//teackmouseevent怎么不行?
BOOL loginDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(pMsg->message == WM_MOUSEMOVE)
{
if(pMsg->hwnd == button.m_hWnd)
{
 RECT rect = {0};
 rect.left = 20;
 rect.right = 20;
 if (!tracking)//全局变量tracking=false
    {
 TRACKMOUSEEVENT t = {
                sizeof(TRACKMOUSEEVENT),
                TME_LEAVE,
                m_hWnd,
                0
            };
            if (::_TrackMouseEvent(&t)){
                tracking = true;
button.SetText(&rect,textfont,RGB(146,206,209),DT_LEFT|DT_VCENTER|DT_SINGLELINE);
                //Invalidate();
            }
}
   
  
} }
if(pMsg->message == WM_MOUSELEAVE)
{
if(pMsg->hwnd == button.m_hWnd)
{
 RECT rect = {0};
 rect.left = 20;
 rect.right = 20;
 tracking = false;
 button.SetText(&rect,textfont,RGB(10,10,10),DT_LEFT|DT_VCENTER|DT_SINGLELINE);

}

}
if(pMsg->message == WM_LBUTTONDOWN)
{
   if (!tracking)
       {
TRACKMOUSEEVENT t = {
sizeof(TRACKMOUSEEVENT),
TME_LEAVE,
m_hWnd,
0
};
if (::_TrackMouseEvent(&t)){
tracking = true;
Invalidate();
}
}
}
if(pMsg->message == WM_LBUTTONUP)
{

}
return CDialog::PreTranslateMessage(pMsg);
}

解决方案 »

  1.   

    没弄明白楼主的问题是什么.
    是指鼠标松开时不能还原?WM_LBUTTONUP你什么也没处理呀.
      

  2.   

     02:41:16 
    lz好用功啊!另外 楼主要让控件改变字体颜色 最好重写一个类在pretranslatemessage处理显得臃肿
      

  3.   

    TRACKMOUSEEVENT t = {sizeof(TRACKMOUSEEVENT),TME_LEAVE,m_Button.m_hWnd,0};更踪 窗口 错了 !
      

  4.   

    你的 代码 vc6 上 测试过 ,可以 enter 和 leave ,你说不行 是 什么 不行?
      

  5.   

    LZ 的意思,不就是按钮的热点效果嘛
    这种情况下最好是从CButton派生
      

  6.   

    不明白 目的。给一个 检测 点 在 按钮内 否的 代码:
    if(pMsg->message == WM_LBUTTONUP)
    {
    CPoint pt;
    GetCursorPos(&pt);
    CRect btrc;
    m_Button.GetWindowRect(&btrc);
    if(btrc.PtInRect(pt))
    afxDump << pt << "\n";
    else
    afxDump << "Out Button\n";
    }
      

  7.   

    ”是不是鼠标按下, 如果在 内部 up 则 变色,如果 在 外部 up 不变色“?
      

  8.   

    如果是,则:
    if(pMsg->message == WM_LBUTTONUP)
    {
    if(pMsg->hwnd == m_Button.m_hWnd)
    {
    CPoint pt;
    GetCursorPos(&pt);
    CRect btrc;
    m_Button.GetWindowRect(&btrc);
    if(btrc.PtInRect(pt))
    m_Button.SetWindowText("xixi");//
    else
    m_Button.SetWindowText("Button");//
    }
    }
    return CDialog::PreTranslateMessage(pMsg);
    别的代码 不要
      

  9.   

    但是,我按下鼠标要有一个字体变色的效果的//只能使用TRACKMOUSEEVENT来跟踪呀  
      

  10.   

    if(pMsg->message == WM_LBUTTONDOWN)
    {
    if(pMsg->hwnd == m_Button.m_hWnd)
    {
    m_pOldFont=m_Button.GetFont();// CFont *
    m_Button.SetFont(m_pFont);
    }
    }
    //
    if(pMsg->message == WM_LBUTTONUP)
    {
    if(pMsg->hwnd == m_Button.m_hWnd)
    {
    CPoint pt;
    GetCursorPos(&pt);
    CRect btrc;
    m_Button.GetWindowRect(&btrc);
    if(btrc.PtInRect(pt))
    {
    m_Button.SetWindowText("xixi");//
    }
    else
    {
    m_Button.SetFont(m_pOldFont);
    m_Button.SetWindowText("Button");//
    }
    }
    }
      

  11.   

    Font 如下://
    m_pFont=NULL;
    // create a font
    LOGFONT  lf;
    memset(&lf,0,sizeof(LOGFONT));
    strcpy(lf.lfFaceName,"Courier");
    m_pFont=new CFont;
    if(!m_pFont->CreateFontIndirect(&lf)) 
    {// create err 
    m_pFont=NULL;
    }
      

  12.   


    所谓的热点,简单的理解就是 根据鼠标和按钮的位置关系(外加鼠标操作),来绘制按钮的外观。这种情况,最好的方法就是从CButton派生一个按钮类,通过重载CButton基类的DrawItem虚函数,根据鼠标和按钮的位置关系绘制按钮的外观(包括按钮显示的文字字体,文字颜色等等)
      

  13.   

    另外,判断鼠标和按钮的位置关系 的方法是设置一个定时器,每隔一段时间来扫描一下,即:通过鼠标当前位置(GetCursorPos)和按钮区域(GetWindowRect)的位置关系和鼠标操作事件来确定 各种状态,你只需要在DrawItem中判断不同的状态 来绘制按钮外观即可PS:
    1、重载PreSubclassWindow虚函数,在该虚函数中设置定时器(SetTimer(1,20,NULL),时间间隔为20毫秒左右,不能太长,太长的话后果很严重,LZ自己领悟去)
    2、需要处理按钮的WM_ERASEBKGND事件,在该事件的处理函数中需要禁止调用基类方法重绘按钮,具体的做法就是直接return掉