zoukankan      html  css  js  c++  java
  • 5.静态控件背景透明化

    一、静态控件透明化

      前面我们介绍过,通过WM_CTLCOLORDLG消息来设置对话框背景,还有消息来设置其他控件得背景:

        WM_CTLCOLORBTN - 按钮

        WM_CTLCOLOREDIT - 编辑框

        WM_CTLCOLORLISTBOX - 列表框

        WM_CTLCOLORSCROLLBAR - 滚动条

        WM_CTLCOLORSTATIC - 静态框

    二、具体事例 - 静态框

      通过在WM_CTLCOLORSTATIC消息中,返回一个空画刷达到背景透明化的要求。

      设置背景透明:

        int  SetBkMode ( HDC hdc,  int iBkMode );

      代码: 

     1 #include "stdafx.h"
     2 #include "05静态控件背景透明化.h"
     3 
     4 WCHAR szDlgTitle[] = L"静态控件背景透明化";
     5 
     6 BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
     7 {
     8     RECT rcDialog;
     9     HBITMAP hBitmap;
    10     static BITMAP s_bm;
    11     static HDC s_hdcMem;
    12     switch (message)
    13     {
    14     case WM_INITDIALOG:
    15         SetWindowText(hWnd, szDlgTitle);
    16         SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) | WS_SIZEBOX);
    17         // 加载背影图片
    18         hBitmap = (HBITMAP)LoadImage(NULL, L"006.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    19         if (hBitmap == NULL)
    20         {
    21             MessageBox(hWnd, L"LoadImage failed", L"Error", MB_ICONERROR);
    22             exit(0);
    23         }
    24         else
    25         {
    26             // 将背影图片放入HDC - s_hdcMem
    27             HDC hdc;
    28             hdc = GetDC(hWnd);
    29             s_hdcMem = CreateCompatibleDC(hdc);
    30             SelectObject(s_hdcMem, hBitmap);
    31             ReleaseDC(hWnd, hdc);
    32             // 得到位图信息
    33             GetObject(hBitmap, sizeof(s_bm), &s_bm);
    34         }
    35         return 0;
    36     case WM_COMMAND:
    37         if (IDCANCEL == LOWORD(wParam))
    38         {
    39             DeleteDC(s_hdcMem);
    40             EndDialog(hWnd, LOWORD(wParam));
    41             return TRUE;
    42         }
    43         break;
    44     case WM_SIZE:
    45         InvalidateRect(hWnd, NULL, TRUE);
    46         return TRUE;
    47     case WM_CTLCOLORSTATIC:
    48         SetBkMode((HDC)wParam, TRANSPARENT);
    49         return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));
    50     case WM_CTLCOLORDLG:
    51         GetClientRect(hWnd, &rcDialog);
    52         //通过SetStretchBltMode的设置能使StretchBlt在缩放图像更加清晰
    53         SetStretchBltMode((HDC)wParam, COLORONCOLOR);
    54         StretchBlt((HDC)wParam, 0, 0, rcDialog.right, rcDialog.bottom, s_hdcMem, 0, 0, s_bm.bmWidth, s_bm.bmHeight, SRCCOPY);
    55         return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));
    56     }
    57     return FALSE;
    58 }
    59 
    60 int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
    61 {
    62     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    63     return 0;
    64 }

      运行结果:

                                                  

                                             未处理WM_CTLCOLORSTATIC消息                                                                         处理WM_CTLCOLORSTATIC消息

    三、继续优化

      静态框的背景已经透明化了,但是组合框的文字是被白色得边框划过的,很不美观。要解决这个问题,我们用位图画刷,在WM_CTLCOLORSTATIC消息中返回一个位图画刷。

      代码: 

     1 #include "stdafx.h"
     2 #include "05静态控件背景透明化.h"
     3 
     4 WCHAR szDlgTitle[] = L"静态控件背景透明化";
     5 
     6 BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
     7 {
     8     static HBRUSH s_hBitmapBrush; //位图画刷  
     9     switch (message)
    10     {
    11     case WM_INITDIALOG: 
    12         SetWindowText(hWnd, szDlgTitle);
    13         SetWindowLong(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) | WS_SIZEBOX);
    14         // 加载背影图片  
    15         HBITMAP hBitmap;
    16         hBitmap = (HBITMAP)LoadImage(NULL, L"006.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    17         if (hBitmap == NULL)
    18         {
    19             MessageBox(hWnd, L"LoadImage failed", L"Error", MB_ICONERROR);
    20             exit(0);
    21         }
    22         // 创建位图画刷  
    23         s_hBitmapBrush = CreatePatternBrush(hBitmap);
    24         return 0;
    25     case WM_COMMAND:
    26         if (IDCANCEL == LOWORD(wParam))
    27         {
    28             DeleteObject(s_hBitmapBrush);
    29             EndDialog(hWnd, LOWORD(wParam));
    30             return TRUE;
    31         }
    32         break;
    33     case WM_CTLCOLORSTATIC:
    34         SetBkMode((HDC)wParam, TRANSPARENT);
    35     case WM_CTLCOLORDLG:
    36         return (BOOL)s_hBitmapBrush;
    37     }
    38     return FALSE;
    39 }
    40 int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
    41 {
    42     DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    43     return 0;
    44 }

      运行结果:

                         

  • 相关阅读:
    Hive sql
    Hive严格模式
    Hive 分区表和分桶表
    hive
    Hive内部表与外部表区别详解
    HDFS
    Hadoop
    MySQL数据库优化
    Mysql常用存储引擎介绍
    Day12-Mysql服务日志类型及增量恢复命令
  • 原文地址:https://www.cnblogs.com/csqtech/p/5982996.html
Copyright © 2011-2022 走看看