相对于父级放置窗口
Posted
技术标签:
【中文标题】相对于父级放置窗口【英文标题】:Place window relative to parent 【发布时间】:2012-02-02 09:18:55 【问题描述】:我有一个简单的无模式对话框,我想把它放在父窗口的右下角。这是我第一次在 C 中使用 windows 窗体(如果我不直接理解,请耐心等待)。
我尝试使用SetWindowPos 定位窗口,但无济于事,因为坐标 x 和 y 是相对于屏幕左上角的。
//hWnd is the parent window
hwndStatusBox = CreateDialog(hInst, MAKEINTRESOURCE(IDD_STATUSBOX),
hWnd, svnStatusBoxProc);
SetWindowPos(hwndStatusBox,NULL, 100, 100, 0, 0,
SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOZORDER);
我错过了一个函数还是我必须自己计算偏移量?
我不想使用资源中定义的坐标,我想以编程方式解决它。
【问题讨论】:
有人在没有评论的情况下投了反对票,所以我会投赞成票来补偿...... 【参考方案1】:对于***窗口,即不是子窗口,坐标确实是相对于屏幕的。
您需要读取所属窗口的坐标,计算出您需要的偏移量,添加偏移量,最后设置对话框相对于屏幕原点的坐标。或者你可以调用ClientToScreen
,传递hWnd
,让系统为你做。
【讨论】:
我要放置的窗口是一个孩子。难道不能把它相对于它的父母吗? MSDN 对坐标说:“对于子窗口,x 是窗口左上角相对于父窗口左上角的 x 坐标客户区。”换句话说,您告诉我们的内容似乎不一致。我怀疑这真的是一个孩子。对话框是***窗口。它们不是子窗口。 是的,我确实认为我遗漏了一些东西:P 我在创建窗口的地方添加了代码,我这样做对吗? 对 CreateDialog 的调用对我来说看起来不错。 MSDN 通过重载名为 hwndParent 的参数使事情变得相当混乱。如果您正在创建子窗口,这是 parent 窗口,如果您正在创建***窗口,则这是 owner 窗口。你正在做后者。对话框坐标与屏幕相关。 谢谢你的解释我不知道有什么不同。我在资源中设置了 WS_CHILD 样式并删除了 WS_POPUP 样式,现在它可以工作了。【参考方案2】:有一个函数可以做到这一点:
ClientToScreen
将客户端坐标转换为屏幕坐标。例如:-
message_box_position = ParentWidth - MessageBoxWidth, ParentHeight - MessageBoxHeight
ClientToScreen (parent_window_handle, &message_box_position)
SetWindowPos (message_box_handle, messahe_box_position)
【讨论】:
-1 我正试图做相反的事情。请仔细阅读问题。 @R34lthing 不,这正是您想要做的。您要指定相对于拥有窗口的客户区的坐标。但是因为您有一个***对话框,所以您必须指定屏幕相关坐标。ClientToScreen
将执行该转换。 +1 补偿。
@DavidHeffernan 好的,我不知道。对于如此轻率和不恰当的回答,我深表歉意。
@R34lthing 随意撤销您的反对票并将其转为赞成票以上是关于相对于父级放置窗口的主要内容,如果未能解决你的问题,请参考以下文章