source: dev/trunk/ab5.0/abdev/ProjectEditor/IconEditor.cpp@ 475

Last change on this file since 475 was 475, checked in by dai_9181, 16 years ago

構成管理を変更中・・・(いったんコミット)

File size: 17.1 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5RGBQUAD DefaultColorTable16[16]={
6 0,0,0,0,
7 0,0,128,0,
8 0,128,0,0,
9 0,128,128,0,
10 128,0,0,0,
11 128,0,128,0,
12 128,128,0,0,
13 128,128,128,0,
14 192,192,192,0,
15 0,0,255,0,
16 0,255,0,0,
17 0,255,255,0,
18 255,0,0,0,
19 255,0,255,0,
20 255,255,0,0,
21 255,255,255,0,
22};
23RGBQUAD DefaultColorTable256[256]; //ファイルから読み込む(SetupProjectEditor関数を参照)
24
25void ResizeIconWindow(HWND hMain,HWND hToolDlg,HWND hColorDlg,int width,int height){
26 MoveWindow(hMain,0,0,width-170,height-50,1);
27 MoveWindow(hToolDlg,width-170,0,170,height,1);
28 MoveWindow(hColorDlg,0,height-50,width-170,50,1);
29}
30void ResetIconType(int WndNum){
31 extern MDIINFO MdiInfo[MAX_WNDNUM];
32 int i;
33 HWND hCombo;
34 char temporary[MAX_PATH];
35 BITMAPINFOHEADER *pBmpInfoHdr;
36
37 hCombo=GetDlgItem(MdiInfo[WndNum].MdiIconEditInfo->hToolDlg,IDC_ICONTYPECOMBO);
38
39 for(i=0;i<MdiInfo[WndNum].MdiIconEditInfo->num;i++){
40 pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum].MdiIconEditInfo->pIconImage[i];
41
42 //例: "32*32 (xxxx色)"
43 sprintf(temporary,"%d*%d (%d%s)",
44 pBmpInfoHdr->biWidth,
45 pBmpInfoHdr->biHeight/2,
46 (int)pow((double)2,(double)pBmpInfoHdr->biBitCount),
47 STRING_UNIT_COLORS);
48 SendMessage(hCombo,CB_ADDSTRING,0,(long)temporary);
49 }
50 SendMessage(hCombo,CB_SETCURSEL,0,0);
51}
52BYTE *CreateIconType(int IconType,DWORD *dwBytes){
53 extern HANDLE hHeap;
54 int i,width,BitCount,dwBytesInRes;
55 BITMAPINFOHEADER *pBmpHdr;
56 BYTE *pImageBuffer;
57
58 switch(IconType){
59 case ICONTYPE_16_16:
60 width=16;
61 BitCount=4;
62 break;
63 case ICONTYPE_16_256:
64 width=16;
65 BitCount=8;
66 break;
67 case ICONTYPE_32_16:
68 width=32;
69 BitCount=4;
70 break;
71 case ICONTYPE_32_256:
72 width=32;
73 BitCount=8;
74 break;
75 }
76
77 //イメージサイズを計算
78 dwBytesInRes=sizeof(BITMAPINFOHEADER)+
79 sizeof(RGBQUAD)*(int)pow((double)2,(double)BitCount)+
80 BitCount*width*width/8;
81 if(width==16) dwBytesInRes+=width*width*2/8;
82 else dwBytesInRes+=width*width/8;
83 *dwBytes=dwBytesInRes;
84
85 //メモリ領域を確保
86 pImageBuffer=(BYTE *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,dwBytesInRes);
87
88 //ヘッダ情報をセット
89 pBmpHdr=(BITMAPINFOHEADER *)pImageBuffer;
90 pBmpHdr->biSize=sizeof(BITMAPINFOHEADER);
91 pBmpHdr->biWidth=width;
92 pBmpHdr->biHeight=width*2;
93 pBmpHdr->biPlanes=1;
94 pBmpHdr->biBitCount=BitCount;
95
96 //カラーテーブルをセット
97 RGBQUAD *pRgbq;
98 pRgbq=(RGBQUAD *)(pImageBuffer+sizeof(BITMAPINFOHEADER));
99 if(BitCount==4){
100 //16色
101 memcpy(pRgbq,DefaultColorTable16,sizeof(RGBQUAD)*16);
102 }
103 else if(BitCount==8){
104 //256色
105 memcpy(pRgbq,DefaultColorTable256,sizeof(RGBQUAD)*256);
106 }
107
108 //マスクビットをセット
109 BYTE *pMaskBuf;
110 pMaskBuf=pImageBuffer+
111 sizeof(BITMAPINFOHEADER)+
112 sizeof(RGBQUAD)*(int)pow((double)2,(double)BitCount)+
113 BitCount*width*width/8;
114 if(width==16){
115 //一行の4バイト境界を考慮
116 for(i=0;i<16;i++){
117 pMaskBuf[i*4]=0xFF;
118 pMaskBuf[i*4+1]=0xFF;
119 pMaskBuf[i*4+2]=0;
120 pMaskBuf[i*4+3]=0;
121 }
122 }
123 else memset(pMaskBuf,0xFF,width*width/8);
124
125 return pImageBuffer;
126}
127void AddIconType(int WndNum,int IconType){
128 extern HANDLE hHeap;
129 extern MDIINFO MdiInfo[MAX_WNDNUM];
130 int i,width,BitCount;
131
132 switch(IconType){
133 case ICONTYPE_16_16:
134 width=16;
135 BitCount=4;
136 break;
137 case ICONTYPE_16_256:
138 width=16;
139 BitCount=8;
140 break;
141 case ICONTYPE_32_16:
142 width=32;
143 BitCount=4;
144 break;
145 case ICONTYPE_32_256:
146 width=32;
147 BitCount=8;
148 break;
149 }
150
151 MdiInfo[WndNum].MdiIconEditInfo->pIconImage[MdiInfo[WndNum].MdiIconEditInfo->num]=
152 CreateIconType(IconType,
153 &MdiInfo[WndNum].MdiIconEditInfo->dwBytesInRes[MdiInfo[WndNum].MdiIconEditInfo->num]);
154
155 //イメージ選択用のメモリを解放
156 if(MdiInfo[WndNum].MdiIconEditInfo->SelectLevel==2)
157 DeleteObject(MdiInfo[WndNum].MdiIconEditInfo->hSelectingBmp);
158 MdiInfo[WndNum].MdiIconEditInfo->SelectLevel=0;
159
160 //アイコンタイプを追加
161 MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum=MdiInfo[WndNum].MdiIconEditInfo->num;
162 MdiInfo[WndNum].MdiIconEditInfo->num++;
163
164 //変更情報を初期化
165 i=MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum;
166 MdiInfo[WndNum].MdiIconEditInfo->undo[i].NowPos=0;
167 memset(MdiInfo[WndNum].MdiIconEditInfo->undo[i].lpData,0,sizeof(BYTE *)*MAX_ICONEDIT_UNDONUM);
168
169 //アイコンタイプコンボボックスに追加
170 char temporary[32];
171 HWND hCombo;
172 hCombo=GetDlgItem(MdiInfo[WndNum].MdiIconEditInfo->hToolDlg,IDC_ICONTYPECOMBO);
173
174 //例: "32*32 (xxxx色)"
175 sprintf(temporary,"%d*%d (%d%s)",
176 width,
177 width,
178 (int)pow((double)2,(double)BitCount),
179 STRING_UNIT_COLORS);
180 i=SendMessage(hCombo,CB_ADDSTRING,0,(long)temporary);
181
182 SendMessage(hCombo,CB_SETCURSEL,i,0);
183
184 //再描画
185 HBRUSH hOldBrush;
186 hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum].MdiIconEditInfo->memdc,GetStockObject(WHITE_BRUSH));
187 PatBlt(MdiInfo[WndNum].MdiIconEditInfo->memdc,0,0,400,400,PATCOPY);
188 SelectObject(MdiInfo[WndNum].MdiIconEditInfo->memdc,hOldBrush);
189 DrawIconToMemBmp(WndNum,0);
190 InvalidateRect(MdiInfo[WndNum].MdiIconEditInfo->hMain,NULL,1);
191 InvalidateRect(MdiInfo[WndNum].MdiIconEditInfo->hColorDlg,NULL,0);
192}
193void DeleteIconType(int WndNum){
194 extern MDIINFO MdiInfo[MAX_WNDNUM];
195 int i;
196
197 //変更情報を解放
198 for(i=0;i<MAX_ICONEDIT_UNDONUM;i++){
199 if(MdiInfo[WndNum].MdiIconEditInfo->undo[MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum].lpData[i])
200 HeapDefaultFree(MdiInfo[WndNum].MdiIconEditInfo->undo[MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum].lpData[i]);
201 }
202
203 //メモリを解放
204 HeapDefaultFree(MdiInfo[WndNum].MdiIconEditInfo->pIconImage[MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum]);
205
206 //イメージ選択用のメモリを解放
207 if(MdiInfo[WndNum].MdiIconEditInfo->SelectLevel==2)
208 DeleteObject(MdiInfo[WndNum].MdiIconEditInfo->hSelectingBmp);
209 MdiInfo[WndNum].MdiIconEditInfo->SelectLevel=0;
210
211 ////////////////////////
212 // アイコンタイプを削除
213 for(i=MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum;i<MdiInfo[WndNum].MdiIconEditInfo->num-1;i++){
214 MdiInfo[WndNum].MdiIconEditInfo->pIconImage[i]=MdiInfo[WndNum].MdiIconEditInfo->pIconImage[i+1];
215 MdiInfo[WndNum].MdiIconEditInfo->dwBytesInRes[i]=MdiInfo[WndNum].MdiIconEditInfo->dwBytesInRes[i+1];
216 MdiInfo[WndNum].MdiIconEditInfo->undo[i]=MdiInfo[WndNum].MdiIconEditInfo->undo[i+1];
217 }
218 MdiInfo[WndNum].MdiIconEditInfo->num--;
219 if(MdiInfo[WndNum].MdiIconEditInfo->num==MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum)
220 MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum=MdiInfo[WndNum].MdiIconEditInfo->num-1;
221
222 //コンボボックスからアイコンタイプを削除
223 HWND hCombo;
224 hCombo=GetDlgItem(MdiInfo[WndNum].MdiIconEditInfo->hToolDlg,IDC_ICONTYPECOMBO);
225 i=SendMessage(hCombo,CB_DELETESTRING,
226 SendMessage(hCombo,CB_GETCURSEL,0,0),
227 0);
228 SendMessage(hCombo,CB_SETCURSEL,MdiInfo[WndNum].MdiIconEditInfo->SelectIconNum,0);
229
230 //再描画
231 HBRUSH hOldBrush;
232 hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum].MdiIconEditInfo->memdc,GetStockObject(WHITE_BRUSH));
233 PatBlt(MdiInfo[WndNum].MdiIconEditInfo->memdc,0,0,400,400,PATCOPY);
234 SelectObject(MdiInfo[WndNum].MdiIconEditInfo->memdc,hOldBrush);
235 DrawIconToMemBmp(WndNum,0);
236 InvalidateRect(MdiInfo[WndNum].MdiIconEditInfo->hMain,NULL,1);
237 InvalidateRect(MdiInfo[WndNum].MdiIconEditInfo->hColorDlg,NULL,0);
238}
239void NewIconEditWindow(char *filepath){
240 extern HINSTANCE hInst,hResInst;
241 extern HANDLE hHeap;
242 extern HWND hDocCombo;
243 extern MDIINFO MdiInfo[MAX_WNDNUM];
244 int i,i2,IconNum;
245 char str[MAX_PATH],str2[32],*buffer;
246 BYTE *pImageBuffer[8];
247 DWORD dwBytesInRes[8];
248 HWND hChild;
249 HDC hdc;
250 MDICREATESTRUCT mdic;
251
252 if(filepath){
253
254 //すでに指定されたファイルが開かれている場合
255 hChild=GetWindow(hClient,GW_CHILD);
256 while(hChild){
257 i=GetWndNum(hChild);
258 if(MdiInfo[i].DocType==WNDTYPE_ICONEDIT){
259 if(lstrcmpi(MdiInfo[i].path,filepath)==0) break;
260 }
261 hChild=GetNextWindow(hChild,GW_HWNDNEXT);
262 }
263 if(hChild){
264 BringWindowToTop(hChild);
265 return;
266 }
267
268 //ファイル読み込み(正常に読み込めるかの確認も含む)
269 HANDLE hFile;
270 DWORD dw;
271 hFile=CreateFile(filepath,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
272 if(hFile==INVALID_HANDLE_VALUE){
273 //"\"%s\" ファイルの読み込みに失敗しました。"
274 sprintf(str,STRING_ERROR_CANT_FILEOPEN,filepath);
275 MessageBox(hOwner,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
276 return;
277 }
278 i=GetFileSize(hFile,NULL);
279 buffer=(char *)HeapAlloc(hHeap,0,i+1);
280 ReadFile(hFile,buffer,i,&dw,NULL);
281 CloseHandle(hFile);
282
283 ICONDIR *pIconDir;
284 ICONDIRENTRY *pIconDirEntry;
285 pIconDir=(ICONDIR *)buffer;
286 IconNum=pIconDir->idCount;
287 bool FileOk = true;
288 for(i=0;i<IconNum;i++){
289 pIconDirEntry=(ICONDIRENTRY *)(buffer+sizeof(ICONDIR)+sizeof(ICONDIRENTRY)*i);
290
291 pImageBuffer[i]=(BYTE *)HeapAlloc(hHeap,0,pIconDirEntry->dwBytesInRes);
292 memcpy(pImageBuffer[i],buffer+pIconDirEntry->dwImageOffset,pIconDirEntry->dwBytesInRes);
293
294 dwBytesInRes[i]=pIconDirEntry->dwBytesInRes;
295
296 //対応チェック
297 BITMAPINFOHEADER *pBmpInfoHdr=(BITMAPINFOHEADER *)pImageBuffer[i];
298 if( !(pBmpInfoHdr->biBitCount == 4 || pBmpInfoHdr->biBitCount == 8 ) ){
299 //16色、256色以外の場合
300 //未対応
301 FileOk = false;
302 }
303 }
304
305 _splitpath(filepath,NULL,NULL,str,str2);
306 lstrcat(str,str2);
307 mdic.szTitle=str;
308
309 HeapDefaultFree(buffer);
310
311 if( !FileOk ){
312 for(i=0;i<IconNum;i++){
313 HeapDefaultFree( pImageBuffer[i] );
314 }
315
316 char msg[1024];
317 sprintf( msg, "\"%s\"\n\n16色または256色以外の形式のファイルには対応していません。", filepath );
318 MessageBox( hOwner, msg, "ActiveBasic", MB_OK | MB_ICONEXCLAMATION );
319 return;
320 }
321 }
322 else{
323 extern int DocumentCounter;
324 buffer=0;
325 DocumentCounter++;
326 sprintf(str,"Icon[%d]",DocumentCounter);
327 mdic.szTitle=str;
328
329 IconNum=1;
330 pImageBuffer[0]=CreateIconType(ICONTYPE_32_16,&dwBytesInRes[0]);
331 }
332 mdic.szClass="MDIClientWindow_IconEdit";
333 mdic.hOwner=hInst;
334 mdic.x=CW_USEDEFAULT;
335 mdic.y=CW_USEDEFAULT;
336 mdic.cx=CW_USEDEFAULT;
337 mdic.cy=CW_USEDEFAULT;
338
339 hChild=GetWindow(hClient,GW_CHILD);
340 if(IsWindow(hChild)){
341 if(IsZoomed(hChild)) mdic.style=WS_MAXIMIZE;
342 else mdic.style=0;
343 }
344 else{
345 if(pobj_nv->bMDIZoomed) mdic.style=WS_MAXIMIZE;
346 else mdic.style=0;
347 }
348
349 mdic.lParam=0;
350 hChild=(HWND)SendMessage(hClient,WM_MDICREATE,0,(long)&mdic); //ウィンドウ作成
351
352 ////////////////////
353 //子ウィンドウ作成
354
355 //エディタ中央部分を作成
356 HWND hMain;
357 hMain=CreateWindowEx(WS_EX_CLIENTEDGE,"IconEditWindowProc",NULL,
358 WS_CHILD|WS_VISIBLE,
359 0,0,0,0,
360 hChild,NULL,hInst,NULL);
361
362 //ツールダイアログ部分を作成
363 HWND hToolDlg;
364 hToolDlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_ICONEDIT_TOOL),hChild,(DLGPROC)DlgIconToolProc);
365
366 //ツールダイアログのボタン部分を作成
367 HWND hButtonsDlg;
368 hButtonsDlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_ICONEDIT_BUTTONS),hToolDlg,(DLGPROC)DlgIconButtons);
369
370 //カラーテーブルダイアログ部分を作成
371 HWND hColorDlg;
372 hColorDlg=CreateDialog(hResInst,MAKEINTRESOURCE(IDD_ICONEDIT_COLOR),hChild,(DLGPROC)DlgIconColorProc);
373
374 //ウィンドウのID登録
375 for(i=0;i<MAX_WNDNUM;i++){
376 if(MdiInfo[i].hwnd==0){
377 MdiInfo[i].hwnd=hChild;
378 MdiInfo[i].DocType=WNDTYPE_ICONEDIT;
379 MdiInfo[i].title=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(str)+1);
380 lstrcpy(MdiInfo[i].title,str);
381 if(filepath){
382 MdiInfo[i].path=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(filepath)+1);
383 lstrcpy(MdiInfo[i].path,filepath);
384 }
385 else MdiInfo[i].path=(char *)GlobalAlloc(GPTR,1);
386
387 MdiInfo[i].MdiIconEditInfo=(MDIICONEDITINFO *)HeapAlloc(hHeap,0,sizeof(MDIICONEDITINFO));
388 MdiInfo[i].MdiIconEditInfo->hMain=hMain;
389 MdiInfo[i].MdiIconEditInfo->hToolDlg=hToolDlg;
390 MdiInfo[i].MdiIconEditInfo->hButtonsDlg=hButtonsDlg;
391 MdiInfo[i].MdiIconEditInfo->hColorDlg=hColorDlg;
392 hdc=GetDC(hMain);
393 MdiInfo[i].MdiIconEditInfo->memdc=CreateCompatibleDC(hdc);
394 MdiInfo[i].MdiIconEditInfo->hMemBmp=CreateCompatibleBitmap(hdc,600,400);
395 SelectObject(MdiInfo[i].MdiIconEditInfo->memdc,MdiInfo[i].MdiIconEditInfo->hMemBmp);
396 ReleaseDC(hMain,hdc);
397
398 MdiInfo[i].MdiIconEditInfo->SelectLevel=0;
399
400 MdiInfo[i].MdiIconEditInfo->num=IconNum;
401 MdiInfo[i].MdiIconEditInfo->SelectIconNum=0;
402 memcpy(MdiInfo[i].MdiIconEditInfo->pIconImage,pImageBuffer,sizeof(DWORD)*IconNum);
403
404 memcpy(MdiInfo[i].MdiIconEditInfo->dwBytesInRes,dwBytesInRes,sizeof(DWORD)*IconNum);
405
406 MdiInfo[i].MdiIconEditInfo->NowTool=IDC_TOOL_PEN;
407 MdiInfo[i].MdiIconEditInfo->MainColor=RGB(0,0,0);
408 extern COLORREF TransparentClrRef;
409 MdiInfo[i].MdiIconEditInfo->SubColor=TransparentClrRef;
410
411 for(i2=0;i2<MdiInfo[i].MdiIconEditInfo->num;i2++){
412 MdiInfo[i].MdiIconEditInfo->undo[i2].NowPos=0;
413 memset(MdiInfo[i].MdiIconEditInfo->undo[i2].lpData,0,sizeof(BYTE *)*MAX_ICONEDIT_UNDONUM);
414 }
415 MdiInfo[i].MdiIconEditInfo->bModify=0;
416 break;
417 }
418 }
419
420 //メモリへ初期描画を行う
421 HBRUSH hOldBrush;
422 hOldBrush=(HBRUSH)SelectObject(MdiInfo[i].MdiIconEditInfo->memdc,GetStockObject(WHITE_BRUSH));
423 PatBlt(MdiInfo[i].MdiIconEditInfo->memdc,0,0,600,400,PATCOPY);
424 SelectObject(MdiInfo[i].MdiIconEditInfo->memdc,hOldBrush);
425 DrawIconToMemBmp(i,0);
426
427 //ウィンドウ位置を初期化
428 RECT rc;
429 GetClientRect(hChild,&rc);
430 ResizeIconWindow(hMain,hToolDlg,hColorDlg,rc.right,rc.bottom);
431
432 //アイコンタイプコンボボックスをセット
433 ResetIconType(i);
434
435 if(MdiInfo[i].MdiIconEditInfo->num<=1)
436 EnableWindow(GetDlgItem(hToolDlg,IDC_DELETE_ICONTYPE),0);
437
438 //Docコンボボックスに追加
439 i=SendMessage(hDocCombo,CB_ADDSTRING,0,(long)str);
440 SendMessage(hDocCombo,CB_SETCURSEL,i,0);
441
442 //タブに追加
443 pobj_MainTab->InsertItem( str, true );
444
445 SetStatusText(NULL);
446
447 //メニュー状態を設定
448 ResetState_DocMenu();
449}
450void SaveIconFile(char *filepath,HWND hwnd){
451 extern MDIINFO MdiInfo[MAX_WNDNUM];
452 int i,i2,WndNum;
453 char buffer[8192],temporary[MAX_PATH];
454 int ImgBufSize[8];
455
456 WndNum=GetWndNum(hwnd);
457
458 i2=0;
459
460 ///////////
461 // ICONDIR
462 *((WORD *)(buffer+i2))=0; //idReserved
463 i2+=sizeof(WORD);
464 *((WORD *)(buffer+i2))=1; //idType
465 i2+=sizeof(WORD);
466 *((WORD *)(buffer+i2))=MdiInfo[WndNum].MdiIconEditInfo->num; //idCount
467 i2+=sizeof(WORD);
468
469 ////////////////
470 // ICONDIRENTRY
471 ICONDIRENTRY IconDirEntry;
472 memset(&IconDirEntry,0,sizeof(ICONDIRENTRY));
473
474 //イメージバッファの初期位置
475 IconDirEntry.dwImageOffset=sizeof(ICONDIR)+
476 sizeof(ICONDIRENTRY)*MdiInfo[WndNum].MdiIconEditInfo->num;
477
478 for(i=0;i<MdiInfo[WndNum].MdiIconEditInfo->num;i++){
479 BITMAPINFOHEADER *pBmpInfoHdr;
480 pBmpInfoHdr=(BITMAPINFOHEADER *)MdiInfo[WndNum].MdiIconEditInfo->pIconImage[i];
481
482 IconDirEntry.bWidth=(BYTE)pBmpInfoHdr->biWidth;
483 IconDirEntry.bHeight=(BYTE)pBmpInfoHdr->biHeight/2;
484 if(pBmpInfoHdr->biBitCount<=8)
485 IconDirEntry.bColorCount=(BYTE)pow((double)2,(double)pBmpInfoHdr->biBitCount);
486 else IconDirEntry.bColorCount=0;
487
488 IconDirEntry.dwBytesInRes=sizeof(BITMAPINFOHEADER);
489 if(pBmpInfoHdr->biBitCount<=8) //256色以下の場合はカラーパレットのサイズを考慮
490 IconDirEntry.dwBytesInRes+=(DWORD)pow((double)2,(double)pBmpInfoHdr->biBitCount)*sizeof(long);
491 IconDirEntry.dwBytesInRes+=pBmpInfoHdr->biBitCount*pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8;
492 if(pBmpInfoHdr->biWidth==16){
493 //16*16のアイコン
494 IconDirEntry.dwBytesInRes+=pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8*2;
495 }
496 else{
497 //32*32のアイコン
498 IconDirEntry.dwBytesInRes+=pBmpInfoHdr->biWidth*(pBmpInfoHdr->biHeight/2)/8;
499 }
500
501 ImgBufSize[i]=IconDirEntry.dwBytesInRes;
502
503 memcpy(buffer+i2,&IconDirEntry,sizeof(ICONDIRENTRY));
504 i2+=sizeof(ICONDIRENTRY);
505
506 IconDirEntry.dwImageOffset+=IconDirEntry.dwBytesInRes;
507 }
508
509 ////////////////////
510 // イメージバッファ
511 for(i=0;i<MdiInfo[WndNum].MdiIconEditInfo->num;i++){
512 memcpy(buffer+i2,
513 MdiInfo[WndNum].MdiIconEditInfo->pIconImage[i],
514 ImgBufSize[i]);
515
516 i2+=ImgBufSize[i];
517 }
518
519
520 //ファイルへ書き込み
521 HANDLE hFile;
522 DWORD dummy;
523 hFile=CreateFile(filepath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
524 if(hFile==INVALID_HANDLE_VALUE){
525 //"\"%s\" ファイルへの書き込みに失敗しました。"
526 sprintf(temporary,STRING_ERROR_CANT_FILESAVE,filepath);
527 MessageBox(hOwner,temporary,STRING_ERROR,MB_OK|MB_ICONSTOP);
528 return;
529 }
530 WriteFile(hFile,buffer,i2,&dummy,NULL);
531 CloseHandle(hFile);
532}
533
534LRESULT CALLBACK MDIClientWindow_IconEdit(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
535 extern HWND hDocCombo;
536 extern MDIINFO MdiInfo[MAX_WNDNUM];
537 extern PROJECTINFO ProjectInfo;
538 int i,WndNum;
539
540 switch(message){
541 case WM_MDIACTIVATE:
542 if(!lParam) return 0;
543 i=GetWndNum((HWND)lParam);
544 if(i==-1) return 0; //ウィンドウが初期状態の場合
545
546 i=SendMessage(hDocCombo,CB_FINDSTRINGEXACT,0,(long)MdiInfo[i].title);
547 SendMessage(hDocCombo,CB_SETCURSEL,i,0);
548 SetStatusText(NULL);
549 ResetState_EditMenu();
550 return 0;
551 case WM_SIZE:
552 WndNum=GetWndNum(hwnd);
553 if(WndNum==-1) break;
554 ResizeIconWindow(MdiInfo[WndNum].MdiIconEditInfo->hMain,
555 MdiInfo[WndNum].MdiIconEditInfo->hToolDlg,
556 MdiInfo[WndNum].MdiIconEditInfo->hColorDlg,
557 LOWORD(lParam),HIWORD(lParam));
558 break;
559 case WM_CLOSE:
560 CloseDocWindow(GetWndNum(hwnd));
561 pobj_nv->bMDIZoomed=IsZoomed(hwnd);
562 i=DefMDIChildProc(hwnd,message,wParam,lParam);
563
564 //メニュー状態を設定
565 ResetState_DocMenu();
566
567 return i;
568 }
569 return DefMDIChildProc(hwnd,message,wParam,lParam);
570}
Note: See TracBrowser for help on using the repository browser.