相对于父级放置窗口

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 随意撤销您的反对票并将其转为赞成票

以上是关于相对于父级放置窗口的主要内容,如果未能解决你的问题,请参考以下文章

用position:fixed,相对于父级怎么定位?

mysql如何找到相对于父级的子行总数

相对于父视图的底部定位 UIView?

将 JDialog 居中于父级之上

在 jQuery 中,如何设置元素的“top,left”属性,其位置值相对于父级而不是文档?

定位及背景属性