程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Windows SDK編程(Delphi版) 之 消息框和菜單資源

Windows SDK編程(Delphi版) 之 消息框和菜單資源

編輯:Delphi

 消息框,是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,之後,看我在程序中使用這個菜單資源,然後看看效果

Windows SDK編程(Delphi版) 之 消息框和菜單資源

  查看原圖(大圖)

  編譯之後就生成了那個菜單,但是,這個菜單,目前沒有添加任何功能,要使菜單響應應用程序的點擊,我們需要在窗口過程中處理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/





  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved