#ifndef _SKINPPWTL_H_
#define _SKINPPWTL_H_
#ifdef _SKINPP_STATIC
#define SKINPPWTL_API
#else
#ifdef SKINPPWTL_EXPORTS
#define SKINPPWTL_API __declspec(dllexport)
#else
#define SKINPPWTL_API __declspec(dllimport)
#endif
#endif
#define WM_TOOLBARPAINTPRE (WM_USER + 802)
#define WM_TOOLBARPAINTEND (WM_USER + 803)
#define SM_LBUTTONUP (WM_USER + 804)
//按钮状态
enum BUTTONSTATE
{
NORMAL = 0,
PRESS = 1,
DISABLE = 2,
HOT = 3,
FOCUS = 4,
LAST = 5
};
//绘制类型
enum DRAWTYPE
{
BUTTON = 0,
SCROLLARROWUP = 1,
SCROLLARROWDOWN = 2,
SPLITTERBARHORZ = 3,
SPLITTERBARVERT = 4,
SPLITTERBARBORDER = 5,
LISTHEAD = 6
};
//获得皮肤资源的类型
enum SKINOBJTYPE
{
DIALOGTYPE = 0,
BUTTONTYPE = 1,
CHECKBOXTYPE = 2,
RADIOBOXTYPE = 3,
STATICTYPE = 4,
TRACKBARTYPE = 5,
};
struct ListBoxItem
{
HIMAGELIST hImageList;
int nImageIndex;
ListBoxItem()
{
hImageList = NULL;
nImageIndex = -1;
}
};
#define REST_BITMAP 0x0001 //.bmp
#define REST_ICON 0x0002 //.ico
#define REST_CURSOR 0x0003 //.cur
#define REST_ANIMATE 0x0004 //.ani
typedef struct _ResourceInfo
{
HGDIOBJ hGdiObj;//[OUT]
DWORD dwType; //[OUT]
int nWidth; //[OUT]
int nHeight;//[OUT]
TCHAR szResImageName[_MAX_FNAME];//[IN]
BOOL bHorzSplit;//[IN]
int nLength;//[IN]
int nCount; //[IN]
int nIndex; //[IN]
_ResourceInfo()
{
hGdiObj = NULL;
dwType = REST_BITMAP;
nWidth = 0;
nHeight = 0;
_tcscpy(szResImageName,_T(""));
bHorzSplit = TRUE;
nLength = -1;
nCount = -1;
nIndex = -1;
}
}ResInfo,* PRESINFO;
//////////////////////////////////////////////////////////////////////////
//加载皮肤
//SkinFile :皮肤路径,注意可以是*.ssk,也可以是皮肤目录中的INI文件.
//bFromIni :该参数指定皮肤文件是从*.ssk读取,还是从INI文件读取.
SKINPPWTL_API BOOL skinppLoadSkin(TCHAR* szSkinFile,BOOL bFromIni = FALSE);
SKINPPWTL_API BOOL skinppLoadSkinFromRes(HINSTANCE hInstance,LPCTSTR szResourceName,
LPCTSTR szResourceType,TCHAR* szSkinFileName);
//移除皮肤
SKINPPWTL_API BOOL skinppRemoveSkin();
//退出界面库,做清理工作。
SKINPPWTL_API BOOL skinppExitSkin();
//设置ListBox控件的自画信息
//hWnd : ListBox控件的句柄
//nIndex : Item项的索引
//pListBoxItem : Item项自画的结构信息
SKINPPWTL_API void skinppSetListBoxItemDrawInfo(HWND hWnd,int nIndex,struct ListBoxItem* pListBoxItem);
//获得换肤后的系统颜色
//nColorIndex : 要获取的颜色类型
SKINPPWTL_API COLORREF skinppGetSkinSysColor(int nColorIndex);
//获得Windows系统默认的颜色
//nColorIndex : 要获取的颜色类型
SKINPPWTL_API COLORREF skinppGetDefaultSysColor(int nColorIndex);
//hWnd : 对话框窗口的句柄
//nResID : 对话框资源ID
SKINPPWTL_API BOOL skinppSetWindowResID(HWND hWnd,int nResID);//[多语言]
SKINPPWTL_API BOOL skinppSetFreeDlgID(HWND hWnd,int nResID);
SKINPPWTL_API BOOL skinppSetSkinResID(HWND hWnd,int nResID);
//设置ListHeader窗口的排序信息
//hWnd : ListHeader的窗口句柄
//nSortColumn : 要对ListHeader排序的列的索引
//bSortAscending: 是否为升序
SKINPPWTL_API void skinppSetListHeaderSortInfo(HWND hWnd,int nSortColumn,BOOL bSortAscending = TRUE);
//在给定的HDC上,指定相应的绘制类型和状态,在相应的矩形区域中进行绘制.
//hdc :目标DC
//rect :绘制区域
//eDrawType :绘制类型,目前支持SPLITTERBARHORZ,SPLITTERBARVERT,SPLITTERBARBORDER
//nState :选择绘制状态
SKINPPWTL_API void skinppDrawSkinObject(HDC hdc,RECT rect,DRAWTYPE eDrawType,int nState);
//通过资源ID,获得相应类型的皮肤资源位图句柄
//nSkinObjType : 皮肤类型,目前支持 DIALOGTYPE,BUTTONTYPE,CHECKBOXTYPE,RADIOBOXTYPE
//nResID : 资源ID
//nState : 状态,对BUTTONTYPE,CHECKBOXTYPE,RADIOBOXTYPE有效
SKINPPWTL_API HBITMAP skinppGetResFromID(SKINOBJTYPE nSkinObjType,int nResID,int nState =0 );
//设置是否自己画对话框背景,该方法用在需要自己对背景进行处理的情况下.
//hWnd : 对话框的句柄
//bErase : TRUE 为自己画背景,FALSE 为Skin++画,如果没有调用该方法,Skin++将画对话框背景.
SKINPPWTL_API void skinppSetDialogEraseBkgnd(HWND hWnd,BOOL bErase);
//设置对话框背景是否剪切子控件区域。
//hWnd : 对话框句柄
//bNoClip : TRUE为不需要剪切,FALSE为需要剪切区域
//bAllChild : TRUE为该窗体的所有子对话框都剪切.
SKINPPWTL_API void skinppSetDialogBkClipRgn(HWND hWnd,BOOL bClip,BOOL bAllChild = TRUE);
//通过皮肤资源名称获得皮肤资源中位图
//szName : 皮肤资源名称
//HBITMAP : 返回资源中的位图
SKINPPWTL_API HBITMAP skinppGetBitmapRes(LPCTSTR szName);
//通过资源名称取资源的内存指针
//szName : 资源名称
//nSize : 资源大小
//pByte : 返回值,成功返回非NULL,失败返回NULL
SKINPPWTL_API BYTE* skinppGetSkinResource(LPCTSTR szName,int& nSize);
//通过皮肤资源的名称获得位图不被拉伸的区域值
//szName : 皮肤资源名称
//nTopHeight : 返回不被拉伸的顶高
//nBottomHeight : 返回不被拉伸的底高
//nLeftWidth : 返回不被拉伸的左宽
//nRightWidth : 返回不被拉伸的右宽
SKINPPWTL_API BOOL skinppGetBitmapResRect(LPCTSTR szName,int& nTopHeight,int& nBottomHeight,
int& nLeftWidth,int& nRightWidth);
//设置窗口自画是否自己来处理,该方法用于自画部分需要自己处理的情况下
//hWnd : 要自画的窗口句柄
//bCustomDraw : TRUE为自己处理自画,FALSE为交给Skin++处理自画
SKINPPWTL_API void skinppSetCustomDraw(HWND hWnd,BOOL bCustomDraw);
//设置菜单的皮肤标识
//hWnd : 拥有菜单的窗口句柄
//nSkinObjectID : 菜单皮肤的标识
SKINPPWTL_API void skinppSetMenuSkinObjectID(HWND hWnd,int nSkinObjectID);
//设置是否对自画菜单进行换肤
//bSkin : TRUE为换肤
SKINPPWTL_API void skinppSetSkinOwnerMenu(BOOL bSkin);
//对菜单进行换肤控制
//hMenu : 想换肤的菜单句柄
//bNoSkin : 是否换肤,TRUE为不换肤,FALSE为换肤
SKINPPWTL_API void skinppSetDrawMenu(HMENU hMenu,BOOL bNoSkin);
//对指定的窗口去掉皮肤,并且保证不会再被换肤,即使使用SetSkinHwnd也不会换肤.
//hWnd : 指定的窗口句柄
//bChildNoSkin : 是否对该窗口中的子窗口去掉皮肤
SKINPPWTL_API void skinppSetNoSkinHwnd(HWND hWnd,BOOL bChildNoSkin = TRUE);
//对指定的窗口进行换肤
//hWnd : 指定的窗口句柄
//szClassName : 要子类化的Skin类型 WC_DIALOGBOX/WC_CONTROLBAR等
SKINPPWTL_API void skinppSetSkinHwnd(HWND hWnd,LPCTSTR szClassName = NULL);
//对指定的窗口临时去掉皮肤,可以通过SetSkinHwnd进行再次换肤
SKINPPWTL_API void skinppRemoveSkinHwnd(HWND hWnd);
//是对SetNoSkinHwnd的进一步处理,可以解决使用SetNoSkinHwnd引起的Debug版的断言错
#define SETNOSKINHWND(x) {\
HWND w=(x).UnsubclassWindow();\
skinppSetNoSkinHwnd(w);\
(x).SubclassWindow(w);\
}
//是对RemoveSkinHwnd的进一步处理,可以解决使用RemoveSkinHwnd引起的Debug版的断言错
#define REMOVESKINHWND(x){\
HWND w=(x).UnsubclassWindow();\
skinppRemoveSkinHwnd(w);\
(x).SubclassWindow(w);\
}
SKINPPWTL_API HGDIOBJ skinppGetResFromID(PRESINFO pResInfo);
#endif //_SKINPPWTL_H_