【叶帆开源区】任意透明窗体--运用API实现特异窗体
叶帆 博客专家认证 业界专家认证 2004-09-20 10:43:32 特异窗体是制作一些娱乐小程序所应该掌握的基本功,现把源码公开供大家参考,希望大家也贴出自己的解决方案
程序界面:http://www.bjjr.com.cn/yefan/pic/tform.jpg
源码下载:http://http://blog.csdn.net/yefanqiu 【叶帆源码】-任意透明窗体
部分源码:-----------------------
'*************************************************************************
'**模 块 名:mdlBase
'**说 明:YFHome 版权所有2004 - 2005(C)
'**创 建 人:叶帆
'**日 期:2004-09-19
'**修 改 人:
'**日 期:
'**描 述:透明窗体
'**版 本:V1.0.0
'*************************************************************************
Option Explicit
'*************************************************************************
'**窗体最前有关函数
'*************************************************************************
Public Declare Function SetWindowPos& Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
Public Const SWP_NOMOVE = 2
Public Const SWP_NOSIZE = 1
Public Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE
'*************************************************************************
'**移动窗体有关函数
'*************************************************************************
Public Const HTCAPTION = 2
Public Const WM_NCLBUTTONDOWN = &HA1
Public Declare Function ReleaseCapture Lib "user32" () As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
'*************************************************************************
'**透明窗体有关函数
'*************************************************************************
Public Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type
Public Const RGN_OR = 2
Public Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Public Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Public Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Public Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
'*************************************************************************
'** 背景图图片格式说明 (前景图片可以为真彩色)
'**-----------------------------------------------------------------------
'**1、图片必须是8位格式的BMP图片
'**2、图片颜色最好为双色
'**3、左上角一点颜色为默认透明色
'*************************************************************************
'*************************************************************************
'**函 数 名:SetAutoRgn
'**输 入:hForm(Form) - 窗体
'** :Optional transColor(Byte = vbNull) - 欲透明的色
'**输 出:无
'**功能描述:透明窗体
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2004-09-19
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Public Sub SetAutoRgn(hForm As Form, Optional transColor As Byte = vbNull)
Dim X As Long, Y As Long
Dim Rgn1 As Long, Rgn2 As Long
Dim SPos As Long, EPos As Long
Dim bm As BITMAP
Dim hbm As Long
Dim Wid As Long, Hgt As Long
Dim bmByte() As Byte
'获取窗体背景图片尺寸
hbm = hForm.Picture
GetObjectAPI hbm, Len(bm), bm
Wid = bm.bmWidth + 1
Hgt = bm.bmHeight
ReDim bmByte(1 To Wid, 1 To Hgt)
GetBitmapBits hForm.Picture, Wid * Hgt, bmByte(1, 1) '获取图像数组
If transColor = vbNull Then transColor = bmByte(1, 1)
Rgn1 = CreateRectRgn(0, 0, 0, 0)
For Y = 1 To Hgt '逐行扫描
X = 0
Do
X = X + 1
While (bmByte(X, Y) = transColor) And (X < Wid)
X = X + 1 '跳过透明色的点
Wend
SPos = X
While (bmByte(X, Y) <> transColor) And (X < Wid)
X = X + 1 '跳过不是透明色的点
Wend
EPos = X - 1
'这一段是合并区域
If SPos <= EPos Then
Rgn2 = CreateRectRgn(SPos - 1, Y - 1, EPos, Y)
CombineRgn Rgn1, Rgn1, Rgn2, RGN_OR
DeleteObject Rgn2
End If
Loop Until X >= Wid
Next Y
SetWindowRgn hForm.hwnd, Rgn1, True '设定窗体形状区域
DeleteObject Rgn1
End Sub
'*************************************************************************
'**函 数 名:setFormTop
'**输 入:hwnd(Long) - 窗体句柄
'**输 出:无
'**功能描述:令指定窗体最前
'**全局变量:
'**调用模块:
'**作 者:叶帆
'**日 期:2004-09-19
'**修 改 人:
'**日 期:
'**版 本:V1.0.0
'*************************************************************************
Public Sub setFormTop(hwnd As Long)
SetWindowPos hwnd, -1, 0, 0, 0, 0, FLAGS
End Sub
--------------------------------
【叶帆开源区】其它链接
XP界面窗体制作(可放缩、可缩小到托盘)
http://community.csdn.net/Expert/topic/3387/3387552.xml?temp=.416424
有意思的老人源码
http://community.csdn.net/Expert/topic/3376/3376547.xml?temp=.1939661
VB源码之友
http://community.csdn.net/Expert/topic/3365/3365079.xml?temp=7.926577E-02
定制公用对话框(如photoshop的文件打开对话框)
http://community.csdn.net/Expert/topic/3385/3385386.xml?temp=.2206842
绝对经典的扫雷源码(仿微软扫雷界面)--可以作弊呢!!!
http://community.csdn.net/Expert/topic/3380/3380429.xml?temp=.3048517
MSComm串口通信示例
http://community.csdn.net/Expert/topic/3387/3387736.xml?temp=.2366754