客户区坐标与屏幕坐标之间的转换问题
轉(zhuǎn)載地址:http://blog.csdn.net/ke_yang/article/details/5417552
??????????http://blog.163.com/tufanghui01@126/blog/static/9460641420101021102433108/
WIN32? API函數(shù):
????? 1、ClientToScreen 函數(shù):
這個函數(shù)的功能:該函數(shù)將指定點的用戶坐標轉(zhuǎn)換成屏幕坐標。
函數(shù)原型:BOOL ClientToScreen(HWND hWnd,LPPOINT lpPoint);
參數(shù):
hWnd :用戶區(qū)域用于轉(zhuǎn)換的窗口句柄。 注:第二個參數(shù)點的坐標是相對于第一個參數(shù)(窗口句柄)的窗口的坐標,將此點轉(zhuǎn)換為屏幕坐標,實際上是在此點窗口坐標(相對于窗口左上角的坐標)的基礎(chǔ)上加上此窗口左上角坐標相對于屏幕左上角的坐標值。
lpPoint:指向一個含有要轉(zhuǎn)換的用戶坐標的結(jié)構(gòu)的指針,如果函數(shù)調(diào)用成功,新屏幕坐標復(fù)制到此結(jié)構(gòu)。
返回值:如果函數(shù)調(diào)用成功,返回值為非零值,否則為零。
注釋:函數(shù)用屏幕坐標取代POINT結(jié)構(gòu)中的用戶坐標,屏幕坐標與屏幕左上角相關(guān)聯(lián)。
????? CWnd::ClientToScreen(LPPOINT lpPoint)? (ClientToScreen(LPRECT lpRect))實現(xiàn)的是同樣的效果,只不過是窗口句柄缺省為調(diào)用此函數(shù)的窗口。
?
????? 2、ScreenToClient 函數(shù):
????? 函數(shù)功能:該函數(shù)把屏幕上指定點的屏幕坐標轉(zhuǎn)換成用戶坐標。
函數(shù)原型:BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);
參數(shù):
hWnd:指向窗口的句柄,此窗口的用戶空間將被用來轉(zhuǎn)換。 注:將此點相對于屏幕左上角的坐標值轉(zhuǎn)換成相對于此窗口左上角的坐標值。
lpPoint:指向POINT結(jié)構(gòu)指針,該結(jié)構(gòu)含有要轉(zhuǎn)換的屏幕坐標。
返回值:如果函數(shù)調(diào)用成功,返回值為非零值,否則為零。
Windows NT:若想獲得更多錯誤信息,請調(diào)用GetLastError函數(shù)。
注釋:該函數(shù)應(yīng)用hWnd參數(shù)標識的窗口和POINT結(jié)構(gòu)給定的屏幕坐標來計算用戶坐標,然后以用戶坐標來替代屏幕坐標,新坐標是相對于指定窗口的領(lǐng)域的左上角。
?
CWnd::void GetClientRect( LPRECT lpRect ) const;函數(shù):
此函數(shù)得到的區(qū)域是相對于調(diào)用此函數(shù)的窗口指針所指向的窗口的客戶區(qū)域,坐標點是相對于此窗口而言的。例如:在對話框中,如果是一個子控件調(diào)用此函數(shù),那么它得到的rect值左上角的點必定為(0,0),長寬必定與此控件的客戶區(qū)長寬想等。如果是對話框自身調(diào)用此函數(shù),Rect是基類對話框客戶區(qū)域坐標,并且rect左上角的點也必定是(0,0),長寬與此對話框的客戶區(qū)長寬相等。
注:API函數(shù)::GetClientRect(HWND hwnd,LPRECT lprect)實現(xiàn)同樣的效果
?
CWnd::void GetWindowRect( LPRECT lpRect ) const; 函數(shù):
此函數(shù)得到的區(qū)域坐標是相對于屏幕左上角而言,無論是對話框本身還是它的子控件調(diào)用此函數(shù)得到的坐標都是相對于屏幕而言。并且如果是對話框那么它得到的是對話框整個窗口的區(qū)域坐標。
注:API函數(shù)::GetWindowRect(HWND hwnd,LPRECT lprect)實現(xiàn)同樣的效果
先調(diào)用GetWindowRect后再調(diào)用ScreenToClient,這個時候得到的rect和直接使用GetClientRect得到的值是相等的。
有時候需要獲得窗口矩形的大小和客戶區(qū)矩形的大小二者的值,故需要分別調(diào)用GetWindowRect和GetClientRect。
如果只需要獲得客戶區(qū)矩形的大小,調(diào)用GetClientRect就行了。
GetWindowRect() 得到的是在屏幕坐標系下的RECT;(即以屏幕左上角為原點)?
GetClientRect() 得到的是在客戶區(qū)坐標系下的RECT; (即以所在窗口左上角為原點)
GetWindowRect()取的是整個窗口的矩形;?
GetClientRect()取的僅是客戶區(qū)的矩形,也就是說不包括標題欄,外框等;
第一個函數(shù)獲得的是窗口在屏幕上的位置,得到的結(jié)果可能是這樣CRect(10,10,240,240);?
第二個函數(shù)和它不同,它只獲得了客戶區(qū)的大小,因此得到的結(jié)果總是這樣CRect(0,0,width,height);
ScreenToClient() 就是把屏幕坐標系下的RECT坐標轉(zhuǎn)換為客戶區(qū)坐標系下的RECT坐標。
GetClientRect得到的是客戶區(qū)的大小,也就是說這樣得到的左上角永遠是(0,0)
GetWindowRect 是窗口相對于整個屏幕的坐標,屏幕左上點為0,0
轉(zhuǎn)載于:https://blog.51cto.com/whatever957/1599175
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的客户区坐标与屏幕坐标之间的转换问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Demos
- 下一篇: brew cask