VC++ 坐标问题总结,控件大小随窗口变化
【出處:blog.csdn.net/lanmanck】
一般變控件位置和大小在OnSize()消息中處理,不外乎幾個函數:
GetClientRect(),GetClientRect(),ScreenToClient(),MoveWindow()。今天說下這幾個函數用法。
假設有一個窗體,Dialog1,上面有一個Edit和一個Button,我們希望窗口大小改變時,Edit大小跟著變,最好鋪滿整個窗口,除了Button;而Button大小不變,但是位置要變。
GetWindowRect() 得到的是在屏幕坐標系下的RECT(對于父窗體來說,以屏幕左上角為原點的矩形[x,y,W,H];對于窗體的控件來說也是以屏幕左上角為原點的矩形[x,y,W,H]);
GetClientRect() 得到的是在客戶區坐標系下的RECT(即以所在窗口左上角為原點,去掉了標題欄計算,僅僅是個大小,返回值的左上角永遠為0,0。對于父窗體來說,是自己的大小[0,0,W,H];對于窗體內的控件來說,也是自己的大小[0,0,W,H]);
ScreenToClient() 就是把屏幕坐標系下的RECT坐標轉換為客戶區坐標系下的RECT坐標。 如果需要獲得窗體在屏幕上的位置,使用GetWindowRect ;如果需要獲得窗體的大小,使用GetClientRect;
對窗體來講:先調用GetWindowRect后再調用ScreenToClient這個時候得到的rect和直接使用GetClientRect得到的值是相等的,表示的是窗體大小,坐標是自己。
例如:
?
GetWindowRect=[t=118,b=511,l=326,r=1000],ScreenToClient=[t=0,b=393,l=0,r=674],
而GetClientRect=[t=0,b=393,l=0,r=674]。
由此可見,實際的控件大小為393x674,前后結果一樣,坐標一樣。
對控件來講:先調用GetWindowRect后再調用ScreenToClient這個時候得到的rect和直接使用GetClientRect得到的值是不相等的,前面表示的是相對于父窗體的坐標,而后面表示的是自己的大小,坐標是自己,
例如:
GetWindowRect=[t=320,b=323,l=328,r=999],ScreenToClient=[t=202,b=205,l=2,r=673],
而GetClientRect=[t=0,b=3,l=0,r=671]。
由此可見,實際的控件大小為3x671,前后的結果都可以算出,但是各自坐標不一樣。
有時候需要獲得窗口矩形的大小和客戶區矩形的大小二者的值,故需要分別調用GetWindowRect和GetClientRect。如果只需要獲得客戶區矩形的大小,調用GetClientRect就行了。
MoveWindow()就是把控件移到某個區域,包括放大、縮小和位置,坐標是對于Client來說的,也就是父窗口。對大窗口來說,它的“父窗口”是大屏幕,對于小控件來說,它的“父窗口”是大窗口。
現在的問題就是,如何得到合適的MoveWindow內的RECT大小。
結合上述例子,我歸結如下,各位拿回去偷偷Happy吧:
在OnSize里面,
1、先得到父窗體的本身大小:GetCLientRect(rcDlg);后面的控件變化以此坐標為參考
2、得到希望變化大小的控件坐標:GetWindowRect(rcEdit);ScreenToCLient(rcEdit); 然后根據需要變更上下左右,與rcDlg比較,最后Movewindow(); 這里的大小都直接是相對于父窗體來說的大小和偏移了。
3、得到希望移動位置的控件坐標:因為上面有大小變化的控件,而本控件不變大小,所以top要以上面的控件為準:
GetClientRect().保存長和寬,然后根據上面的rect加減,一般得到right和top即可,這樣加減保存的長寬,就可以move到一個新位置了。
參考代碼:
?
CRect rcDlg;GetClientRect(rcDlg);CRect rcEdit;m_Edit1.GetWindowRect(rcEdit);ScreenToClient(rcEdit);rcEdit.top = 10;rcEdit.bottom = rcDlg.bottom-30;rcEdit.left = rcDlg.left;rcEdit.right = rcDlg.right;m_Edit1.MoveWindow(rcEdit);CRect rcBtn;m_BtnOK.GetWindowRect(rcBtn);ScreenToClient(rcBtn); /* 我們只是記錄大小,或者這2句改為m_BtnOK.GetClientRect(rcBtn);是一樣的效果 */int nWidth = rcBtn.right-rcBtn.left;int nHeight = rcBtn.bottom - rcBtn.top;rcBtn.top = rcEdit.bottom+2;rcBtn.bottom = rcBtn.top+nHeight;rcBtn.right = rcDlg.right - 10;rcBtn.left = rcBtn.right-nWidth;m_BtnOK.MoveWindow(rcBtn);?
?
轉載于:https://www.cnblogs.com/pangblog/p/3265441.html
總結
以上是生活随笔為你收集整理的VC++ 坐标问题总结,控件大小随窗口变化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 背包问题(Knapsack proble
- 下一篇: Deep Belief Network简