source: dev/trunk/ab5.0/abdev/abdev/DrawWindow.cpp @ 624

Last change on this file since 624 was 624, checked in by dai_9181, 15 years ago

WindowInfoクラスをリファクタリング

File size: 55.8 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5void DrawLineInClient(int WndNum,long StartX,long StartY,long EndX,long EndY){
6    extern MDIINFO MdiInfo[MAX_WNDNUM];
7    MoveToEx(MdiInfo[WndNum].MdiRadInfo->hMemDC,
8        StartX+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
9        StartY+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
10        NULL);
11    LineTo(MdiInfo[WndNum].MdiRadInfo->hMemDC,
12        EndX+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
13        EndY+MdiInfo[WndNum].MdiRadInfo->ClientPos.y);
14}
15void DrawRectangleInClient(int WndNum,long left,long top,long right,long bottom,COLORREF RGB_Pen,COLORREF RGB_Brush,BOOL bBrushing){
16    extern MDIINFO MdiInfo[MAX_WNDNUM];
17    HPEN hPen,hOldPen;
18    HBRUSH hBrush,hOldBrush;
19
20    hPen=CreatePen(PS_SOLID,0,RGB_Pen);
21    if(bBrushing) hBrush=CreateSolidBrush(RGB_Brush);
22    else hBrush=(HBRUSH)GetStockObject(NULL_BRUSH);
23    hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
24    hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hBrush);
25
26    Rectangle(MdiInfo[WndNum].MdiRadInfo->hMemDC,
27        left+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
28        top+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
29        right+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
30        bottom+MdiInfo[WndNum].MdiRadInfo->ClientPos.y);
31
32    SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
33    SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldBrush);
34    DeleteObject(hPen);
35    if(bBrushing) DeleteObject(hBrush);
36}
37void DrawButtonEdge(int WndNum,POINT *pPos,SIZE *pSize){
38    extern MDIINFO MdiInfo[MAX_WNDNUM];
39    HPEN hPen,hOldPen;
40
41    //光源方向の縁
42    hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
43    hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
44    DrawLineInClient(WndNum,
45        pPos->x, pPos->y,
46        pPos->x+pSize->cx-1, pPos->y);
47    DrawLineInClient(WndNum,
48        pPos->x, pPos->y,
49        pPos->x, pPos->y+pSize->cy-1);
50    SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
51    DeleteObject(hPen);
52
53    //影側の縁
54    hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DDKSHADOW));
55    hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
56    DrawLineInClient(WndNum,
57        pPos->x, pPos->y+pSize->cy-1,
58        pPos->x+pSize->cx, pPos->y+pSize->cy-1);
59    DrawLineInClient(WndNum,
60        pPos->x+pSize->cx-1, pPos->y,
61        pPos->x+pSize->cx-1, pPos->y+pSize->cy-1);
62    SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
63    DeleteObject(hPen);
64
65    hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
66    hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
67    DrawLineInClient(WndNum,
68        pPos->x+1, pPos->y+pSize->cy-2,
69        pPos->x+pSize->cx-1, pPos->y+pSize->cy-2);
70    DrawLineInClient(WndNum,
71        pPos->x+pSize->cx-2, pPos->y+1,
72        pPos->x+pSize->cx-2, pPos->y+pSize->cy-2);
73    SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
74    DeleteObject(hPen);
75
76    //内部
77    DrawRectangleInClient(WndNum,
78        pPos->x+1,pPos->y+1,
79        pPos->x+pSize->cx-2,pPos->y+pSize->cy-2,
80        GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
81
82    pPos->x+=3;
83    pPos->y+=2;
84    pSize->cx-=5;
85    pSize->cy-=4;
86}
87void DrawItemEdgeByExStyle(int WndNum,int ExStyle,POINT *pPos,SIZE *pSize){
88    extern MDIINFO MdiInfo[MAX_WNDNUM];
89    HPEN hPen,hOldPen;
90    RECT rect;
91
92    if(ExStyle&WS_EX_DLGMODALFRAME){
93        ///////////////////////////
94        //モーダル フレーム境界線
95
96        rect.left=pPos->x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
97        rect.top=pPos->y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
98        rect.right=pPos->x+pSize->cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
99        rect.bottom=pPos->y+pSize->cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
100        DrawEdge(MdiInfo[WndNum].MdiRadInfo->hMemDC,&rect,EDGE_RAISED,BF_RECT);
101        pPos->x+=2;
102        pPos->y+=2;
103        pSize->cx-=4;
104        pSize->cy-=4;
105
106        //細枠
107        DrawRectangleInClient(WndNum,
108            pPos->x,pPos->y,
109            pPos->x+pSize->cx,pPos->y+pSize->cy,
110            GetSysColor(COLOR_ACTIVEBORDER),0,0);
111
112        pPos->x+=1;
113        pPos->y+=1;
114        pSize->cx-=2;
115        pSize->cy-=2;
116    }
117    else if(ExStyle&WS_EX_STATICEDGE){
118        //////////////////////
119        //スタティック境界線
120
121        //影側の色
122        hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DSHADOW));
123        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
124        DrawLineInClient(WndNum,
125            pPos->x,
126            pPos->y,
127            pPos->x,
128            pPos->y+pSize->cy-1);
129        DrawLineInClient(WndNum,
130            pPos->x,
131            pPos->y,
132            pPos->x+pSize->cx-1,
133            pPos->y);
134        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
135        DeleteObject(hPen);
136
137        //光源方向の縁
138        hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
139        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
140        DrawLineInClient(WndNum,
141            pPos->x,
142            pPos->y+pSize->cy-1,
143            pPos->x+pSize->cx-1,
144            pPos->y+pSize->cy-1);
145        DrawLineInClient(WndNum,
146            pPos->x+pSize->cx-1,
147            pPos->y,
148            pPos->x+pSize->cx-1,
149            pPos->y+pSize->cy);
150        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
151        DeleteObject(hPen);
152
153        pPos->x+=1;
154        pPos->y+=1;
155        pSize->cx-=2;
156        pSize->cy-=2;
157    }
158    if(ExStyle&WS_EX_CLIENTEDGE){
159        //////////////////////
160        //クライアント境界線
161
162        rect.left=pPos->x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
163        rect.top=pPos->y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
164        rect.right=pPos->x+pSize->cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
165        rect.bottom=pPos->y+pSize->cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
166        DrawEdge(MdiInfo[WndNum].MdiRadInfo->hMemDC,&rect,EDGE_SUNKEN,BF_RECT);
167        pPos->x+=2;
168        pPos->y+=2;
169        pSize->cx-=4;
170        pSize->cy-=4;
171    }
172}
173void DrawScrollBar(int WndNum,DWORD style,BOOL bSwitch,POINT *pPos,SIZE *pSize){
174    extern MDIINFO MdiInfo[MAX_WNDNUM];
175    int i,i2;
176    HPEN hPen,hOldPen;
177    COLORREF rgb;
178    POINT pos;
179    SIZE size;
180
181    if(bSwitch==0){
182        //水平スクロールバー
183
184        //左ボタン
185        if(pSize->cx>16*2){
186            pos=*pPos;
187            size.cx=16;
188            size.cy=pSize->cy;
189        }
190        else{
191            pos=*pPos;
192            size.cx=pSize->cx/2;
193            size.cy=pSize->cy;
194        }
195        DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
196
197        //内部
198        DrawRectangleInClient(WndNum,
199            pos.x,pos.y,
200            pos.x+size.cx,pos.y+size.cy,
201            GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
202
203        if(style&WS_DISABLED){
204            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
205            hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
206            pos.x++;
207            pos.y++;
208            i2=pos.y+(size.cy/2);
209            for(i=0;i<4;i++,i2--){
210                DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
211            }
212            SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
213            DeleteObject(hPen);
214            rgb=GetSysColor(COLOR_GRAYTEXT);
215            pos.x--;
216            pos.y--;
217        }
218        else rgb=GetSysColor(COLOR_BTNTEXT);
219        hPen=CreatePen(PS_SOLID,0,rgb);
220        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
221        i2=pos.y+(size.cy/2);
222        for(i=0;i<4;i++,i2--){
223            DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
224        }
225        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
226        DeleteObject(hPen);
227
228        //右ボタン
229        if(pSize->cx>16*2){
230            pos.x=pPos->x+pSize->cx-16;
231            pos.y=pPos->y;
232            size.cx=16;
233            size.cy=pSize->cy;
234        }
235        else{
236            pos.x=pPos->x+pSize->cx/2+pSize->cx%2;
237            pos.y=pPos->y;
238            size.cx=pSize->cx/2;
239            size.cy=pSize->cy;
240        }
241        DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
242
243        //内部
244        DrawRectangleInClient(WndNum,
245            pos.x,pos.y,
246            pos.x+size.cx,pos.y+size.cy,
247            GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
248
249        if(style&WS_DISABLED){
250            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
251            hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
252            pos.x++;
253            pos.y++;
254            i2=pos.y+(size.cy/2);
255            for(i=3;i>=0;i--,i2--){
256                DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
257            }
258            SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
259            DeleteObject(hPen);
260            rgb=GetSysColor(COLOR_GRAYTEXT);
261            pos.x--;
262            pos.y--;
263        }
264        else rgb=GetSysColor(COLOR_BTNTEXT);
265        hPen=CreatePen(PS_SOLID,0,rgb);
266        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
267        i2=pos.y+(size.cy/2);
268        for(i=3;i>=0;i--,i2--){
269            DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
270        }
271        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
272        DeleteObject(hPen);
273
274        if(pSize->cx>16*3){
275            if(!(style&WS_DISABLED)){
276                pos.x=pPos->x+16;
277                pos.y=pPos->y;
278                size.cx=16;
279                size.cy=pSize->cy;
280                DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
281
282                //内部
283                DrawRectangleInClient(WndNum,
284                    pos.x,pos.y,
285                    pos.x+size.cx,pos.y+size.cy,
286                    GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
287
288                pos.x=pPos->x+16*2;
289                pos.y=pPos->y;
290                size.cx=pSize->cx-16*3;
291                size.cy=pSize->cy;
292            }
293            else{
294                pos.x=pPos->x+16;
295                pos.y=pPos->y;
296                size.cx=pSize->cx-16*2;
297                size.cy=pSize->cy;
298            }
299        }
300        else if(pSize->cx>16*2){
301            pos.x=pPos->x+16;
302            pos.y=pPos->y;
303            size.cx=pSize->cx-16*2;
304            size.cy=pSize->cy;
305        }
306        else{
307            pos.x=pPos->x+pSize->cx/2;
308            pos.y=pPos->y;
309            size.cx=pSize->cx%2;
310            size.cy=pSize->cy;
311        }
312    }
313    else{
314        //垂直スクロールバー
315
316        //上ボタン
317        if(pSize->cy>16*2){
318            pos=*pPos;
319            size.cy=16;
320            size.cx=pSize->cx;
321        }
322        else{
323            pos=*pPos;
324            size.cy=pSize->cy/2;
325            size.cx=pSize->cx;
326        }
327        DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
328
329        //内部
330        DrawRectangleInClient(WndNum,
331            pos.x,pos.y,
332            pos.x+size.cx,pos.y+size.cy,
333            GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
334
335        pos.y++;
336        if(style&WS_DISABLED){
337            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
338            hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
339            pos.x++;
340            pos.y++;
341            i2=pos.x+(size.cx/2)-1;
342            for(i=0;i<4;i++,i2--){
343                DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
344            }
345            SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
346            DeleteObject(hPen);
347            rgb=GetSysColor(COLOR_GRAYTEXT);
348            pos.x--;
349            pos.y--;
350        }
351        else rgb=GetSysColor(COLOR_BTNTEXT);
352        hPen=CreatePen(PS_SOLID,0,rgb);
353        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
354        i2=pos.x+(size.cx/2)-1;
355        for(i=0;i<4;i++,i2--){
356            DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
357        }
358        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
359        DeleteObject(hPen);
360
361        //下ボタン
362        if(pSize->cy>16*2){
363            pos.x=pPos->x;
364            pos.y=pPos->y+pSize->cy-16;
365            size.cx=pSize->cx;
366            size.cy=16;
367        }
368        else{
369            pos.x=pPos->x;
370            pos.y=pPos->y+pSize->cy/2+pSize->cy%2;
371            size.cx=pSize->cx;
372            size.cy=pSize->cy/2;
373        }
374        DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
375
376        //内部
377        DrawRectangleInClient(WndNum,
378            pos.x,pos.y,
379            pos.x+size.cx,pos.y+size.cy,
380            GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
381
382        pos.x--;
383        if(style&WS_DISABLED){
384            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
385            hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
386            pos.x++;
387            pos.y++;
388            i2=pos.x+(size.cx/2);
389            for(i=3;i>=0;i--,i2--){
390                DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
391            }
392            SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
393            DeleteObject(hPen);
394            rgb=GetSysColor(COLOR_GRAYTEXT);
395            pos.x--;
396            pos.y--;
397        }
398        else rgb=GetSysColor(COLOR_BTNTEXT);
399        hPen=CreatePen(PS_SOLID,0,rgb);
400        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
401        i2=pos.x+(size.cx/2);
402        for(i=3;i>=0;i--,i2--){
403            DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
404        }
405        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
406        DeleteObject(hPen);
407
408        if(pSize->cy>16*3){
409            if(!(style&WS_DISABLED)){
410                pos.x=pPos->x;
411                pos.y=pPos->y+16;
412                size.cx=pSize->cx;
413                size.cy=16;
414                DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
415
416                //内部
417                DrawRectangleInClient(WndNum,
418                    pos.x,pos.y,
419                    pos.x+size.cx,pos.y+size.cy,
420                    GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
421
422                pos.x=pPos->x;
423                pos.y=pPos->y+16*2;
424                size.cx=pSize->cx;
425                size.cy=pSize->cy-16*3;
426            }
427            else{
428                pos.x=pPos->x;
429                pos.y=pPos->y+16;
430                size.cx=pSize->cx;
431                size.cy=pSize->cy-16*2;
432            }
433        }
434        else if(pSize->cy>16*2){
435            pos.x=pPos->x;
436            pos.y=pPos->y+16;
437            size.cx=pSize->cx;
438            size.cy=pSize->cy-16*2;
439        }
440        else{
441            pos.x=pPos->x;
442            pos.y=pPos->y+pSize->cy/2;
443            size.cx=pSize->cx;
444            size.cy=pSize->cy%2;
445        }
446    }
447
448    if(size.cx){
449        int x,y;
450        HBITMAP hBitmap;
451        BITMAPINFO BitmapInfo;
452        BYTE *pByte;
453
454        memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
455        BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
456        BitmapInfo.bmiHeader.biWidth=size.cx;
457        BitmapInfo.bmiHeader.biHeight=size.cy;
458        BitmapInfo.bmiHeader.biPlanes=1;
459        BitmapInfo.bmiHeader.biBitCount=24;
460
461        hBitmap=CreateDIBSection(MdiInfo[WndNum].MdiRadInfo->hMemDC,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
462        i=BitmapInfo.bmiHeader.biWidth*3;
463        if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
464        for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
465            if(y%2==0) rgb=GetSysColor(COLOR_3DFACE);
466            else rgb=RGB(255,255,255);
467            for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
468                i2=y*i+x*3;
469                pByte[i2+2]=LOBYTE(LOWORD(rgb));
470                pByte[i2+1]=HIBYTE(LOWORD(rgb));
471                pByte[i2]=LOBYTE(HIWORD(rgb));
472                if(rgb==RGB(255,255,255)) rgb=GetSysColor(COLOR_3DFACE);
473                else rgb=RGB(255,255,255);
474            }
475        }
476        SetDIBitsToDevice(MdiInfo[WndNum].MdiRadInfo->hMemDC,
477            pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
478            pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
479            BitmapInfo.bmiHeader.biWidth, BitmapInfo.bmiHeader.biHeight,
480            0,0,
481            0,BitmapInfo.bmiHeader.biHeight,
482            pByte,
483            &BitmapInfo,
484            DIB_RGB_COLORS);
485        DeleteObject(hBitmap);
486    }
487}
488void DrawUpDownControl(int WndNum,DWORD style,BOOL bSwitch,POINT *pPos,SIZE *pSize){
489    extern MDIINFO MdiInfo[MAX_WNDNUM];
490    int i,i2;
491    HPEN hPen,hOldPen;
492    COLORREF rgb;
493    POINT pos;
494    SIZE size;
495
496    if(bSwitch==0){
497        //水平
498
499        //左ボタン
500        pos=*pPos;
501        size.cx=pSize->cx/2;
502        size.cy=pSize->cy;
503        DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
504
505        //内部
506        DrawRectangleInClient(WndNum,
507            pos.x,pos.y,
508            pos.x+size.cx,pos.y+size.cy,
509            GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
510
511        if(style&WS_DISABLED){
512            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
513            hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
514            pos.x++;
515            pos.y++;
516            i2=pos.y+(size.cy/2);
517            for(i=0;i<4;i++,i2--){
518                DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
519            }
520            SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
521            DeleteObject(hPen);
522            rgb=GetSysColor(COLOR_GRAYTEXT);
523            pos.x--;
524            pos.y--;
525        }
526        else rgb=GetSysColor(COLOR_BTNTEXT);
527        hPen=CreatePen(PS_SOLID,0,rgb);
528        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
529        i2=pos.y+(size.cy/2);
530        for(i=0;i<4;i++,i2--){
531            DrawLineInClient(WndNum,i+pos.x+2,i2,i+pos.x+2,i2+(i*2)+1);
532        }
533        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
534        DeleteObject(hPen);
535
536        //右ボタン
537        pos.x=pPos->x+pSize->cx/2+pSize->cx%2;
538        pos.y=pPos->y;
539        size.cx=pSize->cx/2;
540        size.cy=pSize->cy;
541        DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
542
543        //内部
544        DrawRectangleInClient(WndNum,
545            pos.x,pos.y,
546            pos.x+size.cx,pos.y+size.cy,
547            GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
548
549        if(style&WS_DISABLED){
550            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
551            hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
552            pos.x++;
553            pos.y++;
554            i2=pos.y+(size.cy/2);
555            for(i=3;i>=0;i--,i2--){
556                DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
557            }
558            SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
559            DeleteObject(hPen);
560            rgb=GetSysColor(COLOR_GRAYTEXT);
561            pos.x--;
562            pos.y--;
563        }
564        else rgb=GetSysColor(COLOR_BTNTEXT);
565        hPen=CreatePen(PS_SOLID,0,rgb);
566        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
567        i2=pos.y+(size.cy/2);
568        for(i=3;i>=0;i--,i2--){
569            DrawLineInClient(WndNum,i+pos.x+3,i2,i+pos.x+3,i2+((3-i)*2)+1);
570        }
571        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
572        DeleteObject(hPen);
573    }
574    else{
575        //垂直
576
577        //上ボタン
578        pos=*pPos;
579        size.cy=pSize->cy/2;
580        size.cx=pSize->cx;
581        DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
582
583        //内部
584        DrawRectangleInClient(WndNum,
585            pos.x,pos.y,
586            pos.x+size.cx,pos.y+size.cy,
587            GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
588
589        pos.y++;
590        if(style&WS_DISABLED){
591            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
592            hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
593            pos.x++;
594            pos.y++;
595            i2=pos.x+(size.cx/2)-1;
596            for(i=0;i<4;i++,i2--){
597                DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
598            }
599            SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
600            DeleteObject(hPen);
601            rgb=GetSysColor(COLOR_GRAYTEXT);
602            pos.x--;
603            pos.y--;
604        }
605        else rgb=GetSysColor(COLOR_BTNTEXT);
606        hPen=CreatePen(PS_SOLID,0,rgb);
607        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
608        i2=pos.x+(size.cx/2)-1;
609        for(i=0;i<4;i++,i2--){
610            DrawLineInClient(WndNum,i2,i+pos.y+2,i2+(i*2)+1,i+pos.y+2);
611        }
612        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
613        DeleteObject(hPen);
614
615        //下ボタン
616        pos.x=pPos->x;
617        pos.y=pPos->y+pSize->cy/2+pSize->cy%2;
618        size.cx=pSize->cx;
619        size.cy=pSize->cy/2;
620        DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos,&size);
621
622        //内部
623        DrawRectangleInClient(WndNum,
624            pos.x,pos.y,
625            pos.x+size.cx,pos.y+size.cy,
626            GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
627
628        pos.x--;
629        if(style&WS_DISABLED){
630            hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
631            hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
632            pos.x++;
633            pos.y++;
634            i2=pos.x+(size.cx/2);
635            for(i=3;i>=0;i--,i2--){
636                DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
637            }
638            SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
639            DeleteObject(hPen);
640            rgb=GetSysColor(COLOR_GRAYTEXT);
641            pos.x--;
642            pos.y--;
643        }
644        else rgb=GetSysColor(COLOR_BTNTEXT);
645        hPen=CreatePen(PS_SOLID,0,rgb);
646        hOldPen=(HPEN)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hPen);
647        i2=pos.x+(size.cx/2);
648        for(i=3;i>=0;i--,i2--){
649            DrawLineInClient(WndNum,i2,i+pos.y+3,i2+((3-i)*2)+1,i+pos.y+3);
650        }
651        SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldPen);
652        DeleteObject(hPen);
653    }
654}
655void DrawWindowScrollBar(int WndNum,DWORD style,POINT *pPos,SIZE *pSize){
656    POINT pos;
657    SIZE size;
658    if(style&WS_HSCROLL){
659        pos.x=pPos->x;
660        pos.y=pPos->y+pSize->cy-GetSystemMetrics(SM_CYVSCROLL);
661        if(style&WS_VSCROLL) size.cx=pSize->cx-GetSystemMetrics(SM_CXVSCROLL);
662        else size.cx=pSize->cx;
663        size.cy=GetSystemMetrics(SM_CYVSCROLL);
664        DrawScrollBar(WndNum,style,0,&pos,&size);
665    }
666    if(style&WS_VSCROLL){
667        pos.x=pPos->x+pSize->cx-GetSystemMetrics(SM_CXHSCROLL);
668        pos.y=pPos->y;
669        size.cx=GetSystemMetrics(SM_CXHSCROLL);
670        if(style&WS_HSCROLL) size.cy=pSize->cy-GetSystemMetrics(SM_CYHSCROLL);
671        else size.cy=pSize->cy;
672        DrawScrollBar(WndNum,style,1,&pos,&size);
673    }
674}
675void DrawOEMImage(HDC hdc,POINT *pPos,SIZE *pSize,DWORD dwImage){
676    HBITMAP hBmp,hOldBmp;
677    HDC memdc;
678
679    //未完成(XPのみに対応?)
680
681    memdc=CreateCompatibleDC(hdc);
682    hBmp=LoadBitmap(NULL,(LPSTR)dwImage);
683    hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
684    BitBlt(hdc,pPos->x,pPos->y,pSize->cx,pSize->cy,memdc,0,0,SRCCOPY);
685    SelectObject(memdc,hOldBmp);
686    DeleteDC(memdc);
687    DeleteObject(hBmp);
688}
689void DesigningWindow(int WndNum,HDC hdc,POINT *pBasePos,const ActiveBasic::PM::WindowInfo *pWindowInfo){
690    extern MDIINFO MdiInfo[MAX_WNDNUM];
691    int i,i2,i3,i4;
692    double red,green,blue,d_red,d_green,d_blue;
693    char temporary[MAX_PATH];
694    COLORREF rgb;
695    HPEN hPen,hOldPen;
696    HBRUSH hBrush,hOldBrush;
697    HFONT hFont,hOldFont;
698    HANDLE hImage;
699    RECT InsideRect,rect,rc2;
700    POINT pos,pos2;
701    SIZE size,size2;
702
703    HGLOBAL hResource;
704    BITMAPINFO *pBitmapInfo;
705    BYTE *pByte,*pByte2;
706
707
708    ////////////////////////
709    //ウィンドウの縁を描画
710    InsideRect.left=pBasePos->x;
711    InsideRect.top=pBasePos->y;
712    InsideRect.right=InsideRect.left+pWindowInfo->size.cx;
713    InsideRect.bottom=InsideRect.top+pWindowInfo->size.cy;
714
715    if(pWindowInfo->GetStyle()&(WS_BORDER|WS_THICKFRAME)){
716        DrawEdge(hdc,&InsideRect,EDGE_RAISED,BF_RECT);
717
718        InsideRect.left+=2;
719        InsideRect.top+=2;
720        InsideRect.right-=2;
721        InsideRect.bottom-=2;
722    }
723
724
725    ////////////
726    //枠を描画
727    if(pWindowInfo->GetStyle()&(WS_BORDER|WS_THICKFRAME)){
728        //細枠
729        hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_ACTIVEBORDER));
730        hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
731        hOldPen=(HPEN)SelectObject(hdc,hPen);
732        hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
733        Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
734
735        InsideRect.left+=1;
736        InsideRect.top+=1;
737        InsideRect.right-=1;
738        InsideRect.bottom-=1;
739
740        //サイズ変更枠
741        if(pWindowInfo->GetStyle()&WS_THICKFRAME){
742            Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
743
744            InsideRect.left+=1;
745            InsideRect.top+=1;
746            InsideRect.right-=1;
747            InsideRect.bottom-=1;
748        }
749        SelectObject(hdc,hOldPen);
750        SelectObject(hdc,hOldBrush);
751        DeleteObject(hPen);
752        DeleteObject(hBrush);
753    }
754
755
756    //Draw...InClient関数のため
757    MdiInfo[WndNum].MdiRadInfo->ClientPos.x=0;
758    MdiInfo[WndNum].MdiRadInfo->ClientPos.y=0;
759
760    if(pWindowInfo->GetStyle()&(WS_CAPTION&(~WS_BORDER))){
761        //////////////////////
762        //タイトルバーを描画
763
764        //背景を描画(グラデーション可)
765        i=GetSysColor(COLOR_ACTIVECAPTION);
766        OSVERSIONINFO OsVersionInfo;
767        OsVersionInfo.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
768        GetVersionEx(&OsVersionInfo);
769        if((OsVersionInfo.dwPlatformId==VER_PLATFORM_WIN32_NT&&OsVersionInfo.dwMajorVersion>=5)||
770            (OsVersionInfo.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS&&LOWORD(OsVersionInfo.dwBuildNumber)>=1998)){
771#define COLOR_GRADIENTACTIVECAPTION 27
772            i2=GetSysColor(COLOR_GRADIENTACTIVECAPTION);
773        }
774        else i2=i;
775        if(pWindowInfo->GetExStyle()&WS_EX_TOOLWINDOW)
776            i3=GetSystemMetrics(SM_CYSMCAPTION);
777        else i3=GetSystemMetrics(SM_CYCAPTION);
778        d_red=((double)((i2&0xFF)-(i&0xFF)))/(double)(InsideRect.right-InsideRect.left);
779        d_green=((double)(((i2>>8)&0xFF))-((i>>8)&0xFF))/(double)(InsideRect.right-InsideRect.left);
780        d_blue=((double)(((i2>>16)&0xFF))-((i>>16)&0xFF))/(double)(InsideRect.right-InsideRect.left);
781
782        red=(double)(i&0xFF);
783        green=(double)((i>>8)&0xFF);
784        blue=(double)((i>>16)&0xFF);
785        for(i4=InsideRect.left;i4<InsideRect.right;i4++){
786            hPen=CreatePen(PS_SOLID,0,RGB((_int8)red,(_int8)green,(_int8)blue));
787            hOldPen=(HPEN)SelectObject(hdc,hPen);
788            MoveToEx(hdc,i4,InsideRect.top,NULL);
789            LineTo(hdc,i4,InsideRect.top+i3-1);
790            SelectObject(hdc,hOldPen);
791            DeleteObject(hPen);
792            red+=d_red;
793            green+=d_green;
794            blue+=d_blue;
795        }
796
797        //タイトルテキストの描画
798        LOGFONT LogFont;
799        SystemParametersInfo(SPI_GETICONTITLELOGFONT,sizeof(LOGFONT),&LogFont,0);
800        hFont=CreateFontIndirect(&LogFont);
801        hOldFont=(HFONT)SelectObject(hdc,hFont);
802        SetTextColor(hdc,GetSysColor(COLOR_CAPTIONTEXT));
803        rect.left=InsideRect.left+20;
804        rect.top=InsideRect.top;
805        rect.right=InsideRect.right;
806        rect.bottom=InsideRect.top+i3;
807        DrawText(hdc,pWindowInfo->GetCaption().c_str(),pWindowInfo->GetCaption().size(),&rect,DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX);
808        SelectObject(hdc,hOldFont);
809        DeleteObject(hFont);
810
811        //ボタン
812        if(pWindowInfo->GetStyle()&WS_SYSMENU){
813            //終了ボタン
814            size.cx=GetSystemMetrics(SM_CXSIZE)-2;
815            size.cy=GetSystemMetrics(SM_CYSIZE)-4;
816            pos.x=InsideRect.right-2-size.cx;
817            pos.y=InsideRect.top+2;
818            DrawButtonEdge(WndNum,&pos,&size);
819
820            hResource=LoadResource(hResInst,FindResource(hResInst,MAKEINTRESOURCE(IDB_TITLE_BUTTON_CLOSE),RT_BITMAP));
821            pBitmapInfo=(BITMAPINFO *)LockResource(hResource);
822            pByte=(BYTE *)pBitmapInfo+pBitmapInfo->bmiHeader.biSize;
823
824            i2=pBitmapInfo->bmiHeader.biWidth*3;
825            if(i2%sizeof(LONG)!=0) i2+=sizeof(LONG)-(i2%sizeof(LONG));
826            pByte2=(BYTE *)GlobalAlloc(GMEM_FIXED,pBitmapInfo->bmiHeader.biHeight*i2);
827            int x,y;
828            for(y=0;y<pBitmapInfo->bmiHeader.biHeight;y++){
829                if(y%2==0) rgb=GetSysColor(COLOR_3DFACE);
830                else rgb=RGB(255,255,255);
831                for(x=0;x<pBitmapInfo->bmiHeader.biWidth;x++){
832                    i4=y*i2+x*3;
833                    rgb=RGB(pByte[i4+2],pByte[i4+1],pByte[i4]);
834                    if(rgb==RGB(0,0,0)){
835                        rgb=GetSysColor(COLOR_BTNTEXT);
836                        pByte2[i4+2]=LOBYTE(LOWORD(rgb));
837                        pByte2[i4+1]=HIBYTE(LOWORD(rgb));
838                        pByte2[i4]=LOBYTE(HIWORD(rgb));
839                    }
840                    else if(rgb==RGB(255,255,255)){
841                        rgb=GetSysColor(COLOR_3DFACE);
842                        pByte2[i4+2]=LOBYTE(LOWORD(rgb));
843                        pByte2[i4+1]=HIBYTE(LOWORD(rgb));
844                        pByte2[i4]=LOBYTE(HIWORD(rgb));
845                    }
846                }
847            }
848            SetStretchBltMode(hdc,COLORONCOLOR);
849            StretchDIBits(hdc,
850                pos.x+(int)((double)size.cx*0.17), pos.y+(int)((double)size.cy*0.17),
851                (int)((double)size.cx*0.65)+1, (int)((double)size.cy*0.65)+1,
852                0,0,
853                pBitmapInfo->bmiHeader.biWidth,pBitmapInfo->bmiHeader.biHeight,
854                pByte2,
855                pBitmapInfo,
856                DIB_RGB_COLORS,SRCCOPY);
857            GlobalFree(pByte2);
858
859            if(pWindowInfo->GetStyle()&WS_MAXIMIZEBOX||pWindowInfo->GetStyle()&WS_MINIMIZEBOX){
860                //最大化ボタン
861                size.cx=GetSystemMetrics(SM_CXSIZE)-2;
862                size.cy=GetSystemMetrics(SM_CYSIZE)-4;
863                pos.x=InsideRect.right-size.cx*2-4;
864                pos.y=InsideRect.top+2;
865                DrawButtonEdge(WndNum,&pos,&size);
866                if(!(pWindowInfo->GetStyle()&WS_MAXIMIZEBOX)){
867                    pos.x++;
868                    pos.y++;
869                    hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
870                    hOldPen=(HPEN)SelectObject(hdc,hPen);
871                    hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
872                    Rectangle(hdc,pos.x,pos.y,pos.x+size.cx-2,pos.y+size.cy-1);
873                    MoveToEx(hdc,pos.x,pos.y+1,NULL);
874                    LineTo(hdc,pos.x+size.cx-2,pos.y+1);
875                    SelectObject(hdc,hOldPen);
876                    SelectObject(hdc,hOldBrush);
877                    DeleteObject(hPen);
878                    pos.x--;
879                    pos.y--;
880                    rgb=GetSysColor(COLOR_GRAYTEXT);
881                }
882                else rgb=GetSysColor(COLOR_BTNTEXT);
883                hPen=CreatePen(PS_SOLID,0,rgb);
884                hOldPen=(HPEN)SelectObject(hdc,hPen);
885                hOldBrush=(HBRUSH)SelectObject(hdc,GetStockObject(NULL_BRUSH));
886                Rectangle(hdc,pos.x,pos.y,pos.x+size.cx-2,pos.y+size.cy-1);
887                MoveToEx(hdc,pos.x,pos.y+1,NULL);
888                LineTo(hdc,pos.x+size.cx-2,pos.y+1);
889                SelectObject(hdc,hOldPen);
890                SelectObject(hdc,hOldBrush);
891                DeleteObject(hPen);
892
893                //最小化ボタン
894                size.cx=GetSystemMetrics(SM_CXSIZE)-2;
895                size.cy=GetSystemMetrics(SM_CYSIZE)-4;
896                pos.x=InsideRect.right-size.cx*3-4;
897                pos.y=InsideRect.top+2;
898                DrawButtonEdge(WndNum,&pos,&size);
899                if(!(pWindowInfo->GetStyle()&WS_MINIMIZEBOX)){
900                    pos.x++;
901                    pos.y++;
902                    hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
903                    hOldPen=(HPEN)SelectObject(hdc,hPen);
904                    MoveToEx(hdc,pos.x+1,pos.y+size.cy-2,NULL);
905                    LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-2);
906                    MoveToEx(hdc,pos.x+1,pos.y+size.cy-3,NULL);
907                    LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-3);
908                    SelectObject(hdc,hOldPen);
909                    DeleteObject(hPen);
910                    pos.x--;
911                    pos.y--;
912                    rgb=GetSysColor(COLOR_GRAYTEXT);
913                }
914                else rgb=GetSysColor(COLOR_BTNTEXT);
915                hPen=CreatePen(PS_SOLID,0,rgb);
916                hOldPen=(HPEN)SelectObject(hdc,hPen);
917                MoveToEx(hdc,pos.x+1,pos.y+size.cy-2,NULL);
918                LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-2);
919                MoveToEx(hdc,pos.x+1,pos.y+size.cy-3,NULL);
920                LineTo(hdc,pos.x+size.cy-3,pos.y+size.cy-3);
921                SelectObject(hdc,hOldPen);
922                DeleteObject(hPen);
923            }
924        }
925
926        InsideRect.top+=i3;
927    }
928
929    if( pWindowInfo->HasMenu() )
930    {
931        //メニューラインを3DFACEで描画
932        rgb=GetSysColor(COLOR_3DFACE);
933        i=GetSystemMetrics(SM_CYMENU);
934        hPen=CreatePen(PS_SOLID,0,rgb);
935        hBrush=CreateSolidBrush(rgb);
936        hOldPen=(HPEN)SelectObject(hdc,hPen);
937        hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
938        Rectangle(hdc,
939            InsideRect.left,InsideRect.top-1,InsideRect.right,InsideRect.top+i);
940        SelectObject(hdc,hOldPen);
941        SelectObject(hdc,hOldBrush);
942        DeleteObject(hPen);
943        DeleteObject(hBrush);
944
945        InsideRect.top+=i;
946    }
947
948    //クライアント左上ポジションを設定
949    MdiInfo[WndNum].MdiRadInfo->ClientPos.x=InsideRect.left;
950    MdiInfo[WndNum].MdiRadInfo->ClientPos.y=InsideRect.top;
951
952    //ExStyleによる縁を描画
953    pos.x=0;
954    pos.y=0;
955    size.cx=InsideRect.right-InsideRect.left;
956    size.cy=InsideRect.bottom-InsideRect.top;
957    DrawItemEdgeByExStyle(WndNum,pWindowInfo->GetExStyle(),&pos,&size);
958
959    //スクロールバーを描画
960    DrawWindowScrollBar(WndNum,pWindowInfo->GetStyle(),&pos,&size);
961
962    //クライアント領域のサイズを設定
963    MdiInfo[WndNum].MdiRadInfo->ClientSize=size;
964
965
966    //////////////
967    //背景を描画
968    if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE){
969        //3DFACE
970        hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DFACE));
971        hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
972        hOldPen=(HPEN)SelectObject(hdc,hPen);
973        hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
974        Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
975        SelectObject(hdc,hOldPen);
976        SelectObject(hdc,hOldBrush);
977        DeleteObject(hPen);
978        DeleteObject(hBrush);
979    }
980    else if(pWindowInfo->GetBackgroundColor()<=0){
981        //色指定
982        hPen=CreatePen(PS_SOLID,0,-pWindowInfo->GetBackgroundColor());
983        hBrush=CreateSolidBrush(-pWindowInfo->GetBackgroundColor());
984        hOldPen=(HPEN)SelectObject(hdc,hPen);
985        hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
986        Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
987        SelectObject(hdc,hOldPen);
988        SelectObject(hdc,hOldBrush);
989        DeleteObject(hPen);
990        DeleteObject(hBrush);
991    }
992    else if(pWindowInfo->GetBackgroundColor()>=0x1000){
993        //ビットマップ
994        BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
995        {
996            if( projectInfo.resourceManager.bitmapResources[pWindowInfo->GetBackgroundColor()-0x1000].idName == resourceItem.idName )
997            {
998                lstrcpy(temporary,resourceItem.filepath.c_str());
999                lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1000                hImage=LoadImage(NULL,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
1001
1002                hBrush=CreatePatternBrush((HBITMAP)hImage);
1003                hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
1004                SetBrushOrgEx(hdc,InsideRect.left,InsideRect.top,&pos);
1005                PatBlt(hdc,
1006                    InsideRect.left, InsideRect.top,
1007                    InsideRect.right-InsideRect.left, InsideRect.bottom-InsideRect.top,PATCOPY);
1008                SetBrushOrgEx(hdc,pos.x,pos.y,0);
1009                SelectObject(hdc,hOldBrush);
1010                DeleteObject(hBrush);
1011                DeleteObject(hImage);
1012
1013                break;
1014            }
1015        }
1016    }
1017
1018
1019    ////////////////////////////////////////////
1020    //子ウィンドウ(ダイアログアイテム)を描画
1021    hFont=CreateFontIndirect(&pWindowInfo->LogFont);
1022    BOOST_FOREACH( ActiveBasic::PM::ChildWindowInfo *pChildInfo, pWindowInfo->childWindowInfos )
1023    {
1024        pos=pChildInfo->pos;
1025        size=pChildInfo->size;
1026
1027        //ExStyleによる縁を描画
1028        DrawItemEdgeByExStyle(WndNum,pChildInfo->GetExStyle(),&pos,&size);
1029
1030        if(pChildInfo->Control==CT_BUTTON){
1031            ////////////////////////
1032            // Button コントロール
1033
1034            if((pChildInfo->GetStyle()&0x0000000F)==BS_DEFPUSHBUTTON){
1035                //標準のボタンの場合(黒枠描画)
1036                DrawRectangleInClient(WndNum,
1037                    pos.x, pos.y,
1038                    pos.x+size.cx, pos.y+size.cy,
1039                    RGB(0,0,0),0,0);
1040                pos.x++;
1041                pos.y++;
1042                size.cx-=2;
1043                size.cy-=2;
1044            }
1045
1046            //ボタンの縁を描画
1047            DrawButtonEdge(WndNum,&pos,&size);
1048
1049            if(!(pChildInfo->GetStyle()&(BS_ICON|BS_BITMAP))){
1050                //キャプション テキスト
1051
1052                rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1053                rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1054                rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1055                rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1056
1057                if(pChildInfo->GetStyle()&BS_MULTILINE) i4=0;
1058                else i4=DT_SINGLELINE;
1059
1060                //ビットを考慮してBS_CENTERを最初に比較する
1061                if((pChildInfo->GetStyle()&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
1062                else if(pChildInfo->GetStyle()&BS_LEFT) i2=DT_LEFT;
1063                else if(pChildInfo->GetStyle()&BS_RIGHT) i2=DT_RIGHT;
1064                else i2=DT_CENTER;
1065
1066                //ビットを考慮してBS_VCENTERを最初に比較する
1067                if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
1068                else if(pChildInfo->GetStyle()&BS_TOP) i3=DT_TOP;
1069                else if(pChildInfo->GetStyle()&BS_BOTTOM) i3=DT_BOTTOM;
1070                else i3=DT_VCENTER;
1071
1072                hOldFont=(HFONT)SelectObject(hdc,hFont);
1073                if(pChildInfo->GetStyle()&WS_DISABLED){
1074                    SetTextColor(hdc,RGB(255,255,255));
1075                    rc2.left=rect.left+1;
1076                    rc2.top=rect.top+1;
1077                    rc2.right=rect.right+1;
1078                    rc2.bottom=rect.bottom+1;
1079                    DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,i4|i2|i3);
1080                    SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1081                }
1082                else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1083
1084                DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i4|i2|i3);
1085                SelectObject(hdc,hOldFont);
1086            }
1087        }
1088        else if(pChildInfo->Control==CT_CHECKBOX){
1089            //////////////////////////
1090            // CheckBox コントロール
1091
1092            if(pChildInfo->GetStyle()&BS_PUSHLIKE){
1093                //ボタンの縁を描画
1094                DrawButtonEdge(WndNum,&pos,&size);
1095            }
1096            else{
1097                //チェックボックスを描画
1098                size2.cx=13;
1099                size2.cy=13;
1100                if(pChildInfo->GetStyle()&BS_LEFTTEXT)
1101                    pos2.x=pos.x+size.cx-size2.cx;
1102                else pos2.x=pos.x;
1103                if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER||
1104                    (pChildInfo->GetStyle()&BS_VCENTER)==0)
1105                    pos2.y=pos.y+(size.cy/2)-(size2.cy/2);
1106                else if(pChildInfo->GetStyle()&BS_TOP)
1107                    pos2.y=pos.y+1;
1108                else if(pChildInfo->GetStyle()&BS_BOTTOM)
1109                    pos2.y=pos.y+size.cy-size2.cy-1;
1110                DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos2,&size2);
1111
1112                if(pChildInfo->GetStyle()&WS_DISABLED)
1113                    rgb=GetSysColor(COLOR_3DFACE);
1114                else rgb=GetSysColor(COLOR_WINDOW);
1115                DrawRectangleInClient(WndNum,pos2.x, pos2.y,
1116                    pos2.x+size2.cx, pos2.y+size2.cy,
1117                    rgb,rgb,1);
1118                if(!(pChildInfo->GetStyle()&BS_LEFTTEXT)) pos.x+=17;
1119                else pos.x++;
1120                size.cx-=17;
1121            }
1122
1123            if(!(pChildInfo->GetStyle()&(BS_ICON|BS_BITMAP))){
1124                //キャプション テキスト
1125                rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1126                rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1127                rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1128                rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1129
1130                if(pChildInfo->GetStyle()&BS_MULTILINE) i4=0;
1131                else i4=DT_SINGLELINE;
1132
1133                //ビットを考慮してBS_CENTERを最初に比較する
1134                if((pChildInfo->GetStyle()&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
1135                else if(pChildInfo->GetStyle()&BS_LEFT) i2=DT_LEFT;
1136                else if(pChildInfo->GetStyle()&BS_RIGHT) i2=DT_RIGHT;
1137                else i2=DT_LEFT;
1138
1139                //ビットを考慮してBS_VCENTERを最初に比較する
1140                if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
1141                else if(pChildInfo->GetStyle()&BS_TOP) i3=DT_TOP;
1142                else if(pChildInfo->GetStyle()&BS_BOTTOM) i3=DT_BOTTOM;
1143                else i3=DT_VCENTER;
1144
1145                hOldFont=(HFONT)SelectObject(hdc,hFont);
1146                if(pChildInfo->GetStyle()&WS_DISABLED){
1147                    SetTextColor(hdc,RGB(255,255,255));
1148                    rc2.left=rect.left+1;
1149                    rc2.top=rect.top+1;
1150                    rc2.right=rect.right+1;
1151                    rc2.bottom=rect.bottom+1;
1152                    DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,i4|i2|i3);
1153                    SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1154                }
1155                else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1156
1157                DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i4|i2|i3);
1158                SelectObject(hdc,hOldFont);
1159            }
1160        }
1161        else if(pChildInfo->Control==CT_COMBOBOX){
1162            //////////////////////////
1163            // ComboBox コントロール
1164
1165            pos2=pos;
1166            size2.cx=size.cx;
1167            size2.cy=20;
1168            DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos2,&size2);
1169
1170            //内部
1171            if(pChildInfo->GetStyle()&WS_DISABLED)
1172                rgb=GetSysColor(COLOR_3DFACE);
1173            else rgb=GetSysColor(COLOR_WINDOW);
1174            DrawRectangleInClient(WndNum,
1175                pos2.x,pos2.y,
1176                pos2.x+size2.cx,pos2.y+size2.cy,
1177                rgb,rgb,1);
1178
1179            if((pChildInfo->GetStyle()&0x000F)==CBS_SIMPLE){
1180                pos.y+=20;
1181                size.cy-=20;
1182                DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos,&size);
1183
1184                //内部
1185                rgb=GetSysColor(COLOR_WINDOW);
1186                DrawRectangleInClient(WndNum,
1187                    pos.x,pos.y,
1188                    pos.x+size.cx,pos.y+size.cy,
1189                    rgb,rgb,1);
1190            }
1191            else{
1192                //下ボタン
1193                pos2.x+=size2.cx-16;
1194                size2.cx=16;
1195                size2.cy=16;
1196                DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos2,&size2);
1197
1198                //内部
1199                DrawRectangleInClient(WndNum,
1200                    pos2.x,pos2.y,
1201                    pos2.x+size2.cx,pos2.y+size2.cy,
1202                    GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
1203
1204                pos2.x--;
1205                if(pChildInfo->GetStyle()&WS_DISABLED){
1206                    hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
1207                    hOldPen=(HPEN)SelectObject(hdc,hPen);
1208                    pos2.x++;
1209                    pos2.y++;
1210                    i3=pos2.x+(size2.cx/2);
1211                    for(i2=3;i2>=0;i2--,i3--){
1212                        DrawLineInClient(WndNum,i3,i2+pos2.y+3,i3+((3-i2)*2)+1,i2+pos2.y+3);
1213                    }
1214                    SelectObject(hdc,hOldPen);
1215                    DeleteObject(hPen);
1216                    rgb=GetSysColor(COLOR_GRAYTEXT);
1217                    pos2.x--;
1218                    pos2.y--;
1219                }
1220                else rgb=GetSysColor(COLOR_BTNTEXT);
1221                hPen=CreatePen(PS_SOLID,0,rgb);
1222                hOldPen=(HPEN)SelectObject(hdc,hPen);
1223                i3=pos2.x+(size2.cx/2);
1224                for(i2=3;i2>=0;i2--,i3--){
1225                    DrawLineInClient(WndNum,i3,i2+pos2.y+3,i3+((3-i2)*2)+1,i2+pos2.y+3);
1226                }
1227                SelectObject(hdc,hOldPen);
1228                DeleteObject(hPen);
1229            }
1230        }
1231        else if(pChildInfo->Control==CT_EDIT){
1232            //////////////////////
1233            // Edit コントロール
1234
1235            //内部
1236            if(pChildInfo->GetStyle()&WS_DISABLED||pChildInfo->GetStyle()&ES_READONLY)
1237                rgb=GetSysColor(COLOR_3DFACE);
1238            else rgb=GetSysColor(COLOR_WINDOW);
1239            DrawRectangleInClient(WndNum,
1240                pos.x,pos.y,
1241                pos.x+size.cx,pos.y+size.cy,
1242                rgb,rgb,1);
1243
1244            //キャプション テキスト
1245            rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1246            rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1247            rect.right=pos.x+size.cx-1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1248            rect.bottom=pos.y+size.cy-1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1249
1250            if(pChildInfo->GetStyle()&ES_MULTILINE) i4=0;
1251            else i4=DT_SINGLELINE;
1252
1253            //ビットを考慮してES_LEFTを最後に検討する
1254            if(pChildInfo->GetStyle()&ES_CENTER) i2=DT_CENTER;
1255            else if(pChildInfo->GetStyle()&ES_RIGHT) i2=DT_RIGHT;
1256            else i2=DT_LEFT;
1257
1258            //文字色を設定
1259            if(pChildInfo->GetStyle()&WS_DISABLED)
1260                SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1261            else
1262                SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
1263
1264            hOldFont=(HFONT)SelectObject(hdc,hFont);
1265            DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i4|i2);
1266            SelectObject(hdc,hOldFont);
1267        }
1268
1269        else if(pChildInfo->Control==CT_GROUPBOX){
1270            ///////////////////////////////////
1271            // グループ ボックス コントロール
1272
1273            hOldFont=(HFONT)SelectObject(hdc,hFont);
1274            GetTextExtentPoint32(hdc,pChildInfo->GetCaption().c_str(),pChildInfo->GetCaption().size(),&size2);
1275
1276            //枠を描画
1277            rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1278            rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y+(size2.cy/2);
1279            rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1280            rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1281            DrawEdge(hdc,&rect,EDGE_ETCHED,BF_RECT);
1282
1283            //ビットを考慮してBS_CENTERを最初に検討する
1284            if((pChildInfo->GetStyle()&BS_CENTER)==BS_CENTER){
1285                rect.left=pos.x+(size.cx/2)-(size2.cx/2)-3;
1286                rect.right=rect.left+size2.cx+4;
1287            }
1288            else if(pChildInfo->GetStyle()&BS_RIGHT){
1289                rect.right=pos.x+size.cx-7;
1290                rect.left=rect.right-size2.cx-4;
1291            }
1292            else{
1293                rect.left=pos.x+7;
1294                rect.right=rect.left+size2.cx+4;
1295            }
1296            rect.top=pos.y;
1297            rect.bottom=pos.y+size2.cy;
1298
1299            if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE) rgb=GetSysColor(COLOR_3DFACE);
1300            else rgb=-pWindowInfo->GetBackgroundColor();
1301            DrawRectangleInClient(WndNum,rect.left,rect.top,rect.right,rect.bottom,rgb,rgb,1);
1302
1303            if(!((pChildInfo->GetStyle()&BS_ICON)||(pChildInfo->GetStyle()&BS_BITMAP))){
1304                rect.left+=MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1305                rect.top+=MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1306                rect.right+=MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1307                rect.bottom+=MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1308                rect.left+=2;
1309                rect.right-=2;
1310
1311                //テキストを描画
1312                if(pChildInfo->GetStyle()&WS_DISABLED){
1313                    SetTextColor(hdc,RGB(255,255,255));
1314                    rc2.left=rect.left+1;
1315                    rc2.top=rect.top+1;
1316                    rc2.right=rect.right+1;
1317                    rc2.bottom=rect.bottom+1;
1318                    DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,DT_SINGLELINE);
1319                    SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1320                }
1321                else
1322                    SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1323
1324                DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,DT_SINGLELINE);
1325            }
1326            SelectObject(hdc,hOldFont);
1327        }
1328
1329        else if(pChildInfo->Control==CT_HSCROLLBAR){
1330            ////////////////////////////////////
1331            // 水平スクロールバー コントロール
1332            DrawScrollBar(WndNum,pChildInfo->GetStyle(),0,&pos,&size);
1333        }
1334
1335        else if(pChildInfo->Control==CT_IMAGEBOX){
1336            /////////////////////
1337            // イメージ ボックス
1338            HDC memdc;
1339
1340            if((pChildInfo->GetStyle()&0x0000000F)==SS_BLACKFRAME)
1341                DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
1342            else if((pChildInfo->GetStyle()&0x0000000F)==SS_GRAYFRAME)
1343                DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DSHADOW),0,0);
1344            else if((pChildInfo->GetStyle()&0x0000000F)==SS_WHITEFRAME)
1345                DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(255,255,255),0,0);
1346            else if((pChildInfo->GetStyle()&0x0000001F)==SS_ETCHEDFRAME){
1347                rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1348                rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1349                rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1350                rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1351                DrawEdge(hdc,&rect,EDGE_ETCHED,BF_RECT);
1352            }
1353            else if((pChildInfo->GetStyle()&0x0000000F)==SS_BLACKRECT)
1354                DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DDKSHADOW),GetSysColor(COLOR_3DDKSHADOW),1);
1355            else if((pChildInfo->GetStyle()&0x0000000F)==SS_GRAYRECT)
1356                DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DSHADOW),1);
1357            else if((pChildInfo->GetStyle()&0x0000000F)==SS_WHITERECT)
1358                DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(255,255,255),RGB(255,255,255),1);
1359            else if((pChildInfo->GetStyle()&0x0000000F)==SS_ICON)
1360            {
1361                if(pChildInfo->image.IsFile())
1362                {
1363                    lstrcpy(temporary,pChildInfo->image.path.c_str());
1364                }
1365                else
1366                {
1367                    bool isMatch = false;
1368                    BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.iconResources )
1369                    {
1370                        if( resourceItem.idName == pChildInfo->image.path )
1371                        {
1372                            isMatch = true;
1373                            lstrcpy(temporary,resourceItem.filepath.c_str());
1374                            break;
1375                        }
1376                    }
1377                    if( !isMatch )
1378                    {
1379                        goto NonIconImage;
1380                    }
1381                }
1382                lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1383                hImage=LoadImage(NULL,temporary,IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
1384                if(hImage){
1385                    pChildInfo->size.cx=32+(pChildInfo->size.cx-size.cx);
1386                    pChildInfo->size.cy=32+(pChildInfo->size.cy-size.cy);
1387                    pos=pChildInfo->pos;
1388                    size=pChildInfo->size;
1389
1390                    //ExStyleによる縁を再描画
1391                    DrawItemEdgeByExStyle(WndNum,pChildInfo->GetExStyle(),&pos,&size);
1392
1393                    DrawIcon(hdc,
1394                        pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
1395                        pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
1396                        (HICON)hImage);
1397                    DestroyIcon((HICON)hImage);
1398                }
1399                else{
1400NonIconImage:
1401                    DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
1402                    hOldFont=(HFONT)SelectObject(hdc,hFont);
1403                    rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1404                    rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1405                    rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1406                    rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1407                    SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
1408                    DrawText(hdc,"icon...",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
1409                    SelectObject(hdc,hOldFont);
1410                }
1411            }
1412            else if((pChildInfo->GetStyle()&0x0000000F)==SS_BITMAP){
1413                BITMAP Bitmap;
1414
1415                if(pChildInfo->image.IsFile())
1416                {
1417                    lstrcpy(temporary,pChildInfo->image.path.c_str());
1418                }
1419                else{
1420                    bool isMatch = false;
1421                    BOOST_FOREACH( const ActiveBasic::Common::ResourceItem &resourceItem, projectInfo.resourceManager.bitmapResources )
1422                    {
1423                        if( resourceItem.idName == pChildInfo->image.path )
1424                        {
1425                            lstrcpy(temporary,resourceItem.filepath.c_str());
1426                            isMatch = true;
1427                            break;
1428                        }
1429                    }
1430                    if( !isMatch )
1431                    {
1432                        goto NonBitmapImage;
1433                    }
1434                }
1435                lstrcpy( temporary, projectInfo.GetWorkDir().GetFullPath( temporary ).c_str() );
1436                hImage=LoadImage(NULL,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
1437                if(hImage){
1438                    GetObject(hImage,sizeof(BITMAP),&Bitmap);
1439
1440                    pChildInfo->size.cx=Bitmap.bmWidth+(pChildInfo->size.cx-size.cx);
1441                    pChildInfo->size.cy=Bitmap.bmHeight+(pChildInfo->size.cy-size.cy);
1442                    pos=pChildInfo->pos;
1443                    size=pChildInfo->size;
1444
1445                    //ExStyleによる縁を再描画
1446                    DrawItemEdgeByExStyle(WndNum,pChildInfo->GetExStyle(),&pos,&size);
1447
1448                    memdc=CreateCompatibleDC(hdc);
1449                    SelectObject(memdc,hImage);
1450                    BitBlt(hdc,
1451                        pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
1452                        pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
1453                        size.cx, size.cy,
1454                        memdc, 0,0,
1455                        SRCCOPY);
1456                    DeleteDC(memdc);
1457                    DeleteObject(hImage);
1458                }
1459                else{
1460NonBitmapImage:
1461                    DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
1462                    hOldFont=(HFONT)SelectObject(hdc,hFont);
1463                    rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1464                    rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1465                    rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1466                    rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1467                    SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
1468                    DrawText(hdc,"bmp...",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
1469                    SelectObject(hdc,hOldFont);
1470                }
1471            }
1472        }
1473
1474        else if(pChildInfo->Control==CT_LISTBOX){
1475            /////////////////////////
1476            // ListBox コントロール
1477
1478            //内部
1479            if(pChildInfo->GetStyle()&WS_DISABLED)
1480                rgb=GetSysColor(COLOR_3DFACE);
1481            else rgb=GetSysColor(COLOR_WINDOW);
1482            DrawRectangleInClient(WndNum,
1483                pos.x,pos.y,
1484                pos.x+size.cx,pos.y+size.cy,
1485                rgb,rgb,1);
1486
1487            if(pChildInfo->GetStyle()&LBS_DISABLENOSCROLL)
1488                DrawWindowScrollBar(WndNum,pChildInfo->GetStyle()|WS_DISABLED,&pos,&size);
1489        }
1490
1491        else if(pChildInfo->Control==CT_LISTVIEW){
1492            //////////////////////////
1493            // ListView コントロール
1494
1495            //内部
1496            if(pChildInfo->GetStyle()&WS_DISABLED)
1497                rgb=GetSysColor(COLOR_3DFACE);
1498            else rgb=GetSysColor(COLOR_WINDOW);
1499            DrawRectangleInClient(WndNum,
1500                pos.x,pos.y,
1501                pos.x+size.cx,pos.y+size.cy,
1502                rgb,rgb,1);
1503
1504            if((pChildInfo->GetStyle()&LVS_REPORT)&&
1505                (!((pChildInfo->GetStyle()&LVS_LIST)==LVS_LIST))){
1506                //レポート ビュー
1507                size.cy=16;
1508                DrawButtonEdge(WndNum,&pos,&size);
1509            }
1510        }
1511
1512        else if(pChildInfo->Control==CT_PROGRESSBAR){
1513            /////////////////////////////
1514            // ProgressBar コントロール
1515
1516            //内部
1517            pos.x++;
1518            pos.y++;
1519            size.cx-=2;
1520            size.cy-=2;
1521            rgb=GetSysColor(COLOR_ACTIVECAPTION);
1522            if(pChildInfo->GetStyle()&PBS_SMOOTH){
1523                if(pChildInfo->GetStyle()&PBS_VERTICAL){
1524                    pos.y+=(long)((double)size.cy*0.3);
1525                    DrawRectangleInClient(WndNum,
1526                        pos.x,pos.y,
1527                        pos.x+size.cx,pos.y+(long)((double)size.cy*0.7),
1528                        rgb,rgb,1);
1529                }
1530                else{
1531                    DrawRectangleInClient(WndNum,
1532                        pos.x,pos.y,
1533                        pos.x+(long)((double)size.cx*0.7),pos.y+size.cy,
1534                        rgb,rgb,1);
1535                }
1536            }
1537            else{
1538                if(pChildInfo->GetStyle()&PBS_VERTICAL){
1539                    pos.y+=(long)((double)size.cy*0.3);
1540                    i3=(size.cx*2)/3;
1541                    i2=(int)((double)size.cy*0.7);
1542                    for(;i2>i3;i2-=i3+2){
1543                        DrawRectangleInClient(WndNum,
1544                            pos.x,pos.y+i2-i3,
1545                            pos.x+size.cx,pos.y+i2,
1546                            rgb,rgb,1);
1547                    }
1548                }
1549                else{
1550                    i3=(size.cy*2)/3;
1551                    i4=(int)((double)size.cx*0.7);
1552                    for(i2=0;i2+i3<i4;i2+=i3+2){
1553                        DrawRectangleInClient(WndNum,
1554                            pos.x+i2,pos.y,
1555                            pos.x+i2+i3,pos.y+size.cy,
1556                            rgb,rgb,1);
1557                    }
1558                }
1559            }
1560        }
1561
1562        else if(pChildInfo->Control==CT_RADIOBUTTON){
1563            /////////////////////////////
1564            // RadioButton コントロール
1565
1566            if(pChildInfo->GetStyle()&BS_PUSHLIKE){
1567                //ボタンの縁を描画
1568                DrawButtonEdge(WndNum,&pos,&size);
1569            }
1570            else{
1571                //ラジオボタンを描画
1572                size2.cx=12;
1573                size2.cy=12;
1574                if(pChildInfo->GetStyle()&BS_LEFTTEXT)
1575                    pos2.x=pos.x+size.cx-size2.cx;
1576                else pos2.x=pos.x+1;
1577                if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER||
1578                    (pChildInfo->GetStyle()&BS_VCENTER)==0)
1579                    pos2.y=pos.y+(size.cy/2)-(size2.cy/2);
1580                else if(pChildInfo->GetStyle()&BS_TOP)
1581                    pos2.y=pos.y+1;
1582                else if(pChildInfo->GetStyle()&BS_BOTTOM)
1583                    pos2.y=pos.y+size.cy-size2.cy-1;
1584
1585                hResource=LoadResource(hResInst,FindResource(hResInst,MAKEINTRESOURCE(IDB_RADIOBUTTON),RT_BITMAP));
1586                pBitmapInfo=(BITMAPINFO *)LockResource(hResource);
1587                pByte=(BYTE *)pBitmapInfo+pBitmapInfo->bmiHeader.biSize;
1588                pByte2=(BYTE *)GlobalAlloc(GMEM_FIXED,pBitmapInfo->bmiHeader.biWidth*pBitmapInfo->bmiHeader.biHeight*3);
1589                for(i2=0,i3=0;i2<pBitmapInfo->bmiHeader.biWidth*pBitmapInfo->bmiHeader.biHeight;i2++,i3+=3){
1590                    rgb=RGB(pByte[i3+2],pByte[i3+1],pByte[i3]);
1591
1592                    if(rgb==RGB(255,255,0)){
1593                        if(pWindowInfo->GetBackgroundColor()==COLOR_3DFACE) rgb=GetSysColor(COLOR_3DFACE);
1594                        else rgb=-pWindowInfo->GetBackgroundColor();
1595                    }
1596
1597                    //影側
1598                    else if(rgb==RGB(0,0,0)) rgb=GetSysColor(COLOR_3DSHADOW);
1599                    else if(rgb==RGB(255,0,0)) rgb=GetSysColor(COLOR_3DDKSHADOW);
1600
1601                    //光源側
1602                    else if(rgb==RGB(0,0,255)) rgb=GetSysColor(COLOR_3DLIGHT);
1603                    else if(rgb==RGB(0,255,0)) rgb=GetSysColor(COLOR_3DHIGHLIGHT);
1604
1605                    //内部
1606                    else if(rgb==RGB(255,255,255)){
1607                        if(pChildInfo->GetStyle()&WS_DISABLED) rgb=GetSysColor(COLOR_3DFACE);
1608                    }
1609
1610                    pByte2[i3+2]=LOBYTE(LOWORD(rgb));
1611                    pByte2[i3+1]=HIBYTE(LOWORD(rgb));
1612                    pByte2[i3]=LOBYTE(HIWORD(rgb));
1613                }
1614                SetDIBitsToDevice(hdc,
1615                    pos2.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
1616                    pos2.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
1617                    pBitmapInfo->bmiHeader.biWidth, pBitmapInfo->bmiHeader.biHeight,
1618                    0,0,
1619                    0,pBitmapInfo->bmiHeader.biHeight,
1620                    pByte2,
1621                    pBitmapInfo,
1622                    DIB_RGB_COLORS);
1623                GlobalFree(pByte2);
1624
1625                if(!(pChildInfo->GetStyle()&BS_LEFTTEXT)) pos.x+=17;
1626                else pos.x++;
1627                size.cx-=17;
1628            }
1629
1630            if(!(pChildInfo->GetStyle()&(BS_ICON|BS_BITMAP))){
1631                //キャプション テキスト
1632                rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1633                rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1634                rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1635                rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1636
1637                if(pChildInfo->GetStyle()&BS_MULTILINE) i4=0;
1638                else i4=DT_SINGLELINE;
1639
1640                //ビットを考慮してBS_CENTERを最初に比較する
1641                if((pChildInfo->GetStyle()&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
1642                else if(pChildInfo->GetStyle()&BS_LEFT) i2=DT_LEFT;
1643                else if(pChildInfo->GetStyle()&BS_RIGHT) i2=DT_RIGHT;
1644                else i2=DT_LEFT;
1645
1646                //ビットを考慮してBS_VCENTERを最初に比較する
1647                if((pChildInfo->GetStyle()&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
1648                else if(pChildInfo->GetStyle()&BS_TOP) i3=DT_TOP;
1649                else if(pChildInfo->GetStyle()&BS_BOTTOM) i3=DT_BOTTOM;
1650                else i3=DT_VCENTER;
1651
1652                hOldFont=(HFONT)SelectObject(hdc,hFont);
1653                if(pChildInfo->GetStyle()&WS_DISABLED){
1654                    SetTextColor(hdc,RGB(255,255,255));
1655                    rc2.left=rect.left+1;
1656                    rc2.top=rect.top+1;
1657                    rc2.right=rect.right+1;
1658                    rc2.bottom=rect.bottom+1;
1659                    DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,i4|i2|i3);
1660                    SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1661                }
1662                else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1663
1664                DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i4|i2|i3);
1665                SelectObject(hdc,hOldFont);
1666            }
1667        }
1668
1669        else if(pChildInfo->Control==CT_STATIC){
1670            ////////////////////////
1671            // Static コントロール
1672
1673            //キャプション テキスト
1674            rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1675            rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1676            rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1677            rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1678
1679            //ビットを考慮してSS_LEFTを最後に検討する
1680            if(pChildInfo->GetStyle()&SS_CENTER) i2=DT_CENTER;
1681            else if(pChildInfo->GetStyle()&SS_RIGHT) i2=DT_RIGHT;
1682            else i2=DT_LEFT;
1683
1684            hOldFont=(HFONT)SelectObject(hdc,hFont);
1685            if(pChildInfo->GetStyle()&WS_DISABLED){
1686                SetTextColor(hdc,RGB(255,255,255));
1687                rc2.left=rect.left+1;
1688                rc2.top=rect.top+1;
1689                rc2.right=rect.right+1;
1690                rc2.bottom=rect.bottom+1;
1691                DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rc2,i2);
1692                SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1693            }
1694            else
1695                SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1696
1697            //折り返すかどうか
1698            if(!(pChildInfo->GetStyle()&SS_LEFTNOWORDWRAP)){
1699                i2|=DT_WORDBREAK;
1700            }
1701
1702            DrawText(hdc,pChildInfo->GetCaption().c_str(),-1,&rect,i2);
1703            SelectObject(hdc,hOldFont);
1704        }
1705
1706        else if(pChildInfo->Control==CT_TRACKBAR){
1707            //////////////////////////
1708            // TrackBar コントロール
1709
1710            if(pChildInfo->GetStyle()&TBS_VERT){
1711                pos.x+=2;
1712                size.cx-=2;
1713                if(size.cx>21) size.cx=21;
1714                pos.y+=8;
1715                size.cy-=16;
1716
1717                rect.left=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+(size.cx/2)-2;
1718                rect.right=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+(size.cx/2)+2;
1719                rect.top=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y;
1720                rect.bottom=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+size.cy;
1721                DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT);
1722
1723                size.cy=size.cx/2;
1724                DrawButtonEdge(WndNum,&pos,&size);
1725            }
1726            else{
1727                pos.x+=8;
1728                size.cx-=16;
1729                pos.y+=2;
1730                size.cy-=2;
1731                if(size.cy>21) size.cy=21;
1732
1733                rect.left=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x;
1734                rect.right=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+size.cx;
1735                rect.top=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+(size.cy/2)-2;
1736                rect.bottom=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+(size.cy/2)+2;
1737                DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT);
1738
1739                size.cx=size.cy/2;
1740                DrawButtonEdge(WndNum,&pos,&size);
1741            }
1742        }
1743
1744        else if(pChildInfo->Control==CT_TREEVIEW){
1745            //////////////////////////
1746            // TreeView コントロール
1747
1748            //内部
1749            if(pChildInfo->GetStyle()&WS_DISABLED)
1750                rgb=GetSysColor(COLOR_3DFACE);
1751            else rgb=GetSysColor(COLOR_WINDOW);
1752            DrawRectangleInClient(WndNum,
1753                pos.x,pos.y,
1754                pos.x+size.cx,pos.y+size.cy,
1755                rgb,rgb,1);
1756        }
1757
1758        else if(pChildInfo->Control==CT_UPDOWN){
1759            ///////////////////////////////
1760            // アップ ダウン コントロール
1761            if(pChildInfo->GetStyle()&UDS_HORZ)
1762                DrawUpDownControl(WndNum,pChildInfo->GetStyle(),0,&pos,&size);
1763            else DrawUpDownControl(WndNum,pChildInfo->GetStyle(),1,&pos,&size);
1764        }
1765
1766        else if(pChildInfo->Control==CT_VSCROLLBAR){
1767            ////////////////////////////////////
1768            // 垂直スクロールバー コントロール
1769            DrawScrollBar(WndNum,pChildInfo->GetStyle(),1,&pos,&size);
1770        }
1771    }
1772    DeleteObject(hFont);
1773}
1774void DrawRadWindow(int WndNum,const ActiveBasic::PM::WindowInfo *pWindowInfo){
1775    extern MDIINFO MdiInfo[MAX_WNDNUM];
1776    HBRUSH hOldBrush;
1777    POINT pos;
1778
1779    SetBkMode(MdiInfo[WndNum].MdiRadInfo->hMemDC,TRANSPARENT);
1780
1781    hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,GetStockObject(WHITE_BRUSH));
1782    PatBlt(MdiInfo[WndNum].MdiRadInfo->hMemDC,0,0,ScreenX*2,ScreenY*2,PATCOPY);
1783    SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldBrush);
1784
1785    pos.x=LEVER_THICK;
1786    pos.y=LEVER_THICK;
1787    DesigningWindow(WndNum,MdiInfo[WndNum].MdiRadInfo->hMemDC,&pos,pWindowInfo);
1788
1789    InvalidateRect(MdiInfo[WndNum].MdiRadInfo->hRad,NULL,0);
1790}
Note: See TracBrowser for help on using the repository browser.