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

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

WindowInfosクラスを追加。

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