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

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