VC版本改写的变色龙按钮

乌拉圭软件作者gonchuki开发的变色龙按钮非常漂亮,也非常著名。源代码公开的版本最新为2.0.6B,下载地址为:http://www.planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=37471&lngWId=1
由于该版本是VB开发的,在某些其它的IDE中有些属性不支持,比如说在VC中不支持ToolTipText。我将它改写为一个VC版本。但是该版本比2.0.6B有点删减,比如说gonchuki支持的按钮快捷键我改写的不支持。
另外,我新加了一种Graphic按钮类型,该类型按钮显示4个图片:通常状态图片、按下图片、鼠标移动在按钮上时的图片、Disable时图片,并且在这种类型下,没有按钮边框,可以让开发人员轻松灵活地制作各种按钮效果。
BLOG好像不能上传附件,我只好将接口定义文件及控件的H、CPP文件列出如下(我使用VC6创建的是MFC控件工程,工程名称是Chameleon)
(最后:重发布请注明原作者gonchuki):

//
//
Chameleon.odl
//
//
// Chameleon.odl : type library source for ActiveX Control project.

// This file will be processed by the Make Type Library (mktyplib) tool to
// produce the type library (Chameleon.tlb) that will become a resource in
// Chameleon.ocx.

#include <olectl.h>
#include <idispids.h>

[ uuid(56102E2F-1E92-4CE0-9007-507506A21492), version(1.0),
  helpfile("Chameleon.hlp"),
  helpstring("ChameleonButton,based on gonchuki's work"),
  control ]
library CHAMELEONLib
{
    importlib(STDOLE_TLB);
    importlib(STDTYPE_TLB);

    //  Primary dispatch interface for CChameleonCtrl

    [ uuid(CBD15FBF-9BA7-46C5-B013-5F75A5750E31),
      helpstring("Dispatch interface for Chameleon Control"), hidden ]
    dispinterface _DChameleon
    {
        properties:
            // NOTE - ClassWizard will maintain property information here.
            //    Use extreme caution when editing this section.
            //{{AFX_ODL_PROP(CChameleonCtrl)
            [id(DISPID_BACKCOLOR), bindable, requestedit] OLE_COLOR BackColor;
            [id(DISPID_TEXT), bindable, requestedit] BSTR Text;
            [id(DISPID_ENABLED), bindable, requestedit] boolean Enabled;
            [id(DISPID_FONT), bindable] IFontDisp* Font;
            [id(DISPID_FORECOLOR), bindable, requestedit] OLE_COLOR ForeColor;
            [id(DISPID_HWND)] OLE_HANDLE hWnd;
            [id(1)] long MousePointer;
            [id(2)] IPictureDisp* MouseIcon;
            [id(3)] IPictureDisp* Picture;
            [id(4)] long ButtonType;
            [id(5)] long ColorScheme;
            [id(6)] boolean Press;
            [id(7)] boolean ShowFocusRect;
            [id(8)] boolean Stretch;
            [id(9)] BSTR ToolTipText;
            [id(10)] OLE_COLOR BackOverColor;
            [id(11)] OLE_COLOR ForeOverColor;
            [id(12)] long TextEffect;
            [id(13)] boolean HandPointer;
            [id(14)] IPictureDisp* DownPicture;
            [id(15)] IPictureDisp* OverPicture;
            [id(16)] IPictureDisp* DisablePicture;
            //}}AFX_ODL_PROP

        methods:
            // NOTE - ClassWizard will maintain method information here.
            //    Use extreme caution when editing this section.
            //{{AFX_ODL_METHOD(CChameleonCtrl)
            //}}AFX_ODL_METHOD

            [id(DISPID_ABOUTBOX)] void AboutBox();
    };

    //  Event dispatch interface for CChameleonCtrl

    [ uuid(E9D3BEB5-028F-4330-AF0C-D51827D2E638),
      helpstring("Event interface for Chameleon Control") ]
    dispinterface _DChameleonEvents
    {
        properties:
            //  Event interface has no properties

        methods:
            // NOTE - ClassWizard will maintain event information here.
            //    Use extreme caution when editing this section.
            //{{AFX_ODL_EVENT(CChameleonCtrl)
            [id(DISPID_CLICK)] void Click();
            [id(DISPID_MOUSEDOWN)] void MouseDown(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
            [id(DISPID_MOUSEUP)] void MouseUp(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
            [id(DISPID_MOUSEMOVE)] void MouseMove(short Button, short Shift, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y);
            [id(DISPID_KEYDOWN)] void KeyDown(short* KeyCode, short Shift);
            [id(DISPID_KEYUP)] void KeyUp(short* KeyCode, short Shift);
            [id(DISPID_KEYPRESS)] void KeyPress(short* KeyAscii);
            [id(1)] void MouseOver();
            [id(2)] void MouseOut();
            //}}AFX_ODL_EVENT
    };

    //  Class information for CChameleonCtrl

    [ uuid(6AE6E06F-390B-402D-B3A1-C0FF5FB598E7),
      helpstring("Chameleon Control"), control ]
    coclass Chameleon
    {
        [default] dispinterface _DChameleon;
        [default, source] dispinterface _DChameleonEvents;
    };


    //{{AFX_APPEND_ODL}}
    //}}AFX_APPEND_ODL}}
};

//
//
ChameleonCtl.h
//
//
#if !defined(AFX_CHAMELEONCTL_H__2E1BDC1A_34B2_45FB_A4EA_912BCA97F3E5__INCLUDED_)
#define AFX_CHAMELEONCTL_H__2E1BDC1A_34B2_45FB_A4EA_912BCA97F3E5__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

// ChameleonCtl.h : Declaration of the CChameleonCtrl ActiveX Control class.

/
// CChameleonCtrl : See ChameleonCtl.cpp for implementation.

class CChameleonCtrl : public COleControl
{
    DECLARE_DYNCREATE(CChameleonCtrl)

// Constructor
public:
    CChameleonCtrl();

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CChameleonCtrl)
    public:
    virtual void OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid);
    virtual void DoPropExchange(CPropExchange* pPX);
    virtual void OnResetState();
    //}}AFX_VIRTUAL

// Implementation
protected:
    ~CChameleonCtrl();

    DECLARE_OLECREATE_EX(CChameleonCtrl)    // Class factory and guid
    DECLARE_OLETYPELIB(CChameleonCtrl)      // GetTypeInfo
    DECLARE_PROPPAGEIDS(CChameleonCtrl)     // Property page IDs
    DECLARE_OLECTLTYPE(CChameleonCtrl)        // Type name and misc status

// Message maps
    //{{AFX_MSG(CChameleonCtrl)
    afx_msg void OnTimer(UINT nIDEvent);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
    afx_msg void OnKillFocus(CWnd* pNewWnd);
    afx_msg void OnSetFocus(CWnd* pOldWnd);
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
    afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()

// Dispatch maps
    //{{AFX_DISPATCH(CChameleonCtrl)
    afx_msg long GetMousePointer();
    afx_msg void SetMousePointer(long nNewValue);
    afx_msg LPPICTUREDISP GetMouseIcon();
    afx_msg void SetMouseIcon(LPPICTUREDISP newValue);
    afx_msg LPPICTUREDISP GetPicture();
    afx_msg void SetPicture(LPPICTUREDISP newValue);
    afx_msg long GetButtonType();
    afx_msg void SetButtonType(long nNewValue);
    afx_msg long GetColorScheme();
    afx_msg void SetColorScheme(long nNewValue);
    afx_msg BOOL GetPress();
    afx_msg void SetPress(BOOL bNewValue);
    afx_msg BOOL GetShowFocusRect();
    afx_msg void SetShowFocusRect(BOOL bNewValue);
    afx_msg BOOL GetStretch();
    afx_msg void SetStretch(BOOL bNewValue);
    afx_msg BSTR GetToolTipText();
    afx_msg void SetToolTipText(LPCTSTR lpszNewValue);
    afx_msg OLE_COLOR GetBackOverColor();
    afx_msg void SetBackOverColor(OLE_COLOR nNewValue);
    afx_msg OLE_COLOR GetForeOverColor();
    afx_msg void SetForeOverColor(OLE_COLOR nNewValue);
    afx_msg long GetTextEffect();
    afx_msg void SetTextEffect(long nNewValue);
    afx_msg BOOL GetHandPointer();
    afx_msg void SetHandPointer(BOOL bNewValue);
    afx_msg LPPICTUREDISP GetDownPicture();
    afx_msg void SetDownPicture(LPPICTUREDISP newValue);
    afx_msg LPPICTUREDISP GetOverPicture();
    afx_msg void SetOverPicture(LPPICTUREDISP newValue);
    afx_msg LPPICTUREDISP GetDisablePicture();
    afx_msg void SetDisablePicture(LPPICTUREDISP newValue);
    //}}AFX_DISPATCH
    DECLARE_DISPATCH_MAP()

    virtual void OnBackColorChanged();
    virtual void OnForeColorChanged();
    virtual void OnTextChanged();
    virtual void OnEnabledChanged();
    virtual void OnFontChanged();

    afx_msg void AboutBox();

// Event maps
    //{{AFX_EVENT(CChameleonCtrl)
    void FireMouseOver()
        {FireEvent(eventidMouseOver,EVENT_PARAM(VTS_NONE));}
    void FireMouseOut()
        {FireEvent(eventidMouseOut,EVENT_PARAM(VTS_NONE));}
    //}}AFX_EVENT
    DECLARE_EVENT_MAP()

// Dispatch and event IDs
public:
    enum {
    //{{AFX_DISP_ID(CChameleonCtrl)
    dispidMousePointer = 1L,
    dispidMouseIcon = 2L,
    dispidPicture = 3L,
    dispidButtonType = 4L,
    dispidColorScheme = 5L,
    dispidPress = 6L,
    dispidShowFocusRect = 7L,
    dispidStretch = 8L,
    dispidToolTipText = 9L,
    dispidBackOverColor = 10L,
    dispidForeOverColor = 11L,
    dispidTextEffect = 12L,
    dispidHandPointer = 13L,
    dispidDownPicture = 14L,
    dispidOverPicture = 15L,
    dispidDisablePicture = 16L,
    eventidMouseOver = 1L,
    eventidMouseOut = 2L,
    //}}AFX_DISP_ID
    };

protected:

    /
    //成员函数
    //

    //重绘函数
    int Redraw( int nStatus, bool bForce, CDC * pdcDraw = NULL);

    //检查鼠标是否在控件上
    bool CheckMouseOver();

    //创建控件区域
    int MakeRegion( CRgn & rgnCreate );

    //设置窗口颜色变量
    int SetColor();
    //增减RBG颜色值
    DWORD ShiftColor( DWORD ulColor, int nValue, bool m_bXP = false );
    //XP风格的增减RGB颜色值
    DWORD ShiftColorOXP( DWORD ulColor, int nBase = 0xB0 );

    //画文本
    int DrawCaption( HDC hdcCtrl, int nDrawType );
    //画文本的特效
    int DrawEffect( HDC hdcCtrl, CRect recDraw );

    //画长方形
    int DrawRectangle( HDC hdcCtrl, int nLeft, int nTop, int nWidth, int nHeight, DWORD ulColor, bool bBoard = false );
    //画边框
    int DrawFrame( HDC hdcCtrl, DWORD ulHigh, DWORD ulDark, DWORD ulLight, DWORD ulShadow, int nExtraOffset, bool bFlat = false );
    //画焦点框
    int DrawFocusR( HDC hdcCtrl, CRect recFocus, DWORD ulColor );
    //画线
    int DrawLine( HDC hdcCtrl, int nX1, int nY1, int nX2, int nY2, DWORD ulColor );

    //向ToolTipCtrl发送消息
    void RelayEvent(UINT message, WPARAM wParam, LPARAM lParam);

    //设置鼠标
    int SetMoveCursor( long lMousePointer );
    //恢复鼠标
    int RestoreCursor();

    //获得图片高宽
    int GetPictureSize( int nType, int &nWidth, int &nHeight );

    /
    //属性变量
    //

    //鼠标类型(未使用)
    long m_lMousePointer;
    //m_lMousePointer为99(自定义)时的鼠标(未使用)
    CPictureHolder m_phdMouseIcon;
    //当按钮类型为Graphic时,正常状态图片
    CPictureHolder m_phdPicture;
    //按钮类型
    //Windows16 = 1,
    //Windows32 = 2,
    //WindowsXP = 3,
    //Mac = 4,
    //Java = 5,
    //Netscape6 = 6,
    //SimpleFlat = 7,
    //FlatHight= 8,
    //OfficeXP= 9,
    //Transparent= 10,
    //Hover= 11,
    //KDE2= 12,
    //Graphic = 13
    long m_lButtonType;
    //按钮颜色方案
    //UseWindows = 1,
    //Custom = 2,
    //ForceStandard = 3,
    //UseContainer = 4
    long m_lColorScheme;
    //是否为CheckBox行为风格按扭
    BOOL m_bPress;
    //是否显示焦点框
    BOOL m_bShowFocusRect;
    //是否扩充图片至按钮当前大小
    BOOL m_bStretch;
    //工具提示文本
    CString m_strTipText;
    //鼠标移动在按钮上时的背景颜色
    long m_lBackOverColor;
    //鼠标移动在按钮上时的前景颜色
    long m_lForeOverColor;
    //按钮文字效果
    //None = 0,
    //Embossed = 1,
    //Engraved = 2,
    //Shadowed = 3
    long m_lTextEffect;
    //鼠标移动在按钮上时,是否将光标改为一只手
    BOOL m_bHandPointer;
    //当按钮类型为Graphic时,按下状态图片
    CPictureHolder m_phdDownPicture;
    //当按钮类型为Graphic时,鼠标移动状态图片
    CPictureHolder m_phdOverPicture;
    //当按钮类型为Graphic时,不可用状态图片
    CPictureHolder m_phdDisablePicture;

    /
    //状态变量
    //

    //快捷键(未使用)
    BYTE m_ucAccessKey;

    //鼠标移动在控件上面的标志
    bool m_bMouseOver;
    //当前鼠标类型
    long m_lCursorType;
    //移动在按钮上面之前的鼠标
    HCURSOR m_hPrevCursor;

    //键盘按下的键
    int m_nLastKey;

    //如果Press属性为true,当前是否处于Press状态
    bool m_bPressState;

    //当前焦点状态
    bool m_bFocus;

    //当前按钮状态:0,正常;1,按下
    int m_nStatus;
    //当前显示的文字
    CString m_strText;
    //当前文字的显示位置和大小
    CRect m_recText;
   
    //按钮的高度和宽度
    int m_nWidth;
    int m_nHeight;

    //焦点框
    CRect m_recFocusRect;
    //窗口区域
    CRgn m_rgnControl;

    //各种颜色
    DWORD m_ulFace;
    DWORD m_ulFaceO;
    DWORD m_ulText;
    DWORD m_ulTextO;
    DWORD m_ulShadow;
    DWORD m_ulLight;
    DWORD m_ulHighLight;
    DWORD m_ulDarkShadow;
    DWORD m_ulXPFace;
    DWORD m_ulOfficeXPB;
    DWORD m_ulOfficeXPF;

    //工具提示功能对象
    CToolTipCtrl m_ttpMes;
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CHAMELEONCTL_H__2E1BDC1A_34B2_45FB_A4EA_912BCA97F3E5__INCLUDED)

