1. 程式人生 > >windows程式設計讀書筆記--------資源

windows程式設計讀書筆記--------資源

 windows使用資源的一個好處是能夠統一的進行管理,把所有的資源都繫結到程式的.EXE檔案中。如果沒有資源的概念的話,資源不得不單獨的作為一個檔案來儲存,並在使用的時候將其讀入記憶體。windows程式設計中,主要有如下一些資源:圖示,滑鼠指標,字串,自定義資源,選單,鍵盤加速鍵,對話方塊,點陣圖。

在VC中在程式中引入資源的一種便捷方法是:(1)設定一個工程已開啟,如下:File->New,在彈出的New對話方塊中,選擇files中的resource script,填寫相關檔名稱及工程。(2)Insert->resource,在彈出的對話方塊中,選擇要建立的資源型別,在根據實際情況就OK了。

圖示

程式中運用圖示,可分為系統定義的圖示和程式設計師定義的圖示。

對於系統定義的圖示使用:

      wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);

對於系統定義的圖示運用LoadIcon來載入時,第一個引數必須為NULL,表示該圖示有系統內定,第二個引數表示系統內定的圖示的ID號,系統定義的圖示主要有:

       IDI_APPLICATION:32512     IDI_QUESTION:332514

    IDI_HAND:32513                   IDI_EXCLAMATION:32515

    IDI_ASTERISK :32516          IDI_WINLOGO:32517

    IDI_UAC :32518(僅Vista、Win7)

自己定義的圖示:

      wndclass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON));

其中第一個引數表示資源圖示的實力來自的例項控制代碼,第二個引數實際是一個字串指標。

#define    MAKEINTRESOURCE(i)  DOWORD((WORD)(i))

這樣也就是說其也可以這樣使用或者定義:
     wndclass.hIcon=LoadIcon(hInstance,szAppName);//其中szAppNmae為一個字串,其代表如表文件

在.RC檔案中資源指令碼ICON語句形式如下eg:

     IDI_ICON   ICON    DISCARDABLE      "icondemo.icon"

 其中IDI_ICON為圖示ID識別符號。ICON代表資源指令碼的型別。IDSCARDABLE表示windows在需要是可以自動將圖示從記憶體中移除,在需要是自動載入到記憶體中,無需程式設計師操作。

如果需在程式中動態改變圖示時,可以使用SetClassLong函式:

    SetClassLong(hwnd,GCL_HICON,LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ALTICON));

也就是說程式中使用圖示有兩種方法:一種是在定義視窗類時,使用LoadIcon函式初始化hIcon項。一種是在程式中使用SetClassLong函式。

滑鼠指標

使用方法:第一種在建立視窗類時,使用LoadCursor函式初始化hCursor項,第二種時呼叫SetClassLong函式動態改變。第三種是使用SetCursor(hCursot)函式。

字串資源

在使用時,應該使用LoadString來複制字串到緩衝區中,便以在程式中使用:

    LoadString(hIstance,id,szBuffer,iMaxLength);

ID:字串資源的ID Caption:字串

自定義資源

方法:Insert->Resorce,在對話方塊中選擇Custom按鈕。

在初始化時可以使用LoadResource函式來獲得控制代碼:

 hResource=LoadResource(hInstance,

                       FindResource(hInstance,MAKEINTRESOURCE(IDR_BINTU),TEXT("BTNTU"));

其中的hResource為HGLOBAL型別,既其指向記憶體塊的控制代碼。

如果需要訪問文字時,應呼叫LockResource函式和FreeResource函式:
pdata=LockResource(hResource);//pdata為指向文字的指標

FreeResource(hResource);//釋放資源

-------------------------------------------------------------------------------------------------------------

選單

選單的建立的方法和上面的各種資源建立方法類似。

建立時會彈出一個對話方塊:

  ID:其為唯一標識選單項的識別符號 Caption:表示選單項的字串。可以在一個字母前使用&. eg:  &Copy  表示可以用Alt+c來開啟該選單項,其與快捷鍵的使用區別在於,快捷鍵無需開啟擁有該選單項的選單。 屬性:Separator:顯示分割線      Pop-up:表示擁有淡出選單     Inactive:表示該選單項是非活動的              Grayed:表示該選單項是非活動的,其會變灰        Help:表示會顯示幫助資訊            Checked:表示該選單項的旁邊會加一個複選標記   引用選單的三種方法:

方法一:wndclass.lpszMenuName=szAppName;

方法二:先用LoadMenu函式載入到記憶體並獲得控制代碼,在呼叫CreateWindow函式時指定相應選單項

                  hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(ID_MENU));

                   hwnd=CreateWindow("myclass","dfds",WS_OVERLAPPEDWINDOW,

                                CW_USEDFAULT,CW_USEDEFAULT,CW_USEDEAULT,

                               CW_USEDEFAULT,NULL,hMenu,hInstance,NULL):

