理解简单的Windows Hello World程序

1 一个简单的Windows Hello World程序

Code:
  1. #include <windows.h>   
  2. #include <mmsystem.h>   
  3. LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;   
  4. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,     
  5.                    PSTR szCmdLine, int iCmdShow)   
  6.            
  7. {   
  8.     static TCHAR szAppName[] = TEXT ("HelloWin") ;   
  9.     HWND   hwnd ;       
  10.     MSG    msg ;          
  11.     WNDCLASS wndclass ;   
  12.     wndclass.style        = CS_HREDRAW | CS_VREDRAW ;       
  13.     wndclass.lpfnWndProc  = WndProc ;     
  14.     wndclass.cbClsExtra   = 0 ;          
  15.     wndclass.cbWndExtra   = 0 ;          
  16.     wndclass.hInstance    = hInstance ;   
  17.     wndclass.hIcon        = LoadIcon (NULL, IDI_APPLICATION) ;          
  18.     wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ;           
  19.     wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;          
  20.     wndclass.lpszMenuName  = NULL ;          
  21.     wndclass.lpszClassName= szAppName ;           
  22.     if (!RegisterClass (&wndclass))           
  23.     {         
  24.             MessageBox (  NULL, TEXT ("This program requires Windows NT!"),          
  25.                                   szAppName, MB_ICONERROR) ;         
  26.             return 0 ;          
  27.     }         
  28.     hwnd = CreateWindow( szAppName,      // window class name       
  29.                    TEXT ("The Hello Program"),   // window caption        
  30.                    WS_OVERLAPPEDWINDOW,  // window style   
  31.                    CW_USEDEFAULT,// initial x position   
  32.                    CW_USEDEFAULT,// initial y position   
  33.                    CW_USEDEFAULT,// initial x size   
  34.                    CW_USEDEFAULT,// initial y size   
  35.                    NULL,                 // parent window handle   
  36.                    NULL,            // window menu handle   
  37.                    hInstance,   // program instance handle   
  38.                    NULL) ;      // creation parameters      
  39.     ShowWindow (hwnd, iCmdShow) ;      
  40.     UpdateWindow (hwnd) ;     
  41.     while (GetMessage (&msg, NULL, 0, 0))       
  42.     {     
  43.           TranslateMessage (&msg) ;   
  44.           DispatchMessage (&msg) ;       
  45.     }       
  46.     return msg.wParam ;          
  47. }   
  48. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)           
  49. {         
  50.     HDC  hdc ;        
  51.     PAINTSTRUCT ps ;        
  52.     RECT rect ;     
  53.     switch (message)       
  54.     {        
  55.     case WM_CREATE:       
  56.     PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;     
  57.             return 0 ;   
  58.     case   WM_PAINT:   
  59.             hdc = BeginPaint (hwnd, &ps) ;   
  60.             GetClientRect (hwnd, &rect) ;   
  61.             DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,   
  62.             DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;   
  63.             EndPaint (hwnd, &ps) ;   
  64.             return 0 ;         
  65.     case   WM_DESTROY:   
  66.             PostQuitMessage (0) ;   
  67.             return 0 ;     
  68.     }        
  69.   return DefWindowProc (hwnd, message, wParam, lParam) ;   
  70.          
  71. }   

2 Windows程序和控制台程序的区别

入口:

Windows程序的入口为:

Code:
  1. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,     
  2.                    PSTR szCmdLine, int iCmdShow)   

控制台程序的入口为:

Code:
  1. int main()  

3 写Windows 程序的基本流程:

写一个程序的每个人都有每个人的风格和方式。如对与本程序:有的人就不喜欢这个写法,他反而更喜欢封装:

他将注册窗口类的过程封装为一个被称为:InitApplication的函数中,将创建窗口,显示窗口,更新窗口的过程封装在一个被称为InitInstance的函数中。他之所以这样写并非故弄玄虚,而是有章可循的。具体原因就牵涉到Windows 3.x时代,窗口类只需注册一次,即可供同一程序的后续每一个实例使用。

下面我们就来看看本程序的流程:

① 声明一个回调函数:

 回调函数就是由用户定义,由操作系统来调用的函数。

② 定义主函数:

    1 注册窗口类. 

      窗口类顾名思义就是窗口的类型。即我们首先为我们以后所要创建的窗口定义了一个类型。

    2 创建窗口

      我们创建的窗口是基于以上窗口类的窗口。

    3 显示窗口

      窗口被创建后并不能自动显示,需我们调用显示窗口的API来显示窗口。

    4 更新窗口

     此动作发送WM_PAINT消息

    5 消息循环

     接收消息,转换消息,分配消息

③ 定义回调函数。

     由一个Switch  case循环来判断接收到的消息的类型,并做相应的处理。若没有找到则交给默认处理函数去处理。

4  理解消息机制

  当我们运行本程序后发现,这个程序与我们平常写的控制台程序或DOS程序不同。该程序若我们不关闭它,它将一直处于运行状态。这里将要引起我们的思考了。是什么能让它一直处于运行状态呢。我们只要回忆一下我们以前写控制台程序的时候,有没有什么结构可以使程序一直运行呢。这里我们自然就想到while循环了。我门找一下程序,它也有一个while循环。

Code:
  1. while (GetMessage (&msg, NULL, 0, 0))       
  2.    {     
  3.          TranslateMessage (&msg) ;   
  4.          DispatchMessage (&msg) ;       
  5.    }       

确实,也就是这个while循环一直支持着程序的运行。它将一直判断消息队列中是否有消息,若有消息就取出,交给

TranslateMessage (&msg) ;函数进行消息的转换。然后交给 DispatchMessage (&msg) ;函数分发消息,该函数会调用我门的回调函数进行消息类型的判断和做相应的处理。若消息队列中没有消息,则循环一直处于判断状态。

5 理解Windows程序的生与死

  ① Windows程序调用CreateWindow初始化,为程序创建了一个窗口,产生窗口后,CreateWindow会发出一个WM_CREATE消息直接给窗口函数,后者可以在这里做些初始化的工作。

 ② 在程序活着的时候,不断的由GetMessage从消息队列中抓取消息,如果这个消息是WM_QUIT,GetMessage就会传回0,while循环条件为假,程序结束。

 ③ DispatchMessage负责分发消息,把消息分派到窗口函数,并进行相应的处理。

 ④ 程序将不断的进行②,③的操作。

 ⑤ 单用户点击系统菜单的Close命令时,系统发出WM_CLOSE消息,该消息有DefWindowsProc处理。DefWindowsProc收到WM_CLOSE消息后,调用DestroyWindow函数来销毁窗口。此后DestroyWindow函数会发出WM_DESTROY消息。

 ⑥ 窗口函数接到此消息后调用PostQuitMessage函数。这个函数仅仅是发送一个WM_QUIT消息来结束程序,它什么也不做。

注意:在第⑥步时,窗口已经被关闭,此时应用程序还在运行。之后WM_QUIT消息令应用程序结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值