/*
    /
    //未使用的属性枚举变量
    //

    typedef [uuid(55A57721-6744-49d2-A711-01E12E6CC023), version(1.0)]
    enum ButtonTypes{
        Windows16 = 1,
        Windows32 = 2,
        WindowsXP = 3,
        Mac = 4,
        Java = 5,
        Netscape6 = 6,
        SimpleFlat = 7,
        FlatHight= 8,
        OfficeXP= 9,
        Transparent= 10,
        Hover= 11,
        KDE2= 12,
        Graphic = 13
    } ButtonTypes;
   
    typedef [uuid(7D7C39D1-5479-4650-937A-768645B2634A), version(1.0)]
    enum ColorTypes{
        UseWindows = 1,
        Custom = 2,
        ForceStandard = 3,
        UseContainer = 4
    } ColorTypes;
   
    typedef [uuid(9CE8E7E4-134F-4950-819B-2208193A3F8B), version(1.0)]
    enum EffectTypes{
        None = 0,
        Embossed = 1,
        Engraved = 2,
        Shadowed = 3
    } EffectTypes;

    MousePointer:
    Default        0        (默认值)由对象决定的形状。
    Arrow        1        箭头。
    Cross        2        十字(十字型指针)
    IBeam        3        I 型标。
    Icon        4        图标(在方块中的小方块)。
    Size        5        大小(四向箭头指向上下左右)。
    SizeNESW    6        右上 - 左下大小(双向箭头分别指向右上和左下)。
    SizeNS        7        垂直大小(双向箭头分别指向上和下)。
    SizeNWSE    8        左上 - 右下大小。
    SizeEW        9        水平大小(双向箭头分别指向左和右)。
    UpArrow        10        向上箭头键。
    Hourglass    11        沙漏(等待)。
    NoDrop        12        不允许放下。
    ArrowHourglass    13    箭头和沙漏。
    ArrowQuestion    14    箭头和问号。
    SizeAll            15    四向箭头。
    Custom            99    由 MouseIcon 属性指定的自定义图标。
*/

//
//
ChameleonCtl.cpp
//
//
// ChameleonCtl.cpp : Implementation of the CChameleonCtrl ActiveX Control class.

#include "stdafx.h"
#include "Chameleon.h"
#include "ChameleonCtl.h"
#include "ChameleonPpg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CChameleonApp NEAR theApp;

IMPLEMENT_DYNCREATE(CChameleonCtrl, COleControl)


/
// Message map

BEGIN_MESSAGE_MAP(CChameleonCtrl, COleControl)
    //{{AFX_MSG_MAP(CChameleonCtrl)
    ON_WM_TIMER()
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_KEYDOWN()
    ON_WM_KEYUP()
    ON_WM_KILLFOCUS()
    ON_WM_SETFOCUS()
    ON_WM_MOUSEMOVE()
    ON_WM_SIZE()
    ON_WM_CREATE()
    ON_WM_RBUTTONUP()
    ON_WM_RBUTTONDOWN()
    ON_WM_MBUTTONUP()
    ON_WM_MBUTTONDOWN()
    //}}AFX_MSG_MAP
    ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
END_MESSAGE_MAP()


/
// Dispatch map