方法三:SetMenu(hwnd,hMenu)函式在建立視窗後指定選單。

與選單相關的一些訊息:

1)WM_INITMENU訊息

        wParam: 主選單控制代碼

        lParam:  0

        產生:當一個選單即將變為活動時,傳送此訊息

2)WM_MENUSELECT訊息

      LOWORD(wParam):  所選的選單項:選單的ID或彈出選單的索引

      HIWORD(wParam): 選擇標記

      lParam:  包含所選項的選單控制代碼

      產生:當滑鼠或者游標在各選單項移動時,會產生許多該訊息

      選擇標記:

         MF_DISABLED:使選單項無效,使該項不能被選擇,但不使選單項變灰。

         MF_GRAYED:使萊單項無效並變灰,使其不能被選擇。

         MF_CHECKED:在選單項旁邊放置一個選取標記。     

         MF_BITMAP:含有點陣圖控制代碼

         MF_POPUP:指定選單開啟一個下拉式選單或子選單

         MF_HELP:幫助

         MF_SYSMENU:顯示系統彈出選單

         MF_MOUSESELECT

3)WM_INITMENUPOPUP訊息

     wParam: 彈出選單控制代碼

     LOWORD(lParam) : 彈出選單的索引

     HIWORD(lParam) :1代表系統選單,0代表其他選單

     產生::Windows要顯示彈出選單時,會向視窗過程傳送此訊息。

4)WM_COMMAND訊息

     LOWORD(wParam): 選單的ID

     HIWORD(wParam):  0

     lParam: 0

    產生:當一個選單被選中時產生

5)WM_MENUCHAR訊息

      LOWORD(wParam):字元碼

      HIWORD(wParam):  選擇碼

      lParam:     選單控制代碼

      產生:如果使用者按下了Alt和一個不對於任何選單項的字元鍵;或者,當淡出選單顯示時,

                  按下了一個不對應於任何彈出選單項的字元鍵。

     選擇碼:0                                      沒有彈出選單顯示

                     MF_POPUP                    彈出選單被顯示

                    MF_SYSYMENU             系統彈出選單被顯示

使用CreateMenu()和AppendMenu函式來建立選單

-------------------------------------------------------------------------------------------------------------------

加速鍵

使用LoadAccelerators函式將鍵盤加速鍵表載入到記憶體中:

HANDLE  hAccel;

hAccel=LoadAccelerators(hInstance,TEXT("MyAccelerators"));

在獲得訊息是可使用TranslateAccelerators(hwnd,hAccel,&msg)來對獲得訊息進行翻譯,如果其與鍵盤加速鍵表中的值匹配,就將該訊息傳給擁有選單的視窗過程,則返回TRUE,否則返回FALSE。

因此可以這樣處理:

while(GetMessage(&msg,NULL,0,0))

        if(!TranslateAcdelerator(hwnd,hAcdel,&msg)) 

        {

                TranslateMessage(&msg);

                DispathMessage(&msg);

         }

}

WM_COMMAND訊息

LOWORD(wParam):   加速鍵ID

HIWORD(wParam):      1

lParam:                            0

ID:快捷鍵對應的選單的ID

Key:虛擬件碼或者AXCII碼

Modifiers:選擇和虛擬件碼組合的鍵

Type:Key中是虛擬件碼還是ASCII碼

----------------------------------------------------------------------------------------------------------------------

一些陌生的函式:

1):CheckMenuItem(hmenu, id,  uCheck); 

           函式功能:該函式取得與指定選單項相聯絡的選單標誌。如果該選單項打開了一個子選單,該函式也返回子選單裡的選單項數。

           uCheck引數:MF_CHECKED,MF_UNCHECKED,MF_BYCOMMAND,MF_BYPOSITION,

                                     MF_DISABLED,MF_ARAYED,MF_HILITE,MF_MENUBARBREAK,MF_SEPARATOR

2):DWORD SetClassLong(HWND hWnd,int nlndex,LONG dwNewLong);

            函式功能:該函式替換在額外類儲存空間的指定偏移地址的32位長整型值,或替換指定視窗所屬類的WNDCLASSEX結構。

            nIndex引數:GCL_CBCLSEXTRA ,GCL_CBWNDEXTRA, GCL_HBRBACKGROUND,

                                    GCL_HCURSOR,GCL_HMODULE , GCL_MENUNAME,GCL_WNDPROC    

            dsNewLong引數:用於替換的值    

