看不到我的第一个窗口应用程序

时间:2011-11-24 14:54:36

标签: c++ visual-studio-2010 winapi

我正在编写一本书,向我展示如何创建一个Windows应用程序。我已经编写了代码,但是当我编译并运行它时,它说它已经成功构建,但它没有显示一个窗口,它应该写入" Hello World"。我正在使用带有C ++的Visual Studio 2010,可能是什么问题?

由于

这是代码;

//Header Files
#include <windows.h>
#include <stdlib.h>
#include <time.h>

//Application Title
#define APPTITLE L"Hello World"

//function prototypes (forward declarations)
BOOL InitInstance( HINSTANCE, int);
ATOM MyRegisterClass( HINSTANCE);
LRESULT CALLBACK WinProc( HWND, UINT, WPARAM, LPARAM);

//The window event callback function
LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    //char *szHello = "Hello World!";
    RECT rt;
    int x, y, n;
    COLORREF c;

    switch(message)
    {
        case WM_PAINT:
            //get the dimensions of the window
            GetClientRect( hWnd, &rt);

            //Start drawing on device context
            hdc = BeginPaint( hWnd, &ps);

            //Draw some text
            DrawText( hdc, L"Hello World!", strlen( "Hello World!"), &rt, DT_CENTER);

            //Draw 1000 random pixels
            for( n=0; n < 3000; n++)
            {
                x = rand() % (rt.right - rt.left);
                y = rand() % (rt.bottom - rt.top);
                c = RGB( rand()%256, rand()%256, rand()%256);
                SetPixel( hdc, x, y, c);
            }

            //Stop drawing
            EndPaint( hWnd, &ps);
            break;

        case WM_DESTROY:
            PostQuitMessage(0);
            break;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);

}

//helper function to set up the window properties
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    //create the window class structure
    WNDCLASSEX wc;
    wc.cbSize = sizeof( WNDCLASSEX);

    //FILL THE STRUCT WITH INGO
    wc.cbSize = CS_HREDRAW |  CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WinProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = APPTITLE;
    wc.hIconSm = NULL;

    //set up the window with the class info
    return RegisterClassEx(&wc);

}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
    HWND hWnd;

    //create a new window
    hWnd = CreateWindow(
        APPTITLE,               //Window class
        APPTITLE,               //title bar
        WS_OVERLAPPEDWINDOW,    //window Style
        CW_USEDEFAULT,          //x position of window
        CW_USEDEFAULT,          //y postion of window
        500,                    //width of the window
        400,                    //height of the window
        NULL,                   //parent window
        NULL,                   //menu
        hInstance,              //application instance
        NULL);                  //window parameters

    //was there an error creating the window?
    if( !hWnd)
        return FALSE;

    //Display the window
    ShowWindow( hWnd, nCmdShow);
    UpdateWindow( hWnd);

    return TRUE;

}

//Entry point for a Windows program
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //declare varuables
    MSG msg;

    //register the class
    MyRegisterClass( hInstance);

    //Initialize application
    if( !InitInstance(hInstance, nCmdShow))
        return FALSE;

    //set random number seed
    srand(time(NULL));

    //Main message loop
    while( GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage( &msg);
        DispatchMessage( &msg);
    }


    return msg.wParam;

}

1 个答案:

答案 0 :(得分:3)

这一行错了:

wc.cbSize = CS_HREDRAW |  CS_VREDRAW;

你的意思是

wc.style = CS_HREDRAW |  CS_VREDRAW;

实际上我会更改窗口类初始化代码,以便在代码中清楚地表明整个结构体已初始化。

WNDCLASSEX wc = { 0 };//initialise struct to 0
wc.cbSize = sizeof( WNDCLASSEX);
//FILL THE STRUCT WITH INGO
wc.style =  CS_HREDRAW |  CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WinProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszClassName = APPTITLE;

你错过了一些错误检查:

if (!MyRegisterClass( hInstance))
    return FALSE;

在调试器下单步执行将允许您查看过程中出现问题的位置。