BEGIN_DISPATCH_MAP(CChameleonCtrl, COleControl)
    //{{AFX_DISPATCH_MAP(CChameleonCtrl)
    DISP_PROPERTY_EX(CChameleonCtrl, "MousePointer", GetMousePointer, SetMousePointer, VT_I4)
    DISP_PROPERTY_EX(CChameleonCtrl, "MouseIcon", GetMouseIcon, SetMouseIcon, VT_PICTURE)
    DISP_PROPERTY_EX(CChameleonCtrl, "Picture", GetPicture, SetPicture, VT_PICTURE)
    DISP_PROPERTY_EX(CChameleonCtrl, "ButtonType", GetButtonType, SetButtonType, VT_I4)
    DISP_PROPERTY_EX(CChameleonCtrl, "ColorScheme", GetColorScheme, SetColorScheme, VT_I4)
    DISP_PROPERTY_EX(CChameleonCtrl, "Press", GetPress, SetPress, VT_BOOL)
    DISP_PROPERTY_EX(CChameleonCtrl, "ShowFocusRect", GetShowFocusRect, SetShowFocusRect, VT_BOOL)
    DISP_PROPERTY_EX(CChameleonCtrl, "Stretch", GetStretch, SetStretch, VT_BOOL)
    DISP_PROPERTY_EX(CChameleonCtrl, "ToolTipText", GetToolTipText, SetToolTipText, VT_BSTR)
    DISP_PROPERTY_EX(CChameleonCtrl, "BackOverColor", GetBackOverColor, SetBackOverColor, VT_COLOR)
    DISP_PROPERTY_EX(CChameleonCtrl, "ForeOverColor", GetForeOverColor, SetForeOverColor, VT_COLOR)
    DISP_PROPERTY_EX(CChameleonCtrl, "TextEffect", GetTextEffect, SetTextEffect, VT_I4)
    DISP_PROPERTY_EX(CChameleonCtrl, "HandPointer", GetHandPointer, SetHandPointer, VT_BOOL)
    DISP_PROPERTY_EX(CChameleonCtrl, "DownPicture", GetDownPicture, SetDownPicture, VT_PICTURE)
    DISP_PROPERTY_EX(CChameleonCtrl, "OverPicture", GetOverPicture, SetOverPicture, VT_PICTURE)
    DISP_PROPERTY_EX(CChameleonCtrl, "DisablePicture", GetDisablePicture, SetDisablePicture, VT_PICTURE)
    DISP_STOCKPROP_BACKCOLOR()
    DISP_STOCKPROP_TEXT()
    DISP_STOCKPROP_ENABLED()
    DISP_STOCKPROP_FONT()
    DISP_STOCKPROP_FORECOLOR()
    DISP_STOCKPROP_HWND()
    //}}AFX_DISPATCH_MAP
    DISP_FUNCTION_ID(CChameleonCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()


/
// Event map

BEGIN_EVENT_MAP(CChameleonCtrl, COleControl)
    //{{AFX_EVENT_MAP(CChameleonCtrl)
    EVENT_CUSTOM("MouseOver", FireMouseOver, VTS_NONE)
    EVENT_CUSTOM("MouseOut", FireMouseOut, VTS_NONE)
    EVENT_STOCK_CLICK()
    EVENT_STOCK_MOUSEDOWN()
    EVENT_STOCK_MOUSEUP()
    EVENT_STOCK_MOUSEMOVE()
    EVENT_STOCK_KEYDOWN()
    EVENT_STOCK_KEYUP()
    EVENT_STOCK_KEYPRESS()
    //}}AFX_EVENT_MAP
END_EVENT_MAP()


/
// Property pages

// TODO: Add more property pages as needed.  Remember to increase the count!
BEGIN_PROPPAGEIDS(CChameleonCtrl, 4)
    PROPPAGEID(CChameleonPropPage::guid)
    PROPPAGEID( CLSID_CFontPropPage )
    PROPPAGEID( CLSID_CColorPropPage )
    PROPPAGEID( CLSID_CPicturePropPage )
END_PROPPAGEIDS(CChameleonCtrl)


/
// Initialize class factory and guid

IMPLEMENT_OLECREATE_EX(CChameleonCtrl, "CHAMELEON.ChameleonCtrl.1",
    0x6ae6e06f, 0x390b, 0x402d, 0xb3, 0xa1, 0xc0, 0xff, 0x5f, 0xb5, 0x98, 0xe7)


/
// Type library ID and version

IMPLEMENT_OLETYPELIB(CChameleonCtrl, _tlid, _wVerMajor, _wVerMinor)


/
// Interface IDs

const IID BASED_CODE IID_DChameleon =
        { 0xcbd15fbf, 0x9ba7, 0x46c5, { 0xb0, 0x13, 0x5f, 0x75, 0xa5, 0x75, 0xe, 0x31 } };
const IID BASED_CODE IID_DChameleonEvents =
        { 0xe9d3beb5, 0x28f, 0x4330, { 0xaf, 0xc, 0xd5, 0x18, 0x27, 0xd2, 0xe6, 0x38 } };


/
// Control type information

static const DWORD BASED_CODE _dwChameleonOleMisc =
    OLEMISC_ACTIVATEWHENVISIBLE |
    OLEMISC_SETCLIENTSITEFIRST |
    OLEMISC_INSIDEOUT |
    OLEMISC_CANTLINKINSIDE |
    OLEMISC_RECOMPOSEONRESIZE;

IMPLEMENT_OLECTLTYPE(CChameleonCtrl, IDS_CHAMELEON, _dwChameleonOleMisc)


/
// CChameleonCtrl::CChameleonCtrlFactory::UpdateRegistry -
// Adds or removes system registry entries for CChameleonCtrl

BOOL CChameleonCtrl::CChameleonCtrlFactory::UpdateRegistry(BOOL bRegister)
{
    // TODO: Verify that your control follows apartment-model threading rules.
    // Refer to MFC TechNote 64 for more information.
    // If your control does not conform to the apartment-model rules, then
    // you must modify the code below, changing the 6th parameter from
    // afxRegApartmentThreading to 0.

    if (bRegister)
        return AfxOleRegisterControlClass(
            AfxGetInstanceHandle(),
            m_clsid,
            m_lpszProgID,
            IDS_CHAMELEON,
            IDB_CHAMELEON,
            afxRegApartmentThreading,
            _dwChameleonOleMisc,
            _tlid,
            _wVerMajor,
            _wVerMinor);
    else
        return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}


/
// CChameleonCtrl::CChameleonCtrl - Constructor

CChameleonCtrl::CChameleonCtrl()
{
    InitializeIIDs(&IID_DChameleon, &IID_DChameleonEvents);

    //属性变量初始化
    m_lMousePointer = 0;
    m_phdMouseIcon.CreateEmpty();
    m_phdPicture.CreateEmpty();
    m_lButtonType = 3;
    m_lColorScheme = 1;
    m_bPress = FALSE;
    m_bShowFocusRect = TRUE;
    m_bStretch = TRUE;
    m_strTipText.Empty();
    m_lBackOverColor = GetSysColor(COLOR_BTNFACE);
    m_lForeOverColor = GetSysColor(COLOR_WINDOWTEXT);
    m_lTextEffect = 0;
    m_bHandPointer = FALSE;
    m_phdDownPicture.CreateEmpty();
    m_phdOverPicture.CreateEmpty();
    m_phdDisablePicture.CreateEmpty();
   
    //状态变量初始化
    m_ucAccessKey = 0;
    m_bMouseOver = false;
    m_lCursorType = -1;
    m_hPrevCursor = NULL;
    m_nLastKey = 0;
    m_bPressState = false;
    m_bFocus = false;
    m_nStatus = 0;
    m_nWidth = 0;
    m_nHeight = 0;
}


/
// CChameleonCtrl::~CChameleonCtrl - Destructor

CChameleonCtrl::~CChameleonCtrl()
{
    // TODO: Cleanup your control's instance data here.
}


/
// CChameleonCtrl::OnDraw - Drawing function

void CChameleonCtrl::OnDraw(
            CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
    //强制使用传入的pdc重画,pdc可能为控件DC,也可能为容器DC(设计状态)
    Redraw( m_nStatus, true, pdc );
}


/
// CChameleonCtrl::DoPropExchange - Persistence support

void CChameleonCtrl::DoPropExchange(CPropExchange* pPX)
{
    ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    COleControl::DoPropExchange(pPX);

    // TODO: Call PX_ functions for each persistent custom property.
    //属性序列化
    PX_Long(pPX, "MousePointer", m_lMousePointer, 0);
    PX_Picture(pPX, "MouseIcon",m_phdMouseIcon);
    PX_Picture(pPX, "Picture",m_phdPicture);
    PX_Long(pPX, "ButtonType", m_lButtonType, 3);
    PX_Long(pPX, "ColorScheme", m_lColorScheme, 1);
    PX_Bool(pPX, "Press", m_bPress, FALSE);
    PX_Bool(pPX, "ShowFocusRect", m_bShowFocusRect, TRUE);
    PX_Bool(pPX, "Stretch", m_bStretch, TRUE);
    PX_String(pPX, "ToolTipText", m_strTipText);
    PX_Long(pPX, "BackOverColor", m_lBackOverColor, GetSysColor(COLOR_BTNFACE));
    PX_Long(pPX, "ForeOverColor", m_lForeOverColor, GetSysColor(COLOR_WINDOWTEXT));
    PX_Long(pPX, "TextEffect", m_lTextEffect, 0);
    PX_Bool(pPX, "HandPointer", m_bHandPointer, FALSE);
    PX_Picture(pPX, "DownPicture",m_phdDownPicture);
    PX_Picture(pPX, "OverPicture",m_phdOverPicture);
    PX_Picture(pPX, "DisablePicture",m_phdDisablePicture);
}


/
// CChameleonCtrl::OnResetState - Reset control to default state

void CChameleonCtrl::OnResetState()
{
    COleControl::OnResetState();  // Resets defaults found in DoPropExchange

    //重置各属性变量
    m_lMousePointer = 0;
    m_phdMouseIcon.CreateEmpty();
    m_phdPicture.CreateEmpty();
    m_lButtonType = 3;
    m_lColorScheme = 1;
    m_bPress = FALSE;
    m_bShowFocusRect = TRUE;
    m_bStretch = TRUE;
    m_strTipText.Empty();
    m_lBackOverColor = GetSysColor(COLOR_BTNFACE);
    m_lForeOverColor = GetSysColor(COLOR_WINDOWTEXT);
    m_lTextEffect = 0;
    m_bHandPointer = FALSE;
    m_phdDownPicture.CreateEmpty();
    m_phdOverPicture.CreateEmpty();
    m_phdDisablePicture.CreateEmpty();
}

int CChameleonCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (COleControl::OnCreate(lpCreateStruct) == -1)
        return -1;

    //创建控件时,创建工具提示功能对象
    if( m_ttpMes.Create( this, TTS_ALWAYSTIP ) )
    {
        m_ttpMes.AddTool( this );
        if( AmbientUserMode() && m_ttpMes.m_hWnd != NULL )
        {
            if( m_strTipText.GetLength() > 0 )
            {
                m_ttpMes.Activate( true );
                m_ttpMes.UpdateTipText( m_strTipText, this );
            }
            else
            {
                m_ttpMes.Activate( false );
            }
        }
    }

    return 0;
}

void CChameleonCtrl::OnTimer(UINT nIDEvent)
{
    if( nIDEvent == 1 )
    {
        //检查鼠标是否在控件上,不是则激发MouseOut事件
        if( !CheckMouseOver() )
        {
            KillTimer( 1 );
            m_bMouseOver = false;
            if( m_bPressState )
            {
                Redraw( 1, true );
            }
            else
            {
                Redraw( 0, true );
            }

            FireMouseOut();
        }
    }
}

void CChameleonCtrl::OnKillFocus(CWnd* pNewWnd)
{
    COleControl::OnKillFocus(pNewWnd);
   
    //获得/丢失焦点时,将结果记录于m_bFocus
    if( m_bEnabled )
    {
        m_bFocus = false;
        Redraw( m_nStatus, true );
    }
}

void CChameleonCtrl::OnSetFocus(CWnd* pOldWnd)
{
    COleControl::OnSetFocus(pOldWnd);
   
    //获得/丢失焦点时,将结果记录于m_bFocus
    if( m_bEnabled )
    {
        m_bFocus = true;
        Redraw( m_nStatus, true );
    }
}

void CChameleonCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
    if( m_bEnabled )
    {
        short sButton = 0;
        short sShift = 0;

        //按下鼠标左键时重绘控件
        Redraw( 1, false );
   
        //激发MouseDown事件
        if( nFlags & MK_LBUTTON )
        {
            sButton += 1;
        }
        if( nFlags & MK_SHIFT )
        {
            sShift += 1;
        }
        if( nFlags & MK_CONTROL )
        {
            sShift += 2;
        }
        FireMouseDown( sButton, sShift, point.x, point.y );
    }
   
    //激发工具提示对象事件
    RelayEvent( WM_LBUTTONDOWN, (WPARAM)nFlags,
        MAKELPARAM(LOWORD(point.x), LOWORD(point.y)) );

    COleControl::OnLButtonDown(nFlags, point);
}

void CChameleonCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
    if( m_bEnabled )
    {
        short sButton = 0;
        short sShift = 0;

        //根据Press属性及当前鼠标的按下状态重画控件
        if( m_bPress )
        {
            m_bPressState = !m_bPressState;
        }
        if( m_bPressState )
        {
            Redraw( 1, true );
        }
        else
        {
            Redraw( 0, true );
        }

        //激发MouseUp、Click事件
        if( nFlags & MK_LBUTTON )
        {
            sButton += 1;
        }
        if( nFlags & MK_SHIFT )
        {
            sShift += 1;
        }
        if( nFlags & MK_CONTROL )
        {
            sShift += 2;
        }
        FireMouseUp( sButton, sShift, point.x, point.y );
        FireClick();
    }

    //激发工具提示对象事件
    RelayEvent( WM_LBUTTONUP, (WPARAM)nFlags,
        MAKELPARAM(LOWORD(point.x), LOWORD(point.y)) );

    COleControl::OnLButtonUp(nFlags, point);
}

void CChameleonCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
    if( m_bEnabled )
    {
        short sButton = 0;
        short sShift = 0;

        //当鼠标左键按下或者无键按下,并且移动在控件上时
        if( nFlags <= MK_LBUTTON )
        {
            if( CheckMouseOver() )
            {
                if( nFlags == 0 && !m_bMouseOver )
                {
                    SetTimer( 1, 100, NULL );
                    m_bMouseOver = true;
                    Redraw( 0, true );

                    FireMouseOver();
                }
                else if( nFlags == MK_LBUTTON )
                {
                    SetTimer( 1, 100, NULL );
                    m_bMouseOver = true;
                    Redraw( 1, false );
                    m_bMouseOver = false;
                }
            }
        }

        //激发MouseMove事件
        if( nFlags & MK_LBUTTON )
        {
            sButton += 1;
        }
        if( nFlags & MK_RBUTTON )
        {
            sButton += 2;
        }
        if( nFlags & MK_MBUTTON )
        {
            sButton += 4;
        }
        if( nFlags & MK_SHIFT )
        {
            sShift += 1;
        }
        if( nFlags & MK_CONTROL )
        {
            sShift += 2;
        }
        FireMouseMove( sButton, sShift, point.x, point.y );
    }

    //激发工具提示对象事件
    RelayEvent( WM_MOUSEMOVE, (WPARAM)nFlags,
        MAKELPARAM(LOWORD(point.x), LOWORD(point.y)) );

    COleControl::OnMouseMove(nFlags, point);
}

void CChameleonCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if( m_bEnabled )
    {
        USHORT usKey = nChar;
        short sShift = 0;

        m_nLastKey = nChar;

        if( m_nLastKey == 32 )
        {
            //响应空格键
            Redraw( 1, false );
        }
        else if( m_nLastKey == 39 || m_nLastKey == 40 )
        {
            //right and down arrows
            //When use in VC and VB,don't need to handle this
        }
        else if( m_nLastKey == 37 || m_nLastKey == 38 )
        {
            //left and up arrows
            //When use in VC and VB,don't need to handle this
        }

        FireKeyDown( &usKey, sShift );
    }

    COleControl::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CChameleonCtrl::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    if( m_bEnabled )
    {
        USHORT usKey = nChar;
        short sShift = 0;
   
        if( m_nLastKey == 32 && usKey == 32 )
        {
            //响应空格键
            if( m_bPress )
            {
                m_bPressState = !m_bPressState;
            }
            if( m_bPressState )
            {
                Redraw( 1, true );
            }
            else
            {
                Redraw( 0, true );
            }
            FireClick();
        }

        FireKeyUp( &usKey, sShift );
        FireKeyPress( &usKey );
    }

    COleControl::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CChameleonCtrl::OnSize(UINT nType, int cx, int cy)
{
    if( !m_bStretch && m_lButtonType == 13 )
    {
        //在Stretch为false,且按钮类型为图片的时候,
        //将按钮设为图片的大小
        int nWidth;
        int nHeight;
        GetPictureSize( 1, nWidth, nHeight );
        if( nWidth == 0 || nHeight == 0 )
        {
            SetControlSize( 32, 32 );
        }
        else
        {
            SetControlSize( nWidth, nHeight );
        }
    }
    else
    {
        COleControl::OnSize(nType, cx, cy);
    }

    //保存按钮的大小
    GetClientRect( m_recFocusRect );
    m_nWidth = m_recFocusRect.Width();
    m_nHeight = m_recFocusRect.Height();

    //计算焦点框的大小
    if( m_lButtonType == 7 )
    {
        InflateRect( m_recFocusRect, -3, -3 );
    }
    else if( m_lButtonType == 12 )
    {
        InflateRect( m_recFocusRect, -5, -5 );
        OffsetRect( m_recFocusRect, 1, 1 );
    }
    else
    {
        InflateRect( m_recFocusRect, -4, -4 );
    }

    //根据按钮类型创建按钮绘画区域
    MakeRegion( m_rgnControl );
    SetWindowRgn( m_rgnControl, true );
}

