用API制作图形窗体

原创 2003年12月07日 22:41:00
程序说明:

使用GetBitmapBits函数,将图片的颜色信息读到一个数组中,然后就对数组的数据进行扫描,使用CreateRectRgn函数生成每一个有用点的图窗体,再使用CombineRgn函数对有用的图象合并,组成所要的窗体,最后使用SetWindowRgn来设定窗体


程序代码:

Module1

Public Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long

Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) 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 Const RGN_OR = 2

Public Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long


Public Type BITMAP 注释:14 bytes
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type

Dim bmByte() As Byte

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 Any) As Long

注释:Public Const WM_SYSCOMMAND = &H112
注释:Public Const SC_MOVE = &HF012
Public Const HTCAPTION = 2
Public Const WM_NCLBUTTONDOWN = &HA1

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 xoff As Long, yoff As Long

获取窗体背景图片尺寸

hbm = hForm.Picture
GetObjectAPI hbm, Len(bm), bm
Wid = bm.bmWidth
Hgt = bm.bmHeight


ReDim bmByte(1 To Wid, 1 To Hgt)
GetBitmapBits hbm, Wid * Hgt, bmByte(1, 1) 获取图像数组


如果没有传入transColor参数,则用第一个像素作为透明色

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


Form1


Private Sub Form_Load()

Form1.Left = Screen.Width / 2 - Form1.Width / 2
Form1.Top = Screen.Height / 2 - Form1.Height / 2

If Me.Picture <> 0 Then Call SetAutoRgn(Me)

End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)


移动窗体

If Button = vbLeftButton Then
ReleaseCapture
SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&

End If
End Sub

Windows API之图形界面(一)

Windows API之图形界面(一) tkorays (tkorays@hotmail.com) 利用windows api来写图形界面,看起来比较复杂,但是了解原理后也看起来十分简...
  • u013128965
  • u013128965
  • 2014年10月20日 00:57
  • 3719

图形API的两种模式

图形API可以分为retained-mode APIs(保存模式API)和immediate-mode APIs(中间模式API). Direct2D是immediate-mode API,而Wind...
  • kenden23
  • kenden23
  • 2013年12月18日 07:59
  • 1983

C#设计一个窗体

/* *程序的版权和版本声明部分: *程序的版权和版本声明部分: *Copyright(c)2013,烟台大学计算机学院学生 *All rights reserved. *文件名称: *作...
  • u012369373
  • u012369373
  • 2014年11月06日 16:54
  • 613

C#编写简单窗体计算器

说起来话长......     大一学习了一年C++了,一直想做一个 GUI的简单计算器,但是在经理各种折磨之后决定放弃。。。。。     因为偶然的机会开始借出学习C#,或许因为有C++的基础,感觉...
  • null1132214759
  • null1132214759
  • 2017年06月12日 13:15
  • 1927

WindowsAPI学习笔记二 - 图形设备接口及windows绘图

转载自:http://www.cppblog.com/sunshinealike/archive/2009/03/10/76148.html Windows 图形设备接口( Graphics...
  • d_o_n_g2
  • d_o_n_g2
  • 2016年12月07日 15:38
  • 1305

新图形API为unity5 带来了什么&下一代新图形API的好处

西瓜的演讲 ppt翻译+解释+其他: wolf96   在最基本的层面上,这些新api是为了改进CPU性能和效率,通过: 减少CPU渲染瓶颈的情况, 提供更多可预测和稳定的驱动的行为, 给应用程序更多...
  • wolf96
  • wolf96
  • 2015年08月31日 09:46
  • 2148

用VC++制作变形窗体

用VC++制作变形窗体首先,我们要建立一个基于对话框的工程distort,这样生成了三个类,即CAboutDlg , CDistort , CDistortDlg ,我们将要进行大改动的是CDisto...
  • i_like_cpp
  • i_like_cpp
  • 2004年12月03日 08:18
  • 1520

用GDI+制作不规则窗体

1. #define TRANS_COLOR         (ALPHA_MASK | RGB(255, 0, 255)) BOOL CMyDialog::OnInitDialog() { ...
  • weiqubo
  • weiqubo
  • 2011年11月10日 10:48
  • 1855

用C#.net制作不规则窗体

现在我们可以使用C#.net轻松的创建不规则窗体,下面我就用一个简单的例子来讲述其制作过程。 1.绘制不规则窗体位图2.设置窗体基本属性3.编写窗体相关代码  (要实现窗口的关闭,移动等操作)   1...
  • qdzx2008
  • qdzx2008
  • 2006年04月06日 18:46
  • 862

css3 制作各种形状的图形

制作圆形: 要使用CSS来制作一个圆形,我们需要一个div,被给它设置一个ID   圆形在设置CSS时要设置宽度和高度相等,然后设置border-radius属性为宽度或高度的一半即...
  • weixin_40914497
  • weixin_40914497
  • 2017年11月15日 14:46
  • 92
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用API制作图形窗体
举报原因:
原因补充:

(最多只允许输入30个字)