Win32学习记录day05

键盘消息

  1. 键盘消息
    • WM_KEYDOWN - 按键被按下时产生
    • WM_KEYUP - 按键被放开时产生
      注意:两个消息不一定一对一出现
    • WM_SYSKEYDOWN - 系统键按下时产生 比如ALT、F10
    • WM_SYSKEYUP - 系统键放开时产生
    • WM_CHAR - 字符消息(TranslateMessage()函数发送)
  2. 消息参数
    • 按键消息:
      • WPARAM - 按键的Virtual Key(虚拟键码)
      • LPARAM - 按键的参数,例如按下次数
    • WM_CHAR消息:
      • WPARAM - 输入的字符(ASC编码)
      • LPARAM - 按键的相关参数
  3. 消息的使用
    • KEYDOWN可以重复出现,KEYUP只能在按键松开时出现1次
  • TranslateMessage在转换WM_KEYDOWN消息时,对于可见字符可以产生WM_CHAR,不可见字符无此消息。
  • WM_KEYDOWN/UP的wParam是表示的按键
    虚拟键码,WM_CHAR是表示输入的字符的ASC字符编码

鼠标消息

  1. 基本鼠标消息
    WM_LBUTTONDOWN - 鼠标左键按下
    WM_LBUTTONUP - 鼠标左键抬起
    WM_RBUTTONDOWN - 鼠标右键按下
    WM_RBUTTONUP - 鼠标右键抬起
    WM_MOUSEMOVE - 鼠标移动消息

     * 参数
     	WPARAM - 其他按键的状态,例如Ctrl/Shift等
     	LPARAM - 鼠标的位置,窗口客户区坐标系。
     		LOWORD X坐标位置
     		HIWORD Y坐标位置
     * 鼠标消息使用
     	一般情况鼠标按下/抬起成对出现。在鼠标移动过程中,会根据移动速度产生一系列的WM_MOUSEMOVE消息。
    
  2. 双击消息
    WM_LBUTTONDBLCLK - 鼠标左键双击
    WM_RBUTTONDBLCLK - 鼠标右键双击

  • 消息参数
    * WPARAM - 其他按键的状态,例如Ctrl/Shift等
    * LPARAM - 鼠标的位置,窗口客户区坐标系。
    * LOWORD X坐标位置
    * HIWORD Y坐标位置
  • 使用时需要在注册窗口类的时候添加CS_DBLCLKS 风格。
  • 消息产生顺序
    以WM_LBUTTONDBLCLK为例:
    * WM_LBUTTONDOWN
    * WM_LBUTTONUP
    * WM_LBUTTONDBLCLK
    * WM_LBUTTONUP
  1. 滚轮消息
    WM_MOUSEWHEEL - 鼠标滚轮消息(鼠标滚轮 WM_MOUSEWHEEL------头文件StdAfx.h中的#include <windows.h>头文件之前定义#define _WIN32_WINNT 0X400)
    消息参数
    • WPARAM:
    • LOWORD - 其他按键的状态
    • HIWORD - 滚轮的偏移量,是120的倍数,通过正负值表示表示滚动方向。
      正:向前滚动
      负:向后滚动
    • LPARAM:鼠标当前的位置,屏幕坐标系
      LOWORD - X坐标
      HIWORD - Y坐标
    • 使用
      通过偏移量,获取滚动的方向和倍数。

定时器消息

  1. 定时器消息(此定时器多用于刷新界面)
    可以在程序中设置定时器,当到达时间
    间隔时,定时器会向程序发送一个
    WM_TIMER消息。
    定时器的精度是毫秒,但是准确度很低。
    例如设置时间间隔为1000ms,但是会在
    非1000毫秒到达。
VOID CALLBACK TimerProc(     
	HWND hwnd, //     
	UINT uMsg, //     
	UINT idEvent, //     
	DWORD dwTime //当前定时器的时间 );
  1. 消息的参数
    WPARAM - 定时器ID
    LPARAM - 定时器处理函数的指针

  2. 定时器使用

    1. 创建定时器
    UINT SetTimer(
    	HWND hWnd,//定时器窗口句柄,定时器触发了,并让该窗口的处理函数处理
    	UINT nIDEvent, //定时器ID
    	UINT uElapse,//时间间隔。毫秒为单位,1000毫秒=1秒
    	TIMERPROC lpTimerFunc //定时器处理函数指针,程序员自己定义,系统调用
    );创建成功,返回非0。
    
    • 当lpTimerFunc为NULL使用窗口处理函数,做为定时器处理函数,
    • 当lpTimerFunc不为NULL使用定时器处理函数处理定时器消息。
    1. 消息处理 WM_TIMER
    2. 关闭定时器
    BOOL KillTimer(
    	HWND hWnd,//定时器窗口句柄
    	UINT uIDEvent //定时器ID
    );
    附:GetClientRect 获取窗口客户区大小
    

综合示例:

绘制圆的函数
BOOL Ellipse( 
 HDC hdc,        // dc句柄(BeginPaint的返回值)
  int nLeftRect,  // 左上角X坐标
  int nTopRect,   //左上角Y坐标
  int nRightRect, //右下角X坐标
  int nBottomRect //左右下角Y坐标
);
获取窗口边界
BOOL GetClientRect(  
  HWND hWnd,      // 窗口句柄
  LPRECT lpRect   // 返回窗口边界的信息
);
posted @ 2016-10-22 15:28  呉语伦比  阅读(117)  评论(0编辑  收藏  举报