3)DWORD GetClassLong(HWND hWnd,int nlndex)

           函式功能:該函式返回與指定視窗相關的WNDCLASSEX結構的指定32位值

           nIndex引數:GCL_CBCLSEXTRA ,GCL_CBWNDEXTRA, GCL_HBRBACKGROUND,

                                   GCL_HCURSOR,GCL_HMODULE ,   GCL_MENUNAME,GCL_WNDPROC    

4)BOOL EnableMenuItem(HMENU hMenu,UINT uIDEnableItem, UINT uEnable);

           函式功能:允許或禁止指定的選單條目

           uEnable引數::MF_BYCOMMAND,MF_BYPOSITION,MF_ENABLED,

                                          MF_DISABLED,MF_GRAYED

5)CreateMenu()

           函式功能:建立選單

           返回值:指向建立的選單記憶體塊的控制代碼

6)BOOL AppendMenu(hMenu hMenu,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);

          函式功能:函式在指定的選單條、下拉式選單、子選單或快捷選單的末尾追加一個新選單項。此函式可指定選單項的內容、外觀和效能

          unFlags引數:MF_BITMAP,MF_CHECKED,MF_DISABLED,MF_ENABLED,MF_GRAYED,

                                     MF_MENUBARBREAK, MF_MENUBREAK,MF_POPUP, MF_SEPARATOR,

                                     MF_STRING,MF_UNCHECKED ,MF_OWNERDRAW

7)BOOL TrackPopupMenu(HMENU hMenu,UINT uFlags,int x,int y,int nReserved,HWND hWnd,CONST RECT* prcRect);

             函式功能:該函式在指定位置顯示快捷選單,並跟蹤選單項的選擇。快捷選單可出現在螢幕上的任何位置。

             uFlags引數:TPM_CENTERALIGN,TPM_LEFTALIGN,TPM_RIGHTALIGN,TPM_BOTTOMALIGN

                                      TPM_TOPALIGN,TPM_VCENTERALIGN,TPM_NONOTIFY,TPM_RETURNCMD,

                                      TPM_LEFTBUTTON,TPM_RIGHTBUTTON

             NReserved:保留值,必須為零。

            PrcRect:未用。

8)GetSystemMenu(hwnd,True);//獲取系統選單控制代碼

9)iCount=GetMenuItemCount(hMenu);//計運算元選單的項數

10) GetSubMenu(hMenu,iPosition);//獲取子選單的控制代碼

11)id=GetMenuItemID(hMenuPopup,iPosition);//獲取ID

12)DarwMenuBar(hwnd);//強制重繪

13)iFlags=GetMenuState(hMenu,id,iFlag);//獲取當前選單項的狀態

14)iCharCount=GetMenuString(hMenu,id,pString,iMaxCount,iFlag);//獲取選單項上的字串

15)SetMenu(hwnd,hMenuMain);

16)BOOL InsertMenu(HMENU hMenu,UINt uPosition,UINT uFlags,UINT uIDNewltem,LPCTSTR lpNewltem);

          函式功能:函式插入一個新選單項到選單裡,並使選單裡其他項下移。

          iPosition引數:指定新選單項將被插入其前面的選單項,其含義由引數uFlagS決定

         uFlags引數:MF_BYCOMMAND,MF_BYPOSITION, MF_BITMAP,MF_CHECKED ,

                                  MF_DISABLED,MF_ENABLED,MF_GRAYED,MF_MENUBARBREAK,

                                  MF_MENUBREAK,MF_OWNERDRAW,MF_POPUP,MF_SEPARATOR,

                                   MF_STRING,MF_UNCHECKED

        uIDNewltem引數:指定新選單項的識別符號,或者當引數uFlags設定為MF_POPUP時,指定下拉式選單或子選單的控制代碼。

  LpNewltem引數:指定新選單項的內容。其含義依賴於引數UFlags是否包含標誌MF_BITMAP,MF_OWNERDRAW或MF_STRING。

17)BOOL ModifyMenu(HMENU hMnu,UINT uPosition,UINT uFlags,UINT uIDNewltem,LPCTSTR IpNewltem);

        函式功能:該引數修改已存在的選單項,並指定選單項的內容、外觀和效能。

18)BOOL RemoveMenu(HMENU hMenu,UINT uPosition,UINT uFlgs);

       函式功能:該函式從指定選單刪除一個選單項或分離一個子選單。如果選單項開啟一個下拉式選單或子選單,RemoveMenu不消毀該選單或其控制代碼,允許選單被重用。

                           在呼叫此函式前,函式GetSubMenu應當取得下拉式選單或子選單的控制代碼。