//基于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_ 阅读(1038)
评论(0) 编辑 收藏 引用