如何在 MFC 中更改弹出窗口的默认位置

Posted

技术标签:

【中文标题】如何在 MFC 中更改弹出窗口的默认位置【英文标题】:How to change default position of pop-up window in MFC 【发布时间】:2014-08-28 07:52:52 【问题描述】:

我有一个 MFC 应用程序,我希望此应用程序生成的所有弹出窗口作为对话框或使用 AfxMessageBox 应定位到配置文件中给定的某个位置。 MFC 中有没有办法为任何弹出窗口设置默认位置?

提前致谢

【问题讨论】:

我不知道。如果我要实现这个,我会使用一个钩子来检测基于对话框的窗口的显示,并在它们显示之前设置它们的位置。 【参考方案1】:

通过窗口挂钩程序轻松完成。

请参阅此 SO 帖子:Hooking window creation in an MFC program

示例代码:

static HHOOK g_myHook = NULL;

LRESULT CALLBACK MyCbtHook(int nCode, WPARAM wParam, LPARAM lParam)

    switch (nCode)
    
        case HCBT_ACTIVATE:
        
            CWnd* wnd = CWnd::FromHandle((HWND)wParam);
            WINDOWINFO wi;
            wi.cbSize = sizeof(wi);
            wnd->GetWindowInfo(&wi);
            if ((wi.dwStyle & WS_POPUPWINDOW) == WS_POPUPWINDOW)
            
                wnd->SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
            
            break;
        
    

    return CallNextHookEx(0, nCode, wParam, lParam);


static void InstallHook()

    g_myHook = SetWindowsHookEx(WH_CBT, MyCbtHook, 0, GetCurrentThreadId());


static void UninstallHook()

    if (g_myHook)
    
        UnhookWindowsHookEx(g_myHook);
        g_myHook = NULL;
    

InitInstance 中调用InstallHook,然后在ExitInstance 中调用UninstallHook(实际上不需要)。

这个示例挂钩过程将所有弹出窗口移动到左上角。

【讨论】:

以上是关于如何在 MFC 中更改弹出窗口的默认位置的主要内容,如果未能解决你的问题,请参考以下文章

根据弹出框相对于窗口边缘的 X 位置更改 Bootstrap 弹出框的位置?

在 C++ 中更改 MFC 菜单弹出文本

mfc SetWindowPos

关于MFC主菜单和右键弹出菜单

如何在MFC中让一个按钮实现打开文件(弹出选择文件窗口)的功能?

弹出窗口出现时如何阻止标签栏项目变灰