posts - 34,comments - 2,trackbacks - 0

//基于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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理