Win32创建异形窗口
大家都见过在windows下各种气泡窗口、输入法窗口以及其他一些窗口,这些窗口看起来不像传统的windows窗那样,上面是标题栏,下面是窗口的客户区。这些窗口形状各异,可以是一个多边形,一幅图,甚至是一个人物画像等。这些异形窗口是怎么实现的呢?下面我们就来实现这个奇异形状的窗口。
其实在windows下实现特殊的窗口并不困难,有两种办法可以实现:
- 通过创建路径和区域、合并区域的办法。创建区域的API有很多,比如CreateRectRgn,CreateRoundRectRgn,CreateEllipticRgn以及其他创建区域函数等,具体参考MSDN。然后使用SetWindowRgn函数设置窗口区域,将区域转化为窗口。这种方式适合通过程序控制实现一些形状定制窗口。
- 通过位图画刷设置窗口背景,然后过滤掉指定的颜色,剩下的部分就是窗口。这种方式即简单,又适合位图化的任意窗口,用的最多,具有更炫的效果。实现方式就是将窗口属性设置分层,然后使用SetLayeredWindowAttributes这个API函数将特定颜色设置为透明色,该函数不仅可以设置为透明色,还可以设置整体窗口的透明度,将上一篇文章中设置半透明窗口效果,也是用的这个函数。
下面我们就来采用第二种方法来实现一个特殊的windows窗口。
首先我们要准备一张用于特殊窗口样子的位图,我们选择的图片如下:
为了实现这个位图的窗口形状,我们先对这个位图进行处理,将窗口以为的部分用一种特殊的颜色来填充,这个颜色需要与窗口保留部分不一样,因为只要是这种特定的颜色就会变成非窗口的部分,当然这种特殊颜色可以随便选择。从这种图来看,我们选择红色比较好,因为需要保留的部分没有红色出现。填充特殊颜色后的图片如下:
SetLayeredWindowAttributes函数原型如下:
BOOL SetLayeredWindowAttributes( HWND hwnd,
COLORREF crKey,
BYTE bAlpha,
DWORD dwFlags
);
hwnd:窗口句柄
crKey:特定的color key,就是要被透明的颜色
bAlpha:窗体的整体透明度
dwFlags:指定透明方式
下面就是实现的示意代码及注释:
#include <windows.h>
staticTCHAR szAppName[] = TEXT("异形窗口");
staticLRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAMlParm);
intWINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
HWNDhwnd;
MSGmsg;
WNDCLASSwndclass;
HBITMAPhBitmap;
BITMAPbm;
hBitmap= (HBITMAP)LoadImage(NULL, TEXT("cartoon_win.bmp"),IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // 该图用于创建窗口背景画刷,我们的窗口形状就是它了
if (hBitmap == NULL)
{
MessageBox(NULL,TEXT("位图加载失败"), TEXT("Error"), MB_ICONERROR);
return 0;
}
wndclass.style = CS_VREDRAW | CS_HREDRAW;
wndclass.lpfnWndProc= MainWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground= CreatePatternBrush(hBitmap);//加载准备好的位图作为画刷
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName= szAppName;
if (!RegisterClass(&wndclass))
{
return FALSE;
}
GetObject(hBitmap,sizeof(bm), &bm);
hwnd= CreateWindowEx(WS_EX_TOPMOST,
szAppName,
szAppName,
WS_POPUP,
CW_USEDEFAULT,
CW_USEDEFAULT,
bm.bmWidth,
bm.bmHeight,
NULL,
NULL,
hInstance,
NULL);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
DeleteObject(hBitmap);
return msg.wParam;
}
staticLRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAMlParm)
{
switch (message)
{
case WM_CREATE:
{
// 设置分层属性
SetWindowLong(hwnd,GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
// 设置透明色以及分层窗口属性,关键就是这个函数!
COLORREFclTransparent = RGB(255, 0, 0);
SetLayeredWindowAttributes(hwnd,clTransparent, 0, LWA_COLORKEY);
}
return 0;
case WM_KEYDOWN:
switch (wParam)
{
case VK_ESCAPE: //按下Esc键时退出
SendMessage(hwnd,WM_DESTROY, 0, 0);
return 0;
}
break;
case WM_LBUTTONDOWN: //当鼠标左键点击时可以拖曳窗口
PostMessage(hwnd,WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParm);
}
程序运行后,结果如下,该窗口的形状就跟图片上我们设定的一样,是不是很新鲜呢?赶快在你的电脑上试一下吧,你还可以换成你自己的图片,只要设置正确的透明色即可。
转载于:https://www.cnblogs.com/shenyantao/p/10712916.html
Win32创建异形窗口相关推荐
- CreateWindow创建异形窗口(不规则窗口) - WINDOWS API 第三弹 异形窗口。
本期将自己从底层中抽离出来,来搞点UI设计相关的,毕竟UI是本人强项(矮子里面拔高个吧).你的UI界面是不是都是矩形框,你有想过其他形状的界面吗?是不是感觉计算机应用就应该是方方正正的.答案肯定是NO ...
- mfc异形窗口的创建
在OnInitDialog进行窗体形状的设置 BOOL CTestWindowDlg::OnInitDialog() {CDialog::OnInitDialog();// 设置此对话框的图标.当应用 ...
- 【转】win32 的DLL中创建windows窗口
转自:https://blog.51cto.com/wangyw/1071967 因工作需求,需要写一个DLL,并在其中创建windows窗口,网上有很多关于DLL创建窗口的文章,不过都是基于MFC的 ...
- win32创建窗口及其消息循环
转自:http://anyzixin.blog.163.com/blog/static/365289122007103031657355/ http://anyzixin.blog.163.com/b ...
- Windows API 编程起始——创建一个窗口
最初了解Windows api编程呢,就是先创建出一个最简洁的窗口,就如我们学习C/C++时的"Helloword"一样,这是进入windows编程大门的重要一个步,下面就开始吧. ...
- python 隐藏进程_python在windows下创建隐藏窗口子进程的方法
python在windows下创建隐藏窗口子进程的方法 发布于 2015-11-08 20:56:53 | 213 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一 ...
- DUILIB异形窗口实现
搞Windows程序的人尽皆知分层窗口能够实现很多不错的效果,之前看过一些异形窗口的实现,所以就手痒也想自己搞一个玩一玩.自己动手实现过程才发现还是有不少问题的. 基本思路是: 1.将窗口扩展属性设置 ...
- 创建windows窗口并且获得窗口句柄
创建windows窗口并且获得窗口句柄 代码 import win32gui from win32con import * import ctypes from ctypes import * def ...
- PySide2 基础入门-创建实例窗口(详细解释)
PySide2 基础入门-创建实例窗口(详细解释) python 3.7 / Pyside2 (如果使用pyQt5,将Pyside2 直接替换PyQt5即可)首先我们在Qt Designer中画好界面 ...
- 【DND图形库】二、创建控制台窗口和游戏循环
二.创建控制台窗口和游戏循环 (甲)为何我们需要创建控制台窗口 虽然游戏需要的是Windows窗口,但是这个窗口可以帮助我们查看即时的调试信息,不输出调试的程序就和不写注释的程序一样,后来修改的人总是 ...
最新文章
- sql2005中的简单分页方法
- Linux进程及进程管理命令
- mysql query cache 命中率_MySQL缓存命中率概述及如何提高缓存命中率
- MAC下代理工具Charles使用
- 最小二乘法(多元)推导
- 最高效的进(线)程间通信机制--eventfd
- LintCode MySQL 1921. 从不充值的玩家(where not in)
- 双11特刊|购物车实时显示到手价,看云原生内存数据库Tair如何提升用户体验?
- springcloud Feign断路器实战和问题总结
- wps python 自动化_请教下 Python 高手,如何用 Python 自动化操作 Excel?
- Oracle 当前用户给另一个用户授权查询指定表或视图的权,否则另一个用户提示不存在视图或表
- Win7点击文件夹右键可打开cmd控制台,并获取当前目录
- AAAI'22 | 多模态摘要任务中的知识蒸馏和分层语义关联
- L1-021 重要的话说三遍 (5 分) — 团体程序设计天梯赛
- Zookeeper 客户端 Curator 使用详解
- 华硕笔记本linux触摸板驱动,华硕触摸板驱动_华硕a豆笔记本触摸板驱动下载安装 v11.0.0.30 官方正式版-126g驱动网...
- 干货分享好用的绘图工具
- 高中信息技术html语言,高中信息技术Frontpage试题
- 短信API整合在spring里面(3)
- android自定义四边形,以编程方式在Android中创建平行四边形绘图
热门文章
- php如何pfx转成jks证书,常规方法不行,变相来实现
- ALOS 12.5米DEM 数字高程模型数据免费下载介绍(20200617)
- 把Android API文档的颜色改成不易疲劳的绿豆沙颜色
- Python爬虫:网易云音乐评论爬取
- Go语言学习(面向区块链)
- 苹果产品介绍合集(加广告语和官方介绍)第二版--由Apple_VM_Xiaoqie整理(微信,抖音同号)
- 计算机主机自动关机如何设置,如何设置电脑自动关机
- 无法使用内置管理员账户打开照片,请使用其他账户登录,然后再试一次
- 无法使用内置管理员账户打开应用
- happen-before讲解