程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Windows SDK筆記(三):定制控件消息處理函數

Windows SDK筆記(三):定制控件消息處理函數

編輯:關於VC++

一、概述

控件的消息處理函數是由系統定義好了的,通常情況下,不需要自己提供。

但當需要對控件進行特殊控制時,可以提供一個消息處理函數,替換原來的消息處理函數。

自己的處理完成後,再調用控件的缺省消息處理。

二、相關函數

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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved