//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);
}
是指鼠标松开时不能还原?WM_LBUTTONUP你什么也没处理呀.
lz好用功啊!另外 楼主要让控件改变字体颜色 最好重写一个类在pretranslatemessage处理显得臃肿
这种情况下最好是从CButton派生
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";
}
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);
别的代码 不要
{
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");//
}
}
}
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;
}
所谓的热点,简单的理解就是 根据鼠标和按钮的位置关系(外加鼠标操作),来绘制按钮的外观。这种情况,最好的方法就是从CButton派生一个按钮类,通过重载CButton基类的DrawItem虚函数,根据鼠标和按钮的位置关系绘制按钮的外观(包括按钮显示的文字字体,文字颜色等等)
1、重载PreSubclassWindow虚函数,在该虚函数中设置定时器(SetTimer(1,20,NULL),时间间隔为20毫秒左右,不能太长,太长的话后果很严重,LZ自己领悟去)
2、需要处理按钮的WM_ERASEBKGND事件,在该事件的处理函数中需要禁止调用基类方法重绘按钮,具体的做法就是直接return掉