C 相对于父窗口放置窗口

C 相对于父窗口放置窗口,c,windows,winapi,C,Windows,Winapi,我有一个简单的无模式对话框,我想把它放在父窗口的右下角。这是我第一次用C语言处理windows窗体(如果我不能直接理解,请耐心等待) 我已经尝试使用定位窗口,但是没有用,因为坐标x和y是相对于屏幕左上角的 //hWnd is the parent window hwndStatusBox = CreateDialog(hInst, MAKEINTRESOURCE(IDD_STATUSBOX), hWnd, svnStatusBoxPro

我有一个简单的无模式对话框,我想把它放在父窗口的右下角。这是我第一次用C语言处理windows窗体(如果我不能直接理解,请耐心等待)

我已经尝试使用定位窗口,但是没有用,因为坐标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);
我是否缺少一个函数,或者我必须自己计算偏移量


我不想使用资源中定义的坐标,我想通过编程解决它。

对于顶级窗口,即不是子窗口,坐标确实是相对于屏幕的


您需要读取所属窗口的坐标,计算出所需的偏移量,添加偏移量,最后设置对话框相对于屏幕原点的坐标。或者您可以调用,传递
hWnd
,让系统为您执行此操作。

对于顶级窗口,即非子窗口,坐标确实是相对于屏幕的


您需要读取所属窗口的坐标,计算出所需的偏移量,添加偏移量,最后设置对话框相对于屏幕原点的坐标。或者您可以调用,传递
hWnd
,让系统为您执行此操作。

有一个函数可以执行此操作:

ClientToScreen
它将客户端坐标转换为屏幕坐标。例如:-

message_box_position = {ParentWidth - MessageBoxWidth, ParentHeight - MessageBoxHeight}
ClientToScreen (parent_window_handle, &message_box_position)
SetWindowPos (message_box_handle, messahe_box_position)

有一个函数可以执行此操作:

ClientToScreen
它将客户端坐标转换为屏幕坐标。例如:-

message_box_position = {ParentWidth - MessageBoxWidth, ParentHeight - MessageBoxHeight}
ClientToScreen (parent_window_handle, &message_box_position)
SetWindowPos (message_box_handle, messahe_box_position)


我想放的窗户是一个孩子。不可能将其相对于其父对象放置吗?这是关于坐标的:“对于子窗口,x是窗口左上角相对于父窗口客户区左上角的x坐标。”换句话说,您告诉我们的内容似乎不一致。我怀疑它真的是个孩子。对话框是顶级窗口。它们不是子窗口。是的,我确实认为我遗漏了一些东西:P我在创建窗口的地方添加了代码,我这样做对吗?调用CreateDialog对我来说很好。MSDN通过重载名为hwndParent的参数使事情变得相当混乱。如果要创建子窗口,则此窗口为父窗口;如果要创建顶级窗口,则此窗口为所有者窗口。你在做后者。对话框坐标是屏幕相关的。谢谢你的解释,我不知道有区别。我在资源中设置了WS_子样式,并删除了WS_弹出样式,现在它可以工作了。我要放置的窗口是一个子窗口。不可能将其相对于其父对象放置吗?这是关于坐标的:“对于子窗口,x是窗口左上角相对于父窗口客户区左上角的x坐标。”换句话说,您告诉我们的内容似乎不一致。我怀疑它真的是个孩子。对话框是顶级窗口。它们不是子窗口。是的,我确实认为我遗漏了一些东西:P我在创建窗口的地方添加了代码,我这样做对吗?调用CreateDialog对我来说很好。MSDN通过重载名为hwndParent的参数使事情变得相当混乱。如果要创建子窗口,则此窗口为父窗口;如果要创建顶级窗口,则此窗口为所有者窗口。你在做后者。对话框坐标是屏幕相关的。谢谢你的解释,我不知道有区别。我在资源中设置了WS_子样式,并删除了WS_弹出样式,现在它可以工作了。-1我正试图做相反的事情。请仔细阅读问题。@r34l不,这正是你想要做的。您希望指定相对于所属窗口的工作区的坐标。但是因为您有一个顶级对话框,所以必须指定屏幕相对坐标。而
ClientToScreen
将执行该转换+1来补偿。@DavidHeffernan好的,我不知道。我为这样一个轻率和不恰当的回答道歉。@r34l你可以随意取消你的反对票,把它变成赞成票。1我正试图做相反的事情。请仔细阅读问题。@r34l不,这正是你想要做的。您希望指定相对于所属窗口的工作区的坐标。但是因为您有一个顶级对话框,所以必须指定屏幕相对坐标。而
ClientToScreen
将执行该转换+1来补偿。@DavidHeffernan好的,我不知道。我为这样一个草率和不恰当的回答道歉。@r34l您可以随意取消您的否决票,并将其变成一个向上投票的人。有些人未经评论就被否决了,所以我将向上投票以补偿……有些人未经评论就被否决了,所以我将向上投票以补偿。。。