【问题标题】:Creating a Window in WinAPI after pressing a button按下按钮后在 WinAPI 中创建一个窗口
【发布时间】:2013-06-02 03:23:52
【问题描述】:

我正在为 WinAPI 中的游戏制作自动点击器,我在主窗口上有 4 个简单的按钮。当用户按下“开始”按钮时,我希望打开另一个窗口,询问他们的设置,例如点击次数和点击之间的时间。当我尝试创建一个新窗口时,什么都没有发生,但其他一切都运行良好。

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }

    case WM_COMMAND:
        {
            switch (wParam)
            {
            case ID_START:
                {
                    HINSTANCE hInstance = GetModuleHandle(CLASS_NAME);

                    HWND settings = CreateWindowEx(
                        0,
                        L"Settings",
                        L"Settings",
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CHILD,
                        100, 100, 600, 200, 
                        NULL,
                        (HMENU) ID_SETTINGS,
                        hInstance,
                        NULL
                        );

                    MSG msg = { };

                    while (GetMessage (&msg, NULL, 0, 0))
                    {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                    }

                    return 0;
                }

            case ID_QUIT:
                {
                    PostQuitMessage(0);
                    return 0;
                }

            case ID_CALIB:
                {
                    if (MessageBox(hwnd, L"You pressed Calibrate", L"Calibrate", MB_OK))
                    {
                        return 0;
                    }
                }

            case ID_INFO:
                {
                    if (MessageBox(hwnd, L"You pressed about", L"About", MB_OK))
                    {
                        return 0;
                    }
                }
            }
        }

    case WM_PAINT:
        {
            PAINTSTRUCT ps;

            HDC hdc = BeginPaint(hwnd, &ps);

            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW+1));
            EndPaint(hwnd, &ps);

            return 0;
        }       
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

我今天刚开始使用 WinAPI,所以我非常陌生。提前感谢您的帮助!

【问题讨论】:

  • 对于设置,您可能希望启动对话框而不是创建普通窗口。
  • 用对话框编辑器和对话框过程(有点像窗口过程)创建一个对话框模板,并在运行时调用DialogBox。你也可以使用 CreateDialog 来做一个无模式对话框(更像是一个普通窗口),但对于第一次尝试,我会坚持使用模式对话框(即 DialogBox)。

标签: c++ winapi button window


【解决方案1】:

CreateWindowEx 的第二个参数必须是您之前通过调用 RegisterClass 注册的类名。

您正在指定 WS_CHILD。但孩子必须有父母。将父 HWND 传递给 hwndParent 参数。

【讨论】:

  • 在我做出您建议的更改后,它给出了链接器错误 1168。我将父窗口参数更改为 hwnd(父窗口的句柄)并将类名设置为我之前在代码。
  • 1>LINK : 致命错误 LNK1168: 无法打开 C:\Users\Frank Family\Desktop\Sean\C++ Projects\Window\Debug\Window.exe 进行写作
  • 哦,那个。确保您的流程结束。
  • @x0xRainx0x,进入任务管理器并确保它没有运行。或者如果您正在调试,请点击停止调试。不过,给出的代码不应该有任何理由这样做。
  • 我不再收到链接器错误(谢谢),但它仍然不起作用。
猜你喜欢
  • 2016-06-12
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多