windows标准显示窗口结构框架代码

2013-10-03 23:28:47   4223
‍#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //窗口函数声明
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)   //WinMain函数说明
{
      static TCHAR szAppName[] = TEXT ("HelloWin") ;
      HWND hwnd ; //这是信息框连续窗口的句柄
      MSG msg ; //消息结构
      WNDCLASS wndclass ; //窗口类结构

      //下面是窗口类的定义
      wndclass.style = CS_HREDRAW | CS_VREDRAW ; /*        表2.6 Windows在的类型标志
  ──────┬──────────────────────────
   标志   │ 说明
  ──────┼──────────────────────────
  CS_HREDRAW │若移动或改变了窗口宽度,则刷新整个窗口
  CS_VREDRAW │若移动或改变了窗口高度,则刷新整个窗口
  CS_OWNDC  │为该类中每个窗口分配一个单值的设备描述表(在本章后
        │面详细描述)
  CS_DBLCLKS │当用户双击鼠标时向窗口程序发送一个双击的信息,同时,
        │光标位于属于该类的窗口中
  CS_PARENTDC │在母窗口中设定一个子窗口的剪切区,以便于子窗口能够
        │画在母窗口中
  CS_SAVEBITS │在一个窗口中保存用户图像,以便于在该窗口被遮住、移
        │动时不必每次刷新屏幕。但是,这样会占用更多的内存,
        │并且比人工同样操作要慢得多
  CS_NOCLOSE │禁止系统菜单上的关闭命令
  ──────┴──────────────────────────*/
      wndclass.lpfnWndProc = WndProc ;//指向事件句柄的函数指针
      wndclass.cbClsExtra = 0 ; //死记
      wndclass.cbWndExtra = 0 ; //死记
      wndclass.hInstance = hInstance ;//在启动时传递给WinMain()函数的句柄实例
      wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;/*加载图标供程序使用
                 LoadIcon()的图标标识符
  ─────────┬───────────────────────
   值       │ 说明
  ─────────┼───────────────────────
  IDI_APPLICATION  │默认应用程序图标
  IDI_ASTERISK   │星号
  IDI_EXCLAMATION  │惊叹号
  IDI_HAND     │手形图标
  IDI_QUESTION   │问号
  IDI_WINLOGO    │Windows徽标
  ─────────┴───────────────────────*/
      wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; /*加载鼠标指针供程序使用
               表2.8 LoadCursor()的值
  ────────┬────────────────────────
   值      │ 说明
  ────────┼────────────────────────
  IDC_ARROW    │标准箭头
  IDC_APPSTARTING │标准箭头和小沙漏标
  IDC_CROSS    │横标线
  IDC_IBEAM    │文本I型标
  IDC_NO     │带正斜线的圆圈
  IDC_SIZEALL   │四向箭头
  IDC_SIZENESW  │指向东北-西南方向的双向箭头
  IDC_SIZENS   │指向南北方向的双向箭头
  IDC_SIZENWSE  │指向东西方向的双向箭头
  IDC_UPARROW   │垂直方向的箭头
  IDC_WAIT    │沙漏
  ────────┴────────────────────────*/
      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;//获取一个图形对象,在这个例子中,是获取绘制窗口背景的刷子 窗口刷新的画笔句柄
      /*  表2.9 GetStockObject()的库存对象标识符
  ────────┬────────────────────────
   值      │ 说明
  ────────┼────────────────────────
  BLACK_BRUSH   │黑色画笔
  WHITE_BRUSH   │白色画笔
  GRAY_BRUSH   │灰色画笔
  LTGRAY_BRUSH  │淡灰色画笔
  DKGRAY_BRUSH  │深灰色画笔
  HOLLOW_BRUSH  │空心画笔
  NULL_BRUSH   │无效(NULL)画笔 
  BLACK_PEN    │黑色笔
  WHITE_PEN    │白色笔
  NULL_PEN    │无效(NULL)笔
  ────────┴────────────────────────*/
      wndclass.lpszMenuName = NULL ;//菜单资源名称的空终止ASCII字符串,用于加载和选用窗口 现在我们只需要将值设为NULL
      wndclass.lpszClassName = szAppName ;//包含相关类的文本标示符的空终止字符串 这样赋值以后,你可以使用它的名字来引用这个新的Windows类
//==================================================================================================
     //下面是窗口类的注册   到这步Windows类已经定义并且存放在winclass中,必须将新的类通知Windows 该功能通过RegisterClass()函数,使用一个指向新类定义的指针来完成
      if (!RegisterClass (&wndclass))//为程序窗口注册窗口类
     {
           return 0 ;
     }
//===============================================================================================
     //根据窗口类创建窗口
     hwnd = CreateWindow (szAppName,    //szAppName 所创建窗口的基础类名( lpClassName )
          TEXT ("一个简单的Win32程序"), //窗口标题( lpWindowsName )
                  WS_OVERLAPPEDWINDOW, //说明窗口外观和行为的通用窗口标志( dwStyle )
/*                            表2.10 dwStyle的通用类型值
  ──────────┬──────────────────────
   类型       │ 所创建的内容
  ──────────┼──────────────────────
  WS_POPUP      │弹出式窗口
  WS_OVERLAPPED    │带有标题栏和边界的重叠式窗口,类似WS_TILED类
            │型 
  WS_OVERLAPPEDWINDOW │具有WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、
            │WS_THICKFRAME、WS_MAXIMIZEBOX和
            │WS_MINIMIZEBOX样式的重叠式窗口
  WS_VISIBLE     │开始就可见的窗口
  WS_SYSMENU     │标题栏上有窗口菜单的窗口
  WS_BORDER      │有细线边界的窗口
  WS_CAPTION     │有标题栏的窗口(包括WS_BORDER样式)
  WS_ICONIC      │开始就最小化的窗口,类似WS_MINIMIZE样式
  WS_MAXIMIZE     │开始就最大化的窗口
  WS_MAXIMIZEBOX      │具有最大化按钮的窗口。不能和WS_EX_CONGTEXTHELP
               │样式合并。WS_SYSMENU也必须指定
  MS_MINIMIZE       │开始就最小化的窗口,类似WS_ICONIC样式
  WS_MINIMIZEOBX      │具有最小化按钮的窗口。不能和WS_EX_CONGTEXITHELP
               │样式合并。WS_SYSMENU也必须指定
  WS_POPUPWINDOW   │带有WS_BORDER、WS_POPUP和WS_SYSMENU类型的
            │弹出式窗口
  WS_SIZEBOX       │一个窗口边界可以变化,和WS_THICKFRAME类型相同
  WS_HSCROLL     │带有水平滚动条的窗口
  WS_VSCROLL     │带有垂直滚动条的窗口
  ──────────┴──────────────────────*/
                  CW_USEDEFAULT, //这是该窗口左上角位置的像素坐标。如果你无所谓,可使用CW_USEDEFALT,这将由Windows来决定。( x,y )
                  CW_USEDEFAULT, //这是以像素表示的窗口宽度和高度。如果你无所谓,可使用CW_USEDEFAULT,这将由Window来决定。( nWidth,nHeight )
                  CW_USEDEFAULT, //假如父窗口存在,这是指向父窗口的句柄。如果没有父窗口,桌面就是父窗口。( hWndParent )
                  CW_USEDEFAULT, //这是指向附属于该窗口菜单的句柄( hMenu )
                  NULL, 
                  NULL, 
                  hInstance, //这是应用程序实例,这里从WinMain()中使用实例。 
                  NULL //高级特征,设置为NULL。 ( lpParam )
                ) ; 
//=========================================================================================================
     //显示窗口
     ShowWindow (hwnd, iCmdShow) ; 
     UpdateWindow (hwnd) ; //指示窗口刷新自身
     //消息循环
     while (GetMessage (&msg, NULL, 0, 0)) 
     {
          TranslateMessage (&msg) ; //转换某些键盘消息
           DispatchMessage (&msg) ; //将消息发送给窗口过程
     }
     return msg.wParam ;
}

//窗口函数
LRESULT CALLBACK WndProc (HWND hwnd,    //这是一个Windows句柄,只有当你使用同一个Windows打开多个窗口时它才用到。这种情况下,hwnd是表明消息来自哪个窗口唯一途径。 
       UINT message, //这是一个实际的WinProc处理的消息标识符。这个标识符可以是众多主要消息中的一个。
       WPARAM wParam, //进一步限定或细发送到msg参数中的信息。
       LPARAM lParam) //进一步限定或细发送到msg参数中的信息。
{
    HDC hdc ;
    PAINTSTRUCT ps ;
    RECT rect ;
    switch (message)
    {
         case WM_PAINT:
                hdc = BeginPaint (hwnd, &ps) ; //开始窗口绘制
                GetClientRect (hwnd, &rect) ; //获取窗口客户区的尺寸
                DrawText (hdc, TEXT ("Hello World!"), -1, &rect,
                DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; //显示Hello World,可以修改程序你要显示的内容
                EndPaint (hwnd, &ps) ; //结束窗口绘制
                return 0 ;
         case WM_DESTROY:
                PostQuitMessage (0) ; //在消息队列中插入一条“退出”消息
                return 0 ;
    }
     return DefWindowProc (hwnd, message, wParam, lParam);//执行默认的消息处理
}
/*                        消息说明符
  ────────┬────────────────────────
   类型     │ 所创建的内容
  ────────┼────────────────────────
  WN_ACTIVATE   │当窗口被激活或者成为一个焦点时传递
  WM_CLOSE    │当窗口关闭时传递
  WM_CREATE    │当窗口第一次创建时传递该消息,以便你进行启动、初始化或资源配置工作
  WM_DESTROY   │当窗口可能要被破坏时该消息传递到你的窗口。通常 这是由于用户单击该窗口的关闭按钮,或者是从该窗口的系统菜单中关闭该窗口造成的。无论上述哪一种方式,都应用释放所有的资源,并且通过发送一个WM_QUIT消息来通知Windows完全终止应用程序
  WM_MOVE     │当窗口移动时传递
  WM_MOUSEMOVE  │当移动鼠标时传递
  WM_KEYUP    │当松开一个键时传递
  WM_KEYDOWN   │当按钮一下键时传递
  WM_TIMER    │当发生定时程序事件时传递
  WM_USER      │允许传递消息
  WM_PAINT    │当一个窗口内容需要重画时传递该消息。这可能有许多原因:用户移动窗口或改变其尺寸、弹出其他应用程序而遮挡了你的窗口等
  WM_QUIT      │当Windows应用程序最后结束时传递
  WM_SIZE      │当一个窗口改变大小时传递
  ────────┴─────────────────────────
*/
‍

下一篇:C++ set用法实战