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

Last change on this file since 481 was 475, checked in by dai_9181, 15 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.