void CChameleonCtrl::OnRButtonUp(UINT nFlags, CPoint point)
{
    //丢弃鼠标右键和中键的响应
    //COleControl::OnRButtonUp(nFlags, point);
}

void CChameleonCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
    //丢弃鼠标右键和中键的响应
    //COleControl::OnRButtonDown(nFlags, point);
}

void CChameleonCtrl::OnMButtonUp(UINT nFlags, CPoint point)
{
    //丢弃鼠标右键和中键的响应
    //COleControl::OnMButtonUp(nFlags, point);
}

void CChameleonCtrl::OnMButtonDown(UINT nFlags, CPoint point)
{
    //丢弃鼠标右键和中键的响应
    //COleControl::OnMButtonDown(nFlags, point);
}

/
// CChameleonCtrl::AboutBox - Display an "About" box to the user

void CChameleonCtrl::AboutBox()
{
    CDialog dlgAbout(IDD_ABOUTBOX_CHAMELEON);
    dlgAbout.DoModal();
}


/
// CChameleonCtrl message handlers

void CChameleonCtrl::OnBackColorChanged()
{
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }
}

void CChameleonCtrl::OnForeColorChanged()
{
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }
}

void CChameleonCtrl::OnTextChanged()
{
    CString strCaption = InternalGetText();
    int nFind = strCaption.Find( "&" );
    if( nFind != -1 )
    {
        if( strCaption.GetLength() > nFind + 1 )
        {
            m_ucAccessKey = (BYTE)strCaption.GetAt( nFind + 1 );
        }
        else
        {
            m_ucAccessKey = 0;
        }
    }
    else
    {
        m_ucAccessKey = 0;
    }

    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }
}

void CChameleonCtrl::OnEnabledChanged()
{
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }
}

void CChameleonCtrl::OnFontChanged()
{
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }
}

long CChameleonCtrl::GetMousePointer()
{
    return m_lMousePointer;
}

void CChameleonCtrl::SetMousePointer(long nNewValue)
{
    m_lMousePointer = nNewValue;
    if( ( m_lMousePointer < 0 || m_lMousePointer > 15 )
        && m_lMousePointer != 99 )
    {
        m_lMousePointer = 0;
    }

    SetModifiedFlag();
}

LPPICTUREDISP CChameleonCtrl::GetMouseIcon()
{
    return m_phdMouseIcon.GetPictureDispatch();
}

void CChameleonCtrl::SetMouseIcon(LPPICTUREDISP newValue)
{
    m_phdMouseIcon.SetPictureDispatch(newValue);

    SetModifiedFlag();
}

LPPICTUREDISP CChameleonCtrl::GetPicture()
{
    return m_phdPicture.GetPictureDispatch();
}

