windows程序设计学习笔记(第三章) 窗口与消息

 

/*------------------------------------------------------------
   HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
                 (c) Charles Petzold, 1998
  ------------------------------------------------------------*/

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("HelloWin") ;
     HWND         hwnd ;
     MSG          msg ;

      //创建窗口类
     WNDCLASS     wndclass ;

     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
     wndclass.lpszMenuName  = NULL ;           //窗口菜单
     wndclass.lpszClassName = szAppName ;  //窗口类

   

     //注册窗口类

     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     

      //创建窗口(会产生WM_CREATE消息,该消息不进入队列,直接调用窗口过程,初始化窗口)
     hwnd = CreateWindow (szAppName,                  //窗口类

                          TEXT ("The Hello Program"), // 窗口标题

                          WS_OVERLAPPEDWINDOW,        // 窗口样式

                          CW_USEDEFAULT,              // initial x position
                          CW_USEDEFAULT,              // initial y position
                          CW_USEDEFAULT,              // initial x size
                          CW_USEDEFAULT,              // initial y size
                          NULL,                       // 父窗口

                          NULL,                       // 菜单

                          hInstance,                  // 应用程序实例句柄

                          NULL) ;                     //      

     //显示窗口(此时窗口仍然是无效的,因为只显示了窗口,但没在上面画些有用的东西)产生WM_size消息
     ShowWindow (hwnd, iCmdShow) ;

     //更新窗口(产生WM_PAINT消息,使得窗口有效,也是直接调用窗口过程,不进入队列)
     UpdateWindow (hwnd) ;
     

     //消息循环
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ; //对消息进行转换
          DispatchMessage (&msg) ;  //把消息交个系统,系统调用窗口过程,窗口过程处理完后才返回
     }
     return msg.wParam ;
}

 

//窗口过程

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
    
     switch (message)
     {
     case WM_CREATE:   
          PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
          return 0 ;
         
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;  //获取设备描述表句柄,和特定的硬件平台有关(显示器)
                                                             //也就是说你有权利使用这个显示器,可以在它上面显示图像
          GetClientRect (hwnd, &rect) ;   //rect保存了客户区的大小
         
          DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,   //-1表示与NULL结尾的字符串
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
         
          EndPaint (hwnd, &ps) ;
          return 0 ;
         
     case WM_DESTROY:
          PostQuitMessage (0) ;//参数0作为返回消息wParam参数
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;//默认处理函数,处理一些其它消息
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值