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

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

CHILDINFOの管理方法をstd::vectorに変更。

File size: 54.6 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 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->style&(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->style&(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->style&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->style&(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->ExStyle&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->caption,lstrlen(pWindowInfo->caption),&rect,DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX);
808 SelectObject(hdc,hOldFont);
809 DeleteObject(hFont);
810
811 //ボタン
812 if(pWindowInfo->style&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->style&WS_MAXIMIZEBOX||pWindowInfo->style&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->style&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->style&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->MenuID){
930 //メニューラインを3DFACEで描画
931 rgb=GetSysColor(COLOR_3DFACE);
932 i=GetSystemMetrics(SM_CYMENU);
933 hPen=CreatePen(PS_SOLID,0,rgb);
934 hBrush=CreateSolidBrush(rgb);
935 hOldPen=(HPEN)SelectObject(hdc,hPen);
936 hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
937 Rectangle(hdc,
938 InsideRect.left,InsideRect.top-1,InsideRect.right,InsideRect.top+i);
939 SelectObject(hdc,hOldPen);
940 SelectObject(hdc,hOldBrush);
941 DeleteObject(hPen);
942 DeleteObject(hBrush);
943
944 InsideRect.top+=i;
945 }
946
947 //クライアント左上ポジションを設定
948 MdiInfo[WndNum].MdiRadInfo->ClientPos.x=InsideRect.left;
949 MdiInfo[WndNum].MdiRadInfo->ClientPos.y=InsideRect.top;
950
951 //ExStyleによる縁を描画
952 pos.x=0;
953 pos.y=0;
954 size.cx=InsideRect.right-InsideRect.left;
955 size.cy=InsideRect.bottom-InsideRect.top;
956 DrawItemEdgeByExStyle(WndNum,pWindowInfo->ExStyle,&pos,&size);
957
958 //スクロールバーを描画
959 DrawWindowScrollBar(WndNum,pWindowInfo->style,&pos,&size);
960
961 //クライアント領域のサイズを設定
962 MdiInfo[WndNum].MdiRadInfo->ClientSize=size;
963
964
965 //////////////
966 //背景を描画
967 if(pWindowInfo->bgColor==COLOR_3DFACE){
968 //3DFACE
969 hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DFACE));
970 hBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
971 hOldPen=(HPEN)SelectObject(hdc,hPen);
972 hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
973 Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
974 SelectObject(hdc,hOldPen);
975 SelectObject(hdc,hOldBrush);
976 DeleteObject(hPen);
977 DeleteObject(hBrush);
978 }
979 else if(pWindowInfo->bgColor<=0){
980 //色指定
981 hPen=CreatePen(PS_SOLID,0,-pWindowInfo->bgColor);
982 hBrush=CreateSolidBrush(-pWindowInfo->bgColor);
983 hOldPen=(HPEN)SelectObject(hdc,hPen);
984 hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
985 Rectangle(hdc,InsideRect.left,InsideRect.top,InsideRect.right,InsideRect.bottom);
986 SelectObject(hdc,hOldPen);
987 SelectObject(hdc,hOldBrush);
988 DeleteObject(hPen);
989 DeleteObject(hBrush);
990 }
991 else if(pWindowInfo->bgColor>=0x1000){
992 //ビットマップ
993 for(i2=0;i2<ProjectInfo.res.NumberOfBitmapRes;i2++){
994 if(lstrcmp(ProjectInfo.res.pBitmapResInfo[pWindowInfo->bgColor-0x1000].IdName,
995 ProjectInfo.res.pBitmapResInfo[i2].IdName)==0) break;
996 }
997 if(i2!=ProjectInfo.res.NumberOfBitmapRes){
998 lstrcpy(temporary,ProjectInfo.res.pBitmapResInfo[i2].path);
999 GetFullPath(temporary,ProjectInfo.dir);
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 }
1014
1015
1016 ////////////////////////////////////////////
1017 //子ウィンドウ(ダイアログアイテム)を描画
1018 hFont=CreateFontIndirect(&pWindowInfo->LogFont);
1019 BOOST_FOREACH( CHILDINFO *pChildInfo, pWindowInfo->childWindowInfos )
1020 {
1021 pos=pChildInfo->pos;
1022 size=pChildInfo->size;
1023
1024 //ExStyleによる縁を描画
1025 DrawItemEdgeByExStyle(WndNum,pChildInfo->ExStyle,&pos,&size);
1026
1027 if(pChildInfo->Control==CT_BUTTON){
1028 ////////////////////////
1029 // Button コントロール
1030
1031 if((pChildInfo->style&0x0000000F)==BS_DEFPUSHBUTTON){
1032 //標準のボタンの場合(黒枠描画)
1033 DrawRectangleInClient(WndNum,
1034 pos.x, pos.y,
1035 pos.x+size.cx, pos.y+size.cy,
1036 RGB(0,0,0),0,0);
1037 pos.x++;
1038 pos.y++;
1039 size.cx-=2;
1040 size.cy-=2;
1041 }
1042
1043 //ボタンの縁を描画
1044 DrawButtonEdge(WndNum,&pos,&size);
1045
1046 if(!(pChildInfo->style&(BS_ICON|BS_BITMAP))){
1047 //キャプション テキスト
1048
1049 rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1050 rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1051 rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1052 rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1053
1054 if(pChildInfo->style&BS_MULTILINE) i4=0;
1055 else i4=DT_SINGLELINE;
1056
1057 //ビットを考慮してBS_CENTERを最初に比較する
1058 if((pChildInfo->style&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
1059 else if(pChildInfo->style&BS_LEFT) i2=DT_LEFT;
1060 else if(pChildInfo->style&BS_RIGHT) i2=DT_RIGHT;
1061 else i2=DT_CENTER;
1062
1063 //ビットを考慮してBS_VCENTERを最初に比較する
1064 if((pChildInfo->style&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
1065 else if(pChildInfo->style&BS_TOP) i3=DT_TOP;
1066 else if(pChildInfo->style&BS_BOTTOM) i3=DT_BOTTOM;
1067 else i3=DT_VCENTER;
1068
1069 hOldFont=(HFONT)SelectObject(hdc,hFont);
1070 if(pChildInfo->style&WS_DISABLED){
1071 SetTextColor(hdc,RGB(255,255,255));
1072 rc2.left=rect.left+1;
1073 rc2.top=rect.top+1;
1074 rc2.right=rect.right+1;
1075 rc2.bottom=rect.bottom+1;
1076 DrawText(hdc,pChildInfo->caption,-1,&rc2,i4|i2|i3);
1077 SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1078 }
1079 else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1080
1081 DrawText(hdc,pChildInfo->caption,-1,&rect,i4|i2|i3);
1082 SelectObject(hdc,hOldFont);
1083 }
1084 }
1085 else if(pChildInfo->Control==CT_CHECKBOX){
1086 //////////////////////////
1087 // CheckBox コントロール
1088
1089 if(pChildInfo->style&BS_PUSHLIKE){
1090 //ボタンの縁を描画
1091 DrawButtonEdge(WndNum,&pos,&size);
1092 }
1093 else{
1094 //チェックボックスを描画
1095 size2.cx=13;
1096 size2.cy=13;
1097 if(pChildInfo->style&BS_LEFTTEXT)
1098 pos2.x=pos.x+size.cx-size2.cx;
1099 else pos2.x=pos.x;
1100 if((pChildInfo->style&BS_VCENTER)==BS_VCENTER||
1101 (pChildInfo->style&BS_VCENTER)==0)
1102 pos2.y=pos.y+(size.cy/2)-(size2.cy/2);
1103 else if(pChildInfo->style&BS_TOP)
1104 pos2.y=pos.y+1;
1105 else if(pChildInfo->style&BS_BOTTOM)
1106 pos2.y=pos.y+size.cy-size2.cy-1;
1107 DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos2,&size2);
1108
1109 if(pChildInfo->style&WS_DISABLED)
1110 rgb=GetSysColor(COLOR_3DFACE);
1111 else rgb=GetSysColor(COLOR_WINDOW);
1112 DrawRectangleInClient(WndNum,pos2.x, pos2.y,
1113 pos2.x+size2.cx, pos2.y+size2.cy,
1114 rgb,rgb,1);
1115 if(!(pChildInfo->style&BS_LEFTTEXT)) pos.x+=17;
1116 else pos.x++;
1117 size.cx-=17;
1118 }
1119
1120 if(!(pChildInfo->style&(BS_ICON|BS_BITMAP))){
1121 //キャプション テキスト
1122 rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1123 rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1124 rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1125 rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1126
1127 if(pChildInfo->style&BS_MULTILINE) i4=0;
1128 else i4=DT_SINGLELINE;
1129
1130 //ビットを考慮してBS_CENTERを最初に比較する
1131 if((pChildInfo->style&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
1132 else if(pChildInfo->style&BS_LEFT) i2=DT_LEFT;
1133 else if(pChildInfo->style&BS_RIGHT) i2=DT_RIGHT;
1134 else i2=DT_LEFT;
1135
1136 //ビットを考慮してBS_VCENTERを最初に比較する
1137 if((pChildInfo->style&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
1138 else if(pChildInfo->style&BS_TOP) i3=DT_TOP;
1139 else if(pChildInfo->style&BS_BOTTOM) i3=DT_BOTTOM;
1140 else i3=DT_VCENTER;
1141
1142 hOldFont=(HFONT)SelectObject(hdc,hFont);
1143 if(pChildInfo->style&WS_DISABLED){
1144 SetTextColor(hdc,RGB(255,255,255));
1145 rc2.left=rect.left+1;
1146 rc2.top=rect.top+1;
1147 rc2.right=rect.right+1;
1148 rc2.bottom=rect.bottom+1;
1149 DrawText(hdc,pChildInfo->caption,-1,&rc2,i4|i2|i3);
1150 SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1151 }
1152 else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1153
1154 DrawText(hdc,pChildInfo->caption,-1,&rect,i4|i2|i3);
1155 SelectObject(hdc,hOldFont);
1156 }
1157 }
1158 else if(pChildInfo->Control==CT_COMBOBOX){
1159 //////////////////////////
1160 // ComboBox コントロール
1161
1162 pos2=pos;
1163 size2.cx=size.cx;
1164 size2.cy=20;
1165 DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos2,&size2);
1166
1167 //内部
1168 if(pChildInfo->style&WS_DISABLED)
1169 rgb=GetSysColor(COLOR_3DFACE);
1170 else rgb=GetSysColor(COLOR_WINDOW);
1171 DrawRectangleInClient(WndNum,
1172 pos2.x,pos2.y,
1173 pos2.x+size2.cx,pos2.y+size2.cy,
1174 rgb,rgb,1);
1175
1176 if((pChildInfo->style&0x000F)==CBS_SIMPLE){
1177 pos.y+=20;
1178 size.cy-=20;
1179 DrawItemEdgeByExStyle(WndNum,WS_EX_CLIENTEDGE,&pos,&size);
1180
1181 //内部
1182 rgb=GetSysColor(COLOR_WINDOW);
1183 DrawRectangleInClient(WndNum,
1184 pos.x,pos.y,
1185 pos.x+size.cx,pos.y+size.cy,
1186 rgb,rgb,1);
1187 }
1188 else{
1189 //下ボタン
1190 pos2.x+=size2.cx-16;
1191 size2.cx=16;
1192 size2.cy=16;
1193 DrawItemEdgeByExStyle(WndNum,WS_EX_DLGMODALFRAME,&pos2,&size2);
1194
1195 //内部
1196 DrawRectangleInClient(WndNum,
1197 pos2.x,pos2.y,
1198 pos2.x+size2.cx,pos2.y+size2.cy,
1199 GetSysColor(COLOR_3DFACE),GetSysColor(COLOR_3DFACE),1);
1200
1201 pos2.x--;
1202 if(pChildInfo->style&WS_DISABLED){
1203 hPen=CreatePen(PS_SOLID,0,GetSysColor(COLOR_3DHIGHLIGHT));
1204 hOldPen=(HPEN)SelectObject(hdc,hPen);
1205 pos2.x++;
1206 pos2.y++;
1207 i3=pos2.x+(size2.cx/2);
1208 for(i2=3;i2>=0;i2--,i3--){
1209 DrawLineInClient(WndNum,i3,i2+pos2.y+3,i3+((3-i2)*2)+1,i2+pos2.y+3);
1210 }
1211 SelectObject(hdc,hOldPen);
1212 DeleteObject(hPen);
1213 rgb=GetSysColor(COLOR_GRAYTEXT);
1214 pos2.x--;
1215 pos2.y--;
1216 }
1217 else rgb=GetSysColor(COLOR_BTNTEXT);
1218 hPen=CreatePen(PS_SOLID,0,rgb);
1219 hOldPen=(HPEN)SelectObject(hdc,hPen);
1220 i3=pos2.x+(size2.cx/2);
1221 for(i2=3;i2>=0;i2--,i3--){
1222 DrawLineInClient(WndNum,i3,i2+pos2.y+3,i3+((3-i2)*2)+1,i2+pos2.y+3);
1223 }
1224 SelectObject(hdc,hOldPen);
1225 DeleteObject(hPen);
1226 }
1227 }
1228 else if(pChildInfo->Control==CT_EDIT){
1229 //////////////////////
1230 // Edit コントロール
1231
1232 //内部
1233 if(pChildInfo->style&WS_DISABLED||pChildInfo->style&ES_READONLY)
1234 rgb=GetSysColor(COLOR_3DFACE);
1235 else rgb=GetSysColor(COLOR_WINDOW);
1236 DrawRectangleInClient(WndNum,
1237 pos.x,pos.y,
1238 pos.x+size.cx,pos.y+size.cy,
1239 rgb,rgb,1);
1240
1241 //キャプション テキスト
1242 rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1243 rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1244 rect.right=pos.x+size.cx-1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1245 rect.bottom=pos.y+size.cy-1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1246
1247 if(pChildInfo->style&ES_MULTILINE) i4=0;
1248 else i4=DT_SINGLELINE;
1249
1250 //ビットを考慮してES_LEFTを最後に検討する
1251 if(pChildInfo->style&ES_CENTER) i2=DT_CENTER;
1252 else if(pChildInfo->style&ES_RIGHT) i2=DT_RIGHT;
1253 else i2=DT_LEFT;
1254
1255 //文字色を設定
1256 if(pChildInfo->style&WS_DISABLED)
1257 SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1258 else
1259 SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
1260
1261 hOldFont=(HFONT)SelectObject(hdc,hFont);
1262 DrawText(hdc,pChildInfo->caption,-1,&rect,i4|i2);
1263 SelectObject(hdc,hOldFont);
1264 }
1265
1266 else if(pChildInfo->Control==CT_GROUPBOX){
1267 ///////////////////////////////////
1268 // グループ ボックス コントロール
1269
1270 hOldFont=(HFONT)SelectObject(hdc,hFont);
1271 GetTextExtentPoint32(hdc,pChildInfo->caption,lstrlen(pChildInfo->caption),&size2);
1272
1273 //枠を描画
1274 rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1275 rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y+(size2.cy/2);
1276 rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1277 rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1278 DrawEdge(hdc,&rect,EDGE_ETCHED,BF_RECT);
1279
1280 //ビットを考慮してBS_CENTERを最初に検討する
1281 if((pChildInfo->style&BS_CENTER)==BS_CENTER){
1282 rect.left=pos.x+(size.cx/2)-(size2.cx/2)-3;
1283 rect.right=rect.left+size2.cx+4;
1284 }
1285 else if(pChildInfo->style&BS_RIGHT){
1286 rect.right=pos.x+size.cx-7;
1287 rect.left=rect.right-size2.cx-4;
1288 }
1289 else{
1290 rect.left=pos.x+7;
1291 rect.right=rect.left+size2.cx+4;
1292 }
1293 rect.top=pos.y;
1294 rect.bottom=pos.y+size2.cy;
1295
1296 if(pWindowInfo->bgColor==COLOR_3DFACE) rgb=GetSysColor(COLOR_3DFACE);
1297 else rgb=-pWindowInfo->bgColor;
1298 DrawRectangleInClient(WndNum,rect.left,rect.top,rect.right,rect.bottom,rgb,rgb,1);
1299
1300 if(!((pChildInfo->style&BS_ICON)||(pChildInfo->style&BS_BITMAP))){
1301 rect.left+=MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1302 rect.top+=MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1303 rect.right+=MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1304 rect.bottom+=MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1305 rect.left+=2;
1306 rect.right-=2;
1307
1308 //テキストを描画
1309 if(pChildInfo->style&WS_DISABLED){
1310 SetTextColor(hdc,RGB(255,255,255));
1311 rc2.left=rect.left+1;
1312 rc2.top=rect.top+1;
1313 rc2.right=rect.right+1;
1314 rc2.bottom=rect.bottom+1;
1315 DrawText(hdc,pChildInfo->caption,-1,&rc2,DT_SINGLELINE);
1316 SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1317 }
1318 else
1319 SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1320
1321 DrawText(hdc,pChildInfo->caption,-1,&rect,DT_SINGLELINE);
1322 }
1323 SelectObject(hdc,hOldFont);
1324 }
1325
1326 else if(pChildInfo->Control==CT_HSCROLLBAR){
1327 ////////////////////////////////////
1328 // 水平スクロールバー コントロール
1329 DrawScrollBar(WndNum,pChildInfo->style,0,&pos,&size);
1330 }
1331
1332 else if(pChildInfo->Control==CT_IMAGEBOX){
1333 /////////////////////
1334 // イメージ ボックス
1335 HDC memdc;
1336
1337 if((pChildInfo->style&0x0000000F)==SS_BLACKFRAME)
1338 DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
1339 else if((pChildInfo->style&0x0000000F)==SS_GRAYFRAME)
1340 DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DSHADOW),0,0);
1341 else if((pChildInfo->style&0x0000000F)==SS_WHITEFRAME)
1342 DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(255,255,255),0,0);
1343 else if((pChildInfo->style&0x0000001F)==SS_ETCHEDFRAME){
1344 rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1345 rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1346 rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1347 rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1348 DrawEdge(hdc,&rect,EDGE_ETCHED,BF_RECT);
1349 }
1350 else if((pChildInfo->style&0x0000000F)==SS_BLACKRECT)
1351 DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DDKSHADOW),GetSysColor(COLOR_3DDKSHADOW),1);
1352 else if((pChildInfo->style&0x0000000F)==SS_GRAYRECT)
1353 DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DSHADOW),1);
1354 else if((pChildInfo->style&0x0000000F)==SS_WHITERECT)
1355 DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(255,255,255),RGB(255,255,255),1);
1356 else if((pChildInfo->style&0x0000000F)==SS_ICON){
1357 if(pChildInfo->ImageCtrlInfo.type==IMGTYPE_FILE)
1358 lstrcpy(temporary,pChildInfo->ImageCtrlInfo.path);
1359 else{
1360 for(i2=0;i2<ProjectInfo.res.NumberOfIconRes;i2++){
1361 if(lstrcmp(pChildInfo->ImageCtrlInfo.path,
1362 ProjectInfo.res.pIconResInfo[i2].IdName)==0) break;
1363 }
1364 if(i2==ProjectInfo.res.NumberOfIconRes) goto NonIconImage;
1365
1366 lstrcpy(temporary,ProjectInfo.res.pIconResInfo[i2].path);
1367 }
1368 GetFullPath(temporary,ProjectInfo.dir);
1369 hImage=LoadImage(NULL,temporary,IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
1370 if(hImage){
1371 pChildInfo->size.cx=32+(pChildInfo->size.cx-size.cx);
1372 pChildInfo->size.cy=32+(pChildInfo->size.cy-size.cy);
1373 pos=pChildInfo->pos;
1374 size=pChildInfo->size;
1375
1376 //ExStyleによる縁を再描画
1377 DrawItemEdgeByExStyle(WndNum,pChildInfo->ExStyle,&pos,&size);
1378
1379 DrawIcon(hdc,
1380 pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
1381 pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
1382 (HICON)hImage);
1383 DestroyIcon((HICON)hImage);
1384 }
1385 else{
1386NonIconImage:
1387 DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
1388 hOldFont=(HFONT)SelectObject(hdc,hFont);
1389 rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1390 rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1391 rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1392 rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1393 SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
1394 DrawText(hdc,"icon...",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
1395 SelectObject(hdc,hOldFont);
1396 }
1397 }
1398 else if((pChildInfo->style&0x0000000F)==SS_BITMAP){
1399 BITMAP Bitmap;
1400
1401 if(pChildInfo->ImageCtrlInfo.type==IMGTYPE_FILE)
1402 lstrcpy(temporary,pChildInfo->ImageCtrlInfo.path);
1403 else{
1404 for(i2=0;i2<ProjectInfo.res.NumberOfBitmapRes;i2++){
1405 if(lstrcmp(pChildInfo->ImageCtrlInfo.path,
1406 ProjectInfo.res.pBitmapResInfo[i2].IdName)==0) break;
1407 }
1408 if(i2==ProjectInfo.res.NumberOfBitmapRes) goto NonBitmapImage;
1409
1410 lstrcpy(temporary,ProjectInfo.res.pBitmapResInfo[i2].path);
1411 }
1412 GetFullPath(temporary,ProjectInfo.dir);
1413 hImage=LoadImage(NULL,temporary,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
1414 if(hImage){
1415 GetObject(hImage,sizeof(BITMAP),&Bitmap);
1416
1417 pChildInfo->size.cx=Bitmap.bmWidth+(pChildInfo->size.cx-size.cx);
1418 pChildInfo->size.cy=Bitmap.bmHeight+(pChildInfo->size.cy-size.cy);
1419 pos=pChildInfo->pos;
1420 size=pChildInfo->size;
1421
1422 //ExStyleによる縁を再描画
1423 DrawItemEdgeByExStyle(WndNum,pChildInfo->ExStyle,&pos,&size);
1424
1425 memdc=CreateCompatibleDC(hdc);
1426 SelectObject(memdc,hImage);
1427 BitBlt(hdc,
1428 pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
1429 pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
1430 size.cx, size.cy,
1431 memdc, 0,0,
1432 SRCCOPY);
1433 DeleteDC(memdc);
1434 DeleteObject(hImage);
1435 }
1436 else{
1437NonBitmapImage:
1438 DrawRectangleInClient(WndNum,pos.x,pos.y,pos.x+size.cx,pos.y+size.cy,RGB(0,0,0),0,0);
1439 hOldFont=(HFONT)SelectObject(hdc,hFont);
1440 rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1441 rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1442 rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1443 rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1444 SetTextColor(hdc,GetSysColor(COLOR_WINDOWTEXT));
1445 DrawText(hdc,"bmp...",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
1446 SelectObject(hdc,hOldFont);
1447 }
1448 }
1449 }
1450
1451 else if(pChildInfo->Control==CT_LISTBOX){
1452 /////////////////////////
1453 // ListBox コントロール
1454
1455 //内部
1456 if(pChildInfo->style&WS_DISABLED)
1457 rgb=GetSysColor(COLOR_3DFACE);
1458 else rgb=GetSysColor(COLOR_WINDOW);
1459 DrawRectangleInClient(WndNum,
1460 pos.x,pos.y,
1461 pos.x+size.cx,pos.y+size.cy,
1462 rgb,rgb,1);
1463
1464 if(pChildInfo->style&LBS_DISABLENOSCROLL)
1465 DrawWindowScrollBar(WndNum,pChildInfo->style|WS_DISABLED,&pos,&size);
1466 }
1467
1468 else if(pChildInfo->Control==CT_LISTVIEW){
1469 //////////////////////////
1470 // ListView コントロール
1471
1472 //内部
1473 if(pChildInfo->style&WS_DISABLED)
1474 rgb=GetSysColor(COLOR_3DFACE);
1475 else rgb=GetSysColor(COLOR_WINDOW);
1476 DrawRectangleInClient(WndNum,
1477 pos.x,pos.y,
1478 pos.x+size.cx,pos.y+size.cy,
1479 rgb,rgb,1);
1480
1481 if((pChildInfo->style&LVS_REPORT)&&
1482 (!((pChildInfo->style&LVS_LIST)==LVS_LIST))){
1483 //レポート ビュー
1484 size.cy=16;
1485 DrawButtonEdge(WndNum,&pos,&size);
1486 }
1487 }
1488
1489 else if(pChildInfo->Control==CT_PROGRESSBAR){
1490 /////////////////////////////
1491 // ProgressBar コントロール
1492
1493 //内部
1494 pos.x++;
1495 pos.y++;
1496 size.cx-=2;
1497 size.cy-=2;
1498 rgb=GetSysColor(COLOR_ACTIVECAPTION);
1499 if(pChildInfo->style&PBS_SMOOTH){
1500 if(pChildInfo->style&PBS_VERTICAL){
1501 pos.y+=(long)((double)size.cy*0.3);
1502 DrawRectangleInClient(WndNum,
1503 pos.x,pos.y,
1504 pos.x+size.cx,pos.y+(long)((double)size.cy*0.7),
1505 rgb,rgb,1);
1506 }
1507 else{
1508 DrawRectangleInClient(WndNum,
1509 pos.x,pos.y,
1510 pos.x+(long)((double)size.cx*0.7),pos.y+size.cy,
1511 rgb,rgb,1);
1512 }
1513 }
1514 else{
1515 if(pChildInfo->style&PBS_VERTICAL){
1516 pos.y+=(long)((double)size.cy*0.3);
1517 i3=(size.cx*2)/3;
1518 i2=(int)((double)size.cy*0.7);
1519 for(;i2>i3;i2-=i3+2){
1520 DrawRectangleInClient(WndNum,
1521 pos.x,pos.y+i2-i3,
1522 pos.x+size.cx,pos.y+i2,
1523 rgb,rgb,1);
1524 }
1525 }
1526 else{
1527 i3=(size.cy*2)/3;
1528 i4=(int)((double)size.cx*0.7);
1529 for(i2=0;i2+i3<i4;i2+=i3+2){
1530 DrawRectangleInClient(WndNum,
1531 pos.x+i2,pos.y,
1532 pos.x+i2+i3,pos.y+size.cy,
1533 rgb,rgb,1);
1534 }
1535 }
1536 }
1537 }
1538
1539 else if(pChildInfo->Control==CT_RADIOBUTTON){
1540 /////////////////////////////
1541 // RadioButton コントロール
1542
1543 if(pChildInfo->style&BS_PUSHLIKE){
1544 //ボタンの縁を描画
1545 DrawButtonEdge(WndNum,&pos,&size);
1546 }
1547 else{
1548 //ラジオボタンを描画
1549 size2.cx=12;
1550 size2.cy=12;
1551 if(pChildInfo->style&BS_LEFTTEXT)
1552 pos2.x=pos.x+size.cx-size2.cx;
1553 else pos2.x=pos.x+1;
1554 if((pChildInfo->style&BS_VCENTER)==BS_VCENTER||
1555 (pChildInfo->style&BS_VCENTER)==0)
1556 pos2.y=pos.y+(size.cy/2)-(size2.cy/2);
1557 else if(pChildInfo->style&BS_TOP)
1558 pos2.y=pos.y+1;
1559 else if(pChildInfo->style&BS_BOTTOM)
1560 pos2.y=pos.y+size.cy-size2.cy-1;
1561
1562 hResource=LoadResource(hResInst,FindResource(hResInst,MAKEINTRESOURCE(IDB_RADIOBUTTON),RT_BITMAP));
1563 pBitmapInfo=(BITMAPINFO *)LockResource(hResource);
1564 pByte=(BYTE *)pBitmapInfo+pBitmapInfo->bmiHeader.biSize;
1565 pByte2=(BYTE *)GlobalAlloc(GMEM_FIXED,pBitmapInfo->bmiHeader.biWidth*pBitmapInfo->bmiHeader.biHeight*3);
1566 for(i2=0,i3=0;i2<pBitmapInfo->bmiHeader.biWidth*pBitmapInfo->bmiHeader.biHeight;i2++,i3+=3){
1567 rgb=RGB(pByte[i3+2],pByte[i3+1],pByte[i3]);
1568
1569 if(rgb==RGB(255,255,0)){
1570 if(pWindowInfo->bgColor==COLOR_3DFACE) rgb=GetSysColor(COLOR_3DFACE);
1571 else rgb=-pWindowInfo->bgColor;
1572 }
1573
1574 //影側
1575 else if(rgb==RGB(0,0,0)) rgb=GetSysColor(COLOR_3DSHADOW);
1576 else if(rgb==RGB(255,0,0)) rgb=GetSysColor(COLOR_3DDKSHADOW);
1577
1578 //光源側
1579 else if(rgb==RGB(0,0,255)) rgb=GetSysColor(COLOR_3DLIGHT);
1580 else if(rgb==RGB(0,255,0)) rgb=GetSysColor(COLOR_3DHIGHLIGHT);
1581
1582 //内部
1583 else if(rgb==RGB(255,255,255)){
1584 if(pChildInfo->style&WS_DISABLED) rgb=GetSysColor(COLOR_3DFACE);
1585 }
1586
1587 pByte2[i3+2]=LOBYTE(LOWORD(rgb));
1588 pByte2[i3+1]=HIBYTE(LOWORD(rgb));
1589 pByte2[i3]=LOBYTE(HIWORD(rgb));
1590 }
1591 SetDIBitsToDevice(hdc,
1592 pos2.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x,
1593 pos2.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y,
1594 pBitmapInfo->bmiHeader.biWidth, pBitmapInfo->bmiHeader.biHeight,
1595 0,0,
1596 0,pBitmapInfo->bmiHeader.biHeight,
1597 pByte2,
1598 pBitmapInfo,
1599 DIB_RGB_COLORS);
1600 GlobalFree(pByte2);
1601
1602 if(!(pChildInfo->style&BS_LEFTTEXT)) pos.x+=17;
1603 else pos.x++;
1604 size.cx-=17;
1605 }
1606
1607 if(!(pChildInfo->style&(BS_ICON|BS_BITMAP))){
1608 //キャプション テキスト
1609 rect.left=pos.x+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1610 rect.top=pos.y+1+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1611 rect.right=pos.x+size.cx-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1612 rect.bottom=pos.y+size.cy-2+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1613
1614 if(pChildInfo->style&BS_MULTILINE) i4=0;
1615 else i4=DT_SINGLELINE;
1616
1617 //ビットを考慮してBS_CENTERを最初に比較する
1618 if((pChildInfo->style&BS_CENTER)==BS_CENTER) i2=DT_CENTER;
1619 else if(pChildInfo->style&BS_LEFT) i2=DT_LEFT;
1620 else if(pChildInfo->style&BS_RIGHT) i2=DT_RIGHT;
1621 else i2=DT_LEFT;
1622
1623 //ビットを考慮してBS_VCENTERを最初に比較する
1624 if((pChildInfo->style&BS_VCENTER)==BS_VCENTER) i3=DT_VCENTER;
1625 else if(pChildInfo->style&BS_TOP) i3=DT_TOP;
1626 else if(pChildInfo->style&BS_BOTTOM) i3=DT_BOTTOM;
1627 else i3=DT_VCENTER;
1628
1629 hOldFont=(HFONT)SelectObject(hdc,hFont);
1630 if(pChildInfo->style&WS_DISABLED){
1631 SetTextColor(hdc,RGB(255,255,255));
1632 rc2.left=rect.left+1;
1633 rc2.top=rect.top+1;
1634 rc2.right=rect.right+1;
1635 rc2.bottom=rect.bottom+1;
1636 DrawText(hdc,pChildInfo->caption,-1,&rc2,i4|i2|i3);
1637 SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1638 }
1639 else SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1640
1641 DrawText(hdc,pChildInfo->caption,-1,&rect,i4|i2|i3);
1642 SelectObject(hdc,hOldFont);
1643 }
1644 }
1645
1646 else if(pChildInfo->Control==CT_STATIC){
1647 ////////////////////////
1648 // Static コントロール
1649
1650 //キャプション テキスト
1651 rect.left=pos.x+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1652 rect.top=pos.y+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1653 rect.right=pos.x+size.cx+MdiInfo[WndNum].MdiRadInfo->ClientPos.x;
1654 rect.bottom=pos.y+size.cy+MdiInfo[WndNum].MdiRadInfo->ClientPos.y;
1655
1656 //ビットを考慮してSS_LEFTを最後に検討する
1657 if(pChildInfo->style&SS_CENTER) i2=DT_CENTER;
1658 else if(pChildInfo->style&SS_RIGHT) i2=DT_RIGHT;
1659 else i2=DT_LEFT;
1660
1661 hOldFont=(HFONT)SelectObject(hdc,hFont);
1662 if(pChildInfo->style&WS_DISABLED){
1663 SetTextColor(hdc,RGB(255,255,255));
1664 rc2.left=rect.left+1;
1665 rc2.top=rect.top+1;
1666 rc2.right=rect.right+1;
1667 rc2.bottom=rect.bottom+1;
1668 DrawText(hdc,pChildInfo->caption,-1,&rc2,i2);
1669 SetTextColor(hdc,GetSysColor(COLOR_GRAYTEXT));
1670 }
1671 else
1672 SetTextColor(hdc,GetSysColor(COLOR_BTNTEXT));
1673
1674 //折り返すかどうか
1675 if(!(pChildInfo->style&SS_LEFTNOWORDWRAP)){
1676 i2|=DT_WORDBREAK;
1677 }
1678
1679 DrawText(hdc,pChildInfo->caption,-1,&rect,i2);
1680 SelectObject(hdc,hOldFont);
1681 }
1682
1683 else if(pChildInfo->Control==CT_TRACKBAR){
1684 //////////////////////////
1685 // TrackBar コントロール
1686
1687 if(pChildInfo->style&TBS_VERT){
1688 pos.x+=2;
1689 size.cx-=2;
1690 if(size.cx>21) size.cx=21;
1691 pos.y+=8;
1692 size.cy-=16;
1693
1694 rect.left=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+(size.cx/2)-2;
1695 rect.right=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+(size.cx/2)+2;
1696 rect.top=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y;
1697 rect.bottom=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+size.cy;
1698 DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT);
1699
1700 size.cy=size.cx/2;
1701 DrawButtonEdge(WndNum,&pos,&size);
1702 }
1703 else{
1704 pos.x+=8;
1705 size.cx-=16;
1706 pos.y+=2;
1707 size.cy-=2;
1708 if(size.cy>21) size.cy=21;
1709
1710 rect.left=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x;
1711 rect.right=MdiInfo[WndNum].MdiRadInfo->ClientPos.x+pos.x+size.cx;
1712 rect.top=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+(size.cy/2)-2;
1713 rect.bottom=MdiInfo[WndNum].MdiRadInfo->ClientPos.y+pos.y+(size.cy/2)+2;
1714 DrawEdge(hdc,&rect,EDGE_SUNKEN,BF_RECT);
1715
1716 size.cx=size.cy/2;
1717 DrawButtonEdge(WndNum,&pos,&size);
1718 }
1719 }
1720
1721 else if(pChildInfo->Control==CT_TREEVIEW){
1722 //////////////////////////
1723 // TreeView コントロール
1724
1725 //内部
1726 if(pChildInfo->style&WS_DISABLED)
1727 rgb=GetSysColor(COLOR_3DFACE);
1728 else rgb=GetSysColor(COLOR_WINDOW);
1729 DrawRectangleInClient(WndNum,
1730 pos.x,pos.y,
1731 pos.x+size.cx,pos.y+size.cy,
1732 rgb,rgb,1);
1733 }
1734
1735 else if(pChildInfo->Control==CT_UPDOWN){
1736 ///////////////////////////////
1737 // アップ ダウン コントロール
1738 if(pChildInfo->style&UDS_HORZ)
1739 DrawUpDownControl(WndNum,pChildInfo->style,0,&pos,&size);
1740 else DrawUpDownControl(WndNum,pChildInfo->style,1,&pos,&size);
1741 }
1742
1743 else if(pChildInfo->Control==CT_VSCROLLBAR){
1744 ////////////////////////////////////
1745 // 垂直スクロールバー コントロール
1746 DrawScrollBar(WndNum,pChildInfo->style,1,&pos,&size);
1747 }
1748 }
1749 DeleteObject(hFont);
1750}
1751void DrawRadWindow(int WndNum,const WindowInfo *pWindowInfo){
1752 extern MDIINFO MdiInfo[MAX_WNDNUM];
1753 HBRUSH hOldBrush;
1754 POINT pos;
1755
1756 SetBkMode(MdiInfo[WndNum].MdiRadInfo->hMemDC,TRANSPARENT);
1757
1758 hOldBrush=(HBRUSH)SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,GetStockObject(WHITE_BRUSH));
1759 PatBlt(MdiInfo[WndNum].MdiRadInfo->hMemDC,0,0,ScreenX*2,ScreenY*2,PATCOPY);
1760 SelectObject(MdiInfo[WndNum].MdiRadInfo->hMemDC,hOldBrush);
1761
1762 pos.x=LEVER_THICK;
1763 pos.y=LEVER_THICK;
1764 DesigningWindow(WndNum,MdiInfo[WndNum].MdiRadInfo->hMemDC,&pos,pWindowInfo);
1765
1766 InvalidateRect(MdiInfo[WndNum].MdiRadInfo->hRad,NULL,0);
1767}
Note: See TracBrowser for help on using the repository browser.