void CChameleonCtrl::SetPicture(LPPICTUREDISP newValue)
{
    m_phdPicture.SetPictureDispatch(newValue);
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

long CChameleonCtrl::GetButtonType()
{
    return m_lButtonType;
}

void CChameleonCtrl::SetButtonType(long newValue)
{
    m_lButtonType = newValue;
    if( m_lButtonType < 1 || m_lButtonType > 13 )
    {
        m_lButtonType = 3;
    }

    if( IsWindow( m_hWnd ) )
    {
        MakeRegion( m_rgnControl );
        SetWindowRgn( m_rgnControl, true );

        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

long CChameleonCtrl::GetColorScheme()
{
    return m_lColorScheme;
}

void CChameleonCtrl::SetColorScheme(long nNewValue)
{
    m_lColorScheme = nNewValue;
    if( m_lButtonType < 1 || m_lButtonType > 4 )
    {
        m_lButtonType = 1;
    }

    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

BOOL CChameleonCtrl::GetPress()
{
    return m_bPress;
}

void CChameleonCtrl::SetPress(BOOL bNewValue)
{
    m_bPress = bNewValue;
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

BOOL CChameleonCtrl::GetShowFocusRect()
{
    return m_bShowFocusRect;
}

void CChameleonCtrl::SetShowFocusRect(BOOL bNewValue)
{
    m_bShowFocusRect = bNewValue;
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

BOOL CChameleonCtrl::GetStretch()
{
    return m_bStretch;
}

void CChameleonCtrl::SetStretch(BOOL bNewValue)
{
    CRect recClient;

    m_bStretch = bNewValue;
    if( IsWindow( m_hWnd ) )
    {
        GetClientRect( recClient );
        OnSize( 0, recClient.Width(), recClient.Height() );

        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

BSTR CChameleonCtrl::GetToolTipText()
{
    return m_strTipText.AllocSysString();
}

void CChameleonCtrl::SetToolTipText(LPCTSTR lpszNewValue)
{
    m_strTipText = lpszNewValue;

    if( AmbientUserMode() && m_ttpMes.m_hWnd != NULL )
    {
        if( m_strTipText.GetLength() > 0 )
        {
            m_ttpMes.Activate( true );
            m_ttpMes.UpdateTipText( m_strTipText, this );
        }
        else
        {
            m_ttpMes.Activate( false );
        }
    }

    SetModifiedFlag();
}

OLE_COLOR CChameleonCtrl::GetBackOverColor()
{
    return m_lBackOverColor;
}

void CChameleonCtrl::SetBackOverColor(OLE_COLOR nNewValue)
{
    m_lBackOverColor = nNewValue;
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

OLE_COLOR CChameleonCtrl::GetForeOverColor()
{
    return m_lForeOverColor;
}

void CChameleonCtrl::SetForeOverColor(OLE_COLOR nNewValue)
{
    m_lForeOverColor = nNewValue;
    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

long CChameleonCtrl::GetTextEffect()
{
    return m_lTextEffect;
}

void CChameleonCtrl::SetTextEffect(long nNewValue)
{
    m_lTextEffect = nNewValue;
    if( m_lTextEffect < 0 || m_lTextEffect > 3 )
    {
        m_lTextEffect = 0;
    }

    if( IsWindow( m_hWnd ) )
    {
        Redraw( m_nStatus, true );
    }

    SetModifiedFlag();
}

BOOL CChameleonCtrl::GetHandPointer()
{
    return m_bHandPointer;
}

void CChameleonCtrl::SetHandPointer(BOOL bNewValue)
{
    m_bHandPointer = bNewValue;

    SetModifiedFlag();
}

LPPICTUREDISP CChameleonCtrl::GetDownPicture()
{
    return m_phdDownPicture.GetPictureDispatch();
}

void CChameleonCtrl::SetDownPicture(LPPICTUREDISP newValue)
{
    m_phdDownPicture.SetPictureDispatch(newValue);

    SetModifiedFlag();
}

LPPICTUREDISP CChameleonCtrl::GetOverPicture()
{
    return m_phdOverPicture.GetPictureDispatch();

    return NULL;
}

void CChameleonCtrl::SetOverPicture(LPPICTUREDISP newValue)
{
    m_phdOverPicture.SetPictureDispatch(newValue);

    SetModifiedFlag();
}

LPPICTUREDISP CChameleonCtrl::GetDisablePicture()
{
    return m_phdDisablePicture.GetPictureDispatch();

    return NULL;
}

void CChameleonCtrl::SetDisablePicture(LPPICTUREDISP newValue)
{
    m_phdDisablePicture.SetPictureDispatch(newValue);

    SetModifiedFlag();
}

/
//
// 重绘函数
// 参数:    pdcDraw        绘图场景
//            nStatus        按钮状态,0,正常;1,按下
//            bForce        是否强制重画
// 返回值:    0            正确
//
/
int CChameleonCtrl::Redraw( int nStatus, bool bForce, CDC * pdcDraw )
{
    BOOL bDefault;
    bool bReleaseDC = false;

    CString strCaption = InternalGetText();
    CFont * pfntOld;

    if( !bForce )
    {
        //如果当前按钮状态未变化,文字也未变化,则取消不必要的重画
        if( m_nStatus == nStatus && m_strText == strCaption )
        {
            return 0;
        }
    }

    //按钮区域为空则退出
    if( m_nHeight == 0 || m_nWidth == 0 )
    {
        return 0;
    }

    //保存按钮状态、文字
    m_nStatus = nStatus;
    m_strText = strCaption;

    //获取按钮是否为Default按钮
    GetAmbientProperty( DISPID_AMBIENT_DISPLAYASDEFAULT, VT_BOOL, &bDefault );

    //如果未传入DC,则获取控件DC
    if( pdcDraw == NULL )
    {
        pdcDraw = GetDC();
        bReleaseDC = true;
    }

    //选入STOCK FONT
    pfntOld = SelectStockFont( pdcDraw );

    //设置绘画所需的各种表面颜色
    SetColor();

    DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight, m_ulFace );

    if( m_bEnabled )
    {
        if( m_nStatus == 0 )
        {
            //正常状态
            if( m_lButtonType == 1 )
            {
                //Windows16
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulShadow,
                    m_ulHighLight, m_ulShadow, -1 );
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                    m_ulDarkShadow, true );
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 2 )
            {
                //Windows32
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
               
                if( bDefault && m_bShowFocusRect )
                {
                    DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulDarkShadow,
                        m_ulLight, m_ulShadow, -1 );
                    DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
                    DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                        m_ulDarkShadow, true );
                }
                else
                {
                    DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulDarkShadow,
                        m_ulLight, m_ulShadow, 0 );
                }
            }
            else if( m_lButtonType == 3 )
            {
                //WindowsXP
                float fStep;

                fStep = 25 / (float)m_nHeight;
                for( int nCount = 1; nCount <= m_nHeight; nCount++ )
                {
                    DrawLine( pdcDraw->m_hDC, 0, nCount, m_nWidth,
                        nCount, ShiftColor( m_ulXPFace, (int)(-fStep * nCount), true ) );
                }

                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight, 0x733C00, true );
                SetPixel( pdcDraw->m_hDC, 1, 1, 0x7B4D10 );
                SetPixel( pdcDraw->m_hDC, 1, m_nHeight - 2, 0x7B4D10 );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, 1, 0x7B4D10 );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, m_nHeight - 2, 0x7B4D10 );

                if( m_bMouseOver )
                {
                    DrawRectangle( pdcDraw->m_hDC, 1, 2,
                        m_nWidth - 2, m_nHeight - 4, 0x31B2FF, true );
                    DrawLine( pdcDraw->m_hDC, 2, m_nHeight - 2,
                        m_nWidth - 2, m_nHeight - 2, 0x96E7 );
                    DrawLine( pdcDraw->m_hDC, 2, 1, m_nWidth - 2, 1, 0xCEF3FF );
                    DrawLine( pdcDraw->m_hDC, 1, 2, m_nWidth - 1, 2, 0x8CDBFF );
                    DrawLine( pdcDraw->m_hDC, 2, 3, 2, m_nHeight - 3, 0x6BCBFF );
                    DrawLine( pdcDraw->m_hDC, m_nWidth - 3,
                        3, m_nWidth - 3, m_nHeight - 3, 0x6BCBFF );
                }
                else if( ( m_bFocus || bDefault ) && m_bShowFocusRect )
                {
                    DrawRectangle( pdcDraw->m_hDC, 1, 2,
                        m_nWidth - 2, m_nHeight - 4, 0xE7AE8C, true );
                    DrawLine( pdcDraw->m_hDC, 2, m_nHeight - 2,
                        m_nWidth - 2, m_nHeight - 2, 0xEF826B );
                    DrawLine( pdcDraw->m_hDC, 2, 1, m_nWidth - 2, 1, 0xFFE7CE );
                    DrawLine( pdcDraw->m_hDC, 1, 2, m_nWidth - 1, 2, 0xF7D7BD );
                    DrawLine( pdcDraw->m_hDC, 2, 3, 2, m_nHeight - 3, 0xF0D1B5 );
                    DrawLine( pdcDraw->m_hDC, m_nWidth - 3, 3,
                        m_nWidth - 3, m_nHeight - 3, 0xF0D1B5 );
                }
                else
                {
                    DrawLine( pdcDraw->m_hDC, 2, m_nHeight - 2,
                        m_nWidth - 2, m_nHeight - 2, ShiftColor( m_ulXPFace, -0x30, true ) );
                    DrawLine( pdcDraw->m_hDC, 1, m_nHeight - 3,
                        m_nWidth - 2, m_nHeight - 3, ShiftColor( m_ulXPFace, -0x20, true ) );
                    DrawLine( pdcDraw->m_hDC, m_nWidth - 2, 2,
                        m_nWidth - 2, m_nHeight - 2, ShiftColor( m_ulXPFace, -0x24, true ) );
                    DrawLine( pdcDraw->m_hDC, m_nWidth - 3, 3,
                        m_nWidth - 3, m_nHeight - 3, ShiftColor( m_ulXPFace, -0x18, true ) );
                    DrawLine( pdcDraw->m_hDC, 2, 1,
                        m_nWidth - 2, 1, ShiftColor( m_ulXPFace, 0x10, true ) );
                    DrawLine( pdcDraw->m_hDC, 1, 2,
                        m_nWidth - 2, 2, ShiftColor( m_ulXPFace, 0x0A, true ) );
                    DrawLine( pdcDraw->m_hDC, 1, 2, 1, m_nHeight - 2,
                        ShiftColor( m_ulXPFace, -0x05, true ) );
                    DrawLine( pdcDraw->m_hDC, 2, 3, 2, m_nHeight - 3,
                        ShiftColor( m_ulXPFace, -0x0A, true ) );
                }
            }
            else if( m_lButtonType == 4 )
            {
                //Mac
                DrawRectangle( pdcDraw->m_hDC, 1, 1,
                    m_nWidth - 2, m_nHeight - 2, m_ulLight );
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                    m_ulDarkShadow, true );
                SetPixel( pdcDraw->m_hDC, 1, 1, m_ulDarkShadow );
                SetPixel( pdcDraw->m_hDC, 1, m_nHeight - 2, m_ulDarkShadow );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, 1, m_ulDarkShadow );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, m_nHeight - 2, m_ulDarkShadow );
                DrawLine( pdcDraw->m_hDC, 1, 2, 2, 0, m_ulFace );
                DrawLine( pdcDraw->m_hDC, 3, 2, m_nWidth - 3, 2, m_ulHighLight );
                DrawLine( pdcDraw->m_hDC, 2, 2, 2, m_nHeight - 3, m_ulHighLight );
                SetPixel( pdcDraw->m_hDC, 3, 3, m_ulHighLight );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 3, 1,
                    m_nWidth - 3, m_nHeight - 3, m_ulFace );
                DrawLine( pdcDraw->m_hDC, 1, m_nHeight - 3,
                    m_nWidth - 3, m_nHeight - 3, m_ulFace );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 4, m_nHeight - 4, m_ulFace );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 2, 2,
                    m_nWidth - 2, m_nHeight - 2, m_ulShadow );
                DrawLine( pdcDraw->m_hDC, 2, m_nHeight - 2,
                    m_nWidth - 2, m_nHeight - 2, m_ulShadow );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 3, m_nHeight - 3, m_ulShadow );
            }
            else if( m_lButtonType == 5 )
            {
                //Java
                DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 1, m_nHeight - 1,
                    ShiftColor( m_ulFace, 0x0C ) );
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 1, m_nHeight - 1,
                    m_ulHighLight, true );
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth - 1, m_nHeight - 1,
                    ShiftColor( m_ulShadow, -0x1A ), true );
                SetPixel( pdcDraw->m_hDC, 1, m_nHeight - 2,
                    ShiftColor( m_ulShadow, 0x1A ) );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, 1,
                    ShiftColor( m_ulShadow, 0x1A ) );
                if( m_bFocus && m_bShowFocusRect )
                {
                    DrawRectangle( pdcDraw->m_hDC, m_recText.left - 2, m_recText.top -1,
                        m_recText.Width() + 4, m_recText.Height() + 2, 0xCC9999, true );
                }
            }
            else if( m_lButtonType == 6 )
            {
                //Netscape6
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                DrawFrame( pdcDraw->m_hDC, ShiftColor( m_ulLight, 0x08 ),
                    m_ulShadow, ShiftColor( m_ulLight, 0x08 ), m_ulShadow, 0 );
               
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 7 )
            {
                //SimpleFlat
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulShadow, 0, 0, 0, true );
               
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 8 )
            {
                //FlatHight
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                if( m_bMouseOver )
                {
                    DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulShadow, 0, 0, 0, true );
                }

                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 9 )
            {
                //OfficeXP
                if( m_bMouseOver )
                {
                    DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth, m_nHeight,
                        m_ulOfficeXPF );
                }
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                if( m_bMouseOver )
                {
                    DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                        m_ulOfficeXPB, true );
                }

                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 10 )
            {
                //Transparent
                /*
                CRect recClient;
                POINT pntPos;
                CDC * pdcParent;

                pntPos.x = 0;
                pntPos.y = 0;
                GetClientRect( recClient );
                pdcParent = GetParent()->GetDC();

                MapWindowPoints( GetParent(), &pntPos, 1 );
                pdcDraw->BitBlt( 0, 0, recClient.Width(), recClient.Height(),
                    pdcParent, pntPos.x, pntPos.y, SRCCOPY );

                GetParent()->ReleaseDC( pdcParent );
                */
            }
            else if( m_lButtonType == 11 )
            {
                //Hover
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                if( m_bMouseOver )
                {
                    DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulDarkShadow,
                        m_ulLight, m_ulShadow, 0, false );
                }

                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 12 )
            {
                //KDE2
                CFont fntBold;
                CFont * pfntCur;
                CFont * pfntOld = NULL;
                float fStep;
                if( m_bMouseOver )
                {
                    DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight, m_ulLight );
                }
                else
                {
                    fStep = 58 / (float)m_nHeight;
                    for( int nCount = 1; nCount <= m_nHeight; nCount++ )
                    {
                        DrawLine( pdcDraw->m_hDC, 0, nCount, m_nWidth, nCount,
                            ShiftColor( m_ulHighLight, (int)(-fStep * nCount) ) );
                    }
                }
                if( bDefault )
                {
                    LOGFONT uLogFont;
                    pfntCur = pdcDraw->GetCurrentFont();
                    pfntCur->GetLogFont( &uLogFont );
                    uLogFont.lfWeight = FW_BOLD;
                    if( fntBold.CreateFontIndirect( &uLogFont ) )
                    {
                        pfntOld = pdcDraw->SelectObject( &fntBold );
                    }
                }
                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
                if( bDefault )
                {
                    if( pfntOld != NULL )
                    {
                        pdcDraw->SelectObject( pfntOld );
                    }
                }
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                    ShiftColor( m_ulShadow, -0x32 ), true );
                DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 2, m_nHeight - 2,
                    ShiftColor( m_ulFace, -0x09 ), true );
                DrawRectangle( pdcDraw->m_hDC, 2, 2, m_nWidth - 4, 2, m_ulHighLight );
                DrawRectangle( pdcDraw->m_hDC, 2, 4, 2, m_nHeight - 6, m_ulHighLight );
               
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 13 )
            {
                //Graphic
                int nPicWidth;
                int nPicHeight;
                CRect recRender;
                CRect recWBounds;

                if( m_bMouseOver )
                {
                    GetPictureSize( 3, nPicWidth, nPicHeight );
                    if( nPicWidth != 0 && nPicHeight != 0 )
                    {
                        recRender.left = 0;
                        recRender.top = 0;
                        if( m_bStretch )
                        {
                            recRender.right = m_nWidth;
                            recRender.bottom = m_nHeight;
                        }
                        else
                        {
                            recRender.right = nPicWidth;
                            recRender.bottom = nPicHeight;
                        }
                        recWBounds.left = 0;
                        recWBounds.top = 0;
                        recWBounds.right = nPicWidth;
                        recWBounds.bottom = nPicHeight;
                        m_phdOverPicture.Render( pdcDraw, recRender, recWBounds );
                    }
                }
                else
                {
                    GetPictureSize( 1, nPicWidth, nPicHeight );
                    if( nPicWidth != 0 && nPicHeight != 0 )
                    {
                        recRender.left = 0;
                        recRender.top = 0;
                        if( m_bStretch )
                        {
                            recRender.right = m_nWidth;
                            recRender.bottom = m_nHeight;
                        }
                        else
                        {
                            recRender.right = nPicWidth;
                            recRender.bottom = nPicHeight;
                        }
                        recWBounds.left = 0;
                        recWBounds.top = 0;
                        recWBounds.right = nPicWidth;
                        recWBounds.bottom = nPicHeight;
                        m_phdPicture.Render( pdcDraw, recRender, recWBounds );
                    }
                }

                if( m_bMouseOver )
                {
                    DrawCaption( pdcDraw->m_hDC, 1 );
                }
                else
                {
                    DrawCaption( pdcDraw->m_hDC, 0 );
                }
            }
        }
        else if( m_nStatus == 1 )
        {
            //Press状态
            if( m_lButtonType == 1 )
            {
                //Windows16
                DrawCaption( pdcDraw->m_hDC, 2 );
                DrawFrame( pdcDraw->m_hDC, m_ulShadow, m_ulHighLight,
                    m_ulShadow, m_ulHighLight, -1 );
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                    m_ulDarkShadow, true );
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 2 )
            {
                //Windows32
                DrawCaption( pdcDraw->m_hDC, 2 );
                if( bDefault && m_bShowFocusRect )
                {
                    DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                        m_ulDarkShadow, true );
                    DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 2, m_nHeight - 2,
                        m_ulShadow, true );
                    DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
                }
                else
                {
                    DrawFrame( pdcDraw->m_hDC, m_ulDarkShadow, m_ulHighLight,
                        m_ulShadow, m_ulLight, 0 );
                }
            }
            else if( m_lButtonType == 3 )
            {
                //WindowsXP
                float fStep;
                DWORD ulXPFaxe2;

                fStep = 25 / (float)m_nHeight;
                ulXPFaxe2 = ShiftColor( m_ulXPFace, -0x20, true );
                for( int nCount = 1; nCount <= m_nHeight; nCount++ )
                {
                    DrawLine( pdcDraw->m_hDC, 0, m_nHeight - nCount,
                        m_nWidth, m_nHeight - nCount,
                        ShiftColor( ulXPFaxe2, (int)(-fStep * nCount), true ) );
                }

                DrawCaption( pdcDraw->m_hDC, 2 );
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight, 0x733C00, true );
                SetPixel( pdcDraw->m_hDC, 1, 1, 0x7B4D10 );
                SetPixel( pdcDraw->m_hDC, 1, m_nHeight - 2, 0x7B4D10 );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, 1, 0x7B4D10 );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, m_nHeight - 2, 0x7B4D10 );

                DrawLine( pdcDraw->m_hDC, 2, m_nHeight - 2,
                    m_nWidth - 2, m_nHeight - 2, ShiftColor( ulXPFaxe2, 0x10, true ) );
                DrawLine( pdcDraw->m_hDC, 1, m_nHeight - 3,
                    m_nWidth - 2, m_nHeight - 3, ShiftColor( ulXPFaxe2, 0x0A, true ) );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 2, 2,
                    m_nWidth - 2, m_nHeight - 2, ShiftColor( ulXPFaxe2, 0x05, true ) );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 3, 3,
                    m_nWidth - 3, m_nHeight - 3, m_ulXPFace );
                DrawLine( pdcDraw->m_hDC, 2, 1,
                    m_nWidth - 2, 1, ShiftColor( ulXPFaxe2, -0x20, true ) );
                DrawLine( pdcDraw->m_hDC, 1, 2,
                    m_nWidth - 2, 2, ShiftColor( ulXPFaxe2, -0x18, true ) );
                DrawLine( pdcDraw->m_hDC, 1, 2,
                    1, m_nHeight - 2, ShiftColor( ulXPFaxe2, -0x20, true ) );
                DrawLine( pdcDraw->m_hDC, 2, 2,
                    2, m_nHeight - 2, ShiftColor( ulXPFaxe2, -0x16, true ) );
            }
            else if( m_lButtonType == 4 )
            {
                //Mac
                DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 2, m_nHeight - 2,
                    ShiftColor( m_ulShadow, -0x10 ) );
               
                m_ulXPFace = ShiftColor( m_ulShadow, -0x10 );
                DrawCaption( pdcDraw->m_hDC, 2 );

                m_ulXPFace = ShiftColor( m_ulFace, 0x30 );
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                    m_ulDarkShadow, true );
                DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 2, m_nHeight - 2,
                    ShiftColor( m_ulShadow, -0x40 ), true );
                DrawRectangle( pdcDraw->m_hDC, 2, 2, m_nWidth - 4, m_nHeight - 4,
                    ShiftColor( m_ulShadow, -0x20 ), true );
                SetPixel( pdcDraw->m_hDC, 2, 2, ShiftColor( m_ulShadow, -0x40 ) );
                SetPixel( pdcDraw->m_hDC, 3, 3, ShiftColor( m_ulShadow, -0x20 ) );
                SetPixel( pdcDraw->m_hDC, 1, 1, m_ulDarkShadow );
                SetPixel( pdcDraw->m_hDC, 1, m_nHeight - 2, m_ulDarkShadow );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, 1, m_ulDarkShadow );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, m_nHeight - 2, m_ulDarkShadow );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 3, 1, m_nWidth - 3, m_nHeight - 3,
                    m_ulShadow );
                DrawLine( pdcDraw->m_hDC, 1, m_nHeight - 3, m_nWidth - 2, m_nHeight - 3,
                    m_ulShadow );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 4, m_nHeight - 4, m_ulShadow );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 2, 3, m_nWidth - 2, m_nHeight - 2,
                    ShiftColor( m_ulShadow, -0x10 ) );
                DrawLine( pdcDraw->m_hDC, 3, m_nHeight - 2, m_nWidth - 2, m_nHeight - 2,
                    ShiftColor( m_ulShadow, -0x10 ) );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 2, m_nHeight - 3,
                    m_nWidth - 4, m_nHeight - 1, ShiftColor( m_ulShadow, -0x20 ) );
                SetPixel( pdcDraw->m_hDC, 2, m_nHeight - 2, ShiftColor( m_ulShadow, -0x20 ) );
                SetPixel( pdcDraw->m_hDC, m_nWidth - 2, 2, ShiftColor( m_ulShadow, -0x20 ) );
            }
            else if( m_lButtonType == 5 )
            {
                //Java
                DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 2, m_nHeight - 2,
                    ShiftColor( m_ulShadow, 0x10 ), false );
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth - 1, m_nHeight - 1,
                    ShiftColor( m_ulShadow, -0x1A ), true );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 1, 1, m_nWidth - 1, m_nHeight,
                    m_ulHighLight );
                DrawLine( pdcDraw->m_hDC, 1, m_nHeight - 1, m_nWidth - 1, m_nHeight - 1,
                    m_ulHighLight );
                DrawCaption( pdcDraw->m_hDC, 1 );
                if( m_bFocus && m_bShowFocusRect )
                {
                    DrawRectangle( pdcDraw->m_hDC, m_recText.left - 2, m_recText.top - 1,
                        m_recText.Width() + 4, m_recText.Height() + 2, 0xCC9999, true );
                }
            }
            else if( m_lButtonType == 6 )
            {
                //Netscape6
                DrawCaption( pdcDraw->m_hDC, 2 );
                DrawFrame( pdcDraw->m_hDC, m_ulShadow, ShiftColor( m_ulLight, 0x08 ),
                    m_ulShadow, ShiftColor( m_ulLight, 0x08 ), 0 );
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 7 )
            {
                //SimpleFlat
                DrawCaption( pdcDraw->m_hDC, 2 );
                DrawFrame( pdcDraw->m_hDC, m_ulShadow, m_ulHighLight, 0, 0, 0, true );
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 8 )
            {
                //FlatHight
                DrawCaption( pdcDraw->m_hDC, 2 );
                DrawFrame( pdcDraw->m_hDC, m_ulShadow, m_ulHighLight, 0, 0, 0, true );
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 9 )
            {
                //OfficeXP
                if( m_bMouseOver )
                {
                    if( m_lColorScheme == 2 )
                    {
                        DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                            ShiftColor( m_ulOfficeXPF, -0x20 ) );
                    }
                    else
                    {
                        DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                            ShiftColor( m_ulOfficeXPB, 0x80 ) );
                    }
                }
                DrawCaption( pdcDraw->m_hDC, 2 );
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                    m_ulOfficeXPB, true );
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 10 )
            {
                //Transparent
            }
            else if( m_lButtonType == 11 )
            {
                //Hover
                DrawCaption( pdcDraw->m_hDC, 2 );
                DrawFrame( pdcDraw->m_hDC, m_ulDarkShadow, m_ulHighLight, m_ulShadow,
                    m_ulLight, 0, false );
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 12 )
            {
                //KDE2
                DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth, m_nHeight,
                    ShiftColor( m_ulFace, -0x09 ) );
                DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                    ShiftColor( m_ulShadow, -0x30 ), true );
                DrawLine( pdcDraw->m_hDC, 2, m_nHeight - 2, m_nWidth - 2, m_nHeight - 2,
                    m_ulHighLight );
                DrawLine( pdcDraw->m_hDC, m_nWidth - 2, 2, m_nWidth - 2, m_nHeight - 1,
                    m_ulHighLight );
                DrawCaption( pdcDraw->m_hDC, 7 );
                DrawFocusR( pdcDraw->m_hDC, m_recFocusRect, m_ulText );
            }
            else if( m_lButtonType == 13 )
            {
                //Graphic
                int nPicWidth;
                int nPicHeight;
                CRect recRender;
                CRect recWBounds;

                GetPictureSize( 2, nPicWidth, nPicHeight );
                if( nPicWidth != 0 && nPicHeight != 0 )
                {
                    recRender.left = 0;
                    recRender.top = 0;
                    if( m_bStretch )
                    {
                        recRender.right = m_nWidth;
                        recRender.bottom = m_nHeight;
                    }
                    else
                    {
                        recRender.right = nPicWidth;
                        recRender.bottom = nPicHeight;
                    }
                    recWBounds.left = 0;
                    recWBounds.top = 0;
                    recWBounds.right = nPicWidth;
                    recWBounds.bottom = nPicHeight;
                    m_phdDownPicture.Render( pdcDraw, recRender, recWBounds );
                }

                DrawCaption( pdcDraw->m_hDC, 2 );
            }
        }
    }
    else
    {
        //Disable状态
        if( m_lButtonType == 1 )
        {
            //Windows16
            DrawCaption( pdcDraw->m_hDC, 3 );
            DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulShadow, m_ulHighLight,
                m_ulShadow, -1 );
            DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                m_ulDarkShadow, true );
        }
        else if( m_lButtonType == 2 )
        {
            //Windows32
            DrawCaption( pdcDraw->m_hDC, 3 );
            DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulDarkShadow,
                m_ulLight, m_ulShadow, 0 );
        }
        else if( m_lButtonType == 3 )
        {
            //WindowsXP
            DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                ShiftColor( m_ulXPFace, -0x18, true ) );
            DrawCaption( pdcDraw->m_hDC, 5 );
            DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                ShiftColor( m_ulXPFace, -0x54, true ), true );
            SetPixel( pdcDraw->m_hDC, 1, 1, ShiftColor( m_ulXPFace, -0x48, true ) );
            SetPixel( pdcDraw->m_hDC, 1, m_nHeight - 2,
                ShiftColor( m_ulXPFace, -0x48, true ) );
            SetPixel( pdcDraw->m_hDC, m_nWidth - 2, 1,
                ShiftColor( m_ulXPFace, -0x48, true ) );
            SetPixel( pdcDraw->m_hDC, m_nWidth - 2, m_nHeight - 2,
                ShiftColor( m_ulXPFace, -0x48, true ) );
        }
        else if( m_lButtonType == 4 )
        {
            //Mac
            DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 2, m_nHeight - 2, m_ulLight );
            DrawCaption( pdcDraw->m_hDC, 3 );
            DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight, m_ulDarkShadow, true );
            SetPixel( pdcDraw->m_hDC, 1, 1, m_ulDarkShadow );
            SetPixel( pdcDraw->m_hDC, 1, m_nHeight - 2, m_ulDarkShadow );
            SetPixel( pdcDraw->m_hDC, m_nWidth - 2, 1, m_ulDarkShadow );
            SetPixel( pdcDraw->m_hDC, m_nWidth - 2, m_nHeight - 2, m_ulDarkShadow );
            DrawLine( pdcDraw->m_hDC, 1, 2, 2, 0, m_ulFace );
            DrawLine( pdcDraw->m_hDC, 3, 2, m_nWidth - 3, 2, m_ulHighLight );
            DrawLine( pdcDraw->m_hDC, 2, 2, 2, m_nHeight - 3, m_ulHighLight );
            SetPixel( pdcDraw->m_hDC, 3, 3, m_ulHighLight );
            DrawLine( pdcDraw->m_hDC, m_nWidth - 3, 1, m_nWidth - 3, m_nHeight - 3,
                m_ulFace );
            DrawLine( pdcDraw->m_hDC, 1, m_nHeight - 3, m_nWidth - 3, m_nHeight - 3,
                m_ulFace );
            SetPixel( pdcDraw->m_hDC, m_nHeight - 4, m_nHeight - 4, m_ulFace );
            DrawLine( pdcDraw->m_hDC, m_nWidth - 2, 2, m_nWidth - 2, m_nHeight - 2,
                m_ulShadow );
            DrawLine( pdcDraw->m_hDC, 2, m_nHeight - 2, m_nWidth - 2, m_nHeight - 2,
                m_ulShadow );
            SetPixel( pdcDraw->m_hDC, m_nHeight - 3, m_nHeight - 3, m_ulShadow );
        }
        else if( m_lButtonType == 5 )
        {
            //Java
            DrawCaption( pdcDraw->m_hDC, 4 );
            DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight, m_ulShadow, true );
        }
        else if( m_lButtonType == 6 )
        {
            //Netscape6
            DrawCaption( pdcDraw->m_hDC, 4 );
            DrawFrame( pdcDraw->m_hDC, ShiftColor( m_ulLight, 0x08 ), m_ulShadow,
                ShiftColor( m_ulLight, 0x08 ), m_ulShadow, 0 );
        }
        else if( m_lButtonType == 7 )
        {
            //SimpleFlat
            DrawCaption( pdcDraw->m_hDC, 3 );
            DrawFrame( pdcDraw->m_hDC, m_ulHighLight, m_ulShadow, 0, 0, 0, true );
        }
        else if( m_lButtonType == 8 )
        {
            //FlatHight
            DrawCaption( pdcDraw->m_hDC, 3 );
        }
        else if( m_lButtonType == 9 )
        {
            //OfficeXP
            DrawCaption( pdcDraw->m_hDC, 4 );
        }
        else if( m_lButtonType == 10 )
        {
            //Transparent
        }
        else if( m_lButtonType == 11 )
        {
            //Hover
            DrawCaption( pdcDraw->m_hDC, 3 );
        }
        else if( m_lButtonType == 12 )
        {
            //KDE2
            float fStep;
           
            fStep = 58 / (float)m_nHeight;
            for( int nCount = 1; nCount <= m_nHeight; nCount++ )
            {
                DrawLine( pdcDraw->m_hDC, 0, nCount, m_nWidth, nCount,
                    ShiftColor( m_ulHighLight, (int)(-fStep * nCount) ) );
            }

            DrawRectangle( pdcDraw->m_hDC, 0, 0, m_nWidth, m_nHeight,
                ShiftColor( m_ulShadow, -0x32 ), true );
            DrawRectangle( pdcDraw->m_hDC, 1, 1, m_nWidth - 2, m_nHeight - 2,
                ShiftColor( m_ulFace, -0x09 ), true );
            DrawRectangle( pdcDraw->m_hDC, 2, 2, m_nWidth - 4, 2, m_ulHighLight );
            DrawRectangle( pdcDraw->m_hDC, 2, 4, 2, m_nHeight - 6, m_ulHighLight );
            DrawCaption( pdcDraw->m_hDC, 6 );
        }
        else if( m_lButtonType == 13 )
        {
            //Graphic
            int nPicWidth;
            int nPicHeight;
            CRect recRender;
            CRect recWBounds;

            GetPictureSize( 4, nPicWidth, nPicHeight );
            if( nPicWidth != 0 && nPicHeight != 0 )
            {
                recRender.left = 0;
                recRender.top = 0;
                if( m_bStretch )
                {
                    recRender.right = m_nWidth;
                    recRender.bottom = m_nHeight;
                }
                else
                {
                    recRender.right = nPicWidth;
                    recRender.bottom = nPicHeight;
                }
                recWBounds.left = 0;
                recWBounds.top = 0;
                recWBounds.right = nPicWidth;
                recWBounds.bottom = nPicHeight;
                m_phdDisablePicture.Render( pdcDraw, recRender, recWBounds );
            }

            DrawCaption( pdcDraw->m_hDC, 3 );
        }
    }

    pdcDraw->SelectObject( pfntOld );

    if( bReleaseDC )
    {
        ReleaseDC( pdcDraw );
    }

    return 0;
}

