消息框,是Windows給用戶提示的一種非常有用的方法。消息框的主要作用就是通知用戶發生了某件事情,讓用戶響應。這個在前面已經用過了,那便是 MessageBox這個函數
函數原型為:
int MessageBox(Hwnd hwnd,LPCSTR lpszText,LPCSTR lpszCaption,UINT MBType);
function MessageBox(Handle: THandle;lpszText: pchar;Caption: Pchar;MBType: UINT): integer;
第一個參數指定為父窗口句柄,lpszText指定消息框的消息字符串指針。lpSzCaption指定為消息窗口標題。MBType指定為消息框的顯示類型,包括顯示什麼類型的按鈕和圖標。
MBType的取值為:
MB_ABORTRETRYIGNORE 顯示"終止,重試,護綠"按鈕
MB_ICONEXCLAMATION 顯示一個感歎號圖標
MB_ICONERROR 顯示一個錯誤信息圖標
MB_ICONINFORMATION 顯示一個信息圖標
MB_ICONQUESTION 顯示一個問號
MB_ICONSTOP 顯示一個停止符號
MB_OK 確定按鈕
MB_OKCANCEL 確定,取消按鈕
MB_RETRYCANCEL 重試,取消按鈕
MB_YESNO 是,否按鈕
MB_YESNOCANCEL 是,否,取消按鈕
MBType的值可以是上面的值的組合,組合采用OR或操作來表示,比如MB_OK or MB_ICONINFORMATION
函數返回用戶對消息框的響應。可返回的值為:
Abort IDABORT
Retry IDRETRY
Ignore IDIGNORE
Cancel IDCANCEL
No IDNO
Yes IDYes
Ok IDOK
這個函數的用法非常簡單,我也就不多說了。
現在要詳細講解的是通過資源文件來建立菜單。
Windows支持三種通用類型的菜單:
1、主菜單
2、彈出式子菜單
3、浮動的獨立彈出式菜單
主菜單式應用程序的最高層菜單。
彈出式子菜單是從主菜單下彈出的。
浮動式彈出菜單是自由菜單,也就是我們常用的TPopupMenu.
菜單在Windows應用程序中占據著非常重要的地位,因此Windows內部提供了對菜單的大量支持。在Delphi中,我們使用菜單相當簡單,僅僅拖一個控件,然後設置一下,就完成了。實際上菜單也是可以在RC文件中編寫,然後通過Brcc32編譯成資源文件給Delphi使用的。如果對原生的 Win32 SDK編程非常了解的話,對這個應該比較清楚,菜單實際上也是資源的形式存在程序中的。現在我就說一下如何向窗口中增加一個菜單:
1、在資源文件中定義菜單的形式。
2、在程序創建它的主窗口時加載菜單。
3、處理菜單的選取。
這就是一個SDK程序中使用菜單的幾個步驟。
資源文件,我想大家都不陌生,Delphi中使用R編譯指令來引入資源文件形式為:
{$R XXX.res}
這個應該都不會陌生了,至於一般的資源文件如何使用,我也就不多說了,僅僅說一下菜單這個資源,如何在Delphi的資源文件中體現出來。這個主要就是看菜單資源的定義語句。定義好了之後,編譯一下就可以生成res資源文件了。
所有菜單資源的定義方式都是:
MenuName MENU [Options]
{
menu items
}
其中,MenuName是菜單名(它可以是指定菜單的整形值,也可以是菜單名,在這裡,我全部使用菜單名)。關鍵字Menu告訴資源編譯器正在創建一個菜單。最後跟Option選項,具體內容為:
DISCARDABLE 當不在需要菜單時,可從內存中將其刪除
CHARACTERISTICS info 具體的應用程序信息,其在info中被指定為long
LANGUAGE lang,sub-lang 資源所使用的語言由Lang和sub_lang指定,被用於國際性菜單
VERSION ver 在ver中指定應用程序定義的版本號
大多數應用程序不需要使用任何選項,而只用簡單的使用缺省設置。
用戶可使用兩種語句來定義菜單,MENUITEM和POPUP。MENUITEM指定最終的選取結果,POPUP指定彈出式子菜單,他內部還可以包含其他的MENUITEM或者POPUP語句。其表現形式為:
MENUITEM "菜單名", MenuID [,options]
POPUP "菜單名" [,Options]
MenuID是與菜單項相聯系的唯一整型值,該值在用來在窗口過程中標記用戶到底會觸發那個菜單的過程。這些整型值通常在頭文件中定義為宏,該頭文件同時包含在用戶的應用程序代碼和資源文件rc中。比如
#define IDM_NEW 102
#define IDM_OPEN 103
這兩個,我們可以寫上這兩個,然後定義為一個頭文件MyMenus.h,之後在定義菜單資源的時候,直接引入
#include "MyMenus.h"
MyMenu MENU
{
MENUITEM "新建", IDM_NEW
MENUITEM "打開", IDM_OPEN
}
不過,我們在Delphi中,不是使用頭文件的,所以,我們可以直接將MyMenus.h中的宏定義內容復制到.rc中
#define IDM_NEW 102
#define IDM_OPEN 103
MyMenu MENU
{
MENUITEM "新建", IDM_NEW
MENUITEM "打開", IDM_OPEN
}
這個與#include那個效果一樣,之後,我們將IDM_NEW 這樣的宏定義在Delphi中聲明為
const
IDM_NEW = 102;
IDM_OPEN = 103;
這樣這個菜單的定義就完成了,之後,用Brcc32編譯成一個比如MenuTest.res的資源文件
在工程中引入
{$R MenuTest.res}
這樣就可以使用這個資源菜單了。
然後我們在看看MenuItem的Options選項信息
CHECKED 復選標記,最頂層菜單不能使用
CRAYED 灰色,既Enabled := False;
Help 與幫助的選取有關系,只適用於MenuItem
MenuBARBREAK 對於菜單欄,將引起條目位於一條新線上,對於彈出式菜單,將引起條目位於不同的欄中。此時
條目通過一條豎欄與菜單分離
MENUBREAK 與MenuBARBREAK差不多,只是不使用分離欄
SEPARATOR 創建菜單與菜單之間的分割線,只用於MENUITEM.
那麼現在就來試驗創建一個Delphi2007的部分菜單
#define IDM_Package 102
#define IDM_Unit 103
#define IDM_Form 104
#define IDM_VclApp 105
#define IDM_Other 106
#define IDM_Custom 107
#define IDM_OPEN 108
#define IDM_OPEN1 109
#define IDM_Save 110
#define IDM_SaveAs 111
#define IDM_Exit 112
#define IDM_Copy 113
#define IDM_Paste 114
#define IDM_Cut 115
TestMenu_D2007 MENU
{
POPUP "File"
{
POPUP "New"
{
MENUITEM "Package-Delphi for Win32",IDM_Package
MENUITEM "Unit-Delphi for Win32",IDM_Unit
MENUITEM "Form-Delphi for Win32",IDM_Form
MENUITEM "Vcl Application-Delphi for Win32",IDM_VclApp
MENUITEM SEPARATOR
MENUITEM "Other",IDM_Other
MENUITEM SEPARATOR
MENUITEM "Customize",IDM_Custom
}
MENUITEM "Open",IDM_OPEN
MENUITEM "Open Project",IDM_OPEN1
MENUITEM SEPARATOR
MENUITEM "Save",IDM_Save
MENUITEM "Save as",IDM_SaveAs
MENUITEM SEPARATOR
MENUITEM "Exit",IDM_Exit
}
POPUP "Edit"
{
MENUITEM "Copy",IDM_Copy
MENUITEM "Paste",IDM_Paste
MENUITEM "Cut",IDM_Cut
}
}
保存為D2007Menu.rc,然後使用Delphi的brcc32編譯一下成為D2007Menu.res,之後,看我在程序中使用這個菜單資源,然後看看效果
查看原圖(大圖)
編譯之後就生成了那個菜單,但是,這個菜單,目前沒有添加任何功能,要使菜單響應應用程序的點擊,我們需要在窗口過程中處理WM_COMMAND消息,用戶每進行一次菜單選擇,都會向程序窗口發送一條WM_COMMAND消息,接收到這個消息之後,LOWord(wParam)中的值就是我們在定義菜單資源時定義的菜單ID比如IDM_OPen這樣的,所以我們在窗口過成忠添加一個如下的處理:
代碼
WM_COMMAND:
begin
case LOWord(wParam) of
IDM_Package: MessageBox(hwnd,'點擊了Package選項','消息',64);
IDM_Unit: MessageBox(hwnd,'創建單元麼?','消息',64);
IDM_Form: MessageBox(hwnd,'創建窗口','消息',64);
IDM_Exit: DestroyWindow(Hwnd)
end;
end
這樣這個窗口過程就響應了,但是如果僅僅添加這個的話,程序是會報告錯誤的,所以,我們需要將在資源定義中的宏都作為常量添加進來:
const
IDM_Package = 102;
IDM_Unit = 103;
IDM_Form = 104;
IDM_VclApp = 105 ;
IDM_Other = 106 ;
IDM_Custom = 107 ;
IDM_OPEN = 108 ;
IDM_OPEN1 = 109 ;
IDM_Save = 110 ;
IDM_SaveAs = 111;
IDM_Exit = 112 ;
IDM_Copy = 113;
IDM_Paste = 114;
IDM_Cut = 115;
也可以將這個作為一個inc文件,然後再Delphi中以{$I }的方式引入。
如果不這樣做的話,那麼在那個WM_COMMAND的處理過程中就是用數值吧,而不用這些宏名代替了。
到這裡一個簡單的菜單程序就完成了。以後再講解一下其他的菜單資源,各位也可以在網上查找一下相關的資料先參考一下!
出處:http://dxsoft.cnblogs.com/