1、
恩。。我想处理一个控件的消息。。比如在一个BUTTON上按F1。。
我想截取这个消息
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
{
case WM_INITDIALOG:
return TRUE; case WM_CLOSE:
EndDialog(hwndDlg, 0);
return TRUE;
case WM_KEYDOWN: break; case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BTN_QUIT:
EndDialog(hwndDlg, 0);
return TRUE; case IDC_BTN_TEST:
MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION);
return TRUE;
}
} return FALSE;
}
消息处理函数是这么写的,不过捕获的好像是在主窗口上的,而不是BUTTON上的
如果一个窗口上有一个控件,那么主窗体不就获取不到消息了么?
该怎么写针对某个对象的消息处理?
-----------------------------------
2、 case IDC_BTN_QUIT:
EndDialog(hwndDlg, 0);
return TRUE; case IDC_BTN_TEST:
MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION);
return TRUE;IDC_BTN_QUIT和IDC_BTN_TEST是两个在资源文件中定义的BUTTON的值
通过上面两个case,可以处理Click事件,那我如果想处理DoubleClick该怎么写?
恩。。就是SDK中是通过什么来区分消息的区别的
恩。。我想处理一个控件的消息。。比如在一个BUTTON上按F1。。
我想截取这个消息
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
{
case WM_INITDIALOG:
return TRUE; case WM_CLOSE:
EndDialog(hwndDlg, 0);
return TRUE;
case WM_KEYDOWN: break; case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BTN_QUIT:
EndDialog(hwndDlg, 0);
return TRUE; case IDC_BTN_TEST:
MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION);
return TRUE;
}
} return FALSE;
}
消息处理函数是这么写的,不过捕获的好像是在主窗口上的,而不是BUTTON上的
如果一个窗口上有一个控件,那么主窗体不就获取不到消息了么?
该怎么写针对某个对象的消息处理?
-----------------------------------
2、 case IDC_BTN_QUIT:
EndDialog(hwndDlg, 0);
return TRUE; case IDC_BTN_TEST:
MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION);
return TRUE;IDC_BTN_QUIT和IDC_BTN_TEST是两个在资源文件中定义的BUTTON的值
通过上面两个case,可以处理Click事件,那我如果想处理DoubleClick该怎么写?
恩。。就是SDK中是通过什么来区分消息的区别的
解决方案 »
- 如何获得指定路径下的一幅位图的句柄??
- 问个VC输出的问题啊
- 关于网卡的禁用,启用的代码问题,它们都在哪些头文件中啊?
- 奇怪:当一次对象创建失败的时候,续后所要求创建的对象都失败,一定要重新运行程序才能成功!?
- ---如何向表中添加数据——
- 考研好还是搞计算机技术好啊??
- 求教:我一个activex控件要处理PreTranslateMessage,这个控件如果是插入在一个dialog上就正常,如果在一个view中用create创建控件的PreT
- 函数返回的指针问题,帮帮我解释一下
- 关于DCOM和CORBA
- VC中如何开始网络编程?高手请说话!!!
- 如何在普通的cpp文件中访问对话框cpp的控件啊?
- 怎样实现上位机程序的"停止"按钮?
我不是很明白。。
我是用WINDOWS SDK写的。。
2、if (HIWORD(wParam) == BN_DBLCLK)则是双击。
要处理在Button上按F1的消息,需要拦截Button本身的消息处理过程。通过SetWindowLong或SetWindowLongPtr 进行窗口子类化来做:LONG lpPrevWndFunc = SetWindowLong( hWnd, //button的窗口句柄
GWL_WNDPROC,
(LONG)NewButtonProc//新的窗口处理过程函数 的指针
);LRESULT CALLBACK NewButtonProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
//处理 按键消息。如 WM_KEYDOWN
switch( uMsg )
{
case WM_KEYDOWN:
} CallWindowProc( (WNDPROC)lpPrevWndFunc, //原窗口处理过程函数指针,
hWnd,
Msg,
wParam,
Param
);
}
2.case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BTN_QUIT:
{
switch( HIWORD(wParam) ) //wParam高字节 表示 消息的code
case BN_CLICKED:
break;
case BN_DOUBLECLICKED:
break;
return TRUE;
}
}
#include "resource.h"
/* Declare Windows procedure */
BOOL CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);/* Make the class name into a global variable */
char szClassName[ ] = "CodeBlocksWindowsApp";int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
DialogBox(hThisInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,WindowProcedure);
return 0;}LRESULT CALLBACK NewButtonProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam);LRESULT CALLBACK NewButtonProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
//处理 按键消息。如 WM_KEYDOWN
switch( uMsg )
{
case BN_CLICKED:
MessageBox(NULL,TEXT("单击"),TEXT("NULL"),MB_OK);
break;
case BN_DOUBLECLICKED:
MessageBox(NULL,TEXT("双击"),TEXT("NULL"),MB_OK);
break;
} CallWindowProc( (WNDPROC)WindowProcedure, //原窗口处理过程函数指针,
hwnd,
uMsg,
wParam,
lParam
);
return 1;
}/* This function is called by the Windows function DispatchMessage() */
BOOL CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BUTTON1:
LONG lpPrevWndFunc = SetWindowLong( hwnd, //button的窗口句柄
GWL_WNDPROC,
(LONG)NewButtonProc//新的窗口处理过程函数 的指针
);
return TRUE;
}
return TRUE;
case WM_CLOSE:
EndDialog(hwnd, 0);
return TRUE;
}
return FALSE;
} 我想在NewButtonProc中响应鼠标单击、双击事件。。
请大家再帮我看下吧,应该是传递消息传错了,导致再NewButtonProc中无法响应
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_BTN_QUIT:
{
switch( HIWORD(wParam) ) //wParam高字节 表示 消息的code
case BN_CLICKED:
break;
case BN_DOUBLECLICKED:
break;
return TRUE;
}
}
如果要把鼠标的左键点击消息在 button的消息处理过程里处理的话,应该如下
LRESULT CALLBACK NewButtonProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
//处理 按键消息。如 WM_KEYDOWN
switch( uMsg )
{
case WM_LBUTTONDOWN :
break;
case WM_LBUTTONUP: break;
} return CallWindowProc( (WNDPROC)WindowProcedure, //原窗口处理过程函数指针,
hwnd,
uMsg,
wParam,
lParam
);}
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
/*
* TODO: Add code to initialize the dialog.
*/ return TRUE; case WM_CLOSE:
EndDialog(hwndDlg, 0);
return TRUE; case WM_COMMAND:
switch(LOWORD(wParam))
{
/*
* TODO: Add more control ID's, when needed.
*/ case IDC_BTN_QUIT:
EndDialog(hwndDlg, 0);
return TRUE; // return TRUE; case IDC_BTN_TEST:
MessageBox(hwndDlg,"test","",MB_OK);
return TRUE;
} } return FALSE;
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
hInst = hInstance; // The user interface is a modal dialog box
return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, DialogProc);
}
这是个没做相应的源码。。麻烦帮我修改下。。我刚试了下把SetWindowLong 写到了
case WM_INITDIALOG:
中。。结果那按钮没了。。郁闷。弄了半天了,唉~
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
//处理 按键消息。如 WM_KEYDOWN
switch( uMsg )
{
case WM_LBUTTONDOWN :
MessageBox(NULL,"test","",MB_OK);
return 0;
case WM_LBUTTONUP:
break;
}
return CallWindowProc( (WNDPROC)g_preButtonProc,
hwnd,
uMsg,
wParam,
lParam
);
} BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
{
HWND hwndButton = ::GetDlgItem( hwndDlg, IDC_BUTTON );//IDC_BUTTON为测试用的按钮的ID
g_preButtonProc = ::SetWindowLong( hwndButton, GWL_WNDPROC, (LONG)NewButtonProc ); return TRUE;
}
case WM_CLOSE:
EndDialog(hwndDlg, 0);
return TRUE; case WM_COMMAND:
switch(LOWORD(wParam))
{
/*
* TODO: Add more control ID's, when needed.
*/
// case IDC_BTN_QUIT:
// EndDialog(hwndDlg, 0);
// return TRUE; //// return TRUE; case IDC_BUTTON:
// MessageBox(hwndDlg,"test","",MB_OK);
return TRUE;
}
}
return FALSE;
}