C++ Win32 API窗口赢得';t打开

C++ Win32 API窗口赢得';t打开,c++,windows,winapi,window,C++,Windows,Winapi,Window,好的,我已经抽出时间学习了一个关于Win32 API如何打开窗口的知识,我最后想到的代码我认为是可行的,但是没有。我注册了window类,做了所有我必须做的事情,但是当我运行它时,什么都没有发生。。。如果有人能指出我做错了什么/遗漏了什么,那将是一个很大的帮助 #include <stdlib.h> #include <iostream> #include <Windows.h> #pragma comment (lib, "wsock32.lib") #de

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

#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;
}
#包括
#包括
#包括
#pragma注释(lib,“wsock32.lib”)
#定义WNDCLASSNAME“WNDCLASSNAME”
bool-quit=false;
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
开关(msg)
{
案例WM_结束:
窗口(hwnd);
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
返回DefWindowProc(hwnd、msg、wParam、lParam);
}
返回0;
}
int-WINAPI WinMain(HINSTANCE-HINSTANCE、HINSTANCE-hprevinstance、LPSTR-lpcmdline、int-nshowcmd)
{
WNDCLASSEX WCE;
WCE.cbSize=sizeof(WNDCLASSEX);
WCE.style=CS|HREDRAW | CS|u VREDRAW | CS|u OWNDC | CS|u DBLCLKS;
WCE.lpfnWndProc=WndProc;
WCE.cbClsExtra=0;
WCE.cbWndExtra=0;
WCE.hInstance=hInstance;
WCE.hIcon=NULL;//LoadImage()
WCE.hCursor=NULL;//LoadCursor(NULL,IDC_交叉);
WCE.hbrBackground=(HBRUSH)颜色背景;
WCE.lpszMenuName=NULL;
WCE.lpszClassName=“KyleWindow”;
WCE.hIconSm=NULL;
注册类别(&WCE);
窗柄;
WindowHandle=CreateWindowEx(WS_OVERLAPPEDWINDOW、“KyleWindow”、“Xerus”、WS_OVERLAPPEDWINDOW、0、0、500、NULL、NULL、NULL、hinstance、NULL);
ShowWindow(WindowHandle,SW_SHOWNORMAL);
更新窗口(窗口句柄);

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

更改:

WNDCLASSEX WCE;
wndclassewce;

删除行:

WCE.cbSize = sizeof(WNDCLASSEX);
更改:


RegisterClass(&WCE);
to
RegisterClass(&WCE)

嗯,你至少能说一下是否所有的函数调用都成功了吗?你的窗口过程收到了什么消息?我们不是通灵的。@RaymondChen抱歉,是的;函数调用成功了。你在传递扩展窗口样式的
WS\u OVERLAPPEDWINDOW
,我想你的意思是
WS\u EX\u OVERLAPPEDWINDOW
@JonathanPotter刚刚尝试过,但不幸的是它不起作用。EDIT:Oops…它确实起作用,谢谢!@KyleMartin不知道你的意思。你的程序中至少有七个函数调用。你是说它们都成功了吗?事实上,这是不正确的,你把它倒过来了。因为当在初始化
WinMain
方法内部的
WNDCLASSEX
结构时,编译器实际上需要在
WinMain
之前查看
WndProc
函数的声明。因此,您可以使用前向声明,也可以按其拥有的顺序保留它们。这为什么可以解决问题?您有什么建议反对扩展窗口类?