我是靠谱客的博主 健康身影,这篇文章主要介绍C++学习笔记之WINDOWS消息机制,现在分享给大家,希望可以做个参考。

一、WINDOWS程序的运行原理:
    1、基于消息的事件驱动:将所有的事件都包装成消息,并存放于消息队列中,应用程序每次取走一条。
    2、消息的捕捉与传递均由WINDOWS执行。


二、WINDOWS中用于存放消息的结构体:
        结构体原型:
        typedef struct tagMSG {     // msg  
           HWND hwnd;
           UINT message;
           WPARAM wParam;
           LPARAM lParam;
           DWORD time;
           POINT pt;

        } MSG;
    参数释义:
        hwnd:窗口句柄,即产生消息的窗口。
        message:消息。
        wParam:消息附加内容。如:产生了一个键盘消息,该附加消息则包含具体按下的键。
        lParam:同样是附加消息。
        time:消息产生的时间。
        pt:消息产生时光标的位置。
    关于结构体中的新数据类型:
        HWND:窗口句柄。
        WORD:16位的整数。
        DWORD:双16位的整数。
    名词:
        句柄:资源的标识符。
        消息队列:WINDOWS中每个程序都对应的有一个消息队列为它服务。实质是一块先进先出的缓冲区域。


三、WinMain函数:WINDOWS程序的入口。
    函数原型:
        int WINAPI WinMain(
        HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPSTR lpCmdLine,
        int nCmdShow
        );
    参数释义:
        hInstance:当前应用程序的实例句柄。
        hPrevInstance:上一个窗口的实例句柄。
        lpCmdLine:命令行参数。
        nCmdShow:指定以何种模式显示窗口,具体的值有以下几种类型(宏):SW_HIDE/SW_MAXIMIZE/SW_MINIMIZE/SW_RESTORE/SW_SHOW/SW_SHOWMAXIMIZED/SW_SHOWMINIMIZED/SW_SHOWMINNOACTIVE/SW_SHOWNA/SW_SHOWNOACTIVATE/Displays /SW_SHOWNORMAL

四、窗口类:

    结构原型:
        typedef struct _WNDCLASS {
          UINT style;
          WNDPROC lpfnWndProc;
          int cbClsExtra;
          int cbWndExtra;
          HANDLE hInstance;
          HICON hIcon;
          HCURSOR hCursor;
          HBRUSH hbrBackground;
          LPCTSTR lpszMenuName;
          LPCTSTR lpszClassName;
        } WNDCLASS;
        参数释义:
            style:窗口类样式,可以有以下几种类型的值:CS_HREDRAW /CS_VREDRAW /CS_DBLCLKS /CS_NOCLOSE /CS_PARENTDC
            lpfnWndProc:指针,消息处理过程函数,函数原型见下文(WindowProc)。
            cbClsExtra:通常为0。
            cbWndExtra:通常为0。
            hInstance:句柄,窗口过程处理的实例。
            hIcon:标题栏的ICON图标。注意采用LoadIcon函数,原型见下文。
            hCursor:窗口区域内的鼠标光标类型。采用LoadCursor函数,原型见下文。
            hbrBackground:画刷,窗口背景颜色。使用GetStockObject函数,原型见下文。
            lpszMenuName:指针,窗口标题。
            lpszClassName:指针,窗口类的名称。
        用到的API函数:
            WindowProc原型:
                LRESULT CALLBACK WindowProc(
                  HWND hwnd,
                  UINT uMsg,
                  WPARAM wParam,
                  LPARAM lParam
                );
            参数释义:
                hwnd:窗口句柄。
                uMsg:消息。
                wParam/lParam:消息附加信息。
            LoadIcon原型:
                HICON LoadIcon(
                  HINSTANCE hInstance,
                  LPCTSTR lpIconName
                );
            参数释义:
                hInstance:NULL时表示使用系统定义的图标。
                lpIconName:指针,指定加载的图标的名称
            LoadCursor原型:
                HCURSOR LoadCursor(
                  HINSTANCE hInstance,
                  LPCTSTR lpCursorName
                );
                参数释义:
                    hInstance:NULL时表示使用系统定义的鼠标样式。
                    lpCursorName:指定鼠标样式,可以有以下值:IDC_APPSTARTING/IDC_ARROW /IDC_CROSS/IDC_HAND /IDC_HELP/IDC_ICON /IDC_NO/IDC_SIZE/IDC_SIZEALL /IDC_SIZENESW/IDC_SIZENS/IDC_SIZENWSE/IDC_SIZEWE/IDC_UPARROW/IDC_WAIT

                GetStockObject原型:
                    HGDIOBJ GetStockObject(
                      int fnObject
                    );
                参数释义:
                    fnObject:画刷的类型。可以有以下值:BLACK_BRUSH/DKGRAY_BRUSH/GRAY_BRUSH /HOLLOW_BRUSH /LTGRAY_BRUSH /NULL_BRUSH /WHITE_BRUSH /BLACK_PEN/WHITE_PEN/NULL_PEN/SYSTEM_FONT/DEFAULT_PALETTE
                    
 五、注册窗口:
     函数原型:
        ATOM RegisterClass(
            const WNDCLASS* lpWndClass
        );
    参数释义:
        lpWndClass:指针,窗口类。


