?? documents3_1.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>
如何做到當我們單擊窗體的最小化和關閉按鈕時,窗體先最小化到任務欄成為按鈕,然后消失呢?金山詞霸能做到,我們也可以做到。</p>
<p>
只要我們能截獲這兩個事件發送給窗體的消息,然后換成我們自定義的過程,問題就解決了。首先,用CloseWindow使窗體最小化;然后,用Form1.Visible
= False使窗體消失。</p>
<p> 這兩個事件共用一個消息:WM_SYSCOMMAND,不同的是傳遞給窗口函數的wp參數。為取得這兩個事件的wp參數,有兩個方法</p>
<p> 1、用vb的常數,這是一些以SC_為前綴的常數(S代表SYS,C代表COMMAND)</p>
<p> 2、編程取得它們,事實上,我采用的是這種方法。在窗口放兩個文本框,當任何WM_SYSCOMMAND消息發生時,先在文本框里顯示wp和lp的值,很容易的發現,單擊最小化按鈕時,wp=61472;單擊關閉按鈕時,wp=61536。現在就可以開始編程了。</p>
<p> 為了實現對窗體的子類處理,采用MsgHook32控件。</p>
<p> 源代碼如下:</p>
<p><font color="#000080"> Option Explicit<br>
</font><br>
<font color="#008000"> ' API函數聲明<br>
</font> <font color="#000080">Private Declare Function</font>
CloseWindow <font color="#000080">Lib</font> "user32" (<font color="#000080">ByVal</font>
hwnd <font color="#000080">As Long</font>) <font color="#000080">As Long</font><br>
<br>
<font color="#008000"> ' 常數聲明<br>
</font> <font color="#000080">Private Const</font> WM_SYSCOMMAND =
&H112<br>
<br>
<font color="#000080">Private Sub</font> Form_Load()<br>
Msghook1.HwndHook = Form1.hwnd<br>
<font color="#008000"> ' 將Msghook1綁定到Form1上<br>
</font> Msghook1.Message(WM_SYSCOMMAND) = <font
color="#000080">True</font><br>
<font color="#008000"> ' Msghook1攔截WM_SYSCOMMAND消息<br>
</font> <font color="#000080">End Sub</font><br>
<br>
<font color="#000080">Private Sub</font> Msghook1_Message(<font
color="#000080">ByVal</font> msg <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> wp <font color="#000080">As Long</font>, <font
color="#000080">ByVal</font> lp <font color="#000080">As Long</font>, result <font
color="#000080">As Long</font>)<br>
Text1.Text = wp<br>
Text2.Text = lp<br>
<font color="#000080">If</font> wp = 61472 <font
color="#000080">Or</font> wp = 61536 <font color="#000080">Then</font><br>
<font color="#008000"> '
單擊的是最小化或關閉按鈕<br>
</font> CloseWindow
Form1.hwnd<br>
<font color="#008000"> '
最小化窗口<br>
</font> Form1.Visible = <font
color="#000080">False</font><br>
<font color="#008000"> '
使窗口消失<br>
</font> Unload Form1<br>
<font color="#008000"> '
卸載窗口。如果有通知欄圖標,就不用卸載窗口<br>
</font><font color="#000080"> Else<br>
</font> <font
color="#000080">Call</font> Msghook1.InvokeWindowProc(msg, wp, lp)<br>
<font color="#008000"> '
其他的事件由默認窗口函數處理<br>
</font><font color="#000080"> End If<br>
End Sub</font></p>
<p>
不僅是單擊窗口右上角的按鈕,其實,在系統菜單里選擇最小化和關閉菜單項,也有同樣的效果。到此,對金山詞霸的一個小秘密就發覺出來了,接下來,就看看<a
href="Documents3_2.htm">如何實現通知欄圖標</a>吧。</p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -