【问题标题】:Win32 API window won't openWin32 API 窗口不会打开
【发布时间】:2013-02-26 02:05:10
【问题描述】:

好的,所以我已经抽出时间学习了与打开窗口有关的 Win32 API,我最终想出的代码我认为可以工作,但没有。我注册了窗口类,做了我必须做的所有事情,但是当我运行它时,什么也没有发生......如果有人能指出我做错了什么/遗漏了什么,那将是一个很大的帮助。

#include <stdlib.h>
#include <iostream>
#include <Windows.h>
#pragma comment (lib, "wsock32.lib")
#define WNDCLASSNAME "wndclass"

bool quit = false;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd)
{
    WNDCLASSEX WCE;
    WCE.cbSize = sizeof(WNDCLASSEX);
    WCE.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC|CS_DBLCLKS;
    WCE.lpfnWndProc = WndProc;
    WCE.cbClsExtra = 0;
    WCE.cbWndExtra = 0;
    WCE.hInstance = hinstance;
    WCE.hIcon = NULL;//LoadImage()
    WCE.hCursor = NULL;//LoadCursor(NULL, IDC_CROSS);
    WCE.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    WCE.lpszMenuName = NULL;
    WCE.lpszClassName = "KyleWindow";
    WCE.hIconSm = NULL;

    RegisterClassEx(&WCE);

    HWND WindowHandle;

    WindowHandle = CreateWindowEx(WS_OVERLAPPEDWINDOW, "KyleWindow", "Xerus", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hinstance, NULL);

    ShowWindow(WindowHandle, SW_SHOWNORMAL);
    UpdateWindow(WindowHandle);

    std::cout<<"'Opened' Window"<<std::endl;

    MSG msg;

    while(!quit)
    {
        if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
        {
            if(msg.message == WM_QUIT)
                quit = true;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return msg.lParam;
}

【问题讨论】:

  • 嗯,你能不能至少说一下是否所有的函数调用都成功了?你的窗口程序收到什么消息?我们不是通灵者。
  • @RaymondChen 对不起,是的;函数调用确实成功了。
  • 你传递了WS_OVERLAPPEDWINDOW 用于扩展窗口样式,我想你的意思是WS_EX_OVERLAPPEDWINDOW。
  • @JonathanPotter 刚刚尝试过,不幸的是它不起作用。编辑:哎呀...它确实有效,谢谢!
  • @KyleMartin 不确定你的意思。您的程序中至少有七个函数调用。你是说他们都成功了?

标签: c++ windows winapi window


【解决方案1】:

使用WS_EX_OVERLAPPEDWINDOW 作为CreateWindowEx 函数的第一个参数(而不是WS_OVERLAPPEDWINDOW,这不是有效的扩展 窗口样式)。

【讨论】:

    【解决方案2】:

    不要使用WNDCLASSEX,而是使用WNDCLASS

    改变:

    WNDCLASSEX WCE; 到 WNDCLASS WCE;

    删除线:

    WCE.cbSize = sizeof(WNDCLASSEX);
    

    改变:

    RegisterClassEx(&amp;WCE); 到 RegisterClass(&amp;WCE);

    【讨论】:

    • 为什么这样可以解决问题?你对扩展窗口类有什么看法?
    【解决方案3】:

    函数 int WINAPI WinMain 必须在函数 LRESULT CALLBACK WndProc 之前。编译器按顺序读取。

    【讨论】:

    • 实际上,这是不正确的——你把它弄反了。由于在 WinMain 方法内部初始化 WNDCLASSEX 结构时使用了指向 WndProc 函数的指针,因此编译器实际上需要查看 WndProc 函数的声明 before @987654325 @。因此,您可以使用前向声明,也可以按照他的顺序保留它们。
    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多