以下是我搜到的,可是我的mfc是以对话框生成的。没有PreTranslateMessage函数。我只要在static text上用鼠标画个矩形就可以了。谢谢。
LegerWu(Legerwu_cn)回复于 2002-05-08 16:09:11 得分 20我试了一下,觉得你首先必须确保按下鼠标左键后能得到相关消息,因为你点在控件窗口内,此时利用主窗口的WM_LBUTTONDOWN消息函数是无法取得效果的,但你如果放在PreTranslateMessage中就可以取得效果:
BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_LBUTTONDOWN)
{
CWnd* pWnd = WindowFromPoint(pMsg->pt);
if (pWnd == GetDlgItem(IDC_EDIT1))
{
MessageBox("Get the IDC_EDIT1");
}
}
return CDialog::PreTranslateMessage(pMsg);
}
LegerWu(Legerwu_cn)回复于 2002-05-08 16:09:11 得分 20我试了一下,觉得你首先必须确保按下鼠标左键后能得到相关消息,因为你点在控件窗口内,此时利用主窗口的WM_LBUTTONDOWN消息函数是无法取得效果的,但你如果放在PreTranslateMessage中就可以取得效果:
BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_LBUTTONDOWN)
{
CWnd* pWnd = WindowFromPoint(pMsg->pt);
if (pWnd == GetDlgItem(IDC_EDIT1))
{
MessageBox("Get the IDC_EDIT1");
}
}
return CDialog::PreTranslateMessage(pMsg);
}
解决方案 »
- 无线局域网内传输大量视频文件用UDP还是tcp?
- 关于CGridCtrl控件和右键点击菜单的问题!
- 始终没有解决的奇怪问题:代码编译为exe正常,编译为DLL调用则出错。
- 两个问题--------知道的请回答(谢谢),不知道的来学习。^_^ *_*
- 有效的瑞星杀毒升级授权ID
- 请问CFontDialog中的字体大小怎么转换成html的字体大小?
- MFC中如何多线程执行一个函数
- 各位码神大家好,我又来问问题了,infinite pin tee filter
- 问各位大哥个问题(钩子),哪个用什么办法改变键盘响应呢?
- 哪里有关于菜单制作的详细资料?
- 动态链接库连接入应用程序时出现问题: 无法打开文件“***.lib”
- 高手指教:如何上下移动桌面壁纸???
然后更改其NOTIFY属性
最后就能添加事件了
在对话框资源上添加一个按钮,然后双击这个按钮,VC(2008)会自动为我们在按钮所在的对话框类中添加响应的消息响应函数,(vc 6.0需要我们自己用类向导添加)。如果这个对话框类还没有创建,VC会要求我们必须创建才能添加按钮消息响应函数。这个消息是 BN_CLICKED (按钮点击)。然后在按钮所在对话框类的函数中用GetDlgItem获得控件句柄,从而可以对控件进行改写文本、改变大小位置等操作。貌似对话框只能响应控件CLICKED消息,但实际上,按钮双击,按钮失去焦点,按钮获得焦点等一些少数的消息,对话框同样可以响应。只需要NOTIFY设置为true.对于静态控件,首先要改变其ID,不能是系统默认的IDC_STATIC ,然后更改其NOTIFY属性 .静态控件能响应单击,双击,enable,disable消息。(不能响应焦点消息)然而对话框不能响应按钮的(mousemove)(size)等消息。怎么办呢?如果一个按钮是程序运行时动态创建的(不是用资源创建的),我们可以从CButton派生一个类CMyButton,在这个类里面,就可以使用丰富的窗口消息了,然后在这些消息(例如WM_MOUSEMOVE)的响应函数中用SendMessage()发送自定义消息给对话框。也可以在按钮类的函数中直接做相应处理。对于资源加载的按钮,要用到SetWindowLong()这个函数可以设置(改变)窗口的消息处理过程函数,也就是说,原本按钮用的是默认的winproc,现在用SetWindowLong()可以把按钮的winproc,改成我们自己的MyWinproc()。
然后我们就可以在MyWinproc()里面处理按钮收到的任何窗口消息了。或许还有一些其他方,期待高手。。
你说对话框没有PreTranslateMessage函数,’
其实对话框有的,对话框也是窗口。
你需要重写:PreTranslateMessage()
VC 6.0 右键点击类视图->添加虚函数.
看来你是初学者啊
你也可以在OnMouseMove里面使用:
CWnd* pWnd = WindowFromPoint(point);
也是一样可以达到效果,一样可以获得按钮的句柄。
但是。静态文本框可能会有问题:因为MSDN说:
“If the point is over a static text control, the return value is a handle to the window under the static text control. ”
WindowFromPoint得到的是静态文本框之下的对话框的句柄。不过MSDN一向来不能全信,经常有错误说明。
还要你自己试试才知道。
获得控件句柄之后,你就可以用MoveWindow来移动控件了。
如果 ,我们既要使用资源来创建按钮,又要使按钮的功能更多样化,怎么实现呢?办法是“控件超类化":
第一步:
在程序的最开始(app):
1.
使用GetClassInfoEx()取得系统定义的按钮的窗口类的结构信息。此函数,填写一个WNDCLASSEX结构。
将WNDCLASSEX的lpfnWndProc(控件消息处理函数地址)保存下来,例如:OldPorc。
2.编写自己的消息处理函数MyWinproc(),在函数里面把消息处理过后,再调用按钮原有的函数OldPorc。(调用函数地址的方法,自己查资料 )
3.改写WNDCLASSEX的实例名hinstanse,消息处理lpfnWndProc,类名称lpszClassName,为当前程序实例,MyWinproc,新的按钮窗口类名称(例如,"NewBtWin"。
4.注册这个新的窗口类"NewBtWin"。
第二步:
1.在资源文件*.rc里面,找到对话框按钮的定义,
把PUSHBUTTON这一行的内容替换成
CONTRL 按钮文本 , ID , "NewBtWin",风格,x,y,高,宽,[扩展风格]
例如:
CONTROL "按钮文本" , IDC_BUTTON2 , "Button",WS_TABSTOP | BS_PUSHBUTTON,0,0,50,14 然后就可以在资源中直接使用自己的按钮类了。
(我是从汇编语言书上看的方法,不知道在VC中有没有简单的方法,期待高手)