Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6065548
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-14 14:02:24

下载本文示例代码
一、概述
控件的消息处理函数是由系统定义好了的,通常情况下,不需要自己提供。
但当需要对控件进行特殊控制时,可以提供一个消息处理函数,替换原来的消息处理函数。
自己的处理完成后,再调用控件的缺省消息处理。


二、相关函数
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;

(全文完)
下载本文示例代码
阅读(643) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~