//基于SDK
//目的:獲得控件在客戶區的坐標,封裝類似MFC中類似void ScreenToClient( LPRECT lpRect )方法
//返回RECT包括左上角的坐標,不只是(0,0)
雖然MFC封裝了不少Windows的API類庫,但是有時候使用MFC 時總是不如人意!特別別扭,還是鐘情在SDK平臺下編寫。于是問題出現:
在SDK平臺下,能獲得窗口的大小的常用API函數有:
BOOL GetWindowRect(HWND hWnd,LPRECT lpRect); //獲得窗口相對屏幕的大小
BOOL GetClientRect(HWND hWnd, LPRECT lpRect ); //獲得窗口相對客戶區的大小
BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint); //把屏幕坐標轉換為客戶區坐標
注意ScreenToClient的參數 lpPoint是指向POINT結構指針,明顯不能達到要求。
在MFC中CWin類庫中提供void ScreenToClient( LPRECT lpRect )方法,而在SDK下沒有,造成很不便。
提供以下算法能很好解決問題:
BOOL GetControlClientRect(HWND hwnd,int iID,RECT &ControlRect)
{
RECT WinRect,ClienWinRect;
// WinRect 是主窗口相對屏幕的大小
// ClienWinRect是主窗口相對客戶區的大小
//ControlRect是控件相對客戶區的坐標
GetWindowRect(hwnd,&WinRect);
GetClientRect(hwnd,&ClienWinRect);
GetWindowRect(GetDlgItem(hwnd,iID),&ControlRect);
int SizeFim=(WinRect.right-WinRect.left-ClienWinRect.right)/2; //獲得客戶區的邊框大小
ControlRect.left=ControlRect.left-WinRect.left-SizeFim;
ControlRect.right=ControlRect.right-WinRect.left-SizeFim;
ControlRect.top=ControlRect.top-(WinRect.bottom-SizeFim-ClienWinRect.bottom);
ControlRect.bottom=ControlRect.bottom-(WinRect.bottom-SizeFim-ClienWinRect.bottom);
return TRUE;
}
//另外一種方法是保證沒有錯誤的。
void NewScreenToClient(HWND hwndPar,HWND hwndChild,RECT &rect)
{
POINT pt;
int ixPos,iyPos;
GetWindowRect(hwndChild,&rect);
pt.x=rect.left;
pt.y=rect.top;
ScreenToClient(hwndPar,&pt);
rect.left=pt.x;
rect.top=pt.y;
pt.x=rect.right;
pt.y=rect.bottom;
ScreenToClient(hwndPar,&pt);
rect.right=pt.x;
rect.bottom=pt.y;
}
//可以設置為全局函數。這樣在較快地得到子窗口相對父窗口的客戶區坐標。
/////////////////////////////////////////////////////////////
posted on 2011-04-11 10:44
Yu_ 閱讀(1043)
評論(0) 編輯 收藏 引用