2000-01-30 00:00
·yesky
提要:
在vc程式設計中要改變控制項(諸如cview, cframewnd, or cwnd等)的背景色可通過處理特定的訊息來實現。但如果想改變按鈕的顏色,就只能使用自繪製的按鈕(也可以用位圖按鈕,此處未做說明)而不能通過onctlcolor()改變。
正文:
一、在乙個mfc應用程式中,要改變控制項的背景色可通過過載onctlcolor()函式來實現。方法是在該函式中設定所需顏色後再返回乙個畫刷控制代碼便可重繪控制項背景色。onctlcolor()函式對於控制項背景色的處理是通過捕捉相應的控制項訊息來實現的。常用的此類訊息有:
ctlcolor_dlg 對話方塊
ctlcolor_edit 編輯框
ctlcolor_listbox 列表框
ctlcolor_msgbox 訊息框
ctlcolor_scrollbar 滑動條
ctlcolor_static 靜態文字框、矩形等。
以下示例**說明如何更改以上控制項的背景色:
定義 class cmydialog : public cdialog //派生自己的對話方塊類
// implementation
protected:
// generated message map functions
//}afx_msg
declare_message_map()
定義hbrush cmydialog::onctlcolor(cdc* pdc, cwnd* pwnd, uint nctlcolor)
switch (nctlcolor)
colorref getbgcolor()
private:
colorref m_fg, m_bg;
#endif
第二步:定義各函式
// ccolorbutton
implement_dynamic(ccolorbutton, cbutton)
ccolorbutton::ccolorbutton()
ccolorbutton::~ccolorbutton()
//定義attach()函式
bool ccolorbutton::attach(const uint nid, cwnd* pparent, const colorref bgcolor, const colorref fgcolor)
if (!subclassdlgitem(nid, pparent))
return false;
m_fg = fgcolor;
m_bg = bgcolor;
return true;
//過載drawitem()
void ccolorbutton::drawitem(lpdrawitemstruct lpdis)
cdc* pdc = cdc::fromhandle(lpdis->hdc);
uint state = lpdis->itemstate;
crect focusrect, btnrect;
focusrect.copyrect(&lpdis->rcitem); //按紐的選中虛線框
btnrect.copyrect(&lpdis->rcitem);
// 設定表示按紐被選中的虛線框
focusrect.left += 4;
focusrect.right -= 4;
focusrect.top += 4;
focusrect.bottom -= 4;
// 按紐標題
const int bufsize = 512;
tchar buffer[bufsize];
getwindowtext(buffer, bufsize);
// 繪製並標誌按紐
drawfilledrect(pdc, btnrect, getbgcolor());
drawframe(pdc, btnrect);
drawbuttontext(pdc, btnrect, buffer, getfgcolor());
// 如果按紐處於選中狀態則在其上繪製選中虛線框
if (state & ods_focus) {
drawfocusrect(lpdis->hdc, (lprect)&focusrect);
void ccolorbutton::drawframe(cdc *dc, crect r)
{ //繪製按紐,使用者通過定製該函式可實現不同形狀的按紐。
drawline(dc, r.left, r.top, r.right, r.top, rgb(255, 255, 255));
drawline(dc, r.left, r.top, r.left, r.bottom, rgb(255, 255, 255));
//以下繪製按紐的外圍框線以使按紐有立體感
drawline(dc, r.left + 1, r.bottom - 1, r.right, r.bottom - 1, rgb(1, 1, 1));
//繪製按紐左框線和上框線
drawline(dc, r.right - 1, r.top + 1, r.right - 1, r.bottom, rgb(1, 1, 1));
//繪製按紐右框線和下框線
//用色彩填充按紐框
void ccolorbutton::drawfilledrect(cdc *dc, crect r, colorref color)
cbrush b;
b.createsolidbrush(color);
dc->fillrect(r, &b);
// drawline用於繪製按紐,其為多態函式
void ccolorbutton::drawline(cdc *dc, crect endpoints, colorref color)
void ccolorbutton::drawline(cdc *dc, long left, long top, long right, long bottom, colorref color)
//繪製按紐文字
void ccolorbutton::drawbuttontext(cdc *dc, crect r, const char *buf, colorref textcolor)
colorref prevcolor = dc->settextcolor(textcolor);
dc->setbkmode(transparent);
dc->drawtext(buf, strlen(buf), r, dt_center|dt_vcenter|dt_singleline);
dc->settextcolor(prevcolor);
第三步:引用定製類
定製任意對話方塊ccolordlg,在其上畫一按鍵控制項。id為idok。
class ccolordlg : public cdialog
// implementation
protected:
ccolorbutton m_btnok;
bool ccolorbtnsampledlg::oninitdialog()
cdialog::oninitdialog();
verify(m_btnok.attach(idok, this, red, blue, yellow));
改變TreeView控制項的背景色
private declare function sendmessage lib user32 alias sendmessagea byval hwnd as long,byval wmsg as long,byval wparam as long,lparam as long as long p...
vc 設定控制項的背景色
過載onctlcolor函式,這個是必須的 設定控制項的背景顏色 第一 afx msg hbrush onctlcolor cdc pdc,cwnd pwnd,uint nctlcolor 在標頭檔案中宣告 在主檔案中 第二 begin message map cok1dlg,cdialog afx...
如何改變TabCtrl的背景色
最近在實現乙個設定介面時用到了tabctrl,用系統自帶的控制項,碰到了乙個問題,在背景圖換成其他的顏色,這裡是指非color 3dface的顏色,比如背景換成淡藍色,我希望控制項的非tab的區域和非客戶區的區域顯示為背景一樣的顏色,但這在預設的控制項裡是做不到的。看了乙個codeproject裡的...