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 }

  运行结果:

                     

时间: 2025-01-02 18:43:00

5.静态控件背景透明化的相关文章

Windows界面编程第五篇 静态控件背景透明化

上一篇<Windows界面编程第三篇 异形窗体 普通版>和<Windows界面编程第四篇异形窗体 高富帅版>介绍了异形窗口(异形窗体)的创建,并总结出了异形窗口的"三要素": 1.WS_EX_LAYERED属性 2.指定透明色 3.以位图为窗口背景 本篇文章将主要介绍Windows编程中如何实现静态控件背景的透明化,这将进一步的美化界面.下面先看一张没有做静态控件背景透明化的对话框程序的运行画面,对话框的彩色图片背景可以参考<Windows界面编程第一篇位

Windows界面编程-背景图片、透明特效使用

Windows界面编程第一篇 位图背景与位图画刷 可以通过WM_CTLCOLORDLG消息来设置对话框的背景,MSDN上对这个消息的说明如下: The WM_CTLCOLORDLG message is sent to a dialog box before the system draws the dialog box. By responding to this message, the dialog box can set its text and background colors us

Windows界面编程第四篇 异形窗体(转)

原文转自 http://blog.csdn.net/morewindows/article/details/8451638 上一篇<Windows界面编程第三篇 异形窗体 普通版>介绍了异形窗口(异形窗体)的创建,其主要步骤为--先通过创建位图画刷来做窗口的背景画刷,再通过SetWindowLong为窗体加上WS_EX_LAYERED属性,然后使用SetLayeredWindowAttributes指定窗口的透明色来完成窗口形状的调整.并且为了使异形窗口支持鼠标的拖曳,在WM_LBUTTOND

SurfaceView类透明背景设置

将SurfaceView背景设置为透明,主要添加以下几句话就可以了: 在SurfaceView创建后设置一下下面的参数: setZOrderOnTop(true); getHolder().setFormat(PixelFormat.TRANSLUCENT); 还有在draw方法中绘制背景颜色的时候以下面的方式进行绘制就可以实现SurfaceView的背景透明化 canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR);

【GIMP学习】抠图方法二则

之前抠图都比较二,懒人我尝试过在线抠图软件.以及在线PS简易版,真的都很不好用,前者简单粗暴,后者我遇到各种储存不能的bug. 在ubuntu的环境下有一个功能可以和PS相媲美的功能强大图片处理软件GIMP,在软件中心就可以直接下载了. 一下介绍两个抠图方法(去背景,背景透明化) 法一: 利用 “按颜色选择工具”(需要背景颜色与待抠的实体颜色有较大的差别) 选取颜色选择工具,点击图片任意处 然后,图层->透明->添加Alpha通道 再,编辑->清楚 最后结果如下图,自行保存成想要的格式就

高仿QQ头像截取

花费了半天时间,把 仿QQ头像截取的方法整理了下,并制作了一个demo以供大家参考,基本上实现了qq中我的资料界面上(包括背景透明化,上滑标题栏显示,下拉隐藏等)的大致效果,先上图看效果吧: 支持的功能: 1.选择裁剪的图片支持手势放大缩小(包括双击放大缩小): 2.判断图片边缘,即裁剪区域不会超过图片边缘: 原理: 一个重写的RelativeLayout,里面放了两层View,下层是重写的支持缩放的ImageView用于放置选择裁剪的图片,ImageView上层是一个自定义View,通过onD

alpha和color key

一.alpha 1.透明度,一般取值0-255 2.Alpha 通道:    Alpha 通道是为保存选择区域而专门设计的通道.在生成一个图像文件时,并不必须产生 Alpha 通道.通常它是由人们在图像处理过程中人为生成,并从中读取选择区域信息的.因此在输出制版时, Alpha 通道会因为与最终生成的图像无关而被删除.但也有     时,比如在三维软件最终渲染输出的时候,会附带生成一张 Alpha 通道,用以在平面处理软件中作后期合成.除了 photoshop 的文件格式 PSD 外, GIF 

Android第三十三期 - Dialog的应用

今天遇到一个大难题哦,不过有大牛一眼就瞄出来了,然后就解决了,AlertDialog和Dialog自定义后圆角的处理,如果你跟我一样没有看到这些细节的话就栽了,用AlertDialog不能使得圆角背景透明化,所以要用Dialog处理才行,也就是下面的方法. Dialog: private static Dialog mDialog; // 加载gridview中的item的xml方法 public static View getView(Context context, int layoutId

如何在论文中画出漂亮的插图?

知乎用户的回答(1259票)]: 强烈推荐 Python 的绘图模块 matplotlib: python plotting .画出来的图真的是高端大气上档次,低调奢华有内涵~ 适用于从 2D 到 3D,从标量到矢量的各种绘图.能够保存成从 eps, pdf 到 svg, png, jpg 的多种格式.并且 Matplotlib 的绘图函数基本上都与 Matlab 的绘图函数名字都差不多,迁移的学习成本比较低.开源免费.如图所示(题目描述中的图在最后): (以下图片均引用自 Thumbnail