2011-11-24 77 views
2

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

谢谢

这是代码;

//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; 

} 

回答

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; 

下调试通过步进将让你看到在这个过程中事情会出错。

+0

非常感谢。我不知道我是如何错过的,但为什么如果我给wc.cbSize提供了错误的数据,它没有给出错误信息? – Perex19

+0

好的!我注意到窗口类没有注册(CreateWindow将最后一个错误设置为1407),但几分钟盯着MyRegisterClass没有发现错误。 –

+0

它确实出现错误。对'RegisterClassEx'的调用,你可以通过调用'GetLastError'找到原因。你只是没有检查。看到我最新的更新。 –

相关问题