?? 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函數(shù)可以做出一些奇怪的形狀。比如,窗體是圓角矩形,在中間挖一個橢圓形的洞。</p>
<p>
先要理解一個重要的概念:區(qū)域。區(qū)域是描述設備場景中某一塊的GDI對象,每個區(qū)域都有一個句柄。一個區(qū)域可以是矩形,也可以是復雜的多邊形,甚至是幾個區(qū)域組織在一起。窗體默認的區(qū)域就是我們看到的矩形,當然它并非一定要用這個默認的區(qū)域</p>
<p>
現(xiàn)在開始,首先在窗體上做一個圓角矩形區(qū)域,這是窗體的大致輪廓。在圓角矩形里再確定一個橢圓形的區(qū)域,然后把這兩個區(qū)域組織成一個區(qū)域,并設置窗體的區(qū)域為這個組織出來的區(qū)域。</p>
<p> CreateRoundRectRgn函數(shù)用于創(chuàng)建一個圓角矩形區(qū)域;CreateEllipticRgn用于創(chuàng)建一個橢圓區(qū)域;CombineRgn函數(shù)用于將兩個區(qū)域組合為一個新區(qū)域;SetWindowRgn函數(shù)允許您改變窗口的區(qū)域。使用其他的函數(shù)還可以做出其他更奇怪的窗體。</p>
<p> 源代碼如下:</p>
<p><font color="#000080"> Option Explicit<br>
</font><br>
<font color="#008000"> ' API 函數(shù)聲明<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"> '常數(shù)聲明<br>
</font><br>
<font color="#000080">Private Const</font> RGN_DIFF = 4<br>
<font color="#008000"> '
目標區(qū)域被設置為兩個區(qū)域不相交的部分<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"> ' 外邊的圓角矩形區(qū)域<br>
</font> <font color="#000080">Private</font> InRgn <font color="#000080">As
Long</font><br>
<font color="#008000"> ' 里邊的橢圓區(qū)域<br>
</font> <font color="#000080">Private</font> MyRgn <font color="#000080">As
Long</font><br>
<font color="#008000"> '
圓角區(qū)域剪切掉橢圓區(qū)域后的區(qū)域,也是窗體最終的形狀<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>
這個程序運行后,在窗體上單擊,窗體就會變形,雙擊窗體程序結(jié)束。要注意的是,在卸載窗體時,用DeleteObject函數(shù)刪除已定義的區(qū)域。</p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -