VC创建自定义不规则窗口

VC创建不规则窗口 创建不规则窗口无外乎两个API:Set 阅读详情

最近工作比较闲,可以写点技术文章了。鄙人不才,可能会有所疏漏,只希望可以起到抛砖引入的作用。

前面写过一篇用透明Png图片来创建不规则窗体的文章,本文则主要讲述通过代码来在自定义透明。(有的时候需要在窗口的某些位置打个洞,我以前做过这样的需求,哈哈。)

透明窗口当然需要给窗口加上WS_EX_LAYERED样式,在绘制时调用UpdateLayeredWindow来贴图,源DC中所有像素点中alpha值为0则全透了。(补充下,每个像素点占4个字节,分别是:A (透明度alpha)R G B(三原色),在内存中存储时是反的:B G R A)我们要制定某块区域透明,就需要在贴图前,设置区域内像素的alpha值为0(全透),也可以为其他值(部分透明)……设置前,需要用CreateDIBSection获取DC中背景位图的像素值到指定的buffer中,燃火我们遍历这个buffer就可以设置了。

主要看WM_PAINT消息的处理部分代码:

	case WM_PAINT:
		{
			hdc = BeginPaint(hWnd, &ps);
			// TODO: 在此添加任意绘图代码...
			RECT rcClient;
			GetClientRect(g_hWnd, &rcClient);
			int nWidth=rcClient.right-rcClient.left;
			int nHeight=rcClient.bottom-rcClient.top;
			if ( NULL == g_hMemDC )
			{
				g_hMemDC=CreateCompatibleDC(hdc);
				//g_hBitmap=LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));
				g_hBitmap=CreateCompatibleBitmap(hdc, nWidth, nHeight);
				SelectObject(g_hMemDC, g_hBitmap);
				BITMAPINFO bi;
				ZeroMemory(&bi, sizeof(BITMAPINFO));
				bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
				bi.bmiHeader.biWidth=nWidth;
				bi.bmiHeader.biHeight=nHeight;
				bi.bmiHeader.biPlanes=1;
				bi.bmiHeader.biBitCount=32;
				bi.bmiHeader.biCompression=BI_RGB;
				bi.bmiHeader.biSizeImage=nWidth*nHeight*4;
				BYTE* lpData=NULL;
				HRGN hRgn=CreateRoundRectRgn(0, 0, 100, 100, 100, 100);
				g_hBitmap=CreateDIBSection(g_hMemDC, &bi, DIB_RGB_COLORS, (void**)&lpData, NULL, 0);
				for (int i=0; i<nHeight; ++i)
					for (int j=0; j<nWidth; ++j)
					{
						int nPos=( (nHeight-i-1)*nWidth+j)*4;
						//lpData[nPos+0]=0xff;
						//lpData[nPos+3]=0x00;
						if ( !PtInRegion(hRgn, j, i) )
							lpData[nPos+3]=0x0f;
						else
						{
							lpData[nPos+0]=0xff;
							lpData[nPos+3]=0x00;
						}

					}
				DeleteObject(hRgn);
				SelectObject(g_hMemDC, g_hBitmap);
			}
			POINT pt={300, 300};
			POINT pt1={0, 0};
			SIZE size={300, 300};
			BLENDFUNCTION bf;
			ZeroMemory(&bf, sizeof(bf));
			bf.SourceConstantAlpha=255;
			bf.AlphaFormat=AC_SRC_ALPHA;
			LONG lStyle=GetWindowLong(hWnd, GWL_EXSTYLE);
			SetWindowLong(hWnd, GWL_EXSTYLE, lStyle|WS_EX_LAYERED);
// 			RECT rc={0, 0, 50, 50};
// 			::SetBkColor(g_hMemDC, 0xffffff);
// 			::ExtTextOut(g_hMemDC, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
			UpdateLayeredWindow(hWnd, hdc, &pt, &size, g_hMemDC, &pt1, 0, &bf, ULW_ALPHA);
			EndPaint(hWnd, &ps);
			break;
		}
PtInRegion是来判断这个点是否在你要穿透的区域
这里只是一个很简单的小例,读者可以自行扩展。打算上传代码的,不过优快云上传的步骤实在是太麻烦了!


VC做无锯齿的不规则窗体 近日做一VC客户端小程序时,由于对UI稍有要求,于是决定以图片为背景做一个不规则窗体。 阅读详情

相关推荐

VC++6.0创建不规则窗口实践指南

本文还有配套的精品资源,点击获取 简介:本教程面向初学者,详细介绍了如何在Windows应用程序开发中使用VC++6.0创建具有独特视觉效果的不规则窗口。通过自定义窗口过程来处理消息和绘制图形,实现非标准形状的用户界面。教程步骤包括创建项目、添加消息处理类、创建不规则窗口类、绘制形状、处理特定窗口消息、注册窗口类以及运行与调试。此外,还提到了更高级的图形渲染技术,如GDI+...

weixin_33597080的博客 1017

VC++玩转炫酷悬浮窗2---不规则窗体的实现(常规)

目标不规则窗体也称为异型窗体,像迅雷的飞鸟型窗体就是啦。这篇文章就是要实现这样的窗体。计划&方案根据上一篇文章继续扩展。我们有几种方案实现不规则窗体。迅雷就是用一张图片作为窗体的形状,那么图片的类型我们也要考虑进来。现在是png图片的天下,自带背景透明;对于bmp图片,需要程序处理一下。对于常规图形如圆形,只需要SetWindowRgn就可以搞定。对于复杂图形,需要用一点技巧来做。下面用例子来

懒人的技术笔记 5916

VC实现的用标准图形组合而成的不规则对话框窗口测试程序

通过两个标准框组合而成一个不规则对话框窗口,并且整个窗口可以通过点击鼠标左键拖动。

用VC++实现不规则窗口

作者:曾劲峰   随着Windows95的推出,在PC系统中出现了越来越多的应用程序采用了非矩形外观的窗体,或者模拟现实中的事物,如钟、眼睛等;或者创造一个具有三维观感的非现实物体,这类程序以各种mp3播放器为代表,甚至一些大腕级的老牌应用程序(如Norton),也开始拥有这种窗口。一来是因为Windows操作系统和各类开发工具自身功能的极大提升;二来,也说明开发人员希望通

蝈蝈俊.net 2493

演示ExtTextOut这个扩展文本输出函数(2KB)...

演示ExtTextOut这个扩展文本输出函数(2KB)

演示ExtTextOut这个扩展文本输出函数

演示ExtTextOut这个扩展文本输出函数

VC绘制不规则窗口(只适合对话框程序)

用BMP位图绘制不规则窗口(只适合对话框程序):原理就是把一张BMP位图上的指定颜色的像素点抠掉,其他地方正常显示,由此生成一个窗口区域,这样就可以实现不规则窗口了;首先要有一张BMP图片,在上面绘图软件在上面绘好你要显示的内容,然后把你不想要显示的部分全部用一种颜色填充(注意,这种颜色只能出现在你想抠掉的区域中,如果其他地方也有这种颜色,那么到时候也会把哪些地方给抠掉).h头文件中声明:【   

潇湘宇的专栏 2222

界面怪异漂亮 vc制作不规则窗体界面

skinsyse界面怪异漂亮 vc制作不规则窗体界面

积沙成塔之VC不规则按钮的创建

一、序言    在绝大多数的Windows应用程序中,其窗体都是使用的正规正矩的矩形窗体,例如我们常用的,“记事本”,“扫雷”,等等。矩形窗体,具有编程实现简单,风格简洁的优点,所以在普通文档应用程序和简单小游戏中使用足矣。但在某些娱乐游戏程序中使用就略显呆板些了,这时若用不规则窗体替代原先的矩形窗体,将会使这类程序更添情趣。典型的例子有windows   自代的Media   Play

xiao__C的专栏 1927

QGIS中高效处理CAD数据的两种实用技巧

本文详细解析了在QGIS中高效处理CAD数据的两种核心方法。针对DWG/DXF文件在QGIS中直接打开失败的问题,介绍了使用QGIS内置数据导入管理器进行标准化转换的流程,并重点推荐了功能更强大的Another DXF Importer插件,以更好地保留文字、块属性等复杂信息。文章对比了两种方法的优劣与适用场景,并提供了坐标系设置、中文乱码等常见问题的避坑指南,帮助用户根据数据需求选择最佳导入策略。