六、创建窗口:

    函数原型:
        HWND CreateWindow(
          LPCTSTR lpClassName,
          LPCTSTR lpWindowName,
          DWORD dwStyle,
          int x,
          int y,
          int nWidth,
          int nHeight,
          HWND hWndParent,
          HMENU hMenu,
          HANDLE hInstance,
          PVOID lpParam
        );
    参数释义:
        lpClassName:窗口类的名称。
        lpWindowName:窗口的名称。
        dwStyle:窗口创建时的样式。可以有如下值:WS_BORDER/WS_CAPTION /WS_CHILD /WS_CLIPCHILDREN /WS_CLIPSIBLINGS /WS_DISABLED/WS_DLGFRAME /WS_GROUP
/WS_HSCROLL /WS_OVERLAPPED /WS_OVERLAPPEDWINDOW /WS_POPUP /WS_SIZEBOX /WS_SYSMENU /WS_TABSTOP /WS_THICKFRAME /WS_VISIBLE/WS_VSCROLL
        x:窗口的X坐标。
        Y:窗口的Y坐标。
        nWidth:窗口的宽度。
        nHeight:窗口的高度。
        hWndParent:父窗口的句柄,无父窗口则为NULL。
        hMenu:菜单栏句柄。
        hInstance:窗口实例句柄。
        lpParam:没理解,NULL。


七、显示窗口:
    函数原型:
        BOOL ShowWindow(
          HWND hWnd,
          int nCmdShow
        );
    参数释义:
        hWnd:窗口句柄。
        nCmdShow:窗口展示方式,可以有以下值:SW_HIDE/SW_SHOW /SW_SHOWNA/SW_SHOWNORMAL


八、更新窗口:
    函数原型:
        BOOL UpdateWindow(
          HWND hWnd
        );
    参数释义:
        hWnd:窗口句柄。


九、消息循环:
    获取消息 函数原型:
        BOOL GetMessage(
          LPMSG lpMsg,
          HWND hWnd,
          UINT wMsgFilterMin,
          UINT wMsgFilterMax
        );
    参数释义:
        lpMsg:OUT,消息。
        hWnd:窗口句柄。
        wMsgFilterMin:消息界限,最小值。
        wMsgFilterMax:消息界限,最大值。
    转换消息 函数原型:
    BOOL TranslateMessage(
      const MSG* lpMsg
    );
    参数释义:
        lpMsg::消息类的指针。
        
    传递消息(将消息传递给窗口过程) 函数原型:
        LONG DispatchMessage(
          const MSG* lpmsg
        );
    参数释义:
        lpmsg:消息指针。
        
