VC中怎么用PostMessage传送一个按钮被按下的消息?怎样用PreTranslateMessage来屏蔽F1消息却不出现帮助框
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC中怎么用PostMessage传送一个按钮被按下的消息?怎样用PreTranslateMessage来屏蔽F1消息却不出现帮助框相关的知识,希望对你有一定的参考价值。
这个问题是我最想知道的,所以拿出了100分!希望神牛们能够给个完美解答!先谢过了!
谢谢大家,整合了大家的智慧,我解决了问题,因为是大家的帮助,所以发起投票!非常感谢大家!我用PreTranslateMessage然后用::PostMessage(hWnd,WM_COMMAND,控件ID,NULL)和重载WN_OnHelpInfo函数!实现了我想要的功能!谢谢大家!
PreTranslateMessage无法屏蔽F1消息不出现帮助框,F1是系统热键,要屏蔽只能用全局钩子。——不要追问我什么是全局钩子。
同时销毁2个对话框,在能正常销毁的对话框中向另一个对话框发送消息就可以了。追问
谢谢,大致理解了您的意思,但是可以详细么?HOOK可以达到功能。但是重载OnHelpInfo函数会更优秀哦!消息发送WM_COMMAND消息怎么发送呢?定义一个消息结构体,然后将ID号写入WPARAM中再用PostMessage将消息投递出去么?
追答BOOL PostMessage( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
PostMessage(hWnd,WM_COMMAND,控件ID,NULL)
2,在类中添加响应函数 afx_msg void OnClick();
3,增加消息映射 ON_MESSAGE(UM_BUTTON1DOWN,OnClick);
4,实现void CMainFrame::OnClick()
5,在需要发送消息的地方放入PostMessage(UM_BUTTON1DOWN);
BOOL 类名::PreTranslateMessage(MSG* pMsg)
// TODO: Add your specialized code here and/or call the base class
CString m_OfferPrice;
GetWindowText(m_OfferPrice);
if (pMsg->message==WM_CHAR)
if ((pMsg->wParam<7)||(pMsg->wParam>57)||(pMsg->wParam>8&&pMsg->wParam<45/*&&pMsg->wParam!=43*/)||( pMsg->wParam==45)||(pMsg->wParam==47)) //屏蔽所有的字符键
return TRUE;
return CEdit::PreTranslateMessage(pMsg);
F1的wParam是几你自己找下吧追问
你好,我是在基于对话框的程序,并且按钮的消息响应已经建立完全了,想要的是按另外的键也可以达到响应,就是两个键都会响应一个按钮,另外PreTranslateMessage的这种方法屏蔽不了按F1会出现帮助框哦,要用别的方法!我就是这样写的,结果只有F1会有问题!谢谢你的回答咯!VK_F1 到 VK_F12表示键盘上 “ F1 ”到“ F12 ”键。
参考技术B 是MFC的基于对话框的程序吗?如果是的话:
修改下面的语句,这样F1就不会弹出帮助。
这个在另一个CPP文件里。。
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
重载下PreTranslateMessage。 写个例子给你
下面的是防止ESC键销毁并推出窗口。
PreTranslateMessage(MSG *pMsg) // 为了防止按ESC键退出窗口
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
return TRUE;
return CDialog::PreTranslateMessage(pMsg);
追问
谢谢!但是第一个问题!就是怎么样才能投递一个已经建立好的按键消息到消息队列?就是按键的ID,消息响应函数都是已知的!怎么样才能投递到消息队列呢?BroadcastSystemMessage ,PostMessage ,PostThreadMessage,SendMessageTimeout ,SendNotifyMessage ,SendMessageCallback应该用哪个才能达到呢?销毁对话框应该用什么函数?
追答那个,你问的问题是如何传送一个按钮被按下是吧?传给谁?传给自己的程序,还是传给其他程序?
其实说起来,MFC还真麻烦。说起来,我也好久没用MFC了。。
就是已经建立了一个按键的消息响应,要想在程序中~不等按键被按下~就用程序控制的方法投递到消息队列使其响应。投递给自己的程序!谢谢你!
追答给你例子给你。。
::SendMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDC_BUTTON1,BN_CLICKED),0);
#define WM_MY_MESSAGE WM_USER + 11 //自定义消息
afx_msg void OnMyMsg(); //自定义消息响应函数名
ON_MESSAGE(WM_MY_MESSAGE, OnMyMsg) //写入消息映射
void CMyDlg::OnMyMsg() //为该函数写入内容
MessageBox("Begin post message!");
void CMyDlg::OnButton1()
PostMessage(WM_MY_MESSAGE);//在按钮函数中调用这个自定义的消息
2、用PreTranslateMessage来屏蔽F1消息
重载OnHelpInfo函数
BOOL CMyDlg::OnHelpInfo(HELPINFO* pHelpInfo)
// TODO: Add your message handler code here and/or call default
return false;
//return CDialog::OnHelpInfo(pHelpInfo);
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
switch(pMsg->wParam)
case VK_F1:
HELPINFO * pHelp = NULL;
OnHelpInfo(pHelp);//调用这个重载的函数
break;
return CDialog::PreTranslateMessage(pMsg);
请问下面的图片左上方的两个按钮加中间竖线用vc++中的MFC怎么去实现?完成后,另赠100分。
若你们不知道我的意思,请下载“学算术 V2.0” 这个小软件,看上面的按钮怎么实现的。
就是图像个组件,把右边拉 左边,拉成一条线,在选择图中属性即可
参考技术A 插入一个图片控件,宽度调整到最小,右击图片控件菜单,属性,在右边的属性面板外观选项卡中将Sunken设置为True。如果是VC6,在弹出的属性面板中选定Sunken(凹陷)即可 参考技术B 应该是TAB控件的吧,插入资源里有
TCITEM tabitem;
TCHAR *tabctrltag[2]=TEXT("横式"),TEXT("竖式练习");
//设置TAB控件背景颜色
SetClassLong(htab,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(DLGMAINBG));
//给TAB控件增加页面
tabitem.mask=TCIF_TEXT;
for(i=0;i<2;i++)
tabitem.pszText=tabctrltag[i];
SendMessage(htab,TCM_INSERTITEM,i,(LPARAM)&tabitem);
本回答被提问者采纳 参考技术C 其实那个竖线也是一个按钮、你新建一个按钮、查看属性、取消"弹出"选项、选中"分隔符"就可以了~不懂就追问哈~ 参考技术D 这个貌似不是什么组件吧! 其实可以自己画一条,就一条线,很容易……
以上是关于VC中怎么用PostMessage传送一个按钮被按下的消息?怎样用PreTranslateMessage来屏蔽F1消息却不出现帮助框的主要内容,如果未能解决你的问题,请参考以下文章