我现在需要一个静态控件,当鼠标放上去时字体与颜色都要改变,当鼠标离开时在变回来。
现在可以改变字体,但是改变字的颜色还不行。我去网上搜了一下,两种方法,一个在父窗口中相应onctlcolor消息,但是我想在类的内部解决问题,所以不想用这个办法。二就是重写onpain函数。但是,我重写了之后,在OnMouseOver函数中用Invaliadate控件并不会刷新,也就是当鼠标放上去时没有变化。
麻烦各位帮忙看看
void MyCstatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// 改变字体
CStatic::OnMouseMove(nFlags, point);
static bool IsChanged = false;
CFont* cf=new CFont();
CWnd* ptrPrevWnd = NULL;
CRect rect;
if(!IsChanged){//还没改变,鼠标进入
IsChanged = true;
m_pOldFont = this->GetFont();
cf->CreatePointFont(120,"隶书");
m_pCurFont = cf;
m_hCurTextColor = RGB(255,0,0);
ptrPrevWnd = SetCapture();
Invalidate(FALSE);
this->RedrawWindow();
this->SendMessage(WM_PAINT,0,0);
}
else{
GetClientRect(rect);
if(!rect.PtInRect(point)){
IsChanged = false;
this->SetFont(m_pOldFont);
ReleaseCapture();
}
}
}void MyCstatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
m_hOldTextColor = dc.SetTextColor(m_hCurTextColor);
MessageBox("OnPaint","paint");
CString str;
this->GetWindowText(str);
CRect rect;
this->GetClientRect(rect);
dc.SelectObject(m_pCurFont);
dc.SetBkMode(TRANSPARENT);
dc.DrawText(str,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
// Do not call CStatic::OnPaint() for painting messages
}
现在可以改变字体,但是改变字的颜色还不行。我去网上搜了一下,两种方法,一个在父窗口中相应onctlcolor消息,但是我想在类的内部解决问题,所以不想用这个办法。二就是重写onpain函数。但是,我重写了之后,在OnMouseOver函数中用Invaliadate控件并不会刷新,也就是当鼠标放上去时没有变化。
麻烦各位帮忙看看
void MyCstatic::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// 改变字体
CStatic::OnMouseMove(nFlags, point);
static bool IsChanged = false;
CFont* cf=new CFont();
CWnd* ptrPrevWnd = NULL;
CRect rect;
if(!IsChanged){//还没改变,鼠标进入
IsChanged = true;
m_pOldFont = this->GetFont();
cf->CreatePointFont(120,"隶书");
m_pCurFont = cf;
m_hCurTextColor = RGB(255,0,0);
ptrPrevWnd = SetCapture();
Invalidate(FALSE);
this->RedrawWindow();
this->SendMessage(WM_PAINT,0,0);
}
else{
GetClientRect(rect);
if(!rect.PtInRect(point)){
IsChanged = false;
this->SetFont(m_pOldFont);
ReleaseCapture();
}
}
}void MyCstatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
m_hOldTextColor = dc.SetTextColor(m_hCurTextColor);
MessageBox("OnPaint","paint");
CString str;
this->GetWindowText(str);
CRect rect;
this->GetClientRect(rect);
dc.SelectObject(m_pCurFont);
dc.SetBkMode(TRANSPARENT);
dc.DrawText(str,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
// Do not call CStatic::OnPaint() for painting messages
}
解决方案 »
- 启动程序时让选择主界面对话框,怎么去掉这个对话框?
- vc++2005中“使用Unicode字符集”和“使用多字节字符集”有什么区别?
- 如何在ScrollView中只滚动窗口的一部分?比如下半部分?
- 关于对话框的,其静态文本框的背景颜色和文本颜色的问题?
- 就是调用DLL不成功出现如下:error LNK2001: unresolved external symbol _WriteCode@32
- 大家写程序的时候听不听歌,都听哪些歌?
- 高分求救,有关非模式对话框隐藏的问题
- 虽然今天实现了一个月穿4条裤衩的目标,但是还是很不爽,散分。
- 请问大家,如果我想把一个目录下的所有文件(和子目录)都用一个软件管理起来
- 问过千遍,没人回答!!好失望、好痛苦
- 帮我看下这个函数GetWindowLong
- 如何在程序中用代码创建Oracle数据库?100分 未解决前长期有效
楼主要做颜色变换的,最简单的嘛就是重载DrawItem,根据它的参数LPDRAWITEMSTRUCT,可以得到当前控件的状态,根据不同的状态去做不同的绘画的动作咯。