C ++ CreateWindow:按钮位置在窗口最大化时获得偏移

时间:2016-11-28 17:53:41

标签: c++ winapi coordinates offset createwindow

我这里有一个奇怪的问题。我为Spotify创建了一个DLL代理,因此我可以覆盖"一个按钮就可以了。基本上,这就是它的工作原理:

DllMain
  -> Creates CMain class
    -> Creates CToggleButton class
      -> Hooks the button onto the Spotify window

它有两个方法,一个是我用于线程的静态方法,因为线程不能调用成员函数,另一个是由成员函数调用的非静态函数。
有了这个,我创建了线程并通过lpParam传递了一个CToggleButton类的实例:

CreateThread(0, NULL, WindowThreadStatic, (void*)this, NULL, NULL);

然后,WindowThreadStatic函数:

DWORD WINAPI CToggleButton::WindowThreadStatic(void* lpParam)
{
   return ((CToggleButton*)lpParam)->WindowThread();
}

类中的主窗口线程函数:

DWORD CToggleButton::WindowThread()
{
MSG msg;
hButton = CreateWindowA("BUTTON", "Test", (WS_VISIBLE | WS_CHILD), 0, 0, 100, 20, parenthWnd, NULL, hInst, NULL);

bool bQueueRunning = true;
while (bQueueRunning)
{
    if (PeekMessage(&msg, parenthWnd, 0, 0, PM_REMOVE))
    {
        switch (msg.message)
        {
        case WM_QUIT:
            bQueueRunning = false;
            break;
        case WM_LBUTTONDOWN:
            if (msg.hwnd == hButton)
            {
                MessageBoxA(parenthWnd, "Button!", "Button", MB_OK);
                continue;
            }
        }

        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    Sleep(10);
}

return 0;
}

正如你所看到的,这也包含按钮的消息循环(我没有在这里使用GetMessage()因为它没有响应所以我决定使用PeekMessage()和10ms延迟,这是有效的罚款。)
小图片展示它的样子:
enter image description here

一切都很棒,但如果我最大化窗口,按钮就会消失。当我最小化和最大化窗口几次时,可以再次看到按钮,但是有非常奇怪的坐标(不是原来的0,0我给了他)。
enter image description here 那我的问题是什么?为什么坐标会偏移? 感谢您阅读我的长篇文章:)

0 个答案:

没有答案