做MFC 控制元件隨視窗變化大小操作幾次后控制元件的程式,也成功了,但是成功之后試著操作了幾次,控制元件都擁擠到了左上角,甚至最后都看不到控制元件了!忘諸位大神幫助看一下,實作方法如下:
//頭檔案中定義:
CRect m_rect;
void RzSize(void);
POINT old;
OnInitDialog()中初始化:
GetClientRect(&m_rect);
old.x=m_rect.right-m_rect.left;
old.y=m_rect.bottom-m_rect.top;
MaxWindow=old;
return TRUE;
//添加WM_SIZE訊息,在Onsize函式中呼叫自定義函式
void CControlSystemDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType==SIZE_MINIMIZED)
{
return;
}
else
{
RzSize();
}
}
//自定義RzSize()函式
void CControlSystemDlg::RzSize(void)
{
float fsp[2];
POINT Newp; //獲取現在對話框的大小
CRect recta;
GetClientRect(&recta); //取客戶區大小
Newp.x=recta.right-recta.left;
Newp.y=recta.bottom-recta.top;
fsp[0]=(float)Newp.x/old.x;
fsp[1]=(float)Newp.y/old.y;
CRect Rect;
int woc;
CPoint OldTLPoint,TLPoint; //左上角
CPoint OldBRPoint,BRPoint; //右下角
HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控制元件
while(hwndChild){
woc=::GetDlgCtrlID(hwndChild);//取得ID
GetDlgItem(woc)->GetWindowRect(Rect);
ScreenToClient(Rect);
OldTLPoint = Rect.TopLeft();
TLPoint.x = long(OldTLPoint.x*fsp[0]);
TLPoint.y = long(OldTLPoint.y*fsp[1]);
OldBRPoint = Rect.BottomRight();
BRPoint.x = long(OldBRPoint.x *fsp[0]);
BRPoint.y = long(OldBRPoint.y *fsp[1]);
Rect.SetRect(TLPoint,BRPoint);
GetDlgItem(woc)->MoveWindow(Rect,TRUE);
hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);
}
old=Newp;
}
uj5u.com熱心網友回復:
控制元件是慢慢跑沒的嗎?long(OldTLPoint.x*fsp[0])這樣可能有問題吧,還有old=Newp。uj5u.com熱心網友回復:
保留 原始 位置, 始終 用 原始 位置 計算uj5u.com熱心網友回復:
codeproject上搜索EASYSIZEuj5u.com熱心網友回復:
查了下CPoint'的建構式CPoint(int initX, int initY)應該是兩個int型,改成int(OldTLPoint.x*fsp[0])還存在同樣問題,麻煩能不能說下為什么不能直接old=Newp?old里不應該一直放呼叫OnSize前的對話框的寬和高嗎?非常感謝!!!
uj5u.com熱心網友回復:
是不是可以理解為把RzSize(void)函式中的最后一行old=newp去除?這種方法也是了,控制元件會更快的往左上角集中!!!
uj5u.com熱心網友回復:
謝謝!這種方法我試下!
uj5u.com熱心網友回復:
新的視窗大小必須和最初的視窗進行計算,不能和上一次的計算。每次計算float都會被截斷丟失精度。uj5u.com熱心網友回復:
"保留 原始 位置, 始終 用 原始 位置 計算"即不要用·
CRect recta;
GetClientRect(&recta); //取客戶區大小
Newp.x=recta.right-recta.left;
Newp.y=recta.bottom-recta.top;
uj5u.com熱心網友回復:
建議UI用DUILIB界面庫去做,里面有布局管理器,控制元件都會自適應。不需要你去寫代碼管理。總之寫界面用duilib很方便uj5u.com熱心網友回復:
剛寫了一個類, 可以參考下 子視窗隨父視窗縮放管理類uj5u.com熱心網友回復:
http://blog.csdn.net/xianglitian/article/details/5667015你可以參考這個鏈接(反正我都是用這個的),也可以使用EASYSIZE。總的思想就是記錄控制元件原始大小,在原始大小的基礎上按比例進行縮放。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/75377.html
標籤:界面
