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

上一篇《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_hdcMem
			HDC        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

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://www.cnblogs.com/captainbed

原文地址:https://www.cnblogs.com/heishanglaoyao/p/10220247.html

时间: 2024-08-07 02:52:54

Windows界面编程第五篇 静态控件背景透明化的相关文章

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

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

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://www.captainbed.net 转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8696726 欢迎关注微博:http://weibo.com/MoreWindows Windows界面编程之位图显示特效系列目录: 1. <Windows界面编程第九篇位图显示特效交错效果> http:/

C语言控制台窗口图形界面编程(五).

控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer(             //文本移动函数 HANDLE hConsoleOutput,                  //句柄 const SMALL_RECT *lpScrollRectangle,    //移动区域 const SMALL_RECT *lpClipRectangle,    

5.静态控件背景透明化

一.静态控件透明化 前面我们介绍过,通过WM_CTLCOLORDLG消息来设置对话框背景,还有消息来设置其他控件得背景: WM_CTLCOLORBTN - 按钮 WM_CTLCOLOREDIT - 编辑框 WM_CTLCOLORLISTBOX - 列表框 WM_CTLCOLORSCROLLBAR - 滚动条 WM_CTLCOLORSTATIC - 静态框 二.具体事例 - 静态框 通过在WM_CTLCOLORSTATIC消息中,返回一个空画刷达到背景透明化的要求. 设置背景透明: int  Se

【C语言】控制台窗口图形界面编程(五):文本移动

目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 指定Unicode或ANSI字符及其属性.控制台功能使用此结构来读取和写入控制台屏幕缓冲区. 类型声明 typedef struct _CHAR_INFO { union { WCHAR UnicodeChar; CHAR AsciiChar; } Char; WORD Attributes; }

Windows核心编程笔记(1)

最近工作比较闲了,一直没来得及看的核心编程最近开始看了,分享下笔记. 1.内核句柄用完不释放一定会造成内存泄漏吗? 不一定,内核句柄在进程退出时会被系统释放掉(遍历内核句柄表,只要每个句柄指向的内核对象的引用计数为0,内核就会销毁该对象,适用于所有的内核对象.资源(GDI对象在内).内存块): 2.内核对象如何关闭? 调用CloseHandle(),内核会查找该进程的句柄表,如果没找到该句柄,返回FALSE(Debug下抛出异常);如果找到,则使该句柄指向的内核对象引用计数减一,若引用计数为0,

五,图形界面编程

五,图形界面编程 一,图形界面编程swt; 1,awt 1,图形类 Button 2,辅助类 1,工具类 2,字体类 3,颜色类 2,Swing 1,图形类 jButton 二,容器与组件 1,首层容器 Contoner 1,所有的中间容器和组件都放在首层容器里 2,常用的首层容器 JApplet-动画效果-过时 Jdiologo-弹出框 Jframe-常用的首层容器 Jwindow 3,先new jframe对象,在设置宽高 ,ste size(宽,高): 内宽高,先水平在垂直先宽后高,单位像

c# winform编程之多线程ui界面资源修改总结篇

单线程的winfom程序中,设置一个控件的值是很easy的事情,直接 this.TextBox1.value = "Hello World!";就搞定了,但是如果在一个新线程中这么做,比如: private void btnSet_Click(object sender, EventArgs e) {        Thread t = new Thread(new ParameterizedThreadStart(SetTextBoxValue));     //当然也可以用匿名委托