子窗体如何得到自己在父窗体中的位置? 子窗体如何得到自己在父窗体中的位置? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如:CRect rect;m_edit.GetWindowRect(&rect);ScreenToClient(&rect);rect == 这就是相对父窗口你的控件位置。 GetClientRect()的得到的左上角永远是(0,0)点。如何转换为子窗体当前在父窗体的RECT? 就是,没看到ScreenToClient进行屏幕与窗口坐标转换 你自己完全可以实现以下函数:BOOL GetWindowRectInParentCoordinates(HWND hwnd, PRECT prc){ // 参数合法性检查 if(!hwnd || !prc || !IsWindow(hwnd)) return FALSE; RECT rc; if(!GetWindowRect(hwnd, &rc)) return FALSE; // // 如果不是子窗口,则返回以屏幕坐标为准的窗口位置信息,否则将 // 坐标映射为父窗口的客户区坐标返回 // if((GetWindowLong(hwnd, GWL_STYLE) & WS_CHILD)) { if(!MapWindowPoints(HWND_DESKTOP, GetParent(hwnd), (LPPOINT)&rc, 2)) return FALSE; } *prc = rc; return TRUE;} 要是代码里有很多处用到这个功能呢?每次都减一遍岂不是太累?而且代码也不复杂啊,只不过你的是 MFC,我的是 SDK,所以用不了 ScreenToClient(PRECT),又不想两次调用 ScreenToClient(PPOINT),就用了个不太常用的 API 而已。 看清楚我上面所说的话里的参数类型啊,你把一个矩形传到 SDK 的 ScreenToClient() API 函数里执行试试看。还有,严格的说来,你的代码虽然没有问题,但是有点答非所问。楼主问的是:子窗体如何得到自己在父窗体中的位置?你回答的问题是:父窗口如何得到子窗口在自己客户区内的位置。 我不想再说了,稍微有意识一看就知道。GetParent()->ScreenToClient() 我也不想再说了,GetParent()->ScreenToClient() 就是你所谓的 SDK 编程啊。 晕~~我真的是不想再说了,程序员是木脑袋啊???如果这都无法变通,回去种田算了。ScreenToClient(GetParent(hWnd/*Child window HWND*/), &rect) GetWindowRect(父窗口)GetWindowRecr(自己)然后一减 晕~~我真的是不想再说了,程序员光有脑袋也没有用啊,动动手好不好?如果对自己不知道的东西别人说了以后连实践一下都懒得弄,回去种田算了。ScreenToClient(GetParent(hWnd/*Child window HWND*/), &rect)上面这行代码你要能在 SDK 程序里调用 API 通过,我老人家从此不再写程序。 多谢两位 dandycheung(珠穆朗玛)和mynamelj(夏娃的诱惑) 如何拦截其他应用的WM_HOTKEY消息 如何在COMBO控件中显示指定字符串? 关于MFC绘图的问题 设置控件颜色!! CListCtrl中某列都为 进度条(急!) 为什么窗口大小变化时位图按钮上的位图糊了? CCombo Box中选择某一条,按“del”键把它删除,这个功能如何实现? 有图象方面的人才吗? 可以使用 CreateFileMapping 映射硬盘吗?急急 对话框中的控件如何响应如鼠标双击等消息? 文件的编码的转换,从Ascii到UTF-8,请教!谢谢 关于NDIS编程。
CRect rect;
m_edit.GetWindowRect(&rect);
ScreenToClient(&rect);rect == 这就是相对父窗口你的控件位置。
BOOL GetWindowRectInParentCoordinates(HWND hwnd, PRECT prc)
{
// 参数合法性检查
if(!hwnd || !prc || !IsWindow(hwnd))
return FALSE; RECT rc;
if(!GetWindowRect(hwnd, &rc))
return FALSE; //
// 如果不是子窗口,则返回以屏幕坐标为准的窗口位置信息,否则将
// 坐标映射为父窗口的客户区坐标返回
// if((GetWindowLong(hwnd, GWL_STYLE) & WS_CHILD))
{
if(!MapWindowPoints(HWND_DESKTOP, GetParent(hwnd), (LPPOINT)&rc, 2))
return FALSE;
} *prc = rc;
return TRUE;
}
而且代码也不复杂啊,只不过你的是 MFC,我的是 SDK,所以用不了 ScreenToClient(PRECT),又不想两次调用 ScreenToClient(PPOINT),就用了个不太常用的 API 而已。
如果这都无法变通,回去种田算了。ScreenToClient(GetParent(hWnd/*Child window HWND*/), &rect)
GetWindowRecr(自己)
然后一减
如果对自己不知道的东西别人说了以后连实践一下都懒得弄,回去种田算了。ScreenToClient(GetParent(hWnd/*Child window HWND*/), &rect)上面这行代码你要能在 SDK 程序里调用 API 通过,我老人家从此不再写程序。