加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:38:52 所属栏目:Windows 来源:网络整理
导读:??? 上一篇《 Windows 界面编程第三篇 异形窗体 普通版 》和《 Windows 界面编程第四篇异形窗体 高富帅版 》介绍了异形窗口(异形窗体)的创建,并总结出了异形窗口的“三要素”: 1. WS_EX_LAYERED 属性 2. 指定透明色 3. 以位图为窗口背景 ? ??? 本篇文

??? 上一篇《Windows界面编程第三篇 异形窗体 普通版》和《Windows界面编程第四篇异形窗体 高富帅版》介绍了异形窗口(异形窗体)的创建,并总结出了异形窗口的“三要素”:

1.WS_EX_LAYERED属性

2.指定透明色

3.以位图为窗口背景

?

??? 本篇文章将主要介绍Windows编程中如何实现静态控件背景的透明化,这将进一步的美化界面。下面先看一张没有做静态控件背景透明化的对话框程序的运行画面,对话框的彩色图片背景可以参考《Windows界面编程第一篇位图背景与位图画刷》。

??? 可以看出静态控件的灰度背景在对话框的彩色图片背景中显得很不谐调,因此有必要对其美化一下。

??? 在第一篇《Windows界面编程第一篇位图背景与位图画刷》中介绍了通过WM_CTLCOLORDLG消息来设置对话框的背景,而在Windows系统中还有类似于WM_CTLCOLORDLG消息的还有WM_CTLCOLORBTNWM_CTLCOLOREDITWM_CTLCOLORLISTBOXWM_CTLCOLORSCROLLBARWM_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,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,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,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,rcDialog.right,rcDialog.bottom,s_hdcMem,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,LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,LPARAM lParam) {
	static HBRUSH    s_hBitmapBrush; //位图画刷

	switch (message)
	{
	case WM_INITDIALOG:
		// 设置对话框标题
		SetWindowText(hDlg,GWL_STYLE) | WS_SIZEBOX);

		// 加载背影图片
		HBITMAP hBitmap;
		hBitmap = (HBITMAP)LoadImage(NULL,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://www.voidcn.com/article/p-xgolfrcs-yt.html

欢迎关注微博:http://weibo.com/MoreWindows

?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读