c++ - 我无法创建窗口

标签 c++ windows

我已经尝试创建窗口好几天了,但它总是告诉我“无法创建窗口” 当它随机创建窗口时,CPU 占用 50%。你能帮我看看是什么原因导致了这个错误吗? 这是源代码:

#include<Windows.h> 
int AppRunning=1;
void TellError(LPCWSTR error,HWND hWnd=NULL);
LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
    switch(msg){
        case WM_KEYDOWN:
            AppRunning=0;
            break;
        case WM_CLOSE:
            DestroyWindow(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
    }
    return DefWindowProc(hWnd,msg,wparam,lparam);
}

HWND NewWindow(LPCTSTR title,int xpos, int ypos, int width, int height)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WindowProcedure;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = GetModuleHandle(NULL);
    wcex.hIcon = NULL;
    wcex.hCursor = NULL;
    wcex.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = L"Svet-ver1.0";
    wcex.hIconSm = LoadIcon(NULL,IDI_APPLICATION); 
    if(!RegisterClassEx(&wcex)){
        TellError(L"Cannot register window!");
        return NULL;
    }
    return CreateWindowEx(WS_EX_CONTROLPARENT, L"Svet3D-ver1.0", title, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, xpos, ypos, width, height, NULL, NULL, GetModuleHandle(NULL), NULL);
 }

 int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nCmdShow)
 {
    MSG msg;
    HWND hWnd = NewWindow(L"Svet",100,100,500,500); 
    if(!hWnd){
        TellError(L"Cannot create window!");
        return 0;
    }
    while(AppRunning){
        if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE)){
            if(!IsDialogMessage(hWnd,&msg)){
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }
    DestroyWindow(hWnd);
    return 0;
 }
 void TellError(LPCWSTR error,HWND hWnd){
     MessageBox(hWnd,error,NULL,MB_OK);
 }

最佳答案

传递给 RegisterClassEx 的类名是 "Svet-ver1.0",但是在创建窗口时您使用的是不同的类名 "Svet3D- ver1.0".

此外,您还在主循环中使用了 PeekMessage,当队列中没有消息时,这将快速循环。这个空循环正在消耗你所有的 CPU(50% 可能是因为你有一个双核系统)。

您应该改用 GetMessage,它将等待下一条消息而不会浪费 CPU 时间。

关于c++ - 我无法创建窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12881190/

相关文章:

c++ - 在不轮询 GetMessage() 的情况下检测 USB 连接/断开连接

java - 查找进程是否在 Windows 中处于 Activity 状态

c++ - 推荐内存占用较小的快速 C++ UI 库

windows - Cygwin `rsync` 本地文件夹路径

java - java中如何写入输入流

c++ - O 表示法中的运行时间代码

c++ - 在基于范围的 for 循环中报告奇怪的语法错误

c++ - 将 s.at(i) 与一个字符进行比较?

c++ - 实现相等算法

windows - 登录 Windows 用户的 API