【专业技术】Win32创建异形窗口

大家都见过在windows下各种气泡窗口、输入法窗口已经其他一些窗口,这些窗口看起来不像传统的windows窗那样,上面是标题栏,下面是窗口的客户区。这些窗口形状各异,可以是一个多边形,一幅图,甚至是一个人物画像等。这些异形窗口是怎么实现的呢?下面我们就来实现这个奇异形状的窗口。

其实在windows下实现特殊的窗口并不困难,有两种办法可以实现:

  1. 通过创建路径和区域、合并区域的办法。创建区域的API有很多,比如CreateRectRgnCreateRoundRectRgnCreateEllipticRgn以及其他创建区域函数等,具体参考MSDN。然后使用SetWindowRgn函数设置窗口区域,将区域转化为窗口。这种方式适合通过程序控制实现一些形状定制窗口。
  2. 通过位图画刷设置窗口背景,然后过滤掉指定的颜色,剩下的部分就是窗口。这种方式即简单,又适合位图化的任意窗口,用的最多,具有更炫的效果。实现方式就是将窗口属性设置分层,然后使用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);

}

程序运行后,结果如下,该窗口的形状就跟图片上我们设定的一样,是不是很新鲜呢?赶快在你的电脑上试一下吧,你还可以换成你自己的图片,只要设置争取的透明色即可。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LeoXu的博客

[读书笔记]响应式web设计 转

@media screen and (max-device-width:400px){ 

751
来自专栏向治洪

深入理解Android渲染机制

基础知识 CPU: 中央处理器,它集成了运算,缓冲,控制等单元,包括绘图功能.CPU将对象处理为多维图形,纹理(Bitmaps、Drawables等都是一起打包...

2246
来自专栏Python小屋

Python操作高版本Excel文件:颜色、边框、合并单元格

本文主要颜色Python扩展库openpyxl的一些基本用法,包括创建工作簿、选择活动工作表、写入单元格数据,设置单元格字体颜色、边框样式,合并单元格等等。 f...

4795
来自专栏.Net移动开发

.Net语言 APP开发平台——Smobiler学习日志:开发APP时,如何快速地实现屏幕自适应

当AutoHeight属性为“True”时,Mobile Form的Scrollable属性将失去效果,以GridView控件的下面两种情况为例(以下两种情况的...

882
来自专栏小樱的经验随笔

关于前端的photoshop初探的学习笔记

写在前边 这还是高三的时候暑假的时候学习这个软件时记的笔记呢,今天又在电脑上找到了它,总觉得不应该让他尘封在我的硬盘上,于是挂了出来。 温馨提示:比较乱,写给自...

2906
来自专栏落影的专栏

直播APP常用动画效果

介绍 记录、总结开发遇到一些问题,大家一起交流学习。 这次带来,对直播APP的常用动画总结。 直播Live 效果展示 下面是一个很多平台都有的入门豪华礼物动...

5298
来自专栏用户2442861的专栏

PyQt4中的布局管理 (入门较好2)

http://www.blogjava.net/glorywine/archive/2008/07/30/217842.html

1321
来自专栏生信宝典

一分钟绘制磷脂双分子层:AI零基础入门和基本图形绘制

Adobe illustrator是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件,是一款非常好的图片处理工具,简称AI。

9153
来自专栏Coding迪斯尼

VUE+WebPack游戏设计:实现盒子爆破效果和界面美化

1563
来自专栏林德熙的博客

Xamarin Forms 进度条控件

本文翻译:http://xamlnative.com/2016/04/14/xamarin-forms-a-simple-circular-progress-c...

1381

扫码关注云+社区