TNB Library
TnbResourceUpdater.h
[詳解]
1#pragma once
12#include "TnbStr.h"
13#include "TnbFile.h"
14
15
16
17//TNB Library
18namespace TNB
19{
20
21
22
23#ifndef _TnbDOXYGEN //Document作成用シンボル
24
26class CIconFile
27{
28 #pragma pack( push )
29 #pragma pack( 1 )
30
32 struct ICONDIR
33 {
34 WORD idReserved;
35 WORD idType;
36 WORD idCount;
37 // ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of 'em)
38 };
40 struct ICONDIRENTRY
41 {
42 BYTE bWidth;
43 BYTE bHeight;
44 BYTE bColorCount;
45 BYTE bReserved;
46 WORD wPlanes;
47 WORD wBitCount;
48 DWORD dwBytesInRes;
49 DWORD dwImageOffset;
50 };
51
53 struct GRPICONDIRENTRY
54 {
55 BYTE bWidth; // Width, in pixels, of the image
56 BYTE bHeight; // Height, in pixels, of the image
57 BYTE bColorCount; // Number of colors in image (0 if >=8bpp)
58 BYTE bReserved; // Reserved
59 WORD wPlanes; // Color Planes
60 WORD wBitCount; // Bits per pixel
61 DWORD dwBytesInRes; // how many bytes in this resource?
62 WORD nID; // the ID
63 };
64 #pragma pack( pop )
65
66 ICONDIR m_iconDir; // アイコンディレクトリ
67 CWorkMemT<ICONDIRENTRY> m_iconEntrys; // アイコンディレクトリエントリ
68 CWorkMemT<CWorkMem> m_iconImages;
69 CWorkMem m_iconGroupData;
70
71public:
72
73 // コンストラクタ
74 CIconFile()
75 {
76 Zero(m_iconDir);
77 }
78
79 // アイコンの持つイメージの数を取得する
80 size_t GetImageCount() const
81 {
82 return m_iconDir.idCount;
83 }
84
85 // index番目のイメージデータを取得する
86 BYTE* GetImageData(INDEX index)
87 {
88 ASSERT( index < GetImageCount());
89 return m_iconImages[index].Ref();
90 }
91
92 // index番目のイメージサイズを取得する
93 DWORD GetImageSize(INDEX index) const
94 {
95 ASSERT(index < GetImageCount());
96 return m_iconEntrys[index].dwBytesInRes;
97 }
98
99 // アイコンファイルをロードする
100 bool Load(LPCTSTR pszFileName)
101 {
102 // アイコンファイルのオープン
103 HANDLE hFile = ::CreateFile(pszFileName, GENERIC_READ,
104 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
105 bool r = (hFile != INVALID_HANDLE_VALUE);
106 DWORD dwRead = 0;
107 // ICONDIR部分の読み込み
108 r &= !! ::ReadFile(hFile, &m_iconDir, sizeof(ICONDIR), &dwRead, NULL);
109 ASSERT( m_iconDir.idReserved == 0 );
110 ASSERT( m_iconDir.idType == 1 );
111 ASSERT( m_iconDir.idCount > 0 );
112 // ICONDIRENTRYの読み込み
113 m_iconEntrys.Resize(m_iconDir.idCount);
114 loop ( i, m_iconDir.idCount )
115 {
116 r &= !! ::ReadFile(hFile, &(m_iconEntrys[i]), sizeof(ICONDIRENTRY), &dwRead, NULL);
117 }
118 // イメージデータの読み込み
119 m_iconImages.Resize(m_iconDir.idCount);
120 loop ( i, m_iconDir.idCount )
121 {
122 ::SetFilePointer(hFile, m_iconEntrys[i].dwImageOffset, NULL, FILE_BEGIN);
123 m_iconImages[i].Resize(m_iconEntrys[i].dwBytesInRes);
124 r &= !! ::ReadFile(hFile, m_iconImages[i], m_iconEntrys[i].dwBytesInRes, &dwRead, NULL);
125 }
126 ::CloseHandle(hFile);
127 return r;
128 }
129
130 // アイコングループデータのサイズ取得
131 size_t SizeOfIconGroupData() const
132 {
133 return sizeof(ICONDIR) + sizeof(GRPICONDIRENTRY) * GetImageCount();
134 }
135
136 // アイコングループデータの作成(nBaseIDはRT_ICONの基底インデックス番号)
137 BYTE* CreateIconGroupData(int nBaseID)
138 {
139 // アイコングループデータの領域確保
140 m_iconGroupData.Resize(SizeOfIconGroupData());
141 // アイコングループディレクトリを書き込む
142 memcpy(m_iconGroupData, &m_iconDir, sizeof(ICONDIR));
143 int offset = sizeof(ICONDIR);
144 loop ( i, GetImageCount() )
145 {
146 GRPICONDIRENTRY grpEntry;
147 // イメージデータからBITMAPINFOHEADER取得
148 BITMAPINFOHEADER bitmapheader;
149 memcpy(&bitmapheader, GetImageData(i), sizeof(BITMAPINFOHEADER));
150 // アイコングループエントリ作成
151 grpEntry.bWidth = m_iconEntrys[i].bWidth;
152 grpEntry.bHeight = m_iconEntrys[i].bHeight;
153 grpEntry.bColorCount = m_iconEntrys[i].bColorCount;
154 grpEntry.bReserved = m_iconEntrys[i].bReserved;
155 grpEntry.wPlanes = bitmapheader.biPlanes;
156 grpEntry.wBitCount = bitmapheader.biBitCount;
157 grpEntry.dwBytesInRes = m_iconEntrys[i].dwBytesInRes;
158 grpEntry.nID = static_cast<WORD>(nBaseID + i);
159 // アイコングループエントリを書き込む
160 memcpy(m_iconGroupData.Ref() + offset, &grpEntry, sizeof(GRPICONDIRENTRY));
161 offset += sizeof(GRPICONDIRENTRY);
162 }
163 return m_iconGroupData.Ref();
164 }
165};
166
167#endif // _TnbDOXYGEN
168
169
170
182{
183 HANDLE m_hUpdate;
184
186 bool m_Close(bool isDiscard)
187 {
188 bool r = false;
189 if ( m_hUpdate != NULL )
190 {
191 r = !! ::EndUpdateResource(m_hUpdate, isDiscard);
192 m_hUpdate = NULL;
193 }
194 return r;
195 }
196public:
197
199 CResourceUpdater(void) : m_hUpdate(NULL)
200 {
201 }
202
205 {
206 m_Close(true);
207 }
208
214 bool IsValid(void) const
215 {
216 return m_hUpdate != NULL;
217 }
218
227 bool Open(LPCTSTR lpszFile, bool isDeleteExistingResources = false)
228 {
229 m_Close(true);
230 m_hUpdate = ::BeginUpdateResource(lpszFile, isDeleteExistingResources);
231 return IsValid();
232 }
233
239 bool WritePush(void)
240 {
241 return m_Close(false);
242 }
243
252 bool ModifyIcon(UINT resourceId, LPCTSTR lpszIconFile, WORD wLanguage = 0)
253 {
254 bool r = false;
255 if ( IsValid() )
256 {
257 CIconFile iconFile;
258 r = iconFile.Load(lpszIconFile);
259 // RT_GROUP_ICON 書き込み
260 r &= !! ::UpdateResource
261 (
262 m_hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(resourceId), wLanguage,
263 iconFile.CreateIconGroupData(resourceId), ToDword(iconFile.SizeOfIconGroupData())
264 );
265 // RT_ICON書き込み
266 loop ( i, iconFile.GetImageCount() )
267 {
268 r &= !! ::UpdateResource
269 (
270 m_hUpdate, RT_ICON, MAKEINTRESOURCE(resourceId+i), wLanguage,
271 iconFile.GetImageData(i), iconFile.GetImageSize(i)
272 );
273 }
274 }
275 return r;
276 }
277};
278
279
280
281}; // TNB
282
283
284
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
ファイル関係のヘッダ
文字列管理関係のヘッダ
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
リソース更新関係クラス.
CResourceUpdater(void)
コンストラクタ
bool ModifyIcon(UINT resourceId, LPCTSTR lpszIconFile, WORD wLanguage=0)
[変更] アイコン変更
bool IsValid(void) const
[確認] 有効か
bool WritePush(void)
[設定] 書き込み
bool Open(LPCTSTR lpszFile, bool isDeleteExistingResources=false)
[設定] オープン
~CResourceUpdater(void)
デストラクタ
ワークメモリテンプレート.
Definition: TnbDef.h:633
void Resize(size_t l)
[設定] サイズ再設定
Definition: TnbDef.h:672
const TYP * Ref(void) const
[取得] ポインタ取得
Definition: TnbDef.h:712
DWORD ToDword(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
Definition: TnbStrLib.h:395
void Zero(V &value)
[設定] ゼロクリア.
Definition: TnbDef.h:399
TNB Library
Definition: TnbDoxyTitle.txt:2