zoukankan      html  css  js  c++  java
  • 定制控件消息处理函数

    Windows SDK笔记(三):定制控件消息处理函数
    作者:冯明德

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


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

  • 相关阅读:
    下载Web微信视频
    强制删除无用old windows文件夹命令
    BitLocker 加密工具挂起和恢复命令行(windows7)
    R 统计学工具部署和使用
    Microsoft Azure 01 (Summarize)
    RocketMQ原理
    专业术语概念
    序列化-ProtoBuf
    Kafka安装与集群部署
    Redis中使用Lua脚本
  • 原文地址:https://www.cnblogs.com/huqingyu/p/36226.html
Copyright © 2011-2022 走看看