C++ Win32 API窗口赢得';t打开
好的,我已经抽出时间学习了一个关于Win32 API如何打开窗口的知识,我最后想到的代码我认为是可行的,但是没有。我注册了window类,做了所有我必须做的事情,但是当我运行它时,什么都没有发生。。。如果有人能指出我做错了什么/遗漏了什么,那将是一个很大的帮助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
#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);
toRegisterClass(&WCE)
嗯,你至少能说一下是否所有的函数调用都成功了吗?你的窗口过程收到了什么消息?我们不是通灵的。@RaymondChen抱歉,是的;函数调用成功了。你在传递扩展窗口样式的WS\u OVERLAPPEDWINDOW
,我想你的意思是WS\u EX\u OVERLAPPEDWINDOW
@JonathanPotter刚刚尝试过,但不幸的是它不起作用。EDIT:Oops…它确实起作用,谢谢!@KyleMartin不知道你的意思。你的程序中至少有七个函数调用。你是说它们都成功了吗?事实上,这是不正确的,你把它倒过来了。因为当在初始化WinMain
方法内部的WNDCLASSEX
结构时,编译器实际上需要在WinMain
之前查看WndProc
函数的声明。因此,您可以使用前向声明,也可以按其拥有的顺序保留它们。这为什么可以解决问题?您有什么建议反对扩展窗口类?