|
VC++对话框与控件 |
本文介绍如何在程序中使用多种皮肤风格与注意事项。
纲要:
引言
Skin++ 2.0以上版本增加了在一个程序中可以同时使用多套皮肤风格的功能。在目前主流的软件中都使用了该功能,使你的软件不再千篇一律。
满足了某些控件特殊处理的需要。在本文中,我们以按钮、组合框、窗体、菜单为例进行详细说明。[回到纲要]
资源ID就是Skin++ 用来识别程序中同一种类型的不同控件对象使用不同风格皮肤的一个重要的标识。
通过设置皮肤对象的Resource ID 可以为同一种类型的窗口对象指定不同的皮肤风格。
在Skin++ Builder中显示如下:

例如:
一个Dialog窗体上有3个按钮,并且需要3种不同的风格。这个时候,我们可以在Builder中创建3个按钮皮肤对象:SkinButton1、SkinButton2、SkinButton3。在这3个皮肤对象的Resource ID中分别指定该三个按钮在程序中的资源ID(VC: Resource.h中定义的控件资源ID值)。这样Skin++在进行换肤的时候会首先根据自己的Resource ID值到皮肤包中去搜索相应的皮肤对象,如果找到就用该对应的皮肤进行贴图,如果没有找到就用Resource ID为空的同种类型的皮肤对象进行贴图。
在Skin++中,有两种形式的Resource ID .
一种是子窗口的控件ID,在程序中可以用API函数GetDlgCtrlID(HWND hWnd)获得其ID值;
另一种是弹出窗口(非子窗口,就是窗口风格中没有WS_CHILDWINDOW)的指定ID,这个ID值是使用skinppSetWindowResID(HWND hWnd,int nResID) [Skin++2.0库提供] 指定的整形值。
目前使用子窗口控件ID的皮肤对象有:SkinButton、ToolBar、StatusBar、ProgressBar、ScrollBar、Header、ComboBox、IPAddress、HotKey、CheckBox、RadioBox、TrackBar、Spin、TabCtrl、Client、ControlBar、ReBar、GroupBox、Static、Datetime
目前使用指定ID的皮肤对象有:SkinFrame 、ToolWindow、Dialog、Popup Menu
目前不使用Resource ID的皮肤对象有:Application,其设置值在整个皮肤配置中只存在一份。[回到纲要]

在这里,我们创建单文档工程:MultiStyleDemo,

点击完成,我们成功创建了案例工程。[回到纲要]
按钮部分可以设置五个状态(正常、按下、禁用、热点、默认)的背景图片、字体、颜色、光标、提示等。
案例中按钮IDC_BTN_STYLE2的文本是“按钮风格2(自定义风格1)”,
在Resource.h中的定义是 :#define IDC_BTN_STYLE2
1001,这个按钮的ResourceID为1001.
我们在Skin++ Builder中创建一个SkinButton,在ResourceID属性中,填上1001。这样,皮肤和程序中的资源ID就关联上了。
以后Skin++就用这个按钮配置对IDC_BTN_STYLE2按钮进行贴图和光标、提示等调用。
按钮IDC_BTN_STYLE2在Skin++ Builder中的设置如下图所示:

按钮IDC_BTN_STYLE3在Skin++ Builder中的设置如下图所示:

运行效果图如下:

按钮的多风格设置,全部在SkinBuilder中设置,不需要添加程序代码。[回到纲要]
案例中通用的ComboBox如下图所示:

案例中第一个自定义ComboBox的ID为IDC_COMBO_STYLE1,
在Resource.h中的定义是 :#define IDC_COMBO_STYLE1
1004,这个ComboBox的ResourceID为1004。
我们在SkinBuilder中创建一个SkinComboBox,在ResourceID属性中,填上1004。这样,皮肤和程序中的资源ID就关联上了。以后Skin++就用这个配置对IDC_COMBO_STYLE1按钮进行贴图。
IDC_COMBO_STYLE1在SkinBuilder中的设置如下图所示:

在SkinBuilder中再创建一个SkinScrollbar对象,在ResourceID属性中,填上1004。这样ComboBox的下拉列表框部分的滚动条就和这个对象设置相关联了。在SkinBuilder中设置如下图:

运行效果如图:

IDC_COMBO_STYLE2在SkinBuilder中的设置同IDC_COMBO_STYLE1,
具体设置如下图所示:


IDC_COMBO_STYLE2 的显示效果如下图:
在SkinBuilder中创建一个SkinFrame对象,设置其ResourceID为2008,这个数字你可以自己确定,但必须和该窗体的在程序中设置的ID保持一致。由于弹出类型的窗体在运行过程无法获得ResourceID,所以我们需要使用Skin++提供的接口进行设置,该接口是skinppSetWindowResID(HWND hWnd,int nResID),第一个参数是窗口的句柄,第二个参数是我们自己确定的一个ID值,该值用来关联窗体和皮肤对象。注意,我们在该窗口的WM_NCCREATE消息响应处进行设置,具体写法如下:
BOOL CMultiStyleFrame::OnNcCreate(LPCREATESTRUCT
lpCreateStruct)
{
if (!CDialog::OnNcCreate(lpCreateStruct))
return
FALSE;
sppSetWindowResID(m_hWnd,2008);
return TRUE;
}
在SkinBuilder中的设置如下图:
在SkinBuilder中设置上面SkinFrame对象的菜单部分,如下图所示:

运行效果图如下:

Copyright@2004-2007 上海勇进软件有限公司,保留所有权利。
如果您对帮助系统有任何建议,可以直接发邮件到
Visual Studio,和Visual Studio logo 是微软公司在美国或在其他国家的注册商标。