日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

VS2010 MFC中控件、对话框等背景颜色动态修改的方法

發(fā)布時(shí)間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS2010 MFC中控件、对话框等背景颜色动态修改的方法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

通過(guò)類向?qū)?#xff0c;或者手動(dòng)添加消息:WM_CTLCOLOR,其消息響應(yīng)函數(shù)為:

afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  • 1
  • 2

在每個(gè)控件開(kāi)始繪制之前,都會(huì)向其父窗口發(fā)送WM_CTLCOLOR通告消息,在該消息的處理函數(shù)中,可以設(shè)置控件顯示文本的前景色、背景色以及字體。該消息處理函數(shù)還要求返回一個(gè)畫刷的句柄,用于在控件具體的繪制之前擦除其客戶區(qū)。當(dāng)窗口重繪時(shí),也會(huì)重新繪制每個(gè)控件,從而分別調(diào)用該函數(shù),這就給了動(dòng)態(tài)修改控件相關(guān)顏色特性的機(jī)會(huì)。

比如在對(duì)應(yīng)的控件下的OnCtrColor函數(shù)中寫入:

?
  • pDC->SetTextColor(RGB(255, 0, 0)); //設(shè)置文本前景色

  • pDC->SetBkColor(RGB(255, 255, 255)); //設(shè)置文本背景色

  • pDC->SetBkMode(TRANSPARENT); //TRANSPARENT或OPAQUE

  • pDC->SelectObject(...)

    • 1
    • 2
    • 3
    • 4
    • 5

    就可以實(shí)現(xiàn)修改某個(gè)控件的繪制屬性。具體的實(shí)現(xiàn)可以參考下面的一段代碼:

    ?
  • //

  • //m_font1與m_font2為CTestDlg的成員,類型為CFont

  • //

  • BOOL CTestDlg::OnInitDialog()

  • {

  • ......

  • // TODO: Add extra initialization here

  • m_font1.CreatePointFont(120, TEXT("Impact"));

  • m_font2.CreatePointFont(120, TEXT("Arial"));

  • ......

  • }

  • ?
  • HBRUSH CTestDlg::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_STATIC)

  • {

  • switch (pWnd->GetDlgCtrlID())

  • {

  • case IDC_STATIC_1:

  • pDC->SetTextColor(RGB(255, 0, 0));

  • pDC->SetBkColor(RGB(255, 255, 255));

  • pDC->SetBkMode(TRANSPARENT);

  • pDC->SelectObject(&m_font1);

  • return (HBRUSH)::GetStockObject(BLACK_BRUSH);

  • break;

  • case IDC_STATIC_2:

  • pDC->SetTextColor(RGB(255, 255, 0));

  • pDC->SetBkColor(RGB(255, 255, 255));

  • pDC->SelectObject(&m_font2);

  • return (HBRUSH)::GetStockObject(BLACK_BRUSH);

  • break;

  • default:

  • break;

  • }

  • }

  • ?
  • // TODO: Return a different brush if the default is not desired

  • return hbr;

  • }

  • ?

    當(dāng)然如果是修改dialog的屬性,可以直接在最后的return上返回一個(gè)畫刷,填充dialog的背景顏色。

    上面這種方法只是一種靜態(tài)的修改,因?yàn)樗械膶傩远际且淮涡栽O(shè)定好了,似乎沒(méi)有根據(jù)情況進(jìn)行改變的可能。這個(gè)是時(shí)候就要用到上面所提到的一種方法:強(qiáng)迫窗口重繪,可用的函數(shù)有Invalidate()和UpdateWindow(),兩者的區(qū)別如下:

    Invalidate在消息隊(duì)列中加入一條WM_PAINT消息,其無(wú)效區(qū)為整個(gè)客戶區(qū)。而UpdateWindow直接發(fā)送一個(gè)WM_PAINT消息,其無(wú)效區(qū)范圍就是消息隊(duì)列中WM_PAINT消息(最多只有一條)的無(wú)效區(qū)。效果很明顯,調(diào)用Invalidate之后,屏幕不一定馬上更新,因?yàn)閃M_PAINT消息不一定在隊(duì)列頭部,而調(diào)用UpdateWindow會(huì)使WM_PAINT消息馬上執(zhí)行的,繞過(guò)了消息隊(duì)列。如果你調(diào)用Invalidate之后想馬上更新屏幕,那就加上UpdateWindow()這條語(yǔ)句。

    那么剩下的事情就比較簡(jiǎn)單了,可以通過(guò)設(shè)置一個(gè)COLORREF m_BrushColor;的成員變量,在調(diào)用窗口重繪的函數(shù)之前,修改m_BrushColor,然后在OnCtlColor函數(shù)中將畫刷的顏色創(chuàng)建為該m_BrushColor:

    ?
  • m_bkBrush.DeleteObject();

  • m_bkBrush.CreateSolidBrush(m_BrushColor); //創(chuàng)建一把黃色的背景刷子

  • ?

    下面是我所修改的函數(shù):

    ?
  • HBRUSH ChandControllerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

  • {

  • HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

  • ?
  • // TODO: 在此更改 DC 的任何特性

  • if((CTLCOLOR_SCROLLBAR)&&(pWnd->GetDlgCtrlID()==IDC_SLIDER1 || pWnd->GetDlgCtrlID()==IDC_SLIDER2))

  • {

  • ?
  • //此處設(shè)置背景的顏色

  • m_bkBrush.DeleteObject();

  • m_bkBrush.CreateSolidBrush(RGB(0,255,0)); //創(chuàng)建一把黃色的背景刷子

  • return m_bkBrush;

  • }

  • ?
  • if((CTLCOLOR_BTN)&&(pWnd->GetDlgCtrlID()==IDOK))

  • {

  • m_bkBrush.DeleteObject();

  • m_bkBrush.CreateSolidBrush(RGB(0,255,0)); //創(chuàng)建一把黃色的背景刷子

  • return m_bkBrush;

  • }

  • m_bkBrush.DeleteObject();

  • m_bkBrush.CreateSolidBrush(m_BrushColor); //創(chuàng)建一把黃色的背景刷子

  • ?
  • // TODO: 如果默認(rèn)的不是所需畫筆,則返回另一個(gè)畫筆

  • return m_bkBrush;

  • }

  • 通過(guò)上面的函數(shù),可以實(shí)現(xiàn)對(duì)對(duì)話框中的控件或者對(duì)話框的背景顏色進(jìn)行動(dòng)態(tài)修改

  • 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的VS2010 MFC中控件、对话框等背景颜色动态修改的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。