動(dòng)態(tài)改變Dialog中IDC_STATIC的文字:
SetDlgItemText(IDC_STATIC,"ABC");
動(dòng)態(tài)改變Dialog中IDC_STATIC文字的顏色:
重載OnCtlColor函數(shù),在要更改顏色的時(shí)候向?qū)υ捒虬l(fā)送WM_CTLCOLOR就行了。
1.在對(duì)話框的類中加入成員:
CBrush m_brush;
COLORREF m_color;
2.在OnInitDialog()中,加入
m_brush.CreateSolidBrush(RGB(255,255,255));
//此處設(shè)置的RGB值可以改變控件的背景色。
m_color=RGB(0,0,0)
//此處設(shè)置控件的文字初始顏色。
3.響應(yīng)WM_ONCTLCOLOR消息,重載OnCtlColor()函數(shù),加入:
if(nCtlColor== CTLCOLOR_STATIC){
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_color);
return (HBRUSH)m_brush.GetSafeHandle();
}
4.需要改變顏色時(shí)
m_color=RGB(128,0,255);//此處改變字體的顏色
CStatic* m_pStatic1=(CStatic*)GetDlgItem(IDC_STATIC1);
m_pStatic1->RedrawWindow();
關(guān)于控件背景和字體顏色設(shè)置的疑惑,只要70分,一問(wèn)題35分
qiangv (說(shuō)完就走) 2005-03-05 20:15:15 在 VC/MFC / 界面 提問(wèn)如一個(gè)dialog中有一button,一edit控件
1。把dialog畫(huà)出來(lái)是發(fā)生在initinstance之后么,每個(gè)控件都是一個(gè)窗口
他們的回調(diào)函數(shù)都是AfxWinPro()
有一個(gè)函數(shù)OnCtlColor是響應(yīng)畫(huà)出來(lái)這個(gè)消息的么?能不能把發(fā)生的流程說(shuō)出來(lái)。
2。還有改變button按鈕的背景色和前景色為什么要新建一個(gè)類,而不能在onctlcolor中改變呢
ownerdraw是什么意思,什么時(shí)候發(fā)生呢?
問(wèn)題點(diǎn)數(shù):70、回復(fù)次數(shù):3
1、OnCtlColor是響應(yīng)WM_CTLCOLOR消息的函數(shù)。當(dāng)子控件將要被繪制的時(shí)候,就會(huì)發(fā)送一個(gè)WM_CTLCOLOR消息給它的父窗口(通常是對(duì)話框),父窗口準(zhǔn)備正確的顏色來(lái)繪制子窗口。在一個(gè)對(duì)話框中,每一個(gè)控件的繪制都會(huì)發(fā)送這個(gè)消息,也就是說(shuō)這個(gè)OnCtlColor函數(shù)會(huì)被調(diào)用多次。OnCtlColor是一個(gè)虛函數(shù),在沒(méi)有被覆蓋之前,直接調(diào)用父類的OnCtlColor函數(shù),返回一個(gè)畫(huà)刷句柄,并用這個(gè)返回的畫(huà)刷句柄去繪制這個(gè)控件。因此,我們可以在這個(gè)函數(shù)中來(lái)設(shè)置控件的背景和控件上文字的顏色、文字字體及文字的背景色,但是對(duì)于Button控件,卻不能直接來(lái)改變背景顏色。
2、Button是一種自繪制控件,在自繪制之前就會(huì)調(diào)用一個(gè)虛函數(shù)CButton;;DrawItem(),因此,要想改變Button的背景及字體,就要定義一個(gè)Button類從CButton派生出來(lái),并且覆蓋DrawItem(),則當(dāng)要繪制這個(gè)按鈕的時(shí)候,框架就會(huì)調(diào)用這個(gè)函數(shù)。來(lái)改變Button的背景顏色和字體,此外,還要設(shè)置控件的ownerdraw屬性.
MSDN上有查過(guò)...有一點(diǎn)不明白
所謂自繪是不是它有自己的ondraw函數(shù)?
它的WM_CTLCOLOR消息不是一樣送到和別的控件一樣的回調(diào)函數(shù)里去么?
它也繼承了CWND
應(yīng)該也有OnCtlColor函數(shù)的呀
1.還有改變button按鈕的背景色和前景色為什么要新建一個(gè)類,而不能在onctlcolor中改變呢
ownerdraw是什么意思,什么時(shí)候發(fā)生呢?
因?yàn)樵谒厦尜N了一層用于顯示標(biāo)題或貼圖.
要改變對(duì)話框的一般顏色,可以在C***App的InitInstance函數(shù)里加入如下代碼:SetDialogBkColor(RGB(0,255,255),RGB(255,0,0));//背景青藍(lán)、文字紅色
但是這樣不能改變對(duì)話框中的圖形控件的顏色;
每個(gè)控件在dialog中都是一個(gè)窗口,當(dāng)要繪制控件時(shí),會(huì)發(fā)出一個(gè)WM_CTLCOLOR消息給它的父窗口(對(duì)話框本身).消息映射及響應(yīng)函數(shù)如下:
ON_WM_CRLCOLOR() //反映WM_CTLCOLOR消息
afx_msg HBRUSH CWnd::OnCrlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor);
//
nCtlColor類型:
CTLCOLOR_DLG對(duì)話框本身,不含有所有的控件
CTLCOLOR_STATIC 所有包含static text控件的設(shè)置(也包括無(wú)效的edit box、combo box的eidt box)
CTLCOLOR_EDIT edit box與combo box的eidt box部分
CTLCOLOR_LIST list box與combo box的edit box部分
CTLCOLOR_SCROLLBAR Scroll bar的空白區(qū)
我們也可以單獨(dú)改變某一個(gè)控件的顏色.OnCtrlColor函數(shù)的pWnd成員變量是各控件的窗口指針,以pWnd->GetDlgCtrlID()可以獲得調(diào)用此函數(shù)的控件ID,將它與已知ID比較,就可以改變這個(gè)控件的顏色。
if(pWnd->GetDlgCtrlID() ==IDC_CONTROL)//為控件的ID
{
//pDC->SetBkColor(RGB(255, 0, 0)); -----------在這里也用上了這種寫(xiě)法。不行的,
}
另外一個(gè)作法是比較pWnd;例如:如果一個(gè)edit box控件的成員變量m_edit1被聲明為CEdit類,那么把m_edit1.m_hWnd與pWnd->m_hWnd比較,也可以知道是哪個(gè)控件.
下面是一個(gè)例子:
HBRUSH CDIALOGDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Change any attributes of the DC here
if(nCtlColor==CTLCOLOR_EDIT)
pDC->SetTextColor(RGB(0,0,255));
if(nCtlColor== CTLCOLOR_LISTBOX)
{
HBRUSH m_hbrush;
m_hbrush=CreateSolidBrush(RGB(0,0,0));
pDC->SetBkMode(TRANSPARENT);
//設(shè)置字體顏色
pDC->SetTextColor(RGB(255,255,255));
return m_hbrush;
}
CBrush m_cBrush;
m_cBrush.CreateSolidBrush(RGB(0,255,255));
switch(nCtlColor)
{
case CTLCOLOR_DLG:
pDC->SetBkMode(TRANSPARENT);
break;
case CTLCOLOR_STATIC:
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(0,255,255));
break;
}
DeleteObject(m_cBrush);
// TODO: Return a different brush if the default is not desired
return hbr;