我系MFC中的菜鸟新人,现有一简单问题求助大家。我希望位图对“Ctrl+Alt+鼠标左键”点击发生响应,以打开另外一个对话框,应该如何去做?我对键盘响应用的是PreTranslateMessage,代码是这样的:
BOOL CTimeDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_KEYDOWN)  
 {
  if (GetAsyncKeyState(VK_CONTROL) && GetAsyncKeyState(VK_MENU))
   keypress = true;
  else
   keypress = false; 
 }
 if (pMsg->message == WM_KEYUP) 
  keypress = false; 
}我对鼠标响应的代码是这样的:
void CTimeDlg::OnStnClickedBitmap()
{
if (keypress)
 {
  //打开另外一个对话框代码  }
}
但为什么不行呢?两者应该怎么联系起来呢?特别是鼠标响应那块,我试着看只响应鼠标点击怎么样,一点反应都没起有!
请教高手!

解决方案 »

  1.   

    我已经对位图属性做了设定,ID不是“IDC_STATIC”,Notify也已设置为“True”,但不知为什么还是不行?
      

  2.   

    有点不明白你说的意思...
    你是想点击了位图区域,然后do something??
    如果是这样,你先判断鼠标位置是否在位图里..然后处理事件
      

  3.   

    if (GetAsyncKeyState(VK_CONTROL) < 0 && GetAsyncKeyState(VK_MENU) < 0)
      

  4.   

    是的,我是想按住“Ctrl”键和左“Alt”键,并在对话框1的位图上点击鼠标左键,就能打开另外一个对话框2。一定要先判断鼠标位置吗?那函数OnStnClickedBitmap() 有什么作用?
      

  5.   


    “IDC_BITMAP”是我位图的ID。
      

  6.   


    这个是...?加在void CTimeDlg::OnStnClickedBitmap() 里面?
      

  7.   

    PreTranslateMessage里面,替换掉你现在的if语句。
      

  8.   

    那“keypress”变量应该在哪里定义呢?
    如果声明为全局变量的话又怎么让“OnStnClickedBitmap()”函数调用“PreTranslateMessage(MSG* pMsg)”函数中得到的“keypress”的值呢?
      

  9.   

    if (GetAsyncKeyState(VK_CONTROL) < 0 && GetAsyncKeyState(VK_MENU) < 0)捕获Ctrl+Alt+鼠标左键响应事件,打开对话框
      

  10.   

    void CTimeDlg::OnStnClickedBitmap() 

    if ((GetAsyncKeyState(VK_CONTROL)<0) && (GetAsyncKeyState(VK_MENU))<0) ) 

      //打开另外一个对话框代码 } 
    } 你确认点击位图OnStnClickedBitmap正确响应了吗?
      

  11.   

    keypress定义为CTimeDlg的成员变量。
      

  12.   

    现在问题关键在“OnStnClickedBitmap()”这里,为什么老是不能反应呢?
    如果只响应“Ctrl+Alt”的话,我试过都是OK的啊。
      

  13.   

    这样做可以:
    BOOL CDD::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
     if (pMsg->message == WM_KEYDOWN)  
     { 
      if (GetAsyncKeyState(VK_CONTROL)<0 && GetAsyncKeyState(VK_MENU)<0) 
      keypress = true; 
      else 
      keypress = false; 
     } 
    }void CDD::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    if(keypress)
    {
    CDialog2 dlg2;
    dlg2.DoModal();
    }

    CDialog::OnLButtonDown(nFlags, point);
    }
      

  14.   

    其中keypress 为BOOL类型的全局变量
      

  15.   

    重新添加一下IDC_STATIC的单击事件。
    以确认OnStnClickedBitmap正常工作。
      

  16.   

    你先在OnStnClickedBitmap函数中设置一个断点,确认是否可以执行到。
      

  17.   


    若位图ID是“IDC_STATIC”的话不是就不可以添加单击事件吗?
      

  18.   


    好像是这里出了问题,程式写成这样也没有反应:
    void CTimeDlg::OnStnClickedBitmap() 

       MessageBox(NULL,TEXT(“HELLO”),0);
    }这会是哪里出错了呢? 
      

  19.   

    另外问一个题外问题
    如何控制richedit2控件中文字的字体、颜色等?
    就是一有文字输入控件,这文字就按照我设定的字体颜色显示?
      

  20.   

    OnStnClickedBitmap是怎么映射的?static点击是向父窗口发WM_COMMAND消息,wParam低16位是控件ID、高16位是STN_CLICKED。
      

  21.   

    将static控件ID设置为IDC_STATIC1,只要不是IDC_STATIC就可以为其添加鼠标单击事件响应函数了
    你原来的思路很好,应该可以实现,加把力吧
      

  22.   

    使用CRichEditCtrl::SetSel设置要改变的文字选种,再用CRichEditCtrl::SetSelectionCharFormat
    设置选种文本的属性
      

  23.   


    我是這樣做的:
    先在BOOL CTimeDlg::OnInitDialog()中添加“DispR.SetEventMask(ENM_CHANGE);” //"IDC_DispR"是我richedit2編輯框的ID然後在
          void CTimeDlg::OnEnChangeDispR()
    {
           CHARFORMAT cf;
            ZeroMemory(&cf, sizeof(CHARFORMAT));
            cf.cbSize = sizeof(CHARFORMAT);
            cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
                                CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
            cf.dwEffects = 0;
            cf.yHeight = 12*12;//文字高度
            cf.crTextColor = RGB(200, 100, 255); //文字颜色
            strcpy(cf.szFaceName ,_T("隶书"));//设置字体
         
            m_richedit1.SetSel(1, 5); //设置处理区域
            m_richedit1.SetSelectionCharFormat(cf);
    }但卻有這個錯誤信息:
    f:\times\timedlg.cpp(76) : error C2039: “SetEventMask”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员
    1>        with
    1>        [
    1>            BaseType=char,
    1>            StringTraits=StrTraitMFC<char>
    1>        ]
    1>f:\times\timedlg.cpp(459) : error C2039: “SetSel”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员
    1>        with
    1>        [
    1>            BaseType=char,
    1>            StringTraits=StrTraitMFC<char>
    1>        ]
    1>f:\times\timedlg.cpp(460) : error C2039: “SetSelectionCharFormat”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员
    1>        with
    1>        [
    1>            BaseType=char,
    1>            StringTraits=StrTraitMFC<char>
    1>        ]这又是哪里出错了呢?
      

  24.   


    我是這樣做的: 
    先在BOOL CTimeDlg::OnInitDialog()中添加“DispR.SetEventMask(ENM_CHANGE);” //"IDC_DispR"是我richedit2編輯框的ID 然後在 
          void CTimeDlg::OnEnChangeDispR() 

          CHARFORMAT cf; 
            ZeroMemory(&cf, sizeof(CHARFORMAT)); 
            cf.cbSize = sizeof(CHARFORMAT); 
            cf.dwMask = CFM_BOLD ¦ CFM_COLOR ¦ CFM_FACE ¦ 
                                CFM_ITALIC ¦ CFM_SIZE ¦ CFM_UNDERLINE; 
            cf.dwEffects = 0; 
            cf.yHeight = 12*12;//文字高度 
            cf.crTextColor = RGB(200, 100, 255); //文字颜色 
            strcpy(cf.szFaceName ,_T("隶书"));//设置字体 
        
            m_richedit1.SetSel(1, 5); //设置处理区域 
            m_richedit1.SetSelectionCharFormat(cf); 
    } 但卻有這個錯誤信息: 
    f:\times\timedlg.cpp(76) : error C2039: “SetEventMask”: 不是“ATL::CStringT <BaseType,StringTraits>”的成员 
    1>        with 
    1>        [ 
    1>            BaseType=char, 
    1>            StringTraits=StrTraitMFC <char> 
    1>        ] 
    1>f:\times\timedlg.cpp(459) : error C2039: “SetSel”: 不是“ATL::CStringT <BaseType,StringTraits>”的成员 
    1>        with 
    1>        [ 
    1>            BaseType=char, 
    1>            StringTraits=StrTraitMFC <char> 
    1>        ] 
    1>f:\times\timedlg.cpp(460) : error C2039: “SetSelectionCharFormat”: 不是“ATL::CStringT <BaseType,StringTraits>”的成员 
    1>        with 
    1>        [ 
    1>            BaseType=char, 
    1>            StringTraits=StrTraitMFC <char> 
    1>        ] 这又是哪里出错了呢? 
      

  25.   

    你可以定义一个自己的类如CMyPicture,从CStatic派生,设置你的位图类型为CMyPicture。
    在CMyPicture::OnLButtonDown(UINT nFlags, CPoint point)中判断Ctrl+Alt是否按下就行了。
      

  26.   


    你好,能再将具体点吗?
    你说的位图类型是属性中的“Type”吗?这个好像不能改?
      

  27.   

    冲在OnCtrlColor
            //根据ID设置颜色颜色
    if (pWnd->GetDlgCtrlID()==IDC_TIPINFO) 
    {
    pDC->SetTextColor(RGB(0,100,0));
            }
      

  28.   

    lz我下面的代码实现了你的“如何使位图对按键和鼠标产生响应”的功能:
    BOOL CDD::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if (pMsg->message == WM_KEYDOWN)  

      if (GetAsyncKeyState(VK_CONTROL)<0 && GetAsyncKeyState(VK_MENU)<0) 
      keypress = true; 
      else 
      keypress = false;  

    return CDialog::PreTranslateMessage(pMsg);
    }void CDD::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default

    if(keypress)

    {
      CRect rect;
      LPPOINT pt;
      m_image.GetWindowRect(&rect); //获得图片的大小
      ScreenToClient(&rect);
      ::GetCursorPos(pt);     //获得鼠标的位置
        if(rect.PtInRect(point))  //判断鼠标是否是在图片里面
    {
      CDialog2 dlg2;
      dlg2.DoModal();
      keypress=false;
    }
    }

    CDialog::OnLButtonDown(nFlags, point);
    }我试验过了,这种方法可以实现你的要求~~~
    你试一下
      

  29.   

    补充:
    首先:你要把将static控件ID设置为IDC_STATIC1;
    其次:m_image为用类向导添加的控制变量
      

  30.   

    我相信你的可以,但可能是我代码其它地方出了问题,导致位图怎么样都不作出任何响应,即使最简单的MessageBox()都没反应!
    我也看不出是哪里出了问题,不过十分感谢你和其他诸位的帮助!