以下是我搜到的,可是我的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);   
  }

解决方案 »

  1.   

    在控件属性中指定Notify风格。
      

  2.   

    利用类向导(Ctrl+W)增加此函数啊
      

  3.   

    首先要改变其ID,不能是系统默认的IDC_STATIC
    然后更改其NOTIFY属性
    最后就能添加事件了
      

  4.   

    我们知道,对于按钮通常的用法是这样的:
    在对话框资源上添加一个按钮,然后双击这个按钮,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()里面处理按钮收到的任何窗口消息了。或许还有一些其他方,期待高手。。
      

  5.   

    除外增加NOTIFY属性外,因为静态控件没有鼠标消息,通过加入PreTranslateMessage消息来响应。对话框如默认满意该函数,CTRL+W -> classInfo -> MessageFilter->windows, 将Messagefilter设置为windows即可调出该函数。
      

  6.   

    对了,如果楼主的方法的确是个不错的选择。
    你说对话框没有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来移动控件了。
      

  7.   

    我是4楼和6楼,添加点新资料:
    如果 ,我们既要使用资源来创建按钮,又要使按钮的功能更多样化,怎么实现呢?办法是“控件超类化":
    第一步:
    在程序的最开始(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中有没有简单的方法,期待高手)