Win32 API复习

本文详细介绍了Win32 API中窗体的创建过程,包括注册、创建和消息处理。讨论了WM_PAINT消息的工作原理,控制台输出,图形与文本绘制,定时器,鼠标和键盘消息的处理。还涵盖了对话框的创建及其与窗体消息处理的区别,以及Win32的I/O操作和虚拟内存与文件映射。
摘要由CSDN通过智能技术生成

目录

创建一个窗体得过程:

  • 1 注册
  • 2 创建
  • 3 处理消息
    用户一般也是把消息取出来(GetMessage),调用WindowProc处理.(只能
    使用CallWindowProc调用,但一般调用他的封装函数DispatchMessage)
    DispatchMessage首先解析lpmsg的窗口过程,然后在调用CallWindowProc。
int MessageBox(
  HWND hWnd,          //提示窗体的父窗体
  LPCTSTR lpText,     //提示的文本
  LPCTSTR lpCaption,  //标题
  UINT uType          //按钮样式
);
 int WINAPI WinMain(
      HINSTANCE hInstance,      //程序的初始化地址
      HINSTANCE hPrevInstance,  //永远不用
      LPSTR lpCmdLine,          //命令行
      int nCmdShow              //窗体显示的样式
    );

1.先定义后注册

 typedef struct _WNDCLASS {
   
            UINT       style;         //窗体的样式(*)    CS_VREDRAW | CS_HREDRAW
            WNDPROC    lpfnWndProc;     //处理窗体的交互事件(*)
            int        cbClsExtra;         //注册类的系统分配空间 0
            int        cbWndExtra;         //系统为窗口数据分配的空间 0
            HINSTANCE  hInstance;         //程序的内存地址(WinMain传递)
            HICON      hIcon;         //窗口图标    (0/NULL)
            HCURSOR    hCursor;         //鼠标光标(0/NULL)
            HBRUSH     hbrBackground;     //背景颜色(*)
            LPCTSTR    lpszMenuName;    //菜单 (0/NULL)
            LPCTSTR    lpszClassName;     //注册名(*)
    } WNDCLASS, *PWNDCLASS;
 ATOM RegisterClass(
          CONST WNDCLASS *lpWndClass  // 注册窗口类的数据参数
        );     

2.创建

HWND CreateWindow(
  LPCTSTR lpClassName,  // 使用RegisterClass注册的名字
  LPCTSTR lpWindowName, // 窗体的标题文本
  DWORD dwStyle,        // 窗体样式
  int x,                // 窗体的x-坐标
  int y,                // 窗体的y-坐标
  int nWidth,           // 窗体宽度
  int nHeight,          // 窗体的高度
  HWND hWndParent,      // 窗体的父窗体
  HMENU hMenu,          // 窗体菜单
  HINSTANCE hInstance,  // 应用程序的句柄
  LPVOID lpParam        // 创建窗体的数据(对MDI窗体有意义)0
);

3.消息处理

先获取,再发送

BOOL GetMessage(
  LPMSG lpMsg,         // 返回消息
  HWND hWnd,           // 指定消息所属的窗体,如果是NULL,则取所有消息
  UINT wMsgFilterMin,  // 消息最小值  0
  UINT wMsgFilterMax   // 消息最大值        0
);
LRESULT DispatchMessage(
  CONST MSG *lpmsg   // message information
);

DispatchMessage首先解析lpmsg的窗口过程,然后在调用CallWindowProc


控制台输出的应用


1.创建控制台
        BOOL AllocConsole(void);创建控制台
        BOOL FreeConsole(VOID);用完释放控制台
2.获取需要的IO句柄
            HANDLE GetStdHandle(
              DWORD nStdHandle   // input, output, or error device
            );
            返回:控制台IO句柄
            参数:指定控制台IO的类型:标准输入/标准输出/标准错误输出
            STD_INPUT_HANDLE Standard input handle
            STD_OUTPUT_HANDLE Standard output handle
            STD_ERROR_HANDLE Standard error handle
3.控制台输出
            BOOL WriteConsole(
              HANDLE hConsoleOutput,           // 控制台句柄
              CONST VOID *lpBuffer,            // 输出数据的缓冲
              DWORD nNumberOfCharsToWrite,     // 输出数据大小
              LPDWORD lpNumberOfCharsWritten,  // 返回实际输出的数据个数
              LPVOID lpReserved                // 永远不使用
            );

消息处理


一、WM_PAINT的工作原理:

        BeginPaint    InvalidateRect  ValidateRect
         EndPaint     InvalidateRgn      ValidateRgn    
  • 1.WM_PAINT没有参数,但是依赖一个绘制区数据结构.PAINTSTRUCT
    他们之间的关系:WM_PAINT触发,必须存在PAINTSTRUCT结构
    如果存在PAINTSTRUCT结构,则系统回自动发送WM_PAINT消息
  • 2.BeginPaint/EndPaint与WM_PAINT的关系
    BeginPaint/EndPaint获取WM_PAINT对应的绘制结构PAINTSTRUCT
    返回HDC.
    如果WM_PAINT对应的PAINTSTRUCT是空,则BeginPaint返回0
  • 3.强制调用WM_PAINT的消息处理:
    PostMessage发送消息
    UpdateWindow完成
    RedrawWindow完成
    前面两个函数可以强制发送消息,但是没有绘制结构PAINTSTRUCT
    推荐:InvalidateRect/InvalidateRgn产生一个绘制区.
  • 4.动画编程模型:
    1.在定时器过程改变数据y+=3,并且设置绘制的无效区InvalidateRect,
    同时强制更新窗体UpdateWindow
    2.在WM_PAINT主要根据数据进行绘制工作

    1.WM_PAINT://当窗体大小/位置改变的时候,该消息被系统使用PostMessage发送

      a.WM_PAINT不能使用SendMessage发送
      b.WM_PAINT优先级别比较低的消息
      c.WM_PAINT的参数(没有使用)
      d.WM_PAINT的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

群野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值