C编程硬件
当我编译代码时,应该打开一个窗口,但它没有打开。我创建了一个类、HWND和应用程序处理程序;还是没什么 我是新来的,很抱歉这个问题 应用程序运行正常,没有错误,但窗口似乎没有出现C编程硬件,c,winapi,hwnd,C,Winapi,Hwnd,当我编译代码时,应该打开一个窗口,但它没有打开。我创建了一个类、HWND和应用程序处理程序;还是没什么 我是新来的,很抱歉这个问题 应用程序运行正常,没有错误,但窗口似乎没有出现 #include<stdio.h> #include<stdlib.h> #include<windows.h> LRESULT CALLBACK myCallBack(HWND regularWnd, UINT message, WPARAM wparam, LPARAM lp
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
LRESULT CALLBACK myCallBack(HWND regularWnd, UINT message, WPARAM wparam, LPARAM lparam){
switch(message){
case 0x0201:
printf("left Click");
MessageBox(regularWnd, "Left Click", "event handler", MB_OK);
break;
case WM_CLOSE:
DestroyWindow(regularWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
DefWindowProc(regularWnd, message, wparam, lparam);
break;
}
return 0;
}
int WINAPI WinMain(HINSTANCE newHInstance, HINSTANCE prevHINSTANCE, LPSTR lpCmdLine, int cmdShow){
WNDCLASSEX regularWndClass;
regularWndClass.cbSize = sizeof(WNDCLASSEX);
regularWndClass.cbWndExtra = 0;
regularWndClass.cbClsExtra = 0;
regularWndClass.style = 0;
regularWndClass.lpszClassName = "regularWindowClass";
regularWndClass.lpszMenuName = NULL;
regularWndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+2);
regularWndClass.lpfnWndProc = myCallBack;
regularWndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
regularWndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
regularWndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
regularWndClass.hInstance = newHInstance;
if(!RegisterClassEx(®ularWndClass) < 0){
perror("Error Wnd class: ");
exit(0);
}
HWND regularWnd;
regularWnd = CreateWindowEx(WS_EX_CLIENTEDGE, "regularWindowClass", "The title of my window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, NULL, NULL, newHInstance, NULL);
if(regularWnd < 0){
perror("window error : ");
exit(0);
}
ShowWindow(regularWnd, cmdShow);
UpdateWindow(regularWnd);
MSG message;
while(GetMessage(&message, NULL, 0, 0) > 0){
TranslateMessage(&message);
DispatchMessage(&message);
}
return message.wParam;
}
#包括
#包括
#包括
LRESULT回调myCallBack(HWND regularWnd,UINT消息,WPARAM WPARAM,LPARAM LPARAM){
开关(信息){
案例0x0201:
printf(“左键单击”);
MessageBox(常规的“左键单击”、“事件处理程序”,MB_OK);
打破
案例WM_结束:
破坏窗口(常规);
打破
案例WM_销毁:
PostQuitMessage(0);
打破
违约:
DefWindowProc(regularWnd、消息、wparam、LPRAM);
打破
}
返回0;
}
int-WINAPI-WinMain(HINSTANCE-newHInstance、HINSTANCE-prevHINSTANCE、LPSTR-lpCmdLine、int-cmdShow){
WNDCLASSEX RegularWndClasses;
regularWndClass.cbSize=sizeof(WndClass X);
regularWndClass.cbWndExtra=0;
regularWndClass.cbClsExtra=0;
regularWndClass.style=0;
regularWndClass.lpszClassName=“regularWindowClass”;
regularWndClass.lpszMenuame=NULL;
regularWndClass.hbrBackground=(HBRUSH)(彩色窗口+2);
regularWndClass.lpfnWndProc=myCallBack;
regularWndClass.hIconSm=LoadIcon(NULL,IDI_应用程序);
regularWndClass.hIcon=LoadIcon(NULL,IDI_应用程序);
regularWndClass.hCursor=LoadCursor(空,IDC_箭头);
regularWndClass.hInstance=新hInstance;
如果(!RegisterClass(®ularWndClass)<0){
perror(“错误Wnd类:”);
出口(0);
}
HWND调节蛋白;
regularWnd=CreateWindowEx(WS_EX_客户端,“regularWindowClass”,“我的窗口的标题”,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,300,NULL,NULL,newHInstance,NULL);
如果(正常值小于0){
perror(“窗口错误:”);
出口(0);
}
ShowWindow(regularWnd、cmdShow);
更新窗口(常规窗口);
消息;
while(GetMessage(&message,NULL,0,0)>0){
翻译消息(和消息);
DispatchMessage(&message);
}
返回message.wParam;
}
直接错误在这一行:
DefWindowProc(regularWnd, message, wparam, lparam);
窗口过程应该返回一个LRESULT
,DefWindowProc
在必要时执行此操作,但您不传递它。将此更改为
return DefWindowProc(regularWnd, message, wparam, lparam);
您的窗口将按预期显示
除此之外,不使用errno
,因此perror()
将不起作用。您必须使用GetLastError()
和FormatMessage()
来显示有意义的错误消息,而使用WinMain()
(这强烈建议子系统windows
),您将不会在默认情况下使用控制台来显示它们
最后,
UpdateWindow()
是完全不必要的。直接错误在这一行:
DefWindowProc(regularWnd, message, wparam, lparam);
LRESULT CALLBACK myCallBack(HWND regularWnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch (message) {
case 0x0201:
printf("left Click");
MessageBox(regularWnd, "Left Click", "event handler", MB_OK);
return 0;
case WM_CLOSE:
DestroyWindow(regularWnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(regularWnd, message, wparam, lparam);
}
窗口过程应该返回一个LRESULT
,DefWindowProc
在必要时执行此操作,但您不传递它。将此更改为
return DefWindowProc(regularWnd, message, wparam, lparam);
您的窗口将按预期显示
除此之外,不使用errno
,因此perror()
将不起作用。您必须使用GetLastError()
和FormatMessage()
来显示有意义的错误消息,而使用WinMain()
(这强烈建议子系统windows
),您将不会在默认情况下使用控制台来显示它们
最后,UpdateWindow()
完全没有必要
LRESULT CALLBACK myCallBack(HWND regularWnd, UINT message, WPARAM wparam, LPARAM lparam)
{
switch (message) {
case 0x0201:
printf("left Click");
MessageBox(regularWnd, "Left Click", "event handler", MB_OK);
return 0;
case WM_CLOSE:
DestroyWindow(regularWnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(regularWnd, message, wparam, lparam);
}
将窗口过程更改为此
另外,使用GetLastError
和FormatMessage
打印错误;不是peror
,这是或C标准库调用。下面是一个如何使用此函数的示例
将窗口过程更改为此
另外,使用GetLastError
和FormatMessage
打印错误;不是peror
,这是或C标准库调用。下面是一个如何使用此函数的示例
我认为
CreateWindowEx()
不会设置errno
。将此更改为使用GetLastError()
和FormatMessage()
——但这只是一个提示;)我建议您仔细阅读MSDN上的ShowWindow
函数的文档:不要使用perror
,因为这会检查errno
,Win32I不使用它。我认为CreateWindowEx()
不会设置errno
。将此更改为使用GetLastError()
和FormatMessage()
——但这只是一个提示;)我建议您仔细阅读MSDN上的ShowWindow
函数的文档:不要使用perror
,因为这会检查errno
,Win32WinMain
不使用它,它只是用户提供的入口点。它本身并不控制程序在哪个子系统中运行。链接器选项可以。我没有说什么“控制”。但是使用WinMain
可以清楚地证明这将构建为“windows子系统”。WinMain()
(这意味着子系统windows
)“-这是错误的WinMain
只是一个符号。按照惯例,这用于在WINDOWS子系统中运行的应用程序。@i不可检测如果你坚持认为它是错误的,那么它才是“错误的”,这不是问题的关键或我的提示:OP正在编写WINDOWS程序,因此stdio
在没有准备的情况下是不可用的。这是一个无条件的声明,这是错误的。不需要口译。既然这是你答案的一部分,我就指出了,这样你就可以改进它。一种说法是,“这是用户为基于Windows的图形应用程序提供的入口点的常规名称”。WinMain
只是用户提供的入口点。它本身并不控制程序在哪个子系统中运行。链接器选项可以。我什么都没说