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

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

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

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