VC窗體透明而控件不透明以及Static文本背景透明方法


出自http://my.oschina.net/ypimgt/blog/60951

優點:
    1.Dialog 窗體完全透明。 
    2. 窗體上的控件不透明、 DC 繪制的圖形不透明。 
    3. 拖動窗體上用 DC 繪制的圖形可以移動窗體。 
缺點: 
    1. 窗體設置透明使用是掩碼顏色,所以在窗體上用 DC 繪圖的過程當中如果采用了和透明掩碼顏色相同的顏色將不會顯示出來。 
    2. 如果將 Border 屬性設置成了 NONE ,那么想通過響應 WM_NCHITEST 消息來實現窗體拖動就無法完成了。只能通過在窗體中增加 DC 繪圖的方式來完成。 

    3.DC繪圖時雖然支持半透明繪圖,但是透明繪圖區域不透明。

1.在OnInitDialog()或OnPaint()中加入:

1
2
3
4
5
<b> COLORREF maskColor = RGB(255,255,255);   //掩碼顏色
SetWindowLong( this ->GetSafeHwnd(),
               GWL_EXSTYLE,
               GetWindowLong( this ->GetSafeHwnd(),GWL_EXSTYLE)| 0x80000);  //設定窗體使用擴展模式
SetLayeredWindowAttributes(maskColor,255,1);  </b>

 

2.在重載的消息WM_CTLCOLOR中加入:(其中包括Static背景透明方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<b> HBRUSH CTimeRemainDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
     HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
 
     // TODO:  在此更改 DC 的任何特性
     //
     if (nCtlColor == CTLCOLOR_DLG)   //此處設置為窗體透明,CTLCOLOR_DLG表示對話框
     {
         CBrush *brush;
         brush = new CBrush(RGB(255,255,255));
         return ( HBRUSH )(brush->m_hObject);
     }
     switch (pWnd->GetDlgCtrlID())   //此處為設置Static Text文本透明。
     {
     case IDC_LEFTTOP:
         pDC->SetBkMode(TRANSPARENT);
         pDC->SetTextColor(RGB(125,0,0));
         return ( HBRUSH )GetStockObject(HOLLOW_BRUSH);
     default : break ;
     }
     // TODO:  如果默認的不是所需畫筆,則返回另一個畫筆
     return hbr;
}</b>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM