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

时间:2014-08-28 07:52:53

标签: c++ visual-c++ mfc

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

提前致谢

1 个答案:

答案 0 :(得分:2)

使用窗口挂钩程序轻松完成。

请参阅此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;
    }
}

致电InstallHook中的InitInstance,然后UninstallHook中的ExitInstance(真的不是必需的)。

此示例挂钩程序将所有弹出窗口移动到左上角。