窗口界面编程之一:VB实现简单异形窗口
一、运行效果图(在Win8里的运行效果,在XP里运行就不能体现出来,因为我使用的XP的界面效果)
二、编译环境:Visual Basic 6.0 (SP6)
三、实现原理:通过区域合并
四、使用API函数:CreateRectRgn、CreateRoundRectRgn、CombineRgn、SetWindowRgn,其声明及说明如下:
函数:CreateRectRgn
声明:Declare Function CreateRectRgn Lib "gdi32" Alias "CreateRectRgn" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
说明:创建一个由点X1,Y1和X2,Y2描述的矩形区域
函数:CreateRoundRectRgn
声明:Declare Function CreateRoundRectRgn Lib "gdi32" Alias "CreateRoundRectRgn" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
说明:创建一个圆角矩形,该矩形由X1,Y1-X2,Y2确定,并由X3,Y3确定的椭圆描述圆角弧度
函数:CombineRgn
声明:Declare Function CombineRgn Lib "gdi32" Alias "CombineRgn" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
说明:将两个区域组合为一个新区域
函数:SetWindowRgn
声明:Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
说明:这是那些很难有人注意到的对编程者来说是个巨大的宝藏的隐含的API函数中的一个。本函数允许您改变窗口的区域。通常所有窗口都是矩形的——窗口一旦存在就含有一个矩形区域。本函数允许您放弃该区域。这意味着您可以创建圆的、星形的窗口,也可以将它分为两个或许多部分——实际上可以是任何形状。
五、开始动手:创建一个无标题栏无边框的窗口,载入一张图片作为窗口背景,使用Image控件作为按钮,在窗口加截函数中处理窗口区域,在窗口鼠标按下函数中加入移动消息,使用API函数CloseWindow实现最小化。
程序源码:
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function CloseWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Dim rect, rgn, winxpstyle, minwindow, message As Long '声明变量
Private Const RGN_AND = 1
Private Const HTCAPTION = 2
Private Const WM_NCLBUTTONDOWN = &HA1 Private Sub Form_Load()
ImageMin2.Visible = False
ImageMin3.Visible = False
ImageClose2.Visible = False
ImageClose3.Visible = False
winxpstyle = CreateRectRgn(0, 0, 0, 0) '创建一个空的区域
rect = CreateRectRgn(0, 0, 642, 480) '以左上角(0,0)为坐标,创建一个矩形区域
rgn = CreateRoundRectRgn(0, 0, 640, 491, 10, 10) '以左上角(0,0)为坐标,创建一个弧度为10的圆角矩形区域
CombineRgn winxpstyle, rect, rgn, RGN_AND '将rect、rgn以相交的方式(RGN_AND)进行合并到winxpstyle区域
DeleteObject rect '删除区域对像
DeleteObject rgn '删除区域对像
SetWindowRgn Me.hwnd, winxpstyle, True '将winxpstyle区域设置为窗口
DeleteObject winxpstyle '删除区域对像
Form1.AutoRedraw = True '设置自动重绘窗口
End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0& '支持无标题栏窗口的移动
End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
ImageMin1.Visible = True
ImageClose1.Visible = True
ImageMin2.Visible = False
ImageMin3.Visible = False
ImageClose2.Visible = False
ImageClose3.Visible = False
End Sub Private Sub ImageClose2_Click()
Unload Me '释放窗口,关闭程序
End Sub Private Sub ImageClose1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ImageClose3.Visible = True
ImageClose2.Visible = False
End Sub Private Sub ImageClose1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
ImageClose2.Visible = True
ImageClose1.Visible = False
End Sub Private Sub ImageMin2_Click()
miniwindow = CloseWindow(Form1.hwnd) '最小化窗口
End Sub Private Sub ImageMin1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ImageMin3.Visible = True
ImageMin2.Visible = False
End Sub Private Sub ImageMin1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
ImageMin2.Visible = True
ImageMin1.Visible = False
End Sub
工程下载地址: http://download.csdn.net/detail/snowren3074/6469381
水梦雪
SnowEmail3074@163.com
窗口界面编程之一:VB实现简单异形窗口的更多相关文章
- Android开发自学笔记(Android Studio)—4.界面编程与View组件简单介绍
一.引言 Android应用开发最重要的一份内容就是界面的开发,无论你程序包含的内容多么优秀,如若没有一个良好的用户交互界面,最终也只是会被用户所遗弃.Android SDK提供了大量功能丰富的UI组 ...
- 分享在winform下实现左右布局多窗口界面
在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform.WPF中实现其实也很容易,我这里就分享一个:在winform下实现左右布局多窗口 ...
- 在winform下实现左右布局多窗口界面的方法(一)
在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform.WPF中实现其实也很容易,通过本文给大家介绍在winform下实现左右布局多窗口 ...
- [置顶] VC++界面编程之--使用分层窗口实现界面皮肤
使用分层界面来实现界面皮肤的好处是:可以保证图片边缘处理不失真,且能用于异形窗口上,如一些不规则的窗口,你很难用SetWindowRgn来达到理想效果. 在很多情况下,界面的漂亮与否,取决于PS的制作 ...
- VC++界面编程之--使用分层窗口实现界面皮肤
使用分层界面来实现界面皮肤的好处是:可以保证图片边缘处理不失真,且能用于异形窗口上,如一些不规则的窗口,你很难用SetWindowRgn来达到理想效果. 在很多情况下,界面的漂亮与否,取决于PS的制作 ...
- Java界面编程-建立一个可以画出图形的简单框架
引子:总共使用3个.java文件,建立一个简单界面编程的框架. 第1个文件:NotHelloWorldComponent.java //NotHelloWorldComponent.java 1 im ...
- 一个最简单的Delphi2010的PNG异形窗口方法
同事演示了一个.NET的的PNG异形窗口.挺漂亮.于是也想用Delphi显摆一个. 关于Delphi用PNG做异形窗口的资料有不少.都是用GDIPlus或者TPNGImage组件加载PNG图像做的.但 ...
- Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译
一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需 ...
- 图形界面编程成就了C++
听有人说C#.VB比C++好是因为做界面方便还算傻得可爱,听有人说用C++做数值计算而不屑于做界面可就对不起咱C++的恩人了.这我可要说道说道. 想当年C++刚出江湖,名门出身,自立门派,想抢Obje ...
随机推荐
- CreateThread函数&&CString::GetBuffer函数
对这个两个常见的windows下的函数学习了一下: //最简单的创建多线程实例 #include <stdio.h> #include <windows.h> //子线程函数 ...
- Hamming Weight的算法分析(转载)
看代码时遇到一个求32bit二进制数中1的个数的问题,感觉算法很奇妙,特记录学习心得于此,备忘. 计算一个64bit二进制数中1的个数. 解决这个问题的算法不难,很自然就可以想到,但是要给出问题的最优 ...
- python实现不可修改的常量
因为种种原因,Python并未提供如C/C++/Java一样的const修饰符,换言之,python中没有常量,至少截止2015年年末,还没有这个打算.Python程序一般通过约定俗成的变量名全大写的 ...
- Numpy中的矩阵合并
列合并/扩展:np.column_stack() 行合并/扩展:np.row_stack() >>> import numpy as np >>> a = np.a ...
- 在mac上搭建python环境
原文出处:http://blog.justbilt.com/2014/07/02/setup_python_on_mac/ 这两天重新搞了下python的环境,发现好多地方还是容易忘记,因此有了这篇文 ...
- 随手记录一个 firefox的backgroundPostion-x和-y的问题
今天帮大师写了一天项目,后来在测试一个显示升序和降序的标签上面,我使用了一个backgroundPosition-y来判断当前icon的状态,却无法不管是使用闭包还是个钟手段,在 firefox下面总 ...
- LINQ标准查询操作符(四) —AsEnumerable,Cast,OfType,ToArray,ToDictionary,ToList,ToLookup,First,Last,ElementAt
十.转换操作符 转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以“As”开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以“To”开头的方法可枚举(即时加载)源集合并 ...
- 第三百三十一天 how can I 坚持
今天加了一天班,好累,还没吃晚饭,回来只吃了个泡面. 晚上回来的路上,在群里聊的倒是很happy,快笑死我了,仲宫二少,哈哈. 弟弟过两天要去见面,多聊聊,该结婚来. 还有,中午吃的肯德基,不好吃,可 ...
- <转载>浅谈C/C++的浮点数在内存中的存储方式
C/C++浮点数在内存中的存储方式 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100.则在Intel CPU架构的系统中 ...
- SpriteParticle II
[SpriteParticle II] 1.Randomizing the Starting Position 2.Setting the Initial Angle 3.Setting a Part ...