大家都见过在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);

}

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

转载于:https://www.cnblogs.com/shenyantao/p/10712916.html

Win32创建异形窗口相关推荐

  1. CreateWindow创建异形窗口(不规则窗口) - WINDOWS API 第三弹 异形窗口。

    本期将自己从底层中抽离出来,来搞点UI设计相关的,毕竟UI是本人强项(矮子里面拔高个吧).你的UI界面是不是都是矩形框,你有想过其他形状的界面吗?是不是感觉计算机应用就应该是方方正正的.答案肯定是NO ...

  2. mfc异形窗口的创建

    在OnInitDialog进行窗体形状的设置 BOOL CTestWindowDlg::OnInitDialog() {CDialog::OnInitDialog();// 设置此对话框的图标.当应用 ...

  3. 【转】win32 的DLL中创建windows窗口

    转自:https://blog.51cto.com/wangyw/1071967 因工作需求,需要写一个DLL,并在其中创建windows窗口,网上有很多关于DLL创建窗口的文章,不过都是基于MFC的 ...

  4. win32创建窗口及其消息循环

    转自:http://anyzixin.blog.163.com/blog/static/365289122007103031657355/ http://anyzixin.blog.163.com/b ...

  5. Windows API 编程起始——创建一个窗口

    最初了解Windows api编程呢,就是先创建出一个最简洁的窗口,就如我们学习C/C++时的"Helloword"一样,这是进入windows编程大门的重要一个步,下面就开始吧. ...

  6. python 隐藏进程_python在windows下创建隐藏窗口子进程的方法

    python在windows下创建隐藏窗口子进程的方法 发布于 2015-11-08 20:56:53 | 213 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一 ...

  7. DUILIB异形窗口实现

    搞Windows程序的人尽皆知分层窗口能够实现很多不错的效果,之前看过一些异形窗口的实现,所以就手痒也想自己搞一个玩一玩.自己动手实现过程才发现还是有不少问题的. 基本思路是: 1.将窗口扩展属性设置 ...

  8. 创建windows窗口并且获得窗口句柄

    创建windows窗口并且获得窗口句柄 代码 import win32gui from win32con import * import ctypes from ctypes import * def ...

  9. PySide2 基础入门-创建实例窗口(详细解释)

    PySide2 基础入门-创建实例窗口(详细解释) python 3.7 / Pyside2 (如果使用pyQt5,将Pyside2 直接替换PyQt5即可)首先我们在Qt Designer中画好界面 ...

  10. 【DND图形库】二、创建控制台窗口和游戏循环

    二.创建控制台窗口和游戏循环 (甲)为何我们需要创建控制台窗口 虽然游戏需要的是Windows窗口,但是这个窗口可以帮助我们查看即时的调试信息,不输出调试的程序就和不写注释的程序一样,后来修改的人总是 ...

最新文章

  1. React组件通信技巧
  2. poj 2034 Anti-prime Sequences(dfs)
  3. python3.6.2安装教程-python 3.6.2 安装配置方法图文教程
  4. python爬虫代码实例-Python爬虫之urllib示例
  5. 学生如何提高专业英文阅读能力--施一公教授
  6. 46、Power Query-Table.FillDown函数简介
  7. boost::mp11::mp_set_union相关用法的测试程序
  8. FPGA 状态机设计
  9. Spring-jdbc-ConnectionHolder
  10. [BZOJ4913][SDOI2017]遗忘的集合
  11. linux声道切换,linux下怎么把数据分别给左右声道
  12. 各式标签二维码明确采用QR码或DM码,其两种不同码制的区别表现
  13. tomcat修改端口号后无法访问
  14. 单晶X射线衍射法和粉末X射线衍射法有哪些不同?
  15. magisk卸载内置软件_手把手教你使用ADB卸载手机内置App软件
  16. Matlab下地形图绘图包m_map绘制晕渲(shaded relief)地形图
  17. 【游戏建模模型制作全流程】ZBrush蜥蜴模型雕刻教程
  18. python requests返回结果带\\u的解决方法
  19. AI教育公司北极星获数千万Pre-A 轮融资,估值2.5亿元
  20. [OHIF-Viewers]医疗数字阅片-医学影像-事件总线管理器

热门文章

  1. 如何利用MATLAB建立Lotka-Volterra模型及其改进模型
  2. 基于BP神经网络控制+Simulink双闭环直流调速系统仿真
  3. NetCore游戏服务器GeekServer
  4. JavaScript教程-18-JavaScript中的内置对象Global
  5. 神舟Z7-KP7SC笔记本电脑-游戏实机帧数截图与鲁大师跑分
  6. WIN下静默安装MSI文件
  7. module ‘eli5‘ has no attribute ‘show_weights‘
  8. linux 虚拟钢琴程序,用Python制作简单的钢琴程序的教程
  9. Consul:7:Consul Connect使用示例(自动sideCar代理)
  10. 东大oj1155 等凹函数