MFC中CStatic控件动态改变
?我現在需要一個靜態控件,當鼠標放上去時字體與顏色都要改變,當鼠標離開時在變回來。
現在可以改變字體,但是改變字的顏色還不行。我去網上搜了一下,兩種方法,一個在父窗口中相應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
}
可以使用消息反射在控件自身處理消息,比如WM_CTLCOLOR。
這個問題第1個回答:
這個問題第2個回答:
其實你并不需要在OnMouseMove里做主動刷新的事情,當鼠標移動到控件上的時候系統會自動重畫該控件的。而且調用Invaliadate也應該注意,如果要一個控件Invaliadate,不論你調用多少次,系統都只按照最后一次調用來進行重畫,所以調用的多并不一定能得到期望的效果。
樓主要做顏色變換的,最簡單的嘛就是重載DrawItem,根據它的參數LPDRAWITEMSTRUCT,可以得到當前控件的狀態,根據不同的狀態去做不同的繪畫的動作咯。
這個問題第3個回答:
??ls說的正確,可以通過重寫DrawItem函數。
總結
以上是生活随笔為你收集整理的MFC中CStatic控件动态改变的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于MFC SDI的图像处理程序(带效果
- 下一篇: 在MFC中创建动态控件的生成与响应