用户操作
[即时聊天] [发私信] [加为好友]
摄氏37度ID:lzyzuixin
6542次访问,排名15613(-3),好友56人,关注者53人。
认真 负责 富有理想 个性独立
lzyzuixin的文章
原创 45 篇
翻译 0 篇
转载 39 篇
评论 1 篇
摄氏37度的公告
让我们共同来追求技术人生上的卓越
最近评论
xiaoyaoping:能让我们看的方便舒服些么,不会是让我们解读天书吧。
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    转载  如何在VC中使用自定义的SkinMagic控件?收藏

    新一篇: 谁能做空中国股市? | 旧一篇: SkinMagic使用方法完美总结

     在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以上的系统,对于开发商业产品,使不合适的。

    发表于 @ 2008年07月23日 10:52:00|评论(loading...)|收藏

    新一篇: 谁能做空中国股市? | 旧一篇: SkinMagic使用方法完美总结

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 摄氏37度