如何在VC中使用自定义的SkinMagic控件?
2008-07-23 10:52
483 查看
在SkinMagic中自定义了一个控件皮肤,并且添加到皮肤文件(.smf);但是,如何在vc程序中使用它呢?本文以CSplitterWnd为例子,说明使用方法。
我想对分割条类CSplitterWnd设计皮肤,SkinMagic没有提供该标准控件;于是,我自定义了该控件。
控件皮肤类型名叫:"SkinSplitter",三个主要属性:
SplitterBar:IMAGERECT类型
Border:IMAGESETION类型
Gripper:IMAGESETION类型
并在皮肤文件中添加了该对象,对象名为"SkinSplitter"。
如图:
现在说说在程序中使用方法,假设我们已经将皮肤文件载入程序,我们重载CSplitterWnd的类名叫CXSplitterWnd。
1、注册控件皮肤对象
重载CSplitterWnd::OnCreate(),然后调用RegisterSkinWindow(m_hWnd,0):
int CXSplitterWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CSplitterWnd::OnCreate(lpCreateStruct) == -1)
return -1;
RegisterSkinWindow(m_hWnd, 0);
return 0;
}
2、控件销毁时,反注册控件皮肤对象
重载CSplitterWnd::OnDestroy(),然后调用UnregisterSkinWindow和CloseSkinData:
void CXSplitterWnd::OnDestroy()
{
CSplitterWnd::OnDestroy();
UnregisterSkinWindow(m_hWnd);
CloseSkinData(m_hSkin);// m_hSkin是在CXSplitterWnd添加的HSKIN类型成员
}
3、添加消息WM_SKINDATACHANGED的响应函数
WM_SKINDATACHANGED是SkinMagic SDK自定义的消息,表示皮肤数据发生改变。编写消息响应函数请读者自行查找,很方便的。:)
我们定义该消息响应函数为OnSkinDataChanged;在其中载入皮肤文件中的对象SkinSplitter:
LRESULT CXSplitterWnd::OnSkinDataChanged(WPARAM wParam, LPARAM lParam)
{
if( m_hSkin ) CloseSkinData( m_hSkin );
m_hSkin = OpenSkinData("SkinSplitter");// 皮肤文件中的自定义皮肤对象
if( m_hSkin )
{
RedrawWindow();
}
return 1;
}
4、调用DrawSkinImageRect、DrawSkinImageSetion等方法重绘分割条
我采取的方法是重载CSplitterWnd::OnPaint(),在其中重绘分割条:
void CXSplitterWnd::OnPaint()
{
......
// rectSplitter是分割条的真实方形区域
// 获取分割条的真实方形区域的方法请看我的另一篇文章"如何获取分割条的真实RECT? "
DrawSkinImageRect(m_hSkin, _T("SplitterBar"), dc, &rectSplitter); // 根据皮肤对象SkinSplitter属性SplitterBar重绘
DrawSkinImageSection(m_hSkin, _T("Border"), dc, &rectSplitter); // 根据皮肤对象SkinSplitter属性Border重绘
DrawSkinImageSection(m_hSkin, _T("Gripper"), dc, &rectSplitter); // 根据皮肤对象SkinSplitter属性Gripper重绘
}
到此结束!
其他自定义控件的使用方法大致相同,只是在重载的函数上可能不同。
希望能帮到大家,:)
是不是想重画分割条,但是用CSplitterWnd::GetRect(...)方法获取后,发现不对呢?这里教你如何获取分割条真实的方形区域。
假如你的分割条类型是CMySplitterWnd(继承自CSplitterWnd),对象是m_Splitter,则
m_Splitter.GetRect(rect)获得的方形区域实际上是整个分割窗口的方形区域。如果想获得分割条的RECT,就得自己计算。方法如
下:
//(假设我们重载了CSplitterWnd::OnPaint())
void CMySplitterWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
int iColumn = 0;
int iRow = 0;
RECT rect1, rect2, rectSplitter;
// 获取每一个垂直的分割条的RECT
for (iColumn=1; iColumn<GetColumnCount(); iColumn++)
{
GetPane(0, iColumn-1)->GetWindowRect(&rect1);
GetPane(GetRowCount()-1, iColumn)->GetWindowRect(&rect2);
rectSplitter.top = rect1.top;
rectSplitter.bottom = rect2.bottom;
rectSplitter.right = rect2.left;
rectSplitter.left = rect1.right;
ScreenToClient(&rectSplitter);
// ... do what u want to do!
}
// 获取每一个水平的分割条的RECT
for (iRow=1; iRow<GetRowCount(); iRow++)
{
GetPane(iRow-1, 0)->GetWindowRect(&rect1);
GetPane(iRow, GetColumnCount()-1)->GetWindowRect(&rect2);
rectSplitter.top = rect1.bottom;
rectSplitter.bottom = rect2.top;
rectSplitter.right = rect2.right;
rectSplitter.left = rect1.left;
ScreenToClient(&rectSplitter);
// ...do what u want to do!
}
}
也有另外一种办法,就是用WTL7.1中的CSplitterWindowImpl类。它的成员函数GetSplitterBarRect(...)可以直接获得,但是WTL7.1只能支持Windows2000及XP以上的系统,对于开发商业产品,使不合适的。
我想对分割条类CSplitterWnd设计皮肤,SkinMagic没有提供该标准控件;于是,我自定义了该控件。
控件皮肤类型名叫:"SkinSplitter",三个主要属性:
SplitterBar:IMAGERECT类型
Border:IMAGESETION类型
Gripper:IMAGESETION类型
并在皮肤文件中添加了该对象,对象名为"SkinSplitter"。
如图:
现在说说在程序中使用方法,假设我们已经将皮肤文件载入程序,我们重载CSplitterWnd的类名叫CXSplitterWnd。
1、注册控件皮肤对象
重载CSplitterWnd::OnCreate(),然后调用RegisterSkinWindow(m_hWnd,0):
int CXSplitterWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CSplitterWnd::OnCreate(lpCreateStruct) == -1)
return -1;
RegisterSkinWindow(m_hWnd, 0);
return 0;
}
2、控件销毁时,反注册控件皮肤对象
重载CSplitterWnd::OnDestroy(),然后调用UnregisterSkinWindow和CloseSkinData:
void CXSplitterWnd::OnDestroy()
{
CSplitterWnd::OnDestroy();
UnregisterSkinWindow(m_hWnd);
CloseSkinData(m_hSkin);// m_hSkin是在CXSplitterWnd添加的HSKIN类型成员
}
3、添加消息WM_SKINDATACHANGED的响应函数
WM_SKINDATACHANGED是SkinMagic SDK自定义的消息,表示皮肤数据发生改变。编写消息响应函数请读者自行查找,很方便的。:)
我们定义该消息响应函数为OnSkinDataChanged;在其中载入皮肤文件中的对象SkinSplitter:
LRESULT CXSplitterWnd::OnSkinDataChanged(WPARAM wParam, LPARAM lParam)
{
if( m_hSkin ) CloseSkinData( m_hSkin );
m_hSkin = OpenSkinData("SkinSplitter");// 皮肤文件中的自定义皮肤对象
if( m_hSkin )
{
RedrawWindow();
}
return 1;
}
4、调用DrawSkinImageRect、DrawSkinImageSetion等方法重绘分割条
我采取的方法是重载CSplitterWnd::OnPaint(),在其中重绘分割条:
void CXSplitterWnd::OnPaint()
{
......
// rectSplitter是分割条的真实方形区域
// 获取分割条的真实方形区域的方法请看我的另一篇文章"如何获取分割条的真实RECT? "
DrawSkinImageRect(m_hSkin, _T("SplitterBar"), dc, &rectSplitter); // 根据皮肤对象SkinSplitter属性SplitterBar重绘
DrawSkinImageSection(m_hSkin, _T("Border"), dc, &rectSplitter); // 根据皮肤对象SkinSplitter属性Border重绘
DrawSkinImageSection(m_hSkin, _T("Gripper"), dc, &rectSplitter); // 根据皮肤对象SkinSplitter属性Gripper重绘
}
到此结束!
其他自定义控件的使用方法大致相同,只是在重载的函数上可能不同。
希望能帮到大家,:)
是不是想重画分割条,但是用CSplitterWnd::GetRect(...)方法获取后,发现不对呢?这里教你如何获取分割条真实的方形区域。
假如你的分割条类型是CMySplitterWnd(继承自CSplitterWnd),对象是m_Splitter,则
m_Splitter.GetRect(rect)获得的方形区域实际上是整个分割窗口的方形区域。如果想获得分割条的RECT,就得自己计算。方法如
下:
//(假设我们重载了CSplitterWnd::OnPaint())
void CMySplitterWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
int iColumn = 0;
int iRow = 0;
RECT rect1, rect2, rectSplitter;
// 获取每一个垂直的分割条的RECT
for (iColumn=1; iColumn<GetColumnCount(); iColumn++)
{
GetPane(0, iColumn-1)->GetWindowRect(&rect1);
GetPane(GetRowCount()-1, iColumn)->GetWindowRect(&rect2);
rectSplitter.top = rect1.top;
rectSplitter.bottom = rect2.bottom;
rectSplitter.right = rect2.left;
rectSplitter.left = rect1.right;
ScreenToClient(&rectSplitter);
// ... do what u want to do!
}
// 获取每一个水平的分割条的RECT
for (iRow=1; iRow<GetRowCount(); iRow++)
{
GetPane(iRow-1, 0)->GetWindowRect(&rect1);
GetPane(iRow, GetColumnCount()-1)->GetWindowRect(&rect2);
rectSplitter.top = rect1.bottom;
rectSplitter.bottom = rect2.top;
rectSplitter.right = rect2.right;
rectSplitter.left = rect1.left;
ScreenToClient(&rectSplitter);
// ...do what u want to do!
}
}
也有另外一种办法,就是用WTL7.1中的CSplitterWindowImpl类。它的成员函数GetSplitterBarRect(...)可以直接获得,但是WTL7.1只能支持Windows2000及XP以上的系统,对于开发商业产品,使不合适的。
相关文章推荐
- VC中如何使用CTreeCtrl控件
- 如何使用VC和OD调试OCX控件
- 图形的绘制,如何使用自定义画笔(颜色,线宽,线形)。如何为程序中添加选项菜单和选项设置对话框,如何使用标准颜色对话框,如何使用字体对话框,在选项对话框中实现预览功能。实现选项对话框和窗口类中的数据交换。如何改变对话框和控件的背景色,如何改变控件的文本颜色,
- Android使用属性动画如何自定义倒计时控件详解
- 如何使用VC自定义菜单
- vc如何自定义消息与在线程中向主窗体控件发送数据
- VC中如何使用自定义消息?
- ASP.NET - 如何:使用自定义函数对 ASP.NET 服务器控件进行验证
- VC 中使用 WebBrowser 控件时自定义 User-Agent 的方法
- Flex中如何通过设置fontFamily样式在ComboBox控件中使用自定义嵌入字体的例子
- C#如何创建自定义控件以及添加自定义属性和事件使用
- 在VC中如何使用OCX控件 【来源:http://blog.csdn.net/wulang1114/article/details/4806089】
- 如何在aspx网页中使用.net编译后的自定义用户控件
- 如何在aspx页面中使用ascx控件(用户自定义的一个控件)?
- vc中日期时间控件如何使用
- 如何在styles.xml中使用控件自定义属性
- 如何在aspx页面中使用ascx控件(用户自定义的一个控件)?
- 使用VC如何处理自定义消息
- How to use toolbar control on dialog using CToolBar class in VC++ - VC++ 中用CToolBar 类如何使用ToolBar控件
- 如何自定义布局文件中,控件对数据源中对数据的使用方式