十、MessageBox:
    函数原型:
    int MessageBox(
      HWND hWnd,
      LPCTSTR lpText,
      LPCTSTR lpCaption,
      UINT uType
    );
    参数释义:
        hWnd:窗口句柄。
        lpText:消息类容。
        lpCaption:警告标题。可以为NULL
        uType:按钮类型,可以有以下值:MB_ABORTRETRYIGNORE/MB_OK/MB_OKCANCEL /MB_RETRYCANCEL/MB_YESNO MB_YESNOCANCEL

十一、HDC(设备上下文句柄)/ReleaseDC/TextOut/DestroyWindow/PostQuitMessage:
    HDC hdc = GetDC(hwnd);
    文字输出 函数原型:
        BOOL TextOut(
          HDC hdc,           // handle to DC
          int nXStart,       // x-coordinate of starting position
          int nYStart,       // y-coordinate of starting position
          LPCTSTR lpString,  // character string
          int cbString       // number of characters
        );
    参数释义:
        hdc:设备上下文句柄。
        nXStart:X坐标。
        nYStart:Y坐标。
        lpString:文字内容。
        cbString:输出文字的长度。
    释放DC 函数原型:
        int ReleaseDC(
          HWND hWnd,
          HDC hDC
        );
    参数释义:
        hWnd:窗口句柄。
        hDC:设备上下文句柄。
    销毁窗口 函数原型:
        BOOL DestroyWindow(
          HWND hWnd
        );
    线程请求退出 函数原型:
        void PostQuitMessage(
          int nExitCode
        );
    参数释义:
    nExitCode:退出的参数。(只知道0)


十二、WINDOWS默认消息处理机制:
    函数原型:
    LRESULT DefWindowProc(
      HWND hWnd,
      UINT Msg,
      WPARAM wParam,
      LPARAM lParam
    );

 

 

一段完整的源码:

#include<windows.h>
#include<stdio.h>

LRESULT CALLBACK WndProc(
  HWND hwnd,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
);
int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
{
    WNDCLASS wndClass;
    wndClass.style=CS_HREDRAW|CS_VREDRAW;
    wndClass.cbClsExtra=0;
    wndClass.cbWndExtra=0;
    wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
    wndClass.hCursor=LoadCursor(hInstance,IDC_HAND);
    wndClass.hIcon=LoadIcon(hInstance,IDI_ERROR);
    wndClass.hInstance=hInstance;
    wndClass.lpfnWndProc=WndProc;
    wndClass.lpszClassName=TEXT("First C++ Window");
    wndClass.lpszMenuName=NULL;
    RegisterClass(&wndClass);
    HWND hWnd;
    hWnd = CreateWindow(TEXT("First C++ Window"), TEXT("我的第一个C++窗口"), WS_OVERLAPPEDWINDOW, 0, 0, 600, 800, NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd,SW_SHOWNORMAL);
    UpdateWindow(hWnd);

    MSG Msg;
    while(GetMessage(&Msg,hWnd,0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return 0;
}
LRESULT CALLBACK WndProc(
  HWND hwnd,
  UINT uMsg,
  WPARAM wParam,
  LPARAM lParam
)
{
    switch(uMsg)
    {
        case WM_CHAR:
            char szChar[20];
            sprintf(szChar,"The char is: %c.",wParam);
            //MessageBox(hwnd,TEXT(szChar),TEXT("消息"),MB_OK);
            break;
        case WM_PAINT:
            HDC hdc;
            PAINTSTRUCT ps;
            hdc = BeginPaint(hwnd,&ps);
            TextOut(hdc,0,0,TEXT("啦啦啊啊啊啊"),strlen("啦啦啊啊啊啊"));
            EndPaint(hwnd,&ps);
            break;
        default :
         return    DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
}

最后

以上就是健康身影最近收集整理的关于C++学习笔记之WINDOWS消息机制的全部内容,更多相关C++学习笔记之WINDOWS消息机制内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部