📄 documents7.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<style><!--
body,table {font-family:"宋体"; font-size: 9pt; line-height:11pt;}
a {text-decoration:none} a:hover {color:red;text-decoration:underline}
--></style>
<title>奇形怪状的窗体</title>
</head>
<body link="#FF0000" vlink="#FF0000" alink="#FF0000" bgcolor="#FFC8C8">
<table border="0" width="100%" cellspacing="4" cellpadding="6">
<tr>
<td width="100%" bgcolor="#336699"><font color="#FFFFFF">奇形怪状的窗体</font></td>
</tr>
</table>
<p> 普通的窗体都是方方的,使用API函数可以做出一些奇怪的形状。比如,窗体是圆角矩形,在中间挖一个椭圆形的洞。</p>
<p>
先要理解一个重要的概念:区域。区域是描述设备场景中某一块的GDI对象,每个区域都有一个句柄。一个区域可以是矩形,也可以是复杂的多边形,甚至是几个区域组织在一起。窗体默认的区域就是我们看到的矩形,当然它并非一定要用这个默认的区域</p>
<p>
现在开始,首先在窗体上做一个圆角矩形区域,这是窗体的大致轮廓。在圆角矩形里再确定一个椭圆形的区域,然后把这两个区域组织成一个区域,并设置窗体的区域为这个组织出来的区域。</p>
<p> CreateRoundRectRgn函数用于创建一个圆角矩形区域;CreateEllipticRgn用于创建一个椭圆区域;CombineRgn函数用于将两个区域组合为一个新区域;SetWindowRgn函数允许您改变窗口的区域。使用其他的函数还可以做出其他更奇怪的窗体。</p>
<p> 源代码如下:</p>
<p><font color="#000080"> Option Explicit<br>
</font><br>
<font color="#008000"> ' API 函数声明<br>
</font><br>
<font color="#000080">Private Declare Function</font> CreateRectRgn <font
color="#000080">Lib</font> "gdi32" (<font color="#000080">ByVal</font> X1 <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> Y1 <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> X2 <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> Y2 <font
color="#000080">As Long</font>) <font color="#000080">As Long</font><br>
<font color="#000080">Private Declare Function</font>
CreateRoundRectRgn <font color="#000080">Lib</font> "gdi32" (<font
color="#000080">ByVal</font> X1 <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> Y1 <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> X2 <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> Y2 <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> X3 <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> Y3 <font color="#000080">As Long</font>) <font
color="#000080">As Long</font><br>
<font color="#000080">Private Declare Function</font> CreateEllipticRgn
<font color="#000080">Lib</font> "gdi32" (<font color="#000080">ByVal</font> X1 <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> Y1 <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> X2 <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> Y2 <font
color="#000080">As Long</font>) <font color="#000080">As Long</font><br>
<font color="#000080">Private Declare Function</font> CombineRgn <font
color="#000080">Lib</font> "gdi32" (<font color="#000080">ByVal</font> hDestRgn <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> hSrcRgn1 <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> hSrcRgn2 <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> nCombineMode <font
color="#000080">As Long</font>) <font color="#000080">As Long</font><br>
<font color="#000080">Private Declare Function</font> SetWindowRgn <font
color="#000080">Lib</font> "user32" (<font color="#000080">ByVal</font> hWnd <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> hRgn <font
color="#000080">As Long</font>, <font color="#000080">ByVal</font> bRedraw <font
color="#000080">As Boolean</font>) <font color="#000080">As Long</font><br>
<font color="#000080">Private Declare Function</font> DeleteObject <font
color="#000080">Lib</font> "gdi32" (<font color="#000080">ByVal</font> hObject <font
color="#000080">As Long</font>) <font color="#000080">As Long</font><br>
<br>
<font color="#008000"> '常数声明<br>
</font><br>
<font color="#000080">Private Const</font> RGN_DIFF = 4<br>
<font color="#008000"> '
目标区域被设置为两个区域不相交的部分<br>
</font><br>
<font color="#008000"> '模块级变量声明<br>
</font><br>
<font color="#000080">Private</font> OutRgn <font color="#000080">As
Long</font><br>
<font color="#008000"> ' 外边的圆角矩形区域<br>
</font> <font color="#000080">Private</font> InRgn <font color="#000080">As
Long</font><br>
<font color="#008000"> ' 里边的椭圆区域<br>
</font> <font color="#000080">Private</font> MyRgn <font color="#000080">As
Long</font><br>
<font color="#008000"> '
圆角区域剪切掉椭圆区域后的区域,也是窗体最终的形状<br>
</font><br>
<font color="#000080">Private Sub</font> Form_Click()<br>
<font color="#000080">If</font> OutRgn <>
0 <font color="#000080">And</font> InRgn <> 0 <font color="#000080">And</font> MyRgn
<> 0 <font color="#000080">Then Exit Sub</font><br>
<font color="#000080">Dim</font> w <font
color="#000080">As Long</font>, h <font color="#000080">As Long</font><br>
w = ScaleX(Form1.Width, vbTwips, vbPixels)<br>
h = ScaleY(Form1.Height, vbTwips, vbPixels)<br>
MyRgn = CreateRectRgn(0, 0, 0, 0)<br>
OutRgn = CreateRoundRectRgn(30, 30, w - 30, h -
30, 100, 100)<br>
InRgn = CreateEllipticRgn(100, 100, w - 100, h
- 100)<br>
<font color="#000080">Call</font>
CombineRgn(MyRgn, OutRgn, InRgn, RGN_DIFF)<br>
<font color="#000080">Call</font>
SetWindowRgn(Form1.hWnd, MyRgn, <font color="#000080">True</font>)<br>
Form1.BackColor = QBColor(4)<br>
<font color="#000080"> End Sub<br>
</font><br>
<font color="#000080">Private Sub</font> Form_DblClick()<br>
Unload Form1<br>
<font color="#000080"> End Sub<br>
</font><br>
<font color="#000080">Private Sub</font> Form_Load()<br>
OutRgn = 0<br>
InRgn = 0<br>
MyRgn = 0<br>
Form1.Width = 7800<br>
Form1.Height = 6000<br>
<font color="#000080"> End Sub<br>
</font><br>
<font color="#000080">Private Sub</font> Form_Unload(Cancel <font
color="#000080">As Integer</font>)<br>
<font color="#000080">If</font> MyRgn <>
0 <font color="#000080">Then</font> DeleteObject MyRgn<br>
<font color="#000080">If</font> OutRgn <>
0 <font color="#000080">Then</font> DeleteObject OutRgn<br>
<font color="#000080">If</font> InRgn <>
0 <font color="#000080">Then</font> DeleteObject InRgn<br>
<font color="#000080"> End Sub</font></p>
<p>
这个程序运行后,在窗体上单击,窗体就会变形,双击窗体程序结束。要注意的是,在卸载窗体时,用DeleteObject函数删除已定义的区域。</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -