C编程硬件

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

当我编译代码时,应该打开一个窗口,但它没有打开。我创建了一个类、HWND和应用程序处理程序;还是没什么

我是新来的,很抱歉这个问题

应用程序运行正常,没有错误,但窗口似乎没有出现

#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(&regularWndClass) < 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
,Win32
WinMain
不使用它,它只是用户提供的入口点。它本身并不控制程序在哪个子系统中运行。链接器选项可以。我没有说什么“控制”。但是使用
WinMain
可以清楚地证明这将构建为“windows子系统”。
WinMain()
(这意味着子系统
windows
)“-这是错误的
WinMain
只是一个符号。按照惯例,这用于在WINDOWS子系统中运行的应用程序。@i不可检测如果你坚持认为它是错误的,那么它才是“错误的”,这不是问题的关键或我的提示:OP正在编写WINDOWS程序,因此
stdio
在没有准备的情况下是不可用的。这是一个无条件的声明,这是错误的。不需要口译。既然这是你答案的一部分,我就指出了,这样你就可以改进它。一种说法是,“这是用户为基于Windows的图形应用程序提供的入口点的常规名称”。
WinMain
只是用户提供的入口点。它本身并不控制程序在哪个子系统中运行。链接器选项可以。我什么都没说