C++ I';我开始学习WINAPI和C++;但有什么不对劲吗?

C++ I';我开始学习WINAPI和C++;但有什么不对劲吗?,c++,winapi,visual-c++,C++,Winapi,Visual C++,我的WinMain出了点问题,我试图去做。我完全不懂Windows C++编程,我试着学习。我跟随一个教程来帮助我。但是看起来不管用! 这是我的密码 #include <Windows.h> LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstanc

我的WinMain出了点问题,我试图去做。我完全不懂Windows C++编程,我试着学习。我跟随一个教程来帮助我。但是看起来不管用! 这是我的密码

#include <Windows.h>

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

    HWND hWnd;
    WNDCLASSEX wc;

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = "WindowClass1";

    RegisterClassEx(&wc);

    hWnd = CreateWindowEx(NULL, "WindowClass1", "Our First Windowed app", WS_OVERLAPPEDWINDOW, 300, 300, 500, 400, NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd, SW_SHOW);

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);

        DispatchMessage(&msg);
    }

    return msg.wParam;


    //return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{

    switch(message)
    {
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        } break;

    }
}
#包括
LRESULT回调WindowProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM);
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、LPSTR lpCmdLine、int nCmdShow)
{
HWND-HWND;
WNDCLASSEX wc;
零内存(&wc,sizeof(WNDCLASSEX));
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=WindowProc;
wc.hInstance=hInstance;
wc.hCursor=LoadCursor(空,IDC_箭头);
wc.hbrBackground=(HBRUSH)彩色窗口;
wc.lpszClassName=“WindowClass1”;
注册类别(&wc);
hWnd=CreateWindowEx(NULL,“WindowClass1”,“我们的第一个窗口应用程序”,WS_OVERLAPPEDWINDOW,300300500400,NULL,NULL,hInstance,NULL);
展示窗口(hWnd、SW_展示);
味精;
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
返回msg.wParam;
//返回0;
}
LRESULT回调WindowProc(HWND-HWND,UINT消息,WPARAM-WPARAM,LPARAM-LPARAM)
{
开关(信息)
{
案例WM_销毁:
{
PostQuitMessage(0);
返回0;
}中断;
}
}
当我编译时,我没有错误,但当我运行应用程序时,我的任务栏中只有应用程序图标,其他什么都没有。在任务管理器中,我看到应用程序的两个实例

我错在哪里


非常感谢你的帮助

在窗口过程中,
DefWindowProc
永远不会被调用,因此根本不会处理您未处理的消息。这包括一些必要条件,让你的窗口显示出来,像一个正常的窗口。这方面的一个好地方是开关的
默认值
情况,所有其他情况都有该消息的必要返回值:

switch (message) {
    case SOME_MESSAGE:
        //...
        return 0;

    case SOME_OTHER_MESSAGE:
        //...
        return 1; //not all messages should return 0; check each one's docs

    default: //all unhandled messages
        return DefWindowProc(hWnd, message, wParam, lParam);
}
提高你的警告级别。您应该得到以下信息(至少在GCC上,我相信MSVC也有类似的功能):

警告:控件到达非无效函数的末尾[-Wreturn类型]


WindowProc中缺少返回值。不要忽略编译器警告

return ::DefWindowProc(hWnd, message, wParam, lParam);

我会说,当我开始学习WinAPI时,我发现它非常挑剔。除非每个细节都完全正确,否则代码无法工作,并且没有任何有意义的错误消息。正常的操作过程是调试。跟踪您的程序,查看API函数返回的值。
RegisterClassEx()
成功还是失败?是
CreateWindowEx()
?是否调用了Windows进程?将来,在询问StackOverflow.Seva之前,请尝试调试自己,就像我说的。。我开始学习。抱歉,如果我们学习时这里不是发布问题的地方。。我试着自己调试,但我的知识有限。所以,对不起,不要再发问题了!:D@neimad,可以学习的winapi最重要的部分是使用
GetLastError
进行交叉引用(特别是在调用以下内容时)。查找您使用的每个函数,并相应地处理返回/错误。从中获得的信息证明您已经进行了一些调试,如果有错误,您可以自己查找。@chris好的,谢谢您的帮助,我下次会尝试!确切地说。。哈哈,我的教程从来没有告诉过我defwindowproc。。哇!我需要更改教程!hehe@neimad,为我工作。我不确定它在排行榜上的位置,但这是我个人开始的地方。这是一个朋友给我的pdf!它假设我们可以在C++ WiLAPI中启动所有需要的东西!没错!hehethanks。。就像我说的。。我的教程糟透了。。我从来没说过这个回报。。是的,现在一切都好了!再次感谢!