• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁編程開發VC|VC++ → 《C語言到底能干什么》1.8 資源的初步深入

    《C語言到底能干什么》1.8 資源的初步深入

    相關軟件相關文章發表評論 來源:滄桑不盡時間:2010/2/1 0:16:32字體大?。?em class="fontsize">A-A+

    作者:滄桑不盡點擊:2081次評論:0次標簽: C語言

    • 類型:源碼相關大?。?i>15.9M語言:中文 評分:3.2
    • 標簽:
    立即下載

    前面已經說了資源的基本概念,不過只是做了和很簡單的介紹,這次我們來點狠的,深入的。前面我雖然也用了資源,不過只是鼠標光標的,回憶下我們的程序,是那么的簡陋。我們早就想把它給裝點下了吧,不用著急,學完了這節后,你就可以成為一個雕刻師了,想讓你的窗口咋樣基本都可以了(需要練習了,呵呵)。

     以當前我這個Word編輯窗口為例,可以看到一個窗口有很多項的,而我們之前的串口跟這個相比,真可謂小巫見大巫。前面的程序連最起碼的菜單欄都沒有,真是慚愧呀。在Vb做界面,簡直就跟畫圖是一樣一樣的,Java中可以在編程時,一個一個組件往窗體對象(JFrame)上畫(也許有IDE可以手畫的),VC中呢,也可以畫,但是注意的細節明顯比VB要多。其實手畫的過程,只是程序幫了我們,幫我們寫了資源文件。這和用網頁設計工具是一樣的,我們只顧點鼠標,代碼則是網頁設計工具生成的了。同樣,其他編程也是這樣,這樣的好處是:一可以讓初學者很容易進入狀態 ,二是可以加快開發,可以少寫n拖代碼。壞處是:不懂得底層機制,很多人寫了n久的程序,也只能是比葫蘆畫瓢,寫的程序界面還是自己學習時候的那種樣式,界面單調死板,開發不出個性界面的。鑒于工具帶來的負面影響,我才給大家從基本說起,雖然我們是用VC 6.0的環境,但是我還是手寫資源來教大家定義資源文件,并不利用VC中IDE工具。如果大家資源文件寫的很熟練的話,再用VC中的IDE工具,不用去看多余的書,自然一看就知道是怎么回事,到時用起來就是得心應手。說實在話,如果不理解Windows的一些處理機制,上去直接去學習VC,我敢肯定學一段時間后,大部分人會頭昏腦脹,事倍功半,雖有收獲,然仍是皮毛,有放棄之想。好了廢話不多說了,言歸正傳。

     如上圖,是我這節要實現的效果,上面有菜單欄,其中點擊“查看”可以菜單子菜單項,彈出的有禁用的菜單、分割線和灰化的菜單項。還有一個我自己做的圖標(xhk字樣的,左上角)。單擊標題欄上的圖標可以彈出系統菜單,在有的程序,在窗口中擊鼠標

    右鍵,就可以彈出“快捷菜單”,這些菜單都屬于彈出式菜單。菜單中的菜單項有好幾種,從資源定義的角度來看,分割用的橫線也是一個菜單項。除橫線外其他菜單項可以供用戶選擇,也可以設置為“禁止”或“灰化”狀態暫時停用,如果上圖的??旖萱I,這個不用說了,大家都知道是做什么用的。菜單項顯示的字符都是在資源文件中定義,至于如何來響應按鍵則要在消息處理函數中添寫代碼了,本節先不討論怎樣獲取這些消息和處理這些消息,這寫留到下節中完成,本節先常用資源的定義格式說下,先完成界面上的東東。

    view source

    print?

    01 1. 菜單資源的定義

    02 在資源腳本文件菜單中的定義格式是這樣的:

    03 菜單 ID MENU [DISCARDABLE]

    04 BEGIN

    05 菜單項的定義

    06 END

    07 也可以這樣定義:

    08 菜單 ID MENU [DISCARDABLE]

    09 {

    10 菜單項的定義

    11 }

    “菜單 ID MENU [DISCARDABLE]”可以用來制定菜單的ID值和內存屬性,菜單ID可以是16位(二進制位)的整數,也可以
    是字符串。但是如果ID位字符串的話,在程序中引用的時候就要用字符串指針代替菜單ID值,顯然這樣不太方便,所以在我們經常
    用整數來做菜單的ID值。MENU關鍵詞后面的DISCARDABLE是菜單的內存屬性,表示菜單在不再使用的時候可以暫時從內存中釋
    放以節省內存,是個可選屬性。菜單項的定義必須在BEGIN和END關鍵詞之內,這兩個關鍵詞也可以用{和}來代替。
    菜單項目的定義方法有三類:
     

    1. 常用的MENUITEM 菜單文字,命令ID [,選項列表]2. 分割線MENUITEM SEPARATOR3. 下級菜單和菜單定義的方式一樣POPUP 菜單文字 [,選項列表]BEGIN Item-definitionsEND
     

    下面對這三類加以說明
    第一類:
    菜單文字——顯示在菜單項中的字符串。像上圖中的“被禁用的菜單項”和“被灰化的菜單項”。
    命令ID——不同菜單項的標識。當菜單被選中的時候,Windows會向窗口過程發送WM_COMMAND消息,消息的參數就是這
    個命令ID。這個可以分辨用戶選中了哪個菜單項,如果想讓兩個菜單項具有相同的功能,可以設置為相同的ID。
    選項列表——用來形容菜單項的各種屬性,它可以是下列選項:
    CHECHKED——表示打上選定標識。
    GRAYED——表示菜單項是灰化的。
    INACTIVE——表示菜單項是禁用的。
    MENUBRREAK或MENUBARBREAK——表示將這個菜單項和以后的那個列到新的列中。
    第二類:
    菜單項之間的分割線,沒什么好說的了。
    第三類:
    彈出式菜單,前文有解釋,這里說下它的選項:
    GREAYED——灰化。
    INACTIV——禁用。
    HELP——表示本項和以后的菜單項是右對齊的,像上圖中的“幫助”菜單。

    2.快捷鍵的定義
    快捷鍵定義是很簡單的,格式如下:
    快捷鍵 ID ACCELERATORS
    BEGIN
    鍵名,命令ID[,類型][,選項]
    END
    BEGIN和END仍然可以用{和}替換。
    鍵名——表示加速鍵對應的按鍵,可以有3中定義方式:
    “^字母”:表示Ctrl鍵加上字母鍵。
    “字母”:表示字母,這時類型必須指明VIRTKEY。
    數值:表示ASCII碼,這時類型必須為ASCII
    命令ID——按下快捷鍵后,Windows就向程序發送此命令ID。
    類型——用來指定鍵的定義方式,可以是VIRTKEY和ASCII,分別用來表示“鍵名”字段定義的是虛擬鍵還是ASCII碼。
    選項——可以使Alt,Control或Shift中的單個或多個,如果指定多個,則中間用逗號隔開,表示快捷鍵是按鍵加上這些控制鍵的
    組合鍵。
    說了這么多,考驗我們的時候終于到了,下面我們就來寫程序了。
    兵馬未動,糧草先行,我們先來把界面定義好,定義一個MyMenu.rc的資源文件,內容如下:
    /**************MyMenu.rc Written By XHK 2009.3.3*************/

    #include <resource.h>

    #define ICO_MAIN 0X1000 //圖標
    #define IDM_MAIN 0X2000 //菜單
    #define IDA_MAIN 0X2000 //快捷鍵

    #define IDM_OPEN 0X4101 //“打開”菜單項
    #define IDM_INACTIVE 0X4201 //“被禁用的菜單項”
    #define IDM_GRAYED 0X4202 //“灰化的菜單項”
    #define IDM_HELP 0X4301 //“幫助”菜單項

    /********The ico file of the window***********/
    ICO_MAIN ICON "xhk.ico"
    /*********************************************/
    /**Next is the definition of the Menus**********/
    IDM_MAIN menu discardable
    {
    popup "文件(&F)"
    {
    menuitem "打開(&O)\tCtrl+Alt+O",IDM_OPEN
    }

    popup "查看(&V)"
    {
    menuitem "被禁用的菜單項",IDM_INACTIVE,INACTIVE
    menuitem separator
    menuitem "被灰化的菜單項",IDM_GRAYED,GRAYED
    }

    popup "幫助(&H)",HELP
    {
    menuitem "幫助主題(&H)\tF1",IDM_HELP
    }
    }

    //下面定義快捷建

    IDA_MAIN accelerators
    {
    VK_F1,IDM_HELP,VIRTKEY //F1
    "O",IDM_OPEN,VIRTKEY,CONTROL,ALT //Ctrl+Alt+O
    }
     

     

    把我們用到的資源ico文件xhk.ico也和此文件放到同一目錄下,然后用資源編譯器rc.exe把MyMenu.rc編譯成MyMenu.res
    下面該出兵了, 程序代碼,采用最精簡的:
    /***********MyMenu.c      Written By XHK 2009.3.3************/

    #include
    <windows.h>

    #define    ICO_MAIN    0X1000    //圖標
    #define    IDM_MAIN    0X2000    //菜單
    #define    IDA_MIAN    0X2000    //快捷鍵

    //回調函數
    LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
    {
       
    switch(Msg)//處理消息過程,什么是消息,下節再講

        {
       
    case WM_DESTROY://響應鼠標單擊關閉按鈕事件

            PostQuitMessage(0);//退出消息隊列,至于什么是消息隊列,下節說
            return 0;//退出函數
        }
       
    return
    DefWindowProc(hWnd,Msg,wParam,lParam);
    }

    //主函數

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int 
    nShowCmd)
    {
       
    char *cName = "myWindow"
    ;
       
    char *cCaption = "帶目錄的窗口  - Made By XHK"
    ;
        WNDCLASSEX wc;
        HWND hWnd;
        MSG Msg;

        wc.cbClsExtra
    = 0
    ;
        wc.cbWndExtra
    = 0
    ;
        wc.cbSize
    = sizeof
    (WNDCLASSEX);
        wc.hbrBackground
    =
    (HBRUSH)GetStockObject(WHITE_BRUSH);
        wc.hCursor
    =
    NULL;
        wc.hIcon
    = LoadIcon(hInstance,MAKEINTRESOURCE(ICO_MAIN));//載入圖標

        wc.hIconSm = NULL;
        wc.hInstance
    =
    hInstance;
        wc.lpfnWndProc
    =
    WinProc;
        wc.lpszClassName
    =
    (LPSTR)cName;
        wc.lpszMenuName
    =
    NULL;
        wc.style
    = CS_HREDRAW |
    CS_VREDRAW;

        RegisterClassEx(
    &
    wc);

        hWnd
    =
    CreateWindowEx(WS_EX_CLIENTEDGE,cName,cCaption,WS_OVERLAPPEDWINDOW,
           
    200,100,300,200
    ,NULL,LoadMenu(hInstance,MAKEINTRESOURCE
    (IDM_MAIN)),hInstance,NULL);
       
    if(hWnd ==
    NULL)
        {
    //容錯處理

            MessageBox(NULL,"There's an Error","Error 
    Title",MB_ICONEXCLAMATION|MB_OK);
            return 0;
        }
        ShowWindow(hWnd,nShowCmd);
    //顯示窗口

        UpdateWindow(hWnd);

       
       
    while(GetMessage(&Msg,NULL,0,0
    ))
        {
            TranslateMessage(
    &Msg);//翻譯消息

            DispatchMessage(&Msg);//分派消息
        }
       
    return
    Msg.message;
    }


    把此編譯為MyMenu.obj,再和MyMenu.res進行連接成MyMenu.exe,運行看看和我截的圖一樣不。當然你也可以定義自己想
    要的界面,不過如果是初學者,可能沒有那么高的悟性吧,不急,慢慢來,你會成為高手的。
    本節又是長篇大論,可能勞您心煩,然資源這方面的知識,在網上也不太好找,想介紹簡單點,怕大家日后碰到沒見過而又
    不好找,所以我盡量壓縮篇幅,依然是冗余漫長。如果大家能夠看到這里,說明您的耐力是很強的,是做大事者,相信您有如此
    精神,一定會光宗耀祖,出人頭地,成就一番輝煌的事業的。

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

      • 8 喜歡喜歡
      • 3 頂
      • 1 難過難過
      • 5 囧
      • 3 圍觀圍觀
      • 2 無聊無聊

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>