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窗口,但是这个窗口可以帮助我们查看即时的调试信息,不输出调试的程序就和不写注释的程序一样,后来修改的人总是 ...
最新文章
- React组件通信技巧
- poj 2034 Anti-prime Sequences(dfs)
- python3.6.2安装教程-python 3.6.2 安装配置方法图文教程
- python爬虫代码实例-Python爬虫之urllib示例
- 学生如何提高专业英文阅读能力--施一公教授
- 46、Power Query-Table.FillDown函数简介
- boost::mp11::mp_set_union相关用法的测试程序
- FPGA 状态机设计
- Spring-jdbc-ConnectionHolder
- [BZOJ4913][SDOI2017]遗忘的集合
- linux声道切换,linux下怎么把数据分别给左右声道
- 各式标签二维码明确采用QR码或DM码,其两种不同码制的区别表现
- tomcat修改端口号后无法访问
- 单晶X射线衍射法和粉末X射线衍射法有哪些不同?
- magisk卸载内置软件_手把手教你使用ADB卸载手机内置App软件
- Matlab下地形图绘图包m_map绘制晕渲(shaded relief)地形图
- 【游戏建模模型制作全流程】ZBrush蜥蜴模型雕刻教程
- python requests返回结果带\\u的解决方法
- AI教育公司北极星获数千万Pre-A 轮融资,估值2.5亿元
- [OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器
热门文章
- 如何利用MATLAB建立Lotka-Volterra模型及其改进模型
- 基于BP神经网络控制+Simulink双闭环直流调速系统仿真
- NetCore游戏服务器GeekServer
- JavaScript教程-18-JavaScript中的内置对象Global
- 神舟Z7-KP7SC笔记本电脑-游戏实机帧数截图与鲁大师跑分
- WIN下静默安装MSI文件
- module ‘eli5‘ has no attribute ‘show_weights‘
- linux 虚拟钢琴程序,用Python制作简单的钢琴程序的教程
- Consul:7:Consul Connect使用示例(自动sideCar代理)
- 东大oj1155 等凹函数