weixin_28363123的博客 117

Jetson Orin NX上CAN总线调试全攻略:从硬件焊接到开机自启动(附常见问题解决方案)

本文详细介绍了在NVIDIA Jetson Orin NX开发板上进行CAN总线调试的全过程,包括硬件焊接、驱动配置、通信测试和开机自启动设置。针对常见问题如信号接反、波特率设置等提供了实用解决方案,帮助开发者快速实现稳定的CAN总线通信。

c2d3e4f的博客 1076

从0开始学习《Windows程序设计》:窗口、窗口!!!

一、消息框 在之前的学习中,我们通过MessageBox创建了一个消息框程序! 消息框是什么,消息框就是我们用来跟用户交流的界面!! /* ------------------------------------------------------------------- MyWindows.c -- 基本窗口模型 《Windows 程序设计(SDK)》视频教程 ----------------...

aixintianshideshouhu的博客 8624

基因组研究之单倍型T2T基因组(一)

单倍型T2T基因组(Haplotype-resolved T2T genome)是一种高精度、高连续性、高完整性的基因组组装技术,它能够提供从端粒到端粒的完整基因组序列,包括所有的基因和非编码序列。完整覆盖:T2T基因组覆盖从端粒到端粒的染色体序列,包含所有的基因和非编码序列,包括以往难以解析的端粒和着丝粒区域。单倍型解析:单倍型T2T基因组能够区分来自父母本的遗传信息,进行亚基因组不对称演化研究,挖掘单倍型等位基因间的表达差异,这对于重测序、性状定位、进化、基因功能、基因编辑等研究至关重要。

2401_89507557的博客 2438

VC个性化窗口界面设计

在VC下有时需要制作个性化的窗口界面,用界面库又比较繁琐,而且有些界面库还必须收费才能使用,这里我提供一个简单且有效的制作个性化界面的方法。   由AppWizard向导生成一个基于对话框的应用程序框架,把对话框模板的Border属性改为none,也就是没有边框和标题栏。从CDialog派生一个类,命名为CCustomDlg。首先我们要建立不规则窗口的界面,要用到以下函数, int Set

LvAppの嵌入式 941

威联通改装飞牛fnOS全攻略:从刷机到Docker影视部署

NAS系统是家庭数字存储的核心,x86架构的威联通设备凭借通用引导和驱动支持,成为改装替代系统的理想平台。飞牛fnOS作为基于Debian的国产NAS系统,以简洁UI、内置Docker和影视墙以及硬件转码能力,吸引了大量玩家。通过U盘引导安装、BIOS调整、系统盘SSD部署,可实现系统切换;原机械硬盘可挂载为存储池,配合Docker部署下载、远程访问等容器,影视中心自动削刮海报墙,硬件转码保障4K播放。改装过程需注意引导失败、硬盘识别、核显驱动等问题。这套方案能让老旧威联通焕发新生,兼顾易用性与扩展性。本文

weixin_33585822的博客 748

电阻抗成像肺功能测试数据分析与直方图生成

本文介绍了基于MATLAB的电阻抗成像(EIT)肺功能测试数据分析方法。研究针对32×32像素的EIT图像序列,通过三步算法处理:首先计算特定时间点与谷值图像的差值,然后分析1秒后峰值与1秒值的差值,最终计算比值矩阵并处理异常值。系统展示了数据预处理、关键时间点检测、比值计算及统计分析的全流程,包括生成概率分布直方图和空间分布图等可视化方法。该分析为无创肺功能评估提供量化指标,可应用于临床呼吸监测和疾病诊断。

huanghm88的专栏 197

VC实现不规则窗口

在VC下创建不规则窗口非常简单,无非就是创建一个HRGN,然后再调用SetWindowRgn就行了,如我们要创建一个原形的窗口只需要如下代码: CRgn rgn; rgn.CreateEllipticRgn( 100,100, 200, 200 ); SetWindowRgn((HRGN)rgn, TRUE); 本文中的例子为一个透明位图不规则窗口,其主...

weixin_33984032的博客 475

Android日志实战——Tombstones日志分析(七)

Tombstones 一般是由 Dalvik 错误、状态监视调试器、C 层代码以及 libc 的一些问题导致的。当系统发生 Tombstone 的时候,内核(kernel)首先会上报一个严重的警告信号(signal),上层接收到之后,进程的调试工具会把进程中当时的调用栈现场保存起来,并在系统创建了 data/tombstones 目录后把异常时的进程信息写在此目录里面,开发者需要通过调用栈来分析整个调用流程来找出出问题的点。Tombstone原因分析pid 与 tid 相同,问题出在主线程。

小旭的专栏 2521

VC不规则窗口实现—位图区域裁剪

既然默认创建的窗口是矩形区域,只要把不想显示的区域透明化,剩下的不就是不规则窗口了吗?!接下来所谓的窗口透明化,我们直接使用CRgn类来实现创建、裁剪和合并区域的功能,然后再使用SetWindowRgn函数来进行整个窗体的区域绘制。     不规则窗口,顾名思义,就是窗口的形状不是长方形、正方形或者圆形,而是一些不规则的图形。例如我们常常看到的一些可设置皮肤的窗口,机器人形状,五角星图形窗口一样等等

沉森心与思考同行 2240

ABAP Development Tool for Visual Studio Code 里使用 MCP server

本文讨论了SAP ABAP开发环境中,除GitHub Copilot外,其他可作为MCP客户端接入ABAP开发工具(MCP server)的编码代理(coding agent)。GitHub Copilot是官方确认可用的工具,而其他代理如Claude Code、Cursor、Windsurf Cascade、Cline和Continue虽然理论上支持MCP协议,但要实际用于ABAP开发还需满足两个关键条件:兼容MCP协议,并能处理VS Code虚拟工作区文件系统。这些工具需要单独验证是否支持ABAP开发工

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 255

CloudCompare 二次开发:插件中的 PCL 环境配置与编程

在进行 CloudCompare 的二次开发过程中,我们常常需要使用点云库(Point Cloud Library,简称 PCL)来处理和分析点云数据。在 CloudCompare 的界面中,选中一个点云对象,然后点击菜单栏中的 “插件” -> “MyPluginAction”。插件将对选中的点云对象进行体素滤波处理,并更新显示结果。下面我们将展示一个简单的插件编程示例,该示例使用 PCL 对输入的点云数据进行体素滤波处理。方法进行体素滤波处理,并将结果点云赋值给选中的点云对象。文件并点击 “打开”。

2301_79331387的博客 283

VC---创建一个不规则形状的窗口

      可以使用MFC 函数cWnd::SetWindowRgn。该函数将绘画和鼠标消息限定在窗口的一个指定的区域,实际上使窗口成为指定的不规则形状。      使用AppWizard创建一个基于对的应用程序并使用资源编辑器从主对话资源中删除所在的缺省控件、标题以及边界。给对话类增加一个CRgn 数据成员,以后要使用该数据成员建立窗口区域。 BOOL CTest2Dlg::OnInitDi

梦想---软件设计师 822

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

如何创建不规则窗口

VC++中提供了CRgn类和SetWindowRgn函数来创建别具一格的窗口。创建一个新窗口首先要定义一个CRgn对象,并用各种初始化函数创建CRgn类的区域,然后调用CWnd:: SetWindowRgn函数创建不规则窗口。CRgn类是从CGdiObject类派生二来的子类,CRgn类用来确定一个多边形、椭圆形或由多边形和椭圆合成的图形范围。CRgn类有三个比较常用的成员函数。1、Cre

harkorb的专栏 1097

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC实现区域选择以及不规则窗口示例

在一些应用场合,比如屏幕选定区域录制,需要选定一个区域,然后画出一个矩形边框以便界定录制区域的边界。如下图: 图中的虚边框是可以随鼠标移动的,并且实时显示坐标信息。 一旦确定位置,再次单击鼠标,则可以画出如下矩形区域: 绿色的矩形就是最终选定的区域,该选择区域位于所有窗口最顶层,所以不会被其他窗口所覆盖。 实现该方法其实也不难,需要创建2个特殊的窗口,一个是用于移动

wind612的博客 1515

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: VC创建不规则窗口
下一篇: C++模板编程实现二维数组
疯狂-的-蜗牛
博客等级 码龄16年 427粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值