日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++ 坐标问题总结,控件大小随窗口变化

發(fā)布時間:2025/6/17 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++ 坐标问题总结,控件大小随窗口变化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【出處:blog.csdn.net/lanmanck】

一般變控件位置和大小在OnSize()消息中處理,不外乎幾個函數(shù):

GetClientRect(),GetClientRect(),ScreenToClient(),MoveWindow()。今天說下這幾個函數(shù)用法。

假設(shè)有一個窗體,Dialog1,上面有一個Edit和一個Button,我們希望窗口大小改變時,Edit大小跟著變,最好鋪滿整個窗口,除了Button;而Button大小不變,但是位置要變。


GetWindowRect() 得到的是在屏幕坐標系下的RECT(對于父窗體來說,以屏幕左上角為原點的矩形[x,y,W,H];對于窗體的控件來說也是以屏幕左上角為原點的矩形[x,y,W,H]);


GetClientRect() 得到的是在客戶區(qū)坐標系下的RECT(即以所在窗口左上角為原點,去掉了標題欄計算,僅僅是個大小,返回值的左上角永遠為0,0。對于父窗體來說,是自己的大小[0,0,W,H];對于窗體內(nèi)的控件來說,也是自己的大小[0,0,W,H]);


ScreenToClient() 就是把屏幕坐標系下的RECT坐標轉(zhuǎn)換為客戶區(qū)坐標系下的RECT坐標。 如果需要獲得窗體在屏幕上的位置,使用GetWindowRect ;如果需要獲得窗體的大小,使用GetClientRect;


對窗體來講:先調(diào)用GetWindowRect后再調(diào)用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,前后結(jié)果一樣,坐標一樣。


對控件來講:先調(diào)用GetWindowRect后再調(diào)用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,前后的結(jié)果都可以算出,但是各自坐標不一樣。


有時候需要獲得窗口矩形的大小和客戶區(qū)矩形的大小二者的值,故需要分別調(diào)用GetWindowRect和GetClientRect。如果只需要獲得客戶區(qū)矩形的大小,調(diào)用GetClientRect就行了。


MoveWindow()就是把控件移到某個區(qū)域,包括放大、縮小和位置,坐標是對于Client來說的,也就是父窗口。對大窗口來說,它的“父窗口”是大屏幕,對于小控件來說,它的“父窗口”是大窗口。

現(xiàn)在的問題就是,如何得到合適的MoveWindow內(nèi)的RECT大小。


結(jié)合上述例子,我歸結(jié)如下,各位拿回去偷偷Happy吧:

在OnSize里面,

1、先得到父窗體的本身大小:GetCLientRect(rcDlg);后面的控件變化以此坐標為參考

2、得到希望變化大小的控件坐標:GetWindowRect(rcEdit);ScreenToCLient(rcEdit); 然后根據(jù)需要變更上下左右,與rcDlg比較,最后Movewindow(); 這里的大小都直接是相對于父窗體來說的大小和偏移了。

3、得到希望移動位置的控件坐標:因為上面有大小變化的控件,而本控件不變大小,所以top要以上面的控件為準:

GetClientRect().保存長和寬,然后根據(jù)上面的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);


?


?

轉(zhuǎn)載于:https://www.cnblogs.com/pangblog/p/3265441.html

總結(jié)

以上是生活随笔為你收集整理的VC++ 坐标问题总结,控件大小随窗口变化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。