现在的位置: 首页 > 综合 > 正文

windows程序设计读书笔记——–资源

2013年06月16日 ⁄ 综合 ⁄ 共 7743字 ⁄ 字号 评论关闭

 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应当取得下拉式菜单或子菜单的句柄。

抱歉!评论已关闭.