WinMain / Win32窗口未显示,但显示在任务管理器的“进程”选项卡中

时间:2015-05-30 22:07:32

标签: c++ winapi visual-studio-2012 winmain

我是c ++的新手,我一直坚持要显示窗口。我没有收到任何错误,但我的窗口没有显示在桌面上。当我打开任务管理器时,它出现在“过程”下。标签。我还没有找到解决这个问题的方法,所以任何帮助都会受到赞赏。谢谢! :)

**注意:我使用的是Microsoft Visual Studio 2012 **注意:不完全是c ++的新手,但更多的是创建一个win32应用程序

#include <Windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

static TCHAR WindowClass[] = L"Window";

LRESULT CALLBACK WindowProc(
    HWND   WinH,
    UINT   Msg,
    WPARAM wParam,
    LPARAM lParam
    )
{
    switch (Msg)
    {
        PAINTSTRUCT pntStruct;
        static HDC hdc;

        case WM_PAINT:
        {
            BeginPaint(
                WinH,
                &pntStruct
            );
            TextOut(hdc,
                5, 5,
                L"Hello, World!", _tcslen(L"Hello, World!"));
            //pntStruct.rcPaint
            EndPaint(
                WinH,
                &pntStruct
            );

        } break;

        case WM_SIZE:
        {

        } break;

        case WM_MOVE:
        {

        } break;

        case WM_DESTROY:
        {

        } break;

        case WM_CLOSE:
        {

        } break;

        default:
        {
            return DefWindowProc(WinH, Msg, wParam, lParam);
        } break;

        case WM_ACTIVATEAPP:
        {
            if (WM_ACTIVATEAPP)
            {
                OutputDebugStringA("WM_ACTIVEAPP->TRUE");
            }
            else
            {
                OutputDebugStringA("WM_ACTIVEAPP->FALSE");
            }
        } break;

    }

    return 0;
};


int WINAPI WinMain(
    HINSTANCE Window,
    HINSTANCE PrevInstance,
    LPSTR     Cmd,
    int       CmdShow
    )
{

    WNDCLASSEX wclass;
        //wclass.cbSize =  sizeof(WNDCLASS);
        wclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
        wclass.lpfnWndProc = WindowProc;
        wclass.cbClsExtra = 0;
        wclass.cbWndExtra = 0;
        wclass.hInstance = Window;
        //wclass.hIcon; TODO: CREATE ICON
        //wclass.hCursor;
        //wclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wclass.lpszMenuName = NULL;
        wclass.lpszClassName = (LPCTSTR)WindowClass;
//      HICON     hIconSm;
        RegisterClassEx(&wclass);

    HWND CreateWin = CreateWindow(
        WindowClass,
        L"NAME OF WINDOW",
        WS_VISIBLE | WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,//WIDTH:[TODO]->Make custom width to fit window
        CW_USEDEFAULT,//HEIGHT:[TODO]->Make custom width to fit window
        0,
        0,
        Window,
        0
    );

    ShowWindow(CreateWin, CmdShow);
    UpdateWindow(CreateWin);

    MSG message;

    while (GetMessage(&message, NULL, 0, 0) > 0)
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    };

    return 0;
};

1 个答案:

答案 0 :(得分:7)

此代码存在许多问题。

您将WindowClass声明为TCHAR[],但使用wchar_t[]进行初始化。与lpString的{​​{1}}参数相同。只有在为项目定义TextOut()时才会有效,否则会出现编译错误。使用UNICODE时,需要使用TCHAR宏包装字符串文字,以便它们使用正确的字符类型。否则,请停止使用TEXT()并仅使用Unicode API。如果您的代码需要同时支持ANSI(Win9x / ME)和Unicode(NT4 +)编译,则只需使用TCHAR。没有人真的支持Win9x / Me,所以新代码应该只关注Unicode API。

您没有将TCHAR结构的内容归零,因此您有意注释掉但未将值分配给(最重要的是WNDCLASSEX字段)的所有字段都将包含随机值。这可能会导致cbSize失败,您没有检查。要避免此问题,请务必在使用之前将API结构清零。这对于随时间增长的结构(当较新的Windows版本引入新的结构字段时)尤为重要。此类结构通常具有RegisterClassEx()字段,因此API知道您正在使用的结构版本,因此您必须提供准确的值。并且您需要将所有未使用的字段清零,这样您就不会从API中获得意外行为。

您没有检查cbSize是否失败,例如CreateWindow()失败的副作用。

您的RegisterClassEx()应该将未处理的邮件传递给WindowProc(),但您没有这样做。大多数DefWindowProc()块只是丢弃消息,因此Windows无法处理它们。那是你真正想要的吗?我对此表示怀疑。特别是case DefWindowProc()的默认行为是销毁窗口,触发WM_CLOSE消息。

您的WM_DESTROY处理程序未调用WM_DESTROYPostQuitMessage()消息放入调用线程的消息队列中,因此WM_QUIT可以返回0以中断您的消息循环并让应用程序退出。

您的GetMessage()处理程序未使用WM_PAINT为您提供的HDC,您正在使用未初始化的BeginPaint()变量进行绘制。

所有这些都说,尝试更像这样的事情:

HDC