Windows介面編程第五篇 靜態控制項背景透明化

來源:互聯網
上載者:User

    上一篇《Windows介面編程第三篇 異形表單 普通版》和《Windows介面編程第四篇異形表單 高富帥版》介紹了異形視窗(異形表單)的建立,並總結出了異形視窗的“三要素”:

1.WS_EX_LAYERED屬性

2.指定透明色

3.以位元影像為視窗背景

 

    本篇文章將主要介紹Windows編程中如何?靜態控制項背景的透明化,這將進一步的美化介面。下面先看一張沒有做靜態控制項背景透明化的對話方塊程式的運行畫面,對話方塊的彩色圖片背景可以參考《Windows介面編程第一篇位元影像背景與位元影像畫刷》。

    可以看出靜態控制項的灰階背景在對話方塊的彩色圖片背景中顯得很不諧調,因此有必要對其美化一下。

    在第一篇《Windows介面編程第一篇位元影像背景與位元影像畫刷》中介紹了通過WM_CTLCOLORDLG訊息來設定對話方塊的背景,而在Windows系統中還有類似於WM_CTLCOLORDLG訊息的還有WM_CTLCOLORBTN,WM_CTLCOLOREDIT,WM_CTLCOLORLISTBOX,WM_CTLCOLORSCROLLBAR,WM_CTLCOLORSTATIC這五種來分別管理按鈕,編輯框,列表框,捲軸,靜態框。因此我們首先在WM_CTLCOLORSTATIC訊息中返回一個空畫刷看看能不能達到背景透明化的要求。另外對於文字地區的背景透明可以通過SetBkMode來設定。其函數原型如下:

int SetBkMode(

    HDC hdc,      // handle to DC

    int iBkMode   // background mode

);

這個函數的第二個參數設定為TRANSPARENT時就可以將文字地區的前景設定成透明。

 

下面給出完整的原始碼(:http://download.csdn.net/download/morewindows/4966826):

// 靜態控制項背景透明化WM_CTLCOLORSTATIC中返回空畫刷//By MoreWindows-(http://blog.csdn.net/MoreWindows)#include <windows.h>#include "resource.h"const char szDlgTitle[] = "靜態控制項背景透明化MoreWindows-(http://blog.csdn.net/MoreWindows)";// 對話方塊訊息處理函數BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);          int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR     lpCmdLine,                     int       nCmdShow){DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);return 0;}BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){RECT       rcDialog;HBITMAP    hBitmap;static BITMAP s_bm;static HDC    s_hdcMem;switch (message){case WM_INITDIALOG:// 設定對話方塊標題SetWindowText(hDlg, szDlgTitle);// 設定對話方塊大小可調節SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);// 載入背影圖片hBitmap = (HBITMAP)LoadImage(NULL, "006.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);if (hBitmap == NULL){MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);exit(0);}else{// 將背影圖片放入HDC - s_hdcMemHDC        hdc;hdc = GetDC(hDlg);s_hdcMem = CreateCompatibleDC(hdc);SelectObject(s_hdcMem, hBitmap);ReleaseDC(hDlg, hdc);// 得到位元影像資訊GetObject(hBitmap, sizeof(s_bm), &s_bm);}return 0;case WM_COMMAND:switch (LOWORD(wParam)){case IDCANCEL:DeleteDC(s_hdcMem);EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;case WM_SIZE:InvalidateRect(hDlg, NULL, TRUE);return TRUE; case WM_CTLCOLORSTATIC: SetBkMode((HDC)wParam, TRANSPARENT); return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));case WM_CTLCOLORDLG:GetClientRect(hDlg, &rcDialog);//通過SetStretchBltMode的設定能使StretchBlt在縮放映像更加清晰SetStretchBltMode((HDC)wParam, COLORONCOLOR);StretchBlt((HDC)wParam, 0, 0, rcDialog.right, rcDialog.bottom, s_hdcMem, 0, 0, s_bm.bmWidth, s_bm.bmHeight, SRCCOPY);return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));}return FALSE;}

這份代碼也是在《Windows介面編程第一篇位元影像背景與位元影像畫刷》文章的代碼上增加了

    case WM_CTLCOLORSTATIC:

             SetBkMode((HDC)wParam, TRANSPARENT);

             return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));

來達到靜態控制項背景透明化的效果的,程式運行效果如下:

 

由圖可以看出,雖然Static Text控制項的是達到了背景透明化的要求,但是Group Box控制項的標題文字的顯示卻顯得很不美觀。

 

要解決這一問題,可以試下位元影像畫刷,我們在WM_CTLCOLORSTATIC訊息中像WM_CTLCOLORDLG訊息一樣也返回一個位元影像畫刷來試試。

// 靜態控制項背景透明化- 在WM_CTLCOLORDLG返回視窗背景的位元影像畫刷//By MoreWindows-(http://blog.csdn.net/MoreWindows)#include <windows.h>#include "resource.h"const char szDlgTitle[] = "靜態控制項背景透明化MoreWindows-(http://blog.csdn.net/MoreWindows)";// 對話方塊訊息處理函數BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR     lpCmdLine, int       nCmdShow){DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);return 0;}BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){static HBRUSH    s_hBitmapBrush; //位元影像畫刷switch (message){case WM_INITDIALOG:// 設定對話方塊標題SetWindowText(hDlg, szDlgTitle);// 設定對話方塊大小可調節SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);// 載入背影圖片HBITMAP hBitmap;hBitmap = (HBITMAP)LoadImage(NULL, "006.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);if (hBitmap == NULL){MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);exit(0);}// 建立位元影像畫刷s_hBitmapBrush = CreatePatternBrush(hBitmap);return 0;case WM_COMMAND:switch (LOWORD(wParam)){case IDCANCEL:DeleteObject(s_hBitmapBrush);EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;case WM_CTLCOLORSTATIC:SetBkMode((HDC)wParam, TRANSPARENT);case WM_CTLCOLORDLG:return (BOOL)s_hBitmapBrush;}return FALSE;}

與上一個程式一樣,這個程式也只是在在《Windows介面編程第一篇位元影像背景與位元影像畫刷》文章的代碼上增加了

       case WM_CTLCOLORSTATIC:

              SetBkMode((HDC)wParam, TRANSPARENT);

來設定靜態控制項背景透明化,程式運行效果如下:

 

由圖可以看出,靜態控制項的透明化還是非常方便的,只要在WM_CTLCOLORSTATIC訊息中完成二個步驟即可:

1.通過SetBkMode((HDC)wParam, TRANSPARENT);來設定文字地區背景透明。

2.返回空畫刷或與父視窗相同的畫刷。

 

後面還陸續發布Windows介面編程方面的文章,更多Windows編程文章,請訪問http://blog.csdn.net/MoreWindows

本文配套程式為:http://download.csdn.net/download/morewindows/4966826

轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/8470452

歡迎關注微博:http://weibo.com/MoreWindows

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.