/
//
// 检查鼠标是否在控件上
// 参数:    none
// 返回值:    0            正确
//
/
bool CChameleonCtrl::CheckMouseOver()
{
    CPoint pntCursor;
    if( GetCursorPos( &pntCursor ) )
    {
        if( WindowFromPoint(pntCursor) == this )
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        return false;
    }
}

/
//
// 创建控件区域
// 参数:    rgnCreate    需要创建的区域
// 返回值:    0            正确
//
/
int CChameleonCtrl::MakeRegion( CRgn & rgnCreate )
{
    CRgn rgnTemp1;
    CRgn rgnTemp2;

    rgnCreate.DeleteObject();
    rgnCreate.CreateRectRgn( 0, 0, m_nWidth, m_nHeight );
    rgnTemp2.CreateRectRgn( 0, 0, 0, 0 );

    if( m_lButtonType == 1 || m_lButtonType == 5 ||
        m_lButtonType == 12 )
    {
        //Windows16
        //Java
        //KDE2
        rgnTemp1.CreateRectRgn( 0, m_nHeight, 1, m_nHeight - 1 );
        rgnTemp2.CombineRgn( &rgnCreate, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        rgnTemp1.CreateRectRgn( m_nWidth, 0, m_nWidth - 1, 1 );
        rgnCreate.CombineRgn( &rgnTemp2, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        if( m_lButtonType != 5 )
        {
            //Java
            rgnTemp1.CreateRectRgn( 0, 0, 1, 1 );
            rgnTemp2.CombineRgn( &rgnCreate, &rgnTemp1, RGN_DIFF );
            rgnTemp1.DeleteObject();
            rgnTemp1.CreateRectRgn( m_nWidth, m_nHeight, m_nWidth - 1, m_nHeight - 1 );
            rgnCreate.CombineRgn( &rgnTemp2, &rgnTemp1, RGN_DIFF );
            rgnTemp1.DeleteObject();
        }
    }
    else if( m_lButtonType == 3 || m_lButtonType == 4 )
    {
        //WindowsXP
        //Mac
        rgnTemp1.CreateRectRgn( 0, 0, 2, 1 );
        rgnTemp2.CombineRgn( &rgnCreate, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        rgnTemp1.CreateRectRgn( 0, m_nHeight, 2, m_nHeight - 1 );
        rgnCreate.CombineRgn( &rgnTemp2, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        rgnTemp1.CreateRectRgn( m_nWidth, 0, m_nWidth - 2, 1 );
        rgnTemp2.CombineRgn( &rgnCreate, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        rgnTemp1.CreateRectRgn( m_nWidth, m_nHeight, m_nWidth - 2, m_nHeight - 1 );
        rgnCreate.CombineRgn( &rgnTemp2, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        rgnTemp1.CreateRectRgn( 0, 1, 1, 2 );
        rgnTemp2.CombineRgn( &rgnCreate, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        rgnTemp1.CreateRectRgn( 0, m_nHeight - 1, 1, m_nHeight - 2 );
        rgnCreate.CombineRgn( &rgnTemp2, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        rgnTemp1.CreateRectRgn( m_nWidth, 1, m_nWidth - 1, 2 );
        rgnTemp2.CombineRgn( &rgnCreate, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
        rgnTemp1.CreateRectRgn( m_nWidth, m_nHeight - 1, m_nWidth - 1, m_nHeight - 2 );
        rgnCreate.CombineRgn( &rgnTemp2, &rgnTemp1, RGN_DIFF );
        rgnTemp1.DeleteObject();
    }

    rgnTemp2.DeleteObject();

    return 0;
}

/
//
// 设置窗口颜色变量
// 参数:    none
// 返回值:    0            正确
//
/
int CChameleonCtrl::SetColor()
{
    if( m_lColorScheme == 2 )
    {
        //Custom
        if( m_bMouseOver && m_lColorScheme == 2 )
        {
            m_ulFace = m_lBackOverColor;
        }
        else
        {
            m_ulFace = TranslateColor( GetBackColor() );
        }
        m_ulFaceO = m_lBackOverColor;
        m_ulText = TranslateColor( GetForeColor() );
        m_ulTextO = m_lForeOverColor;
        m_ulShadow = ShiftColor( m_ulFace, -0x40 );
        m_ulLight = ShiftColor( m_ulFace, 0x1F );
        m_ulHighLight = ShiftColor( m_ulFace, 0x2F );
        m_ulDarkShadow = ShiftColor( m_ulFace, -0xC0 );
        m_ulOfficeXPB = ShiftColor( m_ulFace, -0x80 );
        m_ulOfficeXPF = m_ulFace;
    }
    else if( m_lColorScheme == 3 )
    {
        //ForceStandard
        m_ulFace = 0xC0C0C0;
        m_ulFaceO = m_ulFace;
        m_ulText = 0;
        m_ulTextO = m_ulText;
        m_ulShadow = 0x808080;
        m_ulLight = 0xDFDFDF;
        m_ulHighLight = 0xFFFFFF;
        m_ulDarkShadow = 0;
        m_ulOfficeXPB = 0x800000;
        m_ulOfficeXPF = 0xD1ADAD;
    }
    else if( m_lColorScheme == 4 )
    {
        //UseContainer
        CWnd * pwndParent;
        CDC * pdcParent;

        pwndParent = GetParent();
        pdcParent = pwndParent->GetDC();

        m_ulFace = GetBkColor( pdcParent->m_hDC );
        m_ulFaceO = m_ulFace;
        m_ulText = GetTextColor( pdcParent->m_hDC );
        m_ulTextO = m_ulText;
        m_ulShadow = ShiftColor( m_ulFace, -0x40 );
        m_ulLight = ShiftColor( m_ulFace, 0x1F );
        m_ulHighLight = ShiftColor( m_ulFace, 0x2F );
        m_ulDarkShadow = ShiftColor( m_ulFace, -0xC0 );
        m_ulOfficeXPB = GetSysColor( COLOR_HIGHLIGHT );
        m_ulOfficeXPF = ShiftColorOXP( m_ulOfficeXPB );

        pwndParent->ReleaseDC( pdcParent );
    }
    else
    {
        //UseWindows
        m_ulFace = GetSysColor(COLOR_BTNFACE);
        m_ulFaceO = m_ulFace;
        m_ulText = GetSysColor(COLOR_BTNTEXT);
        m_ulTextO = m_ulText;
        m_ulShadow = GetSysColor(COLOR_BTNSHADOW);
        m_ulLight = GetSysColor(COLOR_3DLIGHT);//COLOR_BTNLIGHT
        m_ulHighLight = GetSysColor(COLOR_BTNHIGHLIGHT);
        m_ulDarkShadow = GetSysColor(COLOR_3DDKSHADOW);//COLOR_BTNDKSHADOW
        m_ulOfficeXPB = GetSysColor( COLOR_HIGHLIGHT );
        m_ulOfficeXPF = ShiftColorOXP( m_ulOfficeXPB );
    }

    if( m_lButtonType == 3 )
    {
        m_ulXPFace = ShiftColor( m_ulFace, 0x30, true );
    }
    else
    {
        m_ulXPFace = ShiftColor( m_ulFace, 0x30 );
    }

    return 0;
}

/
//
// 增减RBG颜色值
// 参数:    ulColor        原色彩
//            nValue        增减数值,0-255
//            m_bXP        是否XP风格
// 返回值:                增减后的色彩
//
/
DWORD CChameleonCtrl::ShiftColor( DWORD ulColor, int nValue, bool m_bXP )
{
    int nR = GetRValue( ulColor );
    int nG = GetGValue( ulColor );
    int nB = GetBValue( ulColor );

    nR += nValue;
    nG += nValue;
    if( m_bXP )
    {
        nB += nB * nValue / 0xC0;
    }
    else
    {
        nB += nValue;
    }

    if( nR < 0 )
    {
        nR = 0;
    }
    if( nR > 255 )
    {
        nR = 255;
    }
    if( nG < 0 )
    {
        nG = 0;
    }
    if( nG > 255 )
    {
        nG = 255;
    }
    if( nB < 0 )
    {
        nB = 0;
    }
    if( nB > 255 )
    {
        nB = 255;
    }

    return RGB( nR, nG, nB );
}

/
//
// XP风格的增减RGB颜色值
// 参数:    ulColor        原色彩
//            nBase        增减基数
// 返回值:                增减后的色彩
//
/
DWORD CChameleonCtrl::ShiftColorOXP( DWORD ulColor, int nBase )
{
    int nR = GetRValue( ulColor );
    int nG = GetGValue( ulColor );
    int nB = GetBValue( ulColor );

    int nDelta = 0xFF - nBase;

    nR = nBase + nR * nDelta / 0xFF;
    nG = nBase + nG * nDelta / 0xFF;
    nB = nBase + nB * nDelta / 0xFF;

    if( nR < 0 )
    {
        nR = 0;
    }
    if( nR > 255 )
    {
        nR = 255;
    }
    if( nG < 0 )
    {
        nG = 0;
    }
    if( nG > 255 )
    {
        nG = 255;
    }
    if( nB < 0 )
    {
        nB = 0;
    }
    if( nB > 255 )
    {
        nB = 255;
    }

    return RGB( nR, nG, nB );
}

/
//
// 画文本
// 参数:    hdcCtrl        绘图设备场景
//            nDrawType    文本的绘制类型
// 返回值:    0            正确
//
/
int CChameleonCtrl::DrawCaption( HDC hdcCtrl, int nDrawType )
{
    CRect recText( 0, 0, m_nWidth, m_nHeight );
    CRect recOffset;

    //获得输出文字区域的大小
    DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recText,
        DT_LEFT | DT_CALCRECT | DT_WORDBREAK | DT_NOPREFIX );
    recText.OffsetRect( ( m_nWidth - recText.Width() ) / 2, ( m_nHeight - recText.Height() ) / 2);
    m_recText.CopyRect( recText );

    recOffset.CopyRect( recText );
    recOffset.OffsetRect( 1, 1 );

    if( GetBkMode( hdcCtrl ) != TRANSPARENT )
    {
        SetBkMode( hdcCtrl, TRANSPARENT );
    }

    if( nDrawType == 0 )
    {
        //normal
        DrawEffect( hdcCtrl, recText );
        SetTextColor( hdcCtrl, m_ulText );
    }
    else if( nDrawType == 1 )
    {
        //hover
        DrawEffect( hdcCtrl, recText );
        SetTextColor( hdcCtrl, m_ulTextO );
    }
    else if( nDrawType == 2 )
    {
        //down
        DrawEffect( hdcCtrl, recOffset );
        if( m_lButtonType == 4 )
        {
            SetTextColor( hdcCtrl, m_ulLight );
        }
        else
        {
            SetTextColor( hdcCtrl, m_ulTextO );
        }
        DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset,
            DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );
    }
    else if( nDrawType == 3 )
    {
        //disabled embossed
        SetTextColor( hdcCtrl, m_ulHighLight );
        DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset,
            DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );
        SetTextColor( hdcCtrl, m_ulShadow );
    }
    else if( nDrawType == 4 )
    {
        //disabled grey
        SetTextColor( hdcCtrl, m_ulShadow );
    }
    else if( nDrawType == 5 )
    {
        //WinXP disabled
        SetTextColor( hdcCtrl, ShiftColor( m_ulXPFace, -0x68, true ) );
    }
    else if( nDrawType == 6 )
    {
        //KDE 2 disabled
        SetTextColor( hdcCtrl, m_ulHighLight );
        DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset,
            DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );
        SetTextColor( hdcCtrl, m_ulFace );
    }
    else if( nDrawType == 7 )
    {
        //KDE 2 down
        SetTextColor( hdcCtrl, ShiftColor( m_ulShadow, -0x32 ) );
        DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset,
            DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );
        SetTextColor( hdcCtrl, m_ulHighLight );
    }

    if( nDrawType != 2 )
    {
        DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recText,
            DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );
    }

    return 0;
}

/
//
// 画文本的特效
// 参数:    hdcCtrl        绘图设备场景
//            recDraw        绘制特效的区域
// 返回值:    0            正确
//
/
int CChameleonCtrl::DrawEffect( HDC hdcCtrl, CRect recDraw )
{
    if( m_lTextEffect > 0 )
    {
        DWORD ulColor;
        CRect recOffset;

        recOffset.CopyRect( recDraw );
        recOffset.OffsetRect( 1, 1 );

        if( m_lButtonType == 3 || m_lButtonType == 4
            || m_lButtonType == 12 )
        {
            ulColor = m_ulXPFace;
        }
        else
        {
            if( m_nStatus == 0 && m_bMouseOver &&
                m_lColorScheme != 2 &&
                m_lButtonType == 9 )
            {
                ulColor = m_ulOfficeXPF;
            }
            else
            {
                ulColor = m_ulFace;
            }
        }

        if( m_lTextEffect == 2 )
        {
            SetTextColor( hdcCtrl, ShiftColor( ulColor, 0x28 ) );
        }
        else
        {
            SetTextColor( hdcCtrl, ShiftColor( ulColor, -0x28 ) );
        }

        DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset,
            DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );

        if( m_lTextEffect < 3 )
        {
            recOffset.OffsetRect( -2, -2 );
            if( m_lTextEffect == 2 )
            {
                SetTextColor( hdcCtrl, ShiftColor( ulColor, -0x28 ) );
            }
            else
            {
                SetTextColor( hdcCtrl, ShiftColor( ulColor, 0x28 ) );
            }
            DrawText( hdcCtrl, m_strText, m_strText.GetLength(), recOffset,
                DT_LEFT | DT_WORDBREAK | DT_NOPREFIX );
        }
    }

    return 0;
}

/
//
// 画长方形
// 参数:    hdcCtrl        绘图设备场景
//            nLeft        左边距
//            nTop        上边距
//            nWidth        宽度
//            nHeight        高度
//            ulColor        画刷颜色
//            bBoard        是否仅绘画边框
// 返回值:    0            正确
//
/
int CChameleonCtrl::DrawRectangle( HDC hdcCtrl, int nLeft, int nTop, int nWidth, int nHeight, DWORD ulColor, bool bBoard )
{
    HBRUSH hBack = CreateSolidBrush( ulColor );
    if( hBack == NULL )
    {
        return 2;
    }

    CRect recPaint( nLeft, nTop, nLeft + nWidth, nTop + nHeight );
    if( bBoard )
    {
        FrameRect( hdcCtrl, recPaint, hBack );
    }
    else
    {
        FillRect( hdcCtrl, recPaint, hBack );
    }

    DeleteObject( hBack );

    return 0;
}

/
//
// 画边框,nExtraOffset,true传入-1,false传入0
// 参数:   
// 返回值:    0            正确
//
/
int CChameleonCtrl::DrawFrame( HDC hdcCtrl, DWORD ulHigh, DWORD ulDark,
                                DWORD ulLight, DWORD ulShadow,
                                int nExtraOffset, bool bFlat )
{
    CPoint pntPos;
    HPEN hpenOld;
    HPEN hpenNew;

    int nFrameWidth = m_nWidth - 1 + nExtraOffset;
    int nFrameHight = m_nHeight - 1 + nExtraOffset;
    int nFrameXtra = abs( nExtraOffset );

    hpenNew = CreatePen( PS_SOLID, 1, ulHigh );
    hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );
    MoveToEx( hdcCtrl, nFrameXtra, nFrameHight, &pntPos );
    LineTo( hdcCtrl, nFrameXtra, nFrameXtra );
    LineTo( hdcCtrl, nFrameWidth, nFrameXtra );
    SelectObject( hdcCtrl, hpenOld );
    DeleteObject( hpenNew );

    hpenNew = CreatePen( PS_SOLID, 1, ulDark );
    hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );
    LineTo( hdcCtrl, nFrameWidth, nFrameHight );
    LineTo( hdcCtrl, nFrameXtra -1,  nFrameHight );
    MoveToEx( hdcCtrl, nFrameXtra + 1, nFrameHight - 1, &pntPos );
    SelectObject( hdcCtrl, hpenOld );
    DeleteObject( hpenNew );

    if( bFlat )
    {
        return 0;
    }

    hpenNew = CreatePen( PS_SOLID, 1, ulLight );
    hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );
    LineTo( hdcCtrl, nFrameXtra + 1, nFrameXtra + 1 );
    LineTo( hdcCtrl, nFrameWidth - 1, nFrameXtra + 1 );
    SelectObject( hdcCtrl, hpenOld );
    DeleteObject( hpenNew );

    hpenNew = CreatePen( PS_SOLID, 1, ulShadow );
    hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );
    LineTo( hdcCtrl, nFrameWidth - 1, nFrameHight - 1 );
    LineTo( hdcCtrl, nFrameXtra, nFrameHight - 1 );
    SelectObject( hdcCtrl, hpenOld );
    DeleteObject( hpenNew );

    return 0;
}

/
//
// 画焦点框
// 参数:    hdcCtrl        绘图设备场景
//            recFocus    焦点框的位置和大小
//            ulColor        焦点框的颜色
// 返回值:    0            正确
//
/
int CChameleonCtrl::DrawFocusR( HDC hdcCtrl, CRect recFocus, DWORD ulColor )
{
    if( m_bShowFocusRect && m_bFocus )
    {
        SetTextColor( hdcCtrl, ulColor );
        DrawFocusRect( hdcCtrl, recFocus );
    }

    return 0;
}

/
//
// 画线
// 参数:    hdcCtrl        绘图设备场景
//            nX1            起点X坐标
//            nY1            起点Y坐标
//            nX2            终点X坐标
//            nY2            终点Y坐标
//            ulColor        颜色
// 返回值:    0            正确
//
/
int CChameleonCtrl::DrawLine( HDC hdcCtrl, int nX1, int nY1, int nX2, int nY2, DWORD ulColor )
{
    CPoint pntPos;
    HPEN hpenOld;
    HPEN hpenNew;

    hpenNew = CreatePen( PS_SOLID, 1, ulColor );
    hpenOld = (HPEN)SelectObject( hdcCtrl, hpenNew );

    MoveToEx( hdcCtrl, nX1, nY1, &pntPos );
    LineTo( hdcCtrl, nX2, nY2 );

    SelectObject( hdcCtrl, hpenOld );
    DeleteObject( hpenNew );

    return 0;
}

/
//
// 向ToolTipCtrl发送消息
// 参数:   
// 返回值:   
//
/
void CChameleonCtrl::RelayEvent(UINT message, WPARAM wParam, LPARAM lParam)
{
    if( m_ttpMes.m_hWnd != NULL )
    {
        MSG msg;
        msg.hwnd = m_hWnd;
        msg.message = message;
        msg.wParam = wParam;
        msg.lParam = lParam;
        msg.time = 0;
        msg.pt.x = LOWORD(lParam);
        msg.pt.y = HIWORD(lParam);
       
        m_ttpMes.RelayEvent(&msg);
    }
}

/
//
// 设置鼠标
// 参数:    lMousePointer    鼠标类型
// 返回值:    0                正确
//
/
int CChameleonCtrl::SetMoveCursor( long lMousePointer )
{
    if( m_bMouseOver && m_lCursorType != lMousePointer )
    {
        m_lCursorType = lMousePointer;
        switch( m_lCursorType )
        {
        case 0:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_APPSTARTING ) );
            break;
        case 1:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_ARROW ) );
            break;
        case 2:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_CROSS ) );
            break;
        case 3:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_IBEAM ) );
            break;
        case 4:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_ICON ) );
            break;
        case 5:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_SIZE ) );
            break;
        case 6:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_SIZENESW ) );
            break;
        case 7:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_SIZENS ) );
            break;
        case 8:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_SIZENWSE ) );
            break;
        case 9:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_SIZEWE ) );
            break;
        case 10:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_UPARROW ) );
            break;
        case 11:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_WAIT ) );
            break;
        case 12:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_NO ) );
            break;
        case 13:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_HELP ) );
            break;
        case 14:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_HELP ) );
            break;
        case 15:
            m_hPrevCursor = SetCursor( LoadCursor( theApp.m_hInstance, IDC_SIZEALL ) );
            break;
        case 99:
            //SetCursor( LoadCursor( theApp.m_hInstance,  ) );
            break;
        }
       
    }

    return 0;
}

/
//
// 恢复鼠标
// 参数:    lMousePointer    鼠标类型
// 返回值:    0                正确
//
/
int CChameleonCtrl::RestoreCursor()
{
    SetCursor( m_hPrevCursor );
    m_lCursorType = -1;

    return 0;
}

/
//
// 获得图片高宽
// 参数:    nType        类型,1,正常图片,2,按下图片,3,移动图片
//                        4,disable图片
//            nWidth        图片宽
//            nHeight        图片高
// 返回值:    0            正确
//
/
int CChameleonCtrl::GetPictureSize( int nType, int &nWidth, int &nHeight )
{
    nWidth = 0;
    nHeight = 0;

    HBITMAP hbmpPic;

    BITMAP uBitmap;

    switch( nType )
    {
    case 1:
        m_phdPicture.m_pPict->get_Handle( (OLE_HANDLE*)&hbmpPic );
        GetObject( hbmpPic, sizeof(uBitmap), &uBitmap );
        nWidth = uBitmap.bmWidth;
        nHeight = uBitmap.bmHeight;
        break;
    case 2:
        m_phdDownPicture.m_pPict->get_Handle( (OLE_HANDLE*)&hbmpPic );
        GetObject( hbmpPic, sizeof(uBitmap), &uBitmap );
        nWidth = uBitmap.bmWidth;
        nHeight = uBitmap.bmHeight;
        break;
    case 3:
        m_phdOverPicture.m_pPict->get_Handle( (OLE_HANDLE*)&hbmpPic );
        GetObject( hbmpPic, sizeof(uBitmap), &uBitmap );
        nWidth = uBitmap.bmWidth;
        nHeight = uBitmap.bmHeight;
        break;
    case 4:
        m_phdDisablePicture.m_pPict->get_Handle( (OLE_HANDLE*)&hbmpPic );
        GetObject( hbmpPic, sizeof(uBitmap), &uBitmap );
        nWidth = uBitmap.bmWidth;
        nHeight = uBitmap.bmHeight;
        break;
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值