龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

Windows SDK笔记(三):定制控件消息处理函数

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
一、概述 控件的消息处理函数是由系统定义好了的,通常情况下,不需要自己提供。 但当需要对控件进行特殊控制时,可以提供一个消息处理函数,替换原来的消息处理函数。 自己的

  一、概述

  控件的消息处理函数是由系统定义好了的,通常情况下,不需要自己提供。

  但当需要对控件进行特殊控制时,可以提供一个消息处理函数,替换原来的消息处理函数。

  自己的处理完成后,再调用控件的缺省消息处理。

  二、相关函数

  1.窗口类的属性可以通过GetWindowLong和SetWindowLong进行读取和设置

LONG GetWindowLong(
  HWND hWnd, // handle to window
  int nIndex // offset of value to retrieve
  );
LONG SetWindowLong(
 HWND hWnd,    // handle to window
 int nIndex,   // offset of value to set
 LONG dwNewLong  // new value
);
  可以返回或设置以下内容:

  nIndex值 意义

  GWL_EXSTYLE 扩展风格

  GWL_STYLE 风格

  GWL_WNDPROC 消息处理函数

  GWL_HINSTANCE 实例

  GWL_ID 窗口ID

  GWL_USERDATA 用户数据

  DWL_DLGPROC 对话框消息处理函数

  DWL_MSGRESULT

  DWL_USER

  所以使用

OldMsgProc = (WNDPROC)SetWindowLong (hControlWnd, GWL_WNDPROC, (LONG)MyMsgProc);
  将控件消息处理函数替换成MyMsgProc,原处理函数被OldMsgProc记录。

  2.调用消息处理函数

LRESULT CallWindowProc(
  WNDPROC lpPrevWndFunc, // pointer to previous procedure
  HWND hWnd,       // handle to window
  UINT Msg,        // message
  WPARAM wParam,     // first message parameter
  LPARAM lParam      // second message parameter
);
  三、示例

  1.提供新处理函数

//记录原来处理函数的全局变量
WNDPROC OldMsgProc;
//新消息处理函数
LRESULT MyMsgProc(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam)
{
  switch(message)
  {
  case WM_LBUTTONDOWN:
    ::MessageBox(NULL,"click!","",MB_OK);
  }
  //调用控件原来的消息处理函数
  return CallWindowProc(OldMsgProc,hwnd,message,wParam,lParam);
}
  2.建立窗口后,更改消息处理函数

case WM_CREATE:
{
  HWND hControlWnd = CreateWindowEx(0,"BUTTON",
    TEXT("按钮(&A)"),
    WS_CHILD | WS_VISIBLE|BS_PUSHBUTTON,
    10,
    10,
    100,
    100,
    hwnd,
    (HMENU)1000,  //控件ID
    ((LPCREATESTRUCT) lParam)->hInstance,  //实例句柄
    NULL);
  //嵌入新的消息处理函数
  OldMsgProc = (WNDPROC) SetWindowLong (hControlWnd, GWL_WNDPROC, (LONG)MyMsgProc);
}
return 0;

精彩图集

赞助商链接