#pragma once //CIconクラス class CIcon : public CObject { public: CIcon(); HICON m_hIcon; //アイコンハンドル ICONINFO m_IconInfo; //ICONINFO構造体 virtual ~CIcon(); //CIconクラスにアイコンハンドルを結び付けます。 //bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。 BOOL Attach(HICON hIcon,UINT bitCount,LPCTSTR lpName,BOOL bDeleteDIB,BOOL bCompressedPNG); //ICONINFO構造体を元にアイコンを作成し、CIconクラスに結び付けます。 //ICONINFO構造体に包括されているBITMAPハンドルは、呼び出し元で削除してください。 BOOL CreateIndirect(ICONINFO* pIconInfo,LPCTSTR lpName,BOOL bCompressedPNG); //CIconクラスからアイコンハンドルを切り離します。 HICON Detach(); //CIconクラスのメンバー変数の削除 void Delete(); //指定されたCIconクラスのコピーを作成します。 BOOL Copy(CIcon* pIcon); //ファイルストリームからの読み込み //bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。 BOOL StreamIn(CFile* infile,BOOL bIcon,LPCTSTR lpName,BOOL bDeleteDIB); //リソースメモリーからの読み込み //bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。 BOOL LoadResource(HMODULE hModule,LPCTSTR lpName,BOOL bIcon,BOOL bDeleteDIB); //リソースメモリーからの読み込み(APIで読む) //bDeleteDIB FALSE:新たにDIBを作成して、格納しておく。 BOOL CreateIconFromResource(HMODULE hModule,LPCTSTR lpName,BOOL bIcon,BOOL bDeleteDIB); //ファイルストリームへの書き込み //bDeleteDIB TRUE:ファイル書き込みに使用したDIBを削除する。 //iPNGMinimumSize 0:PNG圧縮しない。 // 1~256:アイコンサイズが指定されたサイズ以上ならPNG圧縮する。 // それ以外:CIcon::m_bCompressedPNGに従って処理する。 BOOL StreamOut(CFile* outfile,BOOL bIcon,BOOL bDeleteDIB,int iPNGMinimumSize); //ハンドルの取得 HICON GetSafeHandle(){return m_hIcon;}; //アイコンハンドルからDIBを復元する BOOL RetrieveDIB(); //DIBを含んだCONINFO構造体の取得 BOOL GetIconInfo(ICONINFO* pIconInfo); //幅の取得 UINT Width(){return m_width;}; //高さの取得 UINT Height(){return m_height;}; //ビット深度の取得 UINT BitCount(){return m_bitCount;}; //X軸ホットスポットの取得 DWORD GetxHotspot(){return m_IconInfo.xHotspot;}; //Y軸ホットスポットの取得 DWORD GetyHotspot(){return m_IconInfo.yHotspot;}; //ホットスポットの設定 BOOL SetHotspot(DWORD xHotspot=-1,DWORD yHotspot=-1); //リソース形式の取得 LPCTSTR GetType(){return m_lpType;}; //リソース形式の設定 void SetType(LPCTSTR lpType); //リソース名の取得 LPCTSTR GetName(){return m_lpName;}; //リソース名の設定 void SetName(LPCTSTR lpName); //PNG圧縮されているかどうか? UINT IsCompressedPNG(){return m_bCompressedPNG;}; //PNG圧縮に設定する void CompressedPNG(BOOL bON=TRUE){m_bCompressedPNG=bON;}; //描画 void OnDraw(CDC* pDC,int x,int y,int cx=0,int cy=0); private: UINT m_width; //幅 UINT m_height; //高さ UINT m_bitCount; //ビット深度 LPCTSTR m_lpType; //リソース形式(RT_ICON/RT_CURSOR) LPCTSTR m_lpName; //リソース名 BOOL m_bCompressedPNG; //PNG圧縮されていればTRUE }; //リソース形式の設定 inline void CIcon::SetType(LPCTSTR lpType) { if (HIWORD(m_lpType)) delete[]m_lpType; if (HIWORD(lpType)){ m_lpType=new TCHAR[::lstrlen(lpType)+1]; ::lstrcpy((LPTSTR)m_lpType,lpType); } else m_lpType=lpType; } //リソース名の設定 inline void CIcon::SetName(LPCTSTR lpName) { if (HIWORD(m_lpName)) delete[]m_lpName; if (HIWORD(lpName)){ m_lpName=new TCHAR[::lstrlen(lpName)+1]; ::lstrcpy((LPTSTR)m_lpName,lpName); } else m_lpName=lpName; } //描画 inline void CIcon::OnDraw(CDC* pDC,int x,int y,int cx,int cy) { if (m_hIcon){ if (cx<=0) cx=m_width; if (cy<=0) cy=m_height; ::DrawIconEx(pDC->GetSafeHdc(),x,y,m_hIcon,cx,cy,0,0,DI_NORMAL); } } // CGroupIcon command target class CGroupIcon : public CObject { public: CGroupIcon(); virtual ~CGroupIcon(); //すべてのアイコンを削除 void Delete(); //指定されたCGroupIconクラスのコピーを作成します。 BOOL Copy(CGroupIcon* pGrpIcon); //ファイルの読み込み //bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。 BOOL LoadFile(LPCTSTR lpszFileName,BOOL bDeleteDIB=TRUE); BOOL StreamIn(CFile* infile,BOOL bDeleteDIB=TRUE); //ファイルストリームからの読み込み //リソースの読み込み //bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。 BOOL LoadResource(LPCTSTR lpszExeName,LPCTSTR lpName,LPCTSTR lpType,BOOL bDeleteDIB=TRUE); //lpNameはリソース名で、リソースIDをMAKEINTRESOURCEマクロで型キャストした値が入ります。 //lpTypeはリソース形式で、この関数では以下の4種類のリソースが読み込めます。 // 単体のアイコン :RT_ICON // 単体のカーソル :RT_CURSOR // グループアイコン:RT_GROUP_ICON // グループカーソル:RT_GROUP_CURSOR //bDeleteDIB TRUE:アイコン作成時に使用したDIBを削除する。 BOOL LoadResource(HMODULE hModule,LPCTSTR lpName,LPCTSTR lpType,BOOL bDeleteDIB); //ファイルの書き込み //bDeleteDIB TRUE:ファイル書き込みに使用したDIBを削除する。 //iPNGMinimumSize 0:PNG圧縮しない。 // 1~256:アイコンサイズが指定されたサイズ以上ならPNG圧縮する。 // それ以外:CIcon::m_bCompressedPNGに従って処理する。 BOOL SaveFile(LPCTSTR lpszFileName,LPCTSTR lpType=0,BOOL bDeleteDIB=TRUE,int iPNGMinimumSize=256); //ファイルストリームへの書き込み BOOL StreamOut(CFile* outfile,LPCTSTR lpTypee,BOOL bDeleteDIB,int iPNGMinimumSize); //要求するサイズ、ビット深度に一番近いアイコンを探す int FindBestIcon(int cxDesired,int cyDesired,int bitsDesired); //アイコンの描画 void OnDraw(CDC* pDC,int x,int y,int cx=0,int cy=0); //アイコンの数 INT_PTR GetCount(){return m_listIcon.GetCount();}; //CIconクラスの取得 CIcon* GetIcon(int index){return (CIcon*)m_listIcon.GetAt(index);}; //現在選択中のアイコン番号の取得/設定 int GetIconIndex(){return m_indexIcon;}; void SetIconIndex(int indexIcon){m_indexIcon=indexIcon;}; //現在選択中のアイコンの取得 CIcon* GetActiveIcon(){return (GetCount())? GetIcon(m_indexIcon):0;}; //アイコンを追加する INT_PTR AddIcon(CIcon* pIcon){return m_listIcon.Add(pIcon);}; //リソース形式の取得 LPCTSTR GetType(){return m_lpType;} //リソース形式の設定 void SetType(LPCTSTR lpType); //リソース名の取得 LPCTSTR GetName(){return m_lpName;} //リソース名の設定 void SetName(LPCTSTR lpName); private: CPtrArray m_listIcon; //このクラスが保持しているCIconクラスのリスト int m_indexIcon; //現在有効なCIconクラスの番号 LPCTSTR m_lpType; //リソース形式(RT_GROUP_ICON/RT_GROUP_CURSOR) LPCTSTR m_lpName; //リソース名 }; //すべてのアイコンを削除 inline void CGroupIcon::Delete() { for(int i=0;iOnDraw(pDC,x,y,cx,cy); } //リソース形式の設定 inline void CGroupIcon::SetType(LPCTSTR lpType) { if (HIWORD(m_lpType)) delete[]m_lpType; if (HIWORD(lpType)){ m_lpType=new TCHAR[::lstrlen(lpType)+1]; ::lstrcpy((LPTSTR)m_lpType,lpType); } else m_lpType=lpType; } //リソース名の設定 inline void CGroupIcon::SetName(LPCTSTR lpName) { if (HIWORD(m_lpName)) delete[]m_lpName; if (HIWORD(lpName)){ m_lpName=new TCHAR[::lstrlen(lpName)+1]; ::lstrcpy((LPTSTR)m_lpName,lpName); } else m_lpName=lpName; }