Window Program 之 窗口与消息

这里先放一个简单的hello world 小程序做为sample, 参考自 《windows程序设计(第五版)》小程序

WinMain()为程序入口windows

主函数的执行流程:函数

初始化窗口类 -> 注册窗口类(RegisterClass) -> 建立窗口(CreateWindow) ->显示窗口(ShowWindow) -> 刷新窗口(UpdateWindow) ->消息队列循环(获取消息(GetMessage) -> 分发消息(dispatchMessage))ui

窗口进程WndProc,做用是根据收到的各类消息执行对应逻辑spa

如,设计

执行 CreateWindow 时, 会收到 WM_CREATEcode

执行 窗口重刷(页面放大缩小,ShowWindow,UpdateWindow) 时, 会收到 WM_PAINTblog

关闭窗体时,收到WM_DESTORY队列

 

消息分无两种:进程

1. 队列消息:加入消息队列,等待消息队列分发消息通知WndProc,如button相关的操做

2. 非队列消息:直接通知WndProc,如 ShowWindow,UpdateWindow

#include "stdafx.h"
#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 ("123") ;
    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 (BLACK_BRUSH) ;
    wndclass.lpszMenuName    = NULL ;
    wndclass.lpszClassName    = szAppName ;

    if (!RegisterClass (&wndclass))
     {
        MessageBox (    NULL, TEXT ("This program requires Windows NT!"), 
                          szAppName, MB_ICONERROR) ;
        return 0 ;
     }
    hwnd = CreateWindow( szAppName,    // window class name
            TEXT ("The Hello Program"),    // window caption
            WS_OVERLAPPEDWINDOW,    // window style
            CW_USEDEFAULT,    // initial x position
            CW_USEDEFAULT,    // initial y position
            CW_USEDEFAULT,    // initial x size
            CW_USEDEFAULT,    // initial y size
            NULL,            // parent window handle
            NULL,            // window menu handle
            hInstance,        // program instance handle
            NULL) ;         // creation parameters
     
    ShowWindow (hwnd, iCmdShow) ;
    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:
        return 0 ;

    case     WM_PAINT:
        hdc = BeginPaint (hwnd, &ps) ;
          
        GetClientRect (hwnd, &rect) ;
          
        DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
              EndPaint (hwnd, &ps) ;
            return 0 ;
          
    case    WM_DESTROY:
        PostQuitMessage (0) ;
        return 0 ;
     }
   return DefWindowProc (hwnd, message, wParam, lParam) ;
}
相关文章
相关标签/搜索