怎么自己处理 BM_SETSTATE 消息

yonsm 2003-03-04 12:12:40
////////////////////////////////////////////////////////////////////////////////////////////////////
// 假设我子类化了一个按钮,代码如下
////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////////
// 文件头
#include <Windows.h>
#define IDD_DIALOG_MAIN 1000

LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
////////////////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////////////////
// 程序入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
{
DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_MAIN), NULL, (DLGPROC) MainDlgProc);
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 对话框回调函数
LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INITDIALOG:
// 子类化按钮
SetWindowLong(GetDlgItem(hWnd, IDOK), GWL_USERDATA,
SetWindowLong(GetDlgItem(hWnd, IDOK), GWL_WNDPROC, (LONG) ButtonProc));
break;

case WM_COMMAND:
// 测试是否有 WM_COMMAND 消息
if ((HIWORD(wParam) == BN_CLICKED) && (LOWORD(wParam) == IDOK))
MessageBox(hWnd, "测试以下:)", "测试", MB_ICONINFORMATION | MB_OK);
break;

case WM_CLOSE:
EndDialog(hWnd, 0);
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////////////////
// 按钮子类化回调函数
LRESULT CALLBACK ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// 如果是 BM_SETSTATE 消息,不能交给原来的窗口回调函数处理
if (uMsg == BM_SETSTATE)
{
// 问题在这里,这里不能调用 CallWindowProc(......),但我又要不失去按钮原来的功能
// 如果什么都不加,按钮将弹不起来,并且没有父窗口无法获得 WM_COMMAND 消息
// 我要在这里加一些什么代码?
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
else
{
// 调用原来的窗口函数
return CallWindowProc(
(WNDPROC) GetWindowLong(hWnd, GWL_USERDATA),
hWnd, uMsg, wParam, lParam);
}


}
////////////////////////////////////////////////////////////////////////////////////////////////////

...全文
171 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