source: dev/trunk/ab5.0/abdev/abdev/SubOperation.cpp

Last change on this file was 829, checked in by イグトランス (egtra), 12 years ago

svn:eol-styleとsvn:mime-type(文字コード指定含む)の設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/plain; charset=Shift_JIS
File size: 33.9 KB
Line 
1#include "stdafx.h"
2
3#include "Common.h"
4
5using namespace ActiveBasic::IDE;
6
7void ScreenToClient(HWND hwnd,RECT *pRect){
8 ScreenToClient(hwnd,reinterpret_cast<POINT*>(pRect));
9 ScreenToClient(hwnd,reinterpret_cast<POINT*>(reinterpret_cast<char*>(pRect)+sizeof(POINT)));
10}
11void ClientToScreen(HWND hwnd,RECT *pRect){
12 ClientToScreen(hwnd,reinterpret_cast<POINT*>(pRect));
13 ClientToScreen(hwnd,reinterpret_cast<POINT*>(reinterpret_cast<char*>(pRect)+sizeof(POINT)));
14}
15
16
17typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE hProcess,PBOOL Wow64Process);
18BOOL IsWow64(void){
19 ///////////////////////////////////////////////////////////
20 // ProjectEditor.exeがWOW64技術で動作しているのかどうか
21 ///////////////////////////////////////////////////////////
22 BOOL bIsWow64 = FALSE;
23 LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");
24
25 if (NULL != fnIsWow64Process)
26 {
27 if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
28 {
29 // handle error
30 bIsWow64 = FALSE;
31 }
32 }
33 return bIsWow64;
34}
35
36void URLEncode(LPSTR pszSrc){
37 char *temp;
38 temp=(char *)malloc(65535);
39
40 int i,i2;
41 for (i = 0,i2=0; ; i++,i2++)
42 {
43 if(pszSrc[i]=='\0'){
44 temp[i2] = 0;
45 break;
46 }
47
48 // 英数字 _ . - は変換しないでそのまま
49 if (isalnum((BYTE)pszSrc[i]) || pszSrc[i] == '_' || pszSrc[i] == '.' || pszSrc[i] == '-'){
50 temp[i2] = pszSrc[i];
51 }
52 // それ以外は %3B のような形式に変換
53 else{
54 sprintf(temp+i2,"%%%02X", (BYTE)pszSrc[i]);
55 i2+=lstrlen(temp+i2);
56 i2--;
57 }
58 }
59
60 lstrcpy(pszSrc,temp);
61 free(temp);
62}
63
64void Digit(int num,char *buffer){
65 char temporary[255];
66 int i,iPos;
67
68 sprintf(temporary,"%d",abs(num));
69
70 //カンマが不要の場合は抜ける
71 if(lstrlen(temporary)<=3){
72 wsprintf(buffer,"%d",num);
73 return;
74 }
75
76 //合計の文字数からバッファを確保
77 if(num<0){
78 buffer[0]='-';
79 iPos=1;
80 }
81 else{
82 buffer[0]=0;
83 iPos=0;
84 }
85
86 //3桁毎にカンマを加えながら文字列をコピーする
87 int iFirst;
88 iFirst=lstrlen(temporary)%3;
89 if(iFirst==0) iFirst=3;
90 memcpy(buffer+iPos,temporary,iFirst);
91 iPos+=iFirst;
92
93 int i2;
94 i2=(lstrlen(temporary)-4)/3;
95
96 for(i=0;i<=i2;i++){
97 buffer[iPos]=',';
98 iPos++;
99 memcpy(buffer+iPos,temporary+i*3+iFirst,3);
100 iPos+=3;
101 buffer[iPos]=0;
102 }
103}
104
105void RectNaturalFormat(RECT *ReadRect,RECT *CopyRect){
106 if(ReadRect->left > ReadRect->right){
107 CopyRect->left=ReadRect->right;
108 CopyRect->right=ReadRect->left;
109 }
110 else{
111 CopyRect->left=ReadRect->left;
112 CopyRect->right=ReadRect->right;
113 }
114 if(ReadRect->top > ReadRect->bottom){
115 CopyRect->top=ReadRect->bottom;
116 CopyRect->bottom=ReadRect->top;
117 }
118 else{
119 CopyRect->top=ReadRect->top;
120 CopyRect->bottom=ReadRect->bottom;
121 }
122}
123void RectNaturalFormat(int *x1,int *y1,int *x2,int *y2){
124 int temp;
125 if(*x1>*x2){
126 temp=*x1;
127 *x1=*x2;
128 *x2=temp;
129 }
130 if(*y1>*y2){
131 temp=*y1;
132 *y1=*y2;
133 *y2=temp;
134 }
135}
136void KillSpaces(char *str1,char *str2){
137 int i,i2,IsStr;
138 for(i=0,i2=0,IsStr=0;;i++,i2++){
139 while((str1[i]==' '||str1[i]=='\t')&&IsStr==0&&str1[i]!='\0') i++;
140 if(str1[i]=='\"') IsStr^=1;
141 str2[i2]=str1[i];
142 if(str1[i]=='\0') break;
143 }
144}
145void RemoveStringQuotes(char *str){
146 int i;
147 if(str[0]!='\"') return;
148 for(i=0;;i++){
149 str[i]=str[i+1];
150 if(str[i]=='\"') break;
151 }
152 str[i]=0;
153}
154void SlideString(char *buffer, int slide){
155 SlideBuffer(buffer, strlen(buffer) + 1, slide);
156}
157void SlideBuffer(char *buffer,int length,int slide){
158 memmove(buffer+slide, buffer, length);
159}
160BOOL IsVariableTopChar(char c){
161 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_') return 1;
162 return 0;
163}
164bool IsNumberChar( char c ){
165 if(c>='0'&&c<='9'){
166 return true;
167 }
168 return false;
169}
170BOOL IsVariableChar(char c){
171 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
172 c=='_'||c=='.'||c=='$') return 1;
173 return 0;
174}
175
176BOOL IsCommandBackDelimitation(char *buffer,int pos){
177 if(buffer[pos]=='\n'||buffer[pos]==':') return 1;
178 return 0;
179}
180BOOL IsCommandDelimitation(char *buffer,int p){
181 if(buffer[p]=='\r'&&buffer[p+1]=='\n') return 2;
182 if(buffer[p]=='\n'||buffer[p]==':'||buffer[p]=='\0') return 1;
183 return 0;
184}
185
186char *ComparisonString( char *str1, char *str2, bool isBigSmall, bool isWordUnit ){
187 char *temp1 = (char *)malloc( lstrlen( str1 ) +1 );
188 char *temp2 = (char *)malloc( lstrlen( str2 ) +1 );
189
190 lstrcpy( temp1, str1 );
191 lstrcpy( temp2, str2 );
192
193 if( isBigSmall == false ){
194 // 大文字小文字を区別しない場合
195 // すべて大文字にしておく
196 CharUpper( temp1 );
197 CharUpper( temp2 );
198 }
199
200 int len2 = lstrlen( temp2 );
201
202 const char *temp3 = strstr( temp1, temp2 );
203 while( temp3 ){
204 if( isWordUnit ){
205 int pos = (int)temp3 - (int)temp1;
206 if( pos == 0 ){
207 if( !( IsVariableTopChar( temp1[len2] ) || IsNumberChar( temp1[len2] ) ) ){
208 break;
209 }
210 }
211 else{
212 if( !( IsVariableTopChar( temp1[pos-1] ) || IsNumberChar( temp1[pos-1] ) )
213 && !( IsVariableTopChar( temp1[pos+len2] ) || IsNumberChar( temp1[pos+len2] ) )
214 ){
215 break;
216 }
217 }
218 }
219 else{
220 break;
221 }
222
223 temp3 = strstr( temp3 + 1, temp2 );
224 }
225
226 char *result = NULL;
227 if( temp3 ){
228 int pos = (int)temp3 - (int)temp1;
229 result = str1 + pos;
230 }
231
232 free( temp1 );
233 free( temp2 );
234
235 return result;
236}
237int GetOneParameter(char *Parameter,int pos,char *retAns){
238 int i,i2,IsStr,PareNum;
239 for(i=pos,i2=0,IsStr=0,PareNum=0;;i++,i2++){
240 if(IsDBCSLeadByte(Parameter[i])){
241 retAns[i2]=Parameter[i];
242 retAns[++i2]=Parameter[++i];
243 continue;
244 }
245 if(Parameter[i]=='\"') IsStr^=1;
246 if(Parameter[i]=='('&&IsStr==0) PareNum++;
247 if(Parameter[i]==')'&&IsStr==0) PareNum--;
248 if(Parameter[i]==','&&IsStr==0&&PareNum==0){
249 retAns[i2]=0;
250 break;
251 }
252 retAns[i2]=Parameter[i];
253 if(Parameter[i]=='\0'||Parameter[i]=='\r'&&Parameter[i+1]=='\n'){
254 retAns[i2]=0;
255 break;
256 }
257 }
258 if(Parameter[i]==',') i++;
259 return i;
260}
261int GetStringInPare(char *buffer,char *ReadBuffer){
262 int i,IsStr,PareNum;
263 for(i=0,IsStr=0,PareNum=0;;i++){
264 buffer[i]=ReadBuffer[i];
265 if(ReadBuffer[i]=='\"') IsStr^=1;
266 else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
267 else if(ReadBuffer[i]==')'&&IsStr==0){
268 PareNum--;
269 if(PareNum==0){
270 i++;
271 buffer[i]=0;
272 break;
273 }
274 }
275 else if(ReadBuffer[i]=='\0') return 0;
276 }
277 return i;
278}
279int GetStringInBracket(char *buffer,char *ReadBuffer){
280 int i,IsStr,PareNum;
281 for(i=0,IsStr=0,PareNum=0;;i++){
282 buffer[i]=ReadBuffer[i];
283 if(IsDBCSLeadByte(ReadBuffer[i])){
284 i++;
285 buffer[i]=ReadBuffer[i];
286 continue;
287 }
288 if(ReadBuffer[i]=='\"') IsStr^=1;
289 else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
290 else if(ReadBuffer[i]==']'&&IsStr==0){
291 PareNum--;
292 if(PareNum==0){
293 i++;
294 buffer[i]=0;
295 break;
296 }
297 }
298 else if(ReadBuffer[i]=='\0') return 0;
299 }
300 return i;
301}
302void JumpBlank(char *pBuf,int *piPos){
303 int i;
304 i=*piPos;
305
306 while(1){
307 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
308 if(pBuf[i]=='\0') break;
309 if(pBuf[i]=='\''){
310 //注釈文(一行)
311 for(i++;;i++){
312 if(pBuf[i]=='\0') break;
313 if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){
314 i+=2;
315 break;
316 }
317 }
318 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
319 }
320 if(pBuf[i]=='/'&&pBuf[i+1]=='*'){
321 //注釈文(複数行)
322 i+=2;
323 while(!(pBuf[i]=='*'&&pBuf[i+1]=='/')){
324 i++;
325 if(pBuf[i]=='\0') break;
326 }
327 if(pBuf[i]){
328 i+=2;
329 }
330 }
331 while(pBuf[i]=='\r'&&pBuf[i+1]=='\n') i+=2;
332
333 if(!(
334 pBuf[i]==' '||
335 pBuf[i]=='\t'||
336 pBuf[i]=='\''||
337 (pBuf[i]=='/'&&pBuf[i+1]=='*')
338 )) break;
339 }
340
341 *piPos=i;
342}
343
344BOOL CheckParenthesis(char *buffer){
345 int i,IsStr,PareNum,sw;
346 _int8 bracket[1024];
347
348 for(i=0,IsStr=0,PareNum=0,sw=0;;i++){
349 if(buffer[i]=='\"'){
350 IsStr^=1;
351 continue;
352 }
353
354 else if(buffer[i]=='('&&IsStr==0){
355 bracket[PareNum]=0;
356 PareNum++;
357 }
358 else if(buffer[i]=='['&&IsStr==0){
359 bracket[PareNum]=1;
360 PareNum++;
361 }
362
363 else if(buffer[i]==')'&&IsStr==0){
364 PareNum--;
365 if(bracket[PareNum]!=0||PareNum<0){
366 //"カッコ \'( )\'"
367 return 0;
368 }
369 }
370 else if(buffer[i]==']'&&IsStr==0){
371 PareNum--;
372 if(bracket[PareNum]!=1||PareNum<0){
373 //"カッコ \'( )\'"
374 return 0;
375 }
376 }
377
378 else if(buffer[i]=='\n'||buffer[i]=='\0'){
379
380 //"カッコ \'( )\'"
381 if(buffer[i]=='\0'){
382 if(PareNum!=0){
383 return 0;
384 }
385
386 if(IsStr!=0){
387 return 0;
388 }
389 }
390 if(buffer[i]=='\0') break;
391
392 sw=0;
393 }
394 }
395 return 1;
396}
397
398DWORD GetValue(char *value){
399 unsigned long ans;
400 if(value[0]=='&'){
401 if(value[1]=='o'||value[1]=='O') sscanf(value+2,"%o",&ans);
402 if(value[1]=='h'||value[1]=='H') sscanf(value+2,"%x",&ans);
403 }
404 else ans=atol(value);
405 return ans;
406}
407HBITMAP CreateGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
408 //グラデーションビットマップを生成
409
410 BITMAPINFO BitmapInfo;
411 memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
412 BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
413 BitmapInfo.bmiHeader.biWidth=pSize->cx;
414 BitmapInfo.bmiHeader.biHeight=pSize->cy;
415 BitmapInfo.bmiHeader.biPlanes=1;
416 BitmapInfo.bmiHeader.biBitCount=24;
417
418 HDC hdc;
419 hdc=GetDC(GetDesktopWindow());
420
421 HBITMAP hBitmap;
422 BYTE *pByte;
423 hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
424
425 int i,i2,x,y;
426 COLORREF rgb;
427 i=BitmapInfo.bmiHeader.biWidth*3;
428 if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
429 for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
430 if(y<BitmapInfo.bmiHeader.biHeight/2-2) rgb=color2;
431 else if(y>BitmapInfo.bmiHeader.biHeight/2+2) rgb=color1;
432 else{
433 double ratio;
434 ratio=((double)y-((double)BitmapInfo.bmiHeader.biHeight/(double)2-(double)2))/(double)4;
435 //ratio=(double)y/(double)BitmapInfo.bmiHeader.biHeight;
436 rgb=RGB(
437 LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*(ratio), //赤要素
438 HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*(ratio), //緑要素
439 LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*(ratio) //青要素
440 );
441 }
442 for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
443 i2=y*i+x*3;
444 pByte[i2+2]=LOBYTE(LOWORD(rgb));
445 pByte[i2+1]=HIBYTE(LOWORD(rgb));
446 pByte[i2]=LOBYTE(HIWORD(rgb));
447 }
448 }
449
450 ReleaseDC(GetDesktopWindow(),hdc);
451
452 return hBitmap;
453}
454HBITMAP CreateVertGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
455 //グラデーションビットマップを生成
456
457 BITMAPINFO BitmapInfo;
458 memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
459 BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
460 BitmapInfo.bmiHeader.biWidth=pSize->cx;
461 BitmapInfo.bmiHeader.biHeight=pSize->cy;
462 BitmapInfo.bmiHeader.biPlanes=1;
463 BitmapInfo.bmiHeader.biBitCount=24;
464
465 HDC hdc;
466 hdc=GetDC(GetDesktopWindow());
467
468 HBITMAP hBitmap;
469 BYTE *pByte;
470 hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
471
472 int i,i2,x,y;
473 COLORREF rgb;
474 i=BitmapInfo.bmiHeader.biWidth*3;
475 if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
476 for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
477 if(y<BitmapInfo.bmiHeader.biHeight/2-2) rgb=color2;
478 else if(y>BitmapInfo.bmiHeader.biHeight/2+2) rgb=color1;
479 else{
480 double ratio;
481 ratio=(double)y/(double)BitmapInfo.bmiHeader.biHeight;
482 rgb=RGB(
483 LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*(ratio), //赤要素
484 HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*(ratio), //緑要素
485 LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*(ratio) //青要素
486 );
487 }
488 for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
489 i2=y*i+x*3;
490 pByte[i2+2]=LOBYTE(LOWORD(rgb));
491 pByte[i2+1]=HIBYTE(LOWORD(rgb));
492 pByte[i2]=LOBYTE(HIWORD(rgb));
493 }
494 }
495
496 ReleaseDC(GetDesktopWindow(),hdc);
497
498 return hBitmap;
499}
500HBITMAP CreateHorzGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){
501 //グラデーションビットマップを生成
502
503 BITMAPINFO BitmapInfo;
504 memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
505 BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
506 BitmapInfo.bmiHeader.biWidth=pSize->cx;
507 BitmapInfo.bmiHeader.biHeight=pSize->cy;
508 BitmapInfo.bmiHeader.biPlanes=1;
509 BitmapInfo.bmiHeader.biBitCount=24;
510
511 HDC hdc;
512 hdc=GetDC(GetDesktopWindow());
513
514 HBITMAP hBitmap;
515 BYTE *pByte;
516 hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0);
517
518 int i,i2,x,y;
519 COLORREF rgb;
520 i=BitmapInfo.bmiHeader.biWidth*3;
521 if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
522 for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
523 double ratio;
524 ratio=(double)x/(double)BitmapInfo.bmiHeader.biWidth;
525 rgb=RGB(
526 LOBYTE(LOWORD(color1))+(int)(double)(LOBYTE(LOWORD(color2))-LOBYTE(LOWORD(color1)))*(ratio), //赤要素
527 HIBYTE(LOWORD(color1))+(int)(double)(HIBYTE(LOWORD(color2))-HIBYTE(LOWORD(color1)))*(ratio), //緑要素
528 LOBYTE(HIWORD(color1))+(int)(double)(LOBYTE(HIWORD(color2))-LOBYTE(HIWORD(color1)))*(ratio) //青要素
529 );
530 for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
531 i2=y*i+x*3;
532 pByte[i2+2]=LOBYTE(LOWORD(rgb));
533 pByte[i2+1]=HIBYTE(LOWORD(rgb));
534 pByte[i2]=LOBYTE(HIWORD(rgb));
535 }
536 }
537
538 ReleaseDC(GetDesktopWindow(),hdc);
539
540 return hBitmap;
541}
542HICON CreateGrayIcon(HICON hBaseIcon){
543 ////////////////////////
544 // 淡色アイコンを生成
545 ////////////////////////
546
547 HICON hGrayIcon;
548
549 ICONINFO IconInfo;
550 if(GetIconInfo(hBaseIcon,&IconInfo) == FALSE){
551 return 0;
552 }
553
554 //ビットマップを加工
555 BITMAP Bitmap;
556 if(GetObject(IconInfo.hbmColor,sizeof(Bitmap),&Bitmap) == 0){
557 return 0;
558 }
559
560 BITMAPINFO BitmapInfo;
561 memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
562 BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
563 BitmapInfo.bmiHeader.biWidth=Bitmap.bmWidth;
564 BitmapInfo.bmiHeader.biHeight=Bitmap.bmHeight;
565 BitmapInfo.bmiHeader.biPlanes=1;
566 BitmapInfo.bmiHeader.biBitCount=24;
567 BitmapInfo.bmiHeader.biCompression=BI_RGB;
568
569 HDC hdc=GetDC(0);
570
571 BYTE *pByte=(BYTE *)HeapAlloc(hHeap,0,Bitmap.bmWidth*Bitmap.bmHeight*sizeof(COLORREF));
572 if(pByte==0){
573 return 0;
574 }
575 GetDIBits(hdc,
576 IconInfo.hbmColor,
577 0,
578 Bitmap.bmHeight,
579 (void *)pByte,
580 &BitmapInfo,
581 DIB_RGB_COLORS);
582
583 int i,i2,x,y;
584 i=BitmapInfo.bmiHeader.biWidth*3;
585 if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG));
586 for(x=0;x<BitmapInfo.bmiHeader.biWidth;x++){
587 for(y=0;y<BitmapInfo.bmiHeader.biHeight;y++){
588 i2=y*i+x*3;
589 if(pByte[i2+2]==0&&pByte[i2+1]==0&&pByte[i2]==0){
590 //透明色
591 //何もしない
592 }
593 else{
594 double ratio=0.5; //明るさ
595
596 pByte[i2+2]+=(BYTE)((double)(255-pByte[i2+2])*ratio);
597 pByte[i2+1]+=(BYTE)((double)(255-pByte[i2+1])*ratio);
598 pByte[i2]+=(BYTE)((double)(255-pByte[i2])*ratio);
599
600 pByte[i2+2]=(BYTE)(((int)pByte[i2+2]+(int)pByte[i2+1]+(int)pByte[i2])/3);
601 pByte[i2+1]=pByte[i2+2];
602 pByte[i2]=pByte[i2+2];
603 }
604 }
605 }
606
607 SetDIBits(hdc,
608 IconInfo.hbmColor,
609 0,
610 Bitmap.bmHeight,
611 (void *)pByte,
612 &BitmapInfo,
613 DIB_RGB_COLORS);
614
615 HeapDefaultFree(pByte);
616
617 ReleaseDC(GetDesktopWindow(),hdc);
618
619
620 hGrayIcon=CreateIconIndirect(&IconInfo);
621
622 //不要なビットマップを破棄
623 DeleteObject(IconInfo.hbmMask);
624 DeleteObject(IconInfo.hbmColor);
625
626 return hGrayIcon;
627}
628void GetSize(SIZE *pSize,RECT *pRect){
629 pSize->cx=pRect->right-pRect->left;
630 pSize->cy=pRect->bottom-pRect->top;
631}
632BOOL HitTest(RECT *pRect,POINT *pPos){
633 if(pRect->left<=pPos->x&&pPos->x<pRect->right&&
634 pRect->top<=pPos->y&&pPos->y<pRect->bottom) return 1;
635 return 0;
636}
637BOOL Rectangle(HDC hdc,RECT *pRect){
638 return Rectangle(hdc,pRect->left,pRect->top,pRect->right,pRect->bottom);
639}
640
641void ComboBox_SetSelText(HWND hCombo,char *lpszText){
642 SendMessage(hCombo,CB_SETCURSEL,
643 SendMessage(hCombo,CB_FINDSTRINGEXACT,0,(LPARAM)lpszText),
644 0);
645}
646
647void SetCursorByState(int state){
648 if(state==FRAME_UPPER_LEFT||state==FRAME_LOWER_RIGHT) SetCursor(LoadCursor(0,IDC_SIZENWSE));
649 else if(state==FRAME_UPPER_RIGHT||state==FRAME_LOWER_LEFT) SetCursor(LoadCursor(0,IDC_SIZENESW));
650 else if(state==FRAME_LEFT||state==FRAME_RIGHT) SetCursor(LoadCursor(0,IDC_SIZEWE));
651 else if(state==FRAME_UPPER||state==FRAME_LOWER) SetCursor(LoadCursor(0,IDC_SIZENS));
652 else if(state==FRAME_INSIDE) SetCursor(LoadCursor(0,IDC_SIZEALL));
653 else SetCursor(LoadCursor(0,IDC_ARROW));
654}
655
656void SetTextEditColorDesign(TEXTEDIT_COLOR_INFO *pColorInfo,CTheme *pobj_Theme,BOOL bRedraw){
657 pColorInfo->rgbDefault=pobj_Theme->TextColorInfo.rgbDefault;
658 pColorInfo->rgbComment=pobj_Theme->TextColorInfo.rgbComment;
659 pColorInfo->rgbStatement=pobj_Theme->TextColorInfo.rgbStatement;
660 pColorInfo->rgbString=pobj_Theme->TextColorInfo.rgbString;
661 pColorInfo->rgbCursorBack=pobj_Theme->TextColorInfo.rgbCursorBack;
662 pColorInfo->rgbBackground=pobj_Theme->TextColorInfo.rgbBackground;
663
664 //アクティブテーマにセット
665 lstrcpy(pobj_nv->szActiveTheme,pobj_Theme->m_name);
666
667 //テーマ依存の描画リソースを取得
668 pobj_DBTheme->unlock();
669 pobj_DBTheme->lock();
670
671 if(bRedraw){
672 //再描画
673 int i;
674 for(i=0;i<MdiInfo.size();i++){
675 if(MdiInfo[i]->hwnd){
676 if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){
677 SetTextEditWordColor(i);
678 InvalidateRect(MdiInfo[i]->pMdiTextEdit->hEdit,NULL,0);
679 }
680 }
681 }
682 }
683}
684
685BOOL SetupProjectEditor(void){
686 extern HINSTANCE hInst;
687 int i;
688 char str[MAX_PATH],temporary[MAX_PATH];
689
690
691 //リソース用DLLをマッピング
692 const std::string resDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\res.dll";
693 hResInst = LoadLibrary( resDllPath.c_str() );
694 if(!hResInst){
695 MessageBox(0,"res.dllの読み込みに失敗しました。",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
696 return 0;
697 }
698
699 //アイコンリソースDLLをマッピング
700 const std::string iconResDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\icon_res.dll";
701 hIconResInst = LoadLibraryEx( iconResDllPath.c_str(), nullptr, LOAD_LIBRARY_AS_DATAFILE );
702 if(!hIconResInst){
703 MessageBox(0,"icon_res.dllの読み込みに失敗しました。",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
704 return 0;
705 }
706
707 //LuxCtrl.dllをマッピング
708 const std::string luxCtrlDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\LuxCtrl.dll";
709 hLib_LuxCtrl = LoadLibrary( luxCtrlDllPath.c_str() );
710 if(!hLib_LuxCtrl){
711 MessageBox(0,"LuxCtrl.dllの読み込みに失敗しました。",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION);
712 return 0;
713 }
714 LuxToolbar_CreateInstance=
715 (PROC_LuxToolbar_CreateInstance)GetProcAddress(hLib_LuxCtrl,"LuxToolbar_CreateInstance");
716
717
718 //モジュールディレクトリを取得
719 GetModuleFileName(hInst,temporary,MAX_PATH);
720 _splitpath(temporary,pj_editor_Dir,str,NULL,NULL);
721 lstrcat(pj_editor_Dir,str);
722
723 //ヒープオブジェクトを作成
724 extern HANDLE hHeap;
725 hHeap=HeapCreate(HEAP_GENERATE_EXCEPTIONS,0,0);
726
727
728 //自動バックアップ用のディレクトリを生成
729 CreateBackupDir();
730
731
732 //COMを初期化
733 CoInitialize(0);
734
735 //スクリーンサイズを取得
736 ScreenX=GetSystemMetrics(SM_CXSCREEN);
737 ScreenY=GetSystemMetrics(SM_CYSCREEN);
738
739 //不揮発性のデータを取得
740 pobj_nv=new CNonVolatile;
741 pobj_nv->load();
742
743
744 //アルファブレンド用のAPIを取得
745 extern FWINLAYER pSetLayeredWindowAttributes;
746 extern HINSTANCE hUser32Lib;
747 hUser32Lib=GetModuleHandle(TEXT("user32.dll"));
748 pSetLayeredWindowAttributes=reinterpret_cast<FWINLAYER>(GetProcAddress(hUser32Lib,"SetLayeredWindowAttributes"));
749
750
751
752
753 /////////////////////
754 // フォントを定義
755 /////////////////////
756
757 NONCLIENTMETRICS NCMetrics = {0};
758 NCMetrics.cbSize = sizeof( NONCLIENTMETRICS );
759 SystemParametersInfo( SPI_GETNONCLIENTMETRICS, NCMetrics.cbSize, &NCMetrics, 0 );
760
761 //パラメータ ヒント フォント
762 extern METHODCHECKINFO MethodCheckInfo;
763 MethodCheckInfo.hFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
764 i=MethodCheckInfo.LogFont.lfWeight;
765 MethodCheckInfo.LogFont.lfWeight=FW_BOLD;
766 MethodCheckInfo.hBoldFont=CreateFontIndirect(&MethodCheckInfo.LogFont);
767 MethodCheckInfo.LogFont.lfWeight=i;
768
769 //ステータスバー フォント
770 extern HFONT hStatusFont;
771 hStatusFont=CreateFontIndirect(&NCMetrics.lfStatusFont);
772
773 //ハイパーリンク フォント
774 extern HFONT hHyperLinkFont;
775 LOGFONT LogFont;
776 LogFont.lfHeight=-12;
777 LogFont.lfWidth=0;
778 LogFont.lfEscapement=0;
779 LogFont.lfOrientation=0;
780 LogFont.lfWeight=FW_REGULAR;
781 LogFont.lfItalic=NULL;
782 LogFont.lfUnderline=TRUE;
783 LogFont.lfStrikeOut=NULL;
784 LogFont.lfCharSet=SHIFTJIS_CHARSET;
785 LogFont.lfOutPrecision=OUT_STRING_PRECIS;
786 LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
787 LogFont.lfQuality=DRAFT_QUALITY;
788 LogFont.lfPitchAndFamily=VARIABLE_PITCH;
789 _tcscpy(LogFont.lfFaceName,TEXT("MS Pゴシック"));
790 hHyperLinkFont=CreateFontIndirect(&LogFont);
791
792 //ルーラー フォント
793 extern HFONT hRulerFont;
794 LogFont.lfHeight=-10;
795 LogFont.lfWidth=0;
796 LogFont.lfEscapement=0;
797 LogFont.lfOrientation=0;
798 LogFont.lfWeight=FW_REGULAR;
799 LogFont.lfItalic=NULL;
800 LogFont.lfUnderline=0;
801 LogFont.lfStrikeOut=NULL;
802 LogFont.lfCharSet=SHIFTJIS_CHARSET;
803 LogFont.lfOutPrecision=OUT_STRING_PRECIS;
804 LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
805 LogFont.lfQuality=DRAFT_QUALITY;
806 LogFont.lfPitchAndFamily=VARIABLE_PITCH;
807 _tcscpy(LogFont.lfFaceName,TEXT("MS ゴシック"));
808 hRulerFont=CreateFontIndirect(&LogFont);
809
810 //行番号の描画用
811 extern HFONT hFont_LineNumber;
812 LogFont.lfHeight=-11;
813 LogFont.lfWidth=0;
814 LogFont.lfEscapement=0;
815 LogFont.lfOrientation=0;
816 LogFont.lfWeight=FW_BOLD;
817 LogFont.lfItalic=NULL;
818 LogFont.lfUnderline=NULL;
819 LogFont.lfStrikeOut=NULL;
820 LogFont.lfCharSet=ANSI_CHARSET;
821 LogFont.lfOutPrecision=OUT_STRING_PRECIS;
822 LogFont.lfClipPrecision=CLIP_STROKE_PRECIS;
823 LogFont.lfQuality=DRAFT_QUALITY;
824 LogFont.lfPitchAndFamily=VARIABLE_PITCH;
825 _tcscpy(LogFont.lfFaceName,TEXT("Courier New"));
826 hFont_LineNumber=CreateFontIndirect(&LogFont);
827
828 //メニューフォント
829 hMenuFont=CreateFontIndirect(&NCMetrics.lfMenuFont);
830
831
832
833 //背景ブラシ
834 extern HBRUSH h3DFaceBackBrush;
835 h3DFaceBackBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE));
836
837 //アイコン
838 extern HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon;
839 hOwnerIcon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_MAIN),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
840 hBasicProgramIcon = ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_BASICPROGRAM, 16, 16, LR_DEFAULTCOLOR);
841 hTextDocumentIcon = ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_TEXTDOCUMENT, 16, 16, LR_DEFAULTCOLOR);
842 hWindowDocumentIcon = ActiveBasic::Resource::LoadIconAlt(hResInst, IDI_WINDOW, 16, 16, LR_DEFAULTCOLOR);
843
844
845
846
847 //メインメニュー
848 pobj_MainMenu=new CMenuEx(ActiveBasic::Resource::LoadMenuAlt(hResInst, IDR_MAINMENU));
849
850 pobj_MainMenu->InitOwnerDraw(1); //オーナー描画の初期化
851
852 CSubMenuEx *pobj_FileMenu;
853 pobj_FileMenu=pobj_MainMenu->ppobj_MenuItemData[0]->pobj_SubMenu;
854
855 //未完成
856 extern HMENU hFirstMainMenu;
857 hFirstMainMenu=0;
858
859 //「最近使ったファイル」サブメニューを取得(と同時にも正規のメニュー文字列を指定)
860 for(i=0;i<pobj_FileMenu->iMenuItemNum;i++){
861 if(pobj_FileMenu->ppobj_MenuItemData[i]->str){
862 if(lstrcmp(pobj_FileMenu->ppobj_MenuItemData[i]->str,"FileHistory")==0){
863 pobj_FileMenu->RenameMenuItem(i,"最近使ったファイル(&F)");
864
865 extern CSubMenuEx *pobj_FileHistoryMenu;
866 pobj_FileHistoryMenu=pobj_FileMenu->ppobj_MenuItemData[i]->pobj_SubMenu;
867 }
868
869#ifndef THETEXT
870 //「最近使ったプロジェクト」サブメニューを取得(と同時にも正規のメニュー文字列を指定)
871 //※ProjectEditorのみ
872 if(lstrcmp(pobj_FileMenu->ppobj_MenuItemData[i]->str,"ProjectHistory")==0){
873 pobj_FileMenu->RenameMenuItem(i,"最近使ったプロジェクト(&J)");
874
875 extern CSubMenuEx *pobj_ProjectHistoryMenu;
876 pobj_ProjectHistoryMenu=pobj_FileMenu->ppobj_MenuItemData[i]->pobj_SubMenu;
877 }
878#endif
879 }
880 }
881
882#define ICONSET(itemID, iconID) pobj_MainMenu->SetIcon((itemID), ActiveBasic::Resource::LoadIconAlt(hIconResInst, (iconID), 16, 16));
883 //メニューアイコンをセット
884
885 //ファイル
886 ICONSET(IDM_NEW,IDI_NEW);
887 ICONSET(IDM_OPEN,IDI_OPEN);
888 ICONSET(IDM_SAVE,IDI_SAVE);
889 ICONSET(IDM_ALLSAVE,IDI_ALLSAVE);
890 ICONSET(IDM_PREVIEW,IDI_PREVIEW);
891 ICONSET(IDM_PRINTOUT,IDI_PRINT);
892
893 //編集
894 ICONSET(IDM_CUT,IDI_CUT);
895 ICONSET(IDM_COPY,IDI_COPY);
896 ICONSET(IDM_PASTE,IDI_PASTE);
897 ICONSET(IDM_UNDO,IDI_UNDO);
898 ICONSET(IDM_REDO,IDI_REDO);
899 ICONSET(IDM_FIND,IDI_FIND);
900
901 //表示
902 ICONSET(IDM_SET,IDI_OPTION);
903
904 //変換
905 ICONSET(IDM_CONV_ALPHA_SMALL,IDI_CONV_ALPHA_SMALL);
906 ICONSET(IDM_CONV_ALPHA_BIG,IDI_CONV_ALPHA_BIG);
907 ICONSET(IDM_CONV_HALF,IDI_CONV_HALF);
908 ICONSET(IDM_CONV_MULTI,IDI_CONV_MULTI);
909 ICONSET(IDM_CONV_KATAKANA,IDI_CONV_KATAKANA);
910 ICONSET(IDM_CONV_HIRAGANA,IDI_CONV_HIRAGANA);
911
912 //ヘルプ
913 ICONSET(IDM_TOPIC,IDI_HELP);
914
915#ifdef THETEXT
916 //TheTextのみの機能
917 ICONSET(IDM_STRING_COUNT,IDI_STRINGCOUNT);
918#else
919 //ProjectEditorのみの機能
920
921 //リリース
922 ICONSET(IDM_RELEASECOMPILE,IDI_RELEASECOMPILE);
923 ICONSET(IDM_RELEASERUN,IDI_RELEASERUN);
924
925 //デバッグ
926 ICONSET(IDM_ATTACH,IDI_ATTACH);
927 ICONSET(IDM_DEBUGCOMPILE,IDI_DEBUGCOMPILE);
928 ICONSET(IDM_DEBUG,IDI_DEBUGRUN);
929 ICONSET(IDM_BREAKPOINT,IDI_BREAKPOINT);
930 ICONSET(IDM_STEP_IN,IDI_STEPIN);
931 ICONSET(IDM_STEP_OVER,IDI_STEPOVER);
932 ICONSET(IDM_STEP_CURSOR,IDI_STEPTOCURSOR);
933 ICONSET(IDM_DEBUG_PAUSE,IDI_DEBUGPAUSE);
934 ICONSET(IDM_DEBUG_STOP,IDI_DEBUGSTOP);
935
936 //コミュニティ
937 ICONSET(IDM_COMMUNITY,IDI_COMMUNITY_MAIN);
938 ICONSET(IDM_COMMU_SEARCH,IDI_COMMUNITY_FIND);
939 ICONSET(IDM_COMMU_PM,IDI_COMMUNITY_PRIVATEMSG);
940 ICONSET(ID_COMMU_FORUM1,IDI_COMMUNITY_FORUM);
941 ICONSET(ID_COMMU_FORUM2,IDI_COMMUNITY_FORUM);
942 ICONSET(ID_COMMU_FORUM3,IDI_COMMUNITY_FORUM);
943 ICONSET(ID_COMMU_FORUM4,IDI_COMMUNITY_FORUM);
944 ICONSET(ID_COMMU_FORUM5,IDI_COMMUNITY_FORUM);
945 ICONSET(ID_COMMU_FORUM6,IDI_COMMUNITY_FORUM_SECRET);
946 ICONSET(ID_COMMU_FORUM7,IDI_COMMUNITY_FORUM);
947 ICONSET(ID_COMMU_FORUM8,IDI_COMMUNITY_FORUM);
948#endif
949
950#undef ICONSET
951
952
953
954
955 extern HMENU hEditMenuBase,hEditMenu;
956 hEditMenuBase = ActiveBasic::Resource::LoadMenuAlt(hResInst, IDR_EDITMENU);
957 hEditMenu=GetSubMenu(hEditMenuBase,0);
958
959 extern HMENU hRebarMenuBase,hRebarMenu;
960 hRebarMenuBase = ActiveBasic::Resource::LoadMenuAlt(hResInst, IDR_REBARMENU);
961 hRebarMenu=GetSubMenu(hRebarMenuBase,0);
962
963 extern HMENU hTabMenuBase,hTabMenu,hTabColorMenu;
964 hTabMenuBase = ActiveBasic::Resource::LoadMenuAlt(hResInst,IDR_TABMENU);
965 hTabMenu=GetSubMenu(hTabMenuBase,0);
966 hTabColorMenu=GetSubMenu(hTabMenu,0);
967
968 extern HMENU hFileTreeMenuBase;
969 hFileTreeMenuBase = ActiveBasic::Resource::LoadMenuAlt(hResInst,IDR_PROJECTVIEW_FILETREEMENU);
970
971 extern HMENU hProcedureTreeMenuBase;
972 hProcedureTreeMenuBase = ActiveBasic::Resource::LoadMenuAlt(hResInst,IDR_PROJECTVIEW_PROCEDURETREEMENU);
973
974 extern HMENU hMaterialTreeMenuBase;
975 hMaterialTreeMenuBase = ActiveBasic::Resource::LoadMenuAlt(hResInst,IDR_PROJECTVIEW_MATERIALTREEMENU);
976
977 extern HMENU hRadMenuBase;
978 hRadMenuBase = ActiveBasic::Resource::LoadMenuAlt(hResInst,IDR_RADCONTEXTMENU);
979
980 //クリップボードのデータ形式(RAD用)を新規登録
981 extern DWORD dwRadClipboardID;
982 dwRadClipboardID=RegisterClipboardFormat("ProjectEditor-RAD");
983
984 //256色の標準パレットを読み込む
985 extern RGBQUAD DefaultColorTable256[256];
986 const std::string pltPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\8bit.plt";
987 {
988 ATL::CHandle hFile(CreateFile(pltPath.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
989 if(hFile==INVALID_HANDLE_VALUE){
990 hFile.Detach();
991 //"\"%s\" ファイルの読み込みに失敗しました。"
992 sprintf(str,STRING_ERROR_CANT_FILEOPEN,temporary);
993 MessageBox(NULL,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
994 return 0;
995 }
996 DWORD dw;
997 ReadFile(hFile,DefaultColorTable256,sizeof(RGBQUAD)*256,&dw,NULL);
998 }
999
1000
1001
1002 //デザインテーマオブジェクトを生成
1003 pobj_DBTheme=new CDBTheme();
1004
1005
1006 /////////////////////////
1007 // カラーデザインを設定
1008 CTheme *pobj_Theme;
1009 pobj_Theme=pobj_DBTheme->GetActiveTheme();
1010 if(!pobj_Theme) pobj_Theme=pobj_DBTheme->ppobj_Theme[0];
1011
1012 SetTextEditColorDesign(&tci,pobj_Theme,0);
1013
1014
1015#ifndef THETEXT
1016 /////////////////////////////////////////////////////
1017 // ProjectEditorのみ
1018 /////////////////////////////////////////////////////
1019
1020
1021 //クラスビュー管理オブジェクトを生成
1022 pobj_ClassTreeView=new CClassTreeView();
1023
1024
1025 /////////////////////////
1026 // basic.sbpの内容を取得
1027 /////////////////////////
1028
1029 extern char *pHeaderBuf;
1030 sprintf(temporary,"%sbasic.sbp",pobj_nv->szIncludeDir);
1031 GetFullPath( temporary, pj_editor_Dir );
1032 pHeaderBuf = ReadBuffer_NonErrMsg( temporary );
1033
1034 if( !pHeaderBuf ){
1035 pHeaderBuf=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1);
1036 }
1037
1038 //ファイルをインクルード
1039 pHeaderBuf=IncludeFiles(pHeaderBuf);
1040
1041
1042 //デバッガ管理オブジェクトを生成
1043 pobj_Debugger=new CDebugger();
1044#endif
1045
1046
1047 //ブレークポイント管理オブジェクトを生成
1048 extern CDBBreakPoint *pobj_DBBreakPoint;
1049 pobj_DBBreakPoint=new CDBBreakPoint();
1050
1051
1052 return 1;
1053}
1054void EndProjectEditor(void){
1055
1056#ifndef THETEXT
1057 /////////////////////////////////////////////////////
1058 // ProjectEditorのみ
1059 /////////////////////////////////////////////////////
1060
1061
1062 //クラスビュー管理オブジェクトを破棄
1063 delete pobj_ClassTreeView;
1064 pobj_ClassTreeView=0;
1065
1066 //basic.sbpのソースコードバッファを解放
1067 extern char *pHeaderBuf;
1068 HeapDefaultFree(pHeaderBuf);
1069
1070 //デバッガ管理オブジェクトを破棄
1071 delete pobj_Debugger;
1072#endif
1073
1074 //ブレークポイント管理オブジェクトを破棄
1075 extern CDBBreakPoint *pobj_DBBreakPoint;
1076 delete pobj_DBBreakPoint;
1077
1078 //デザインテーマオブジェクトを破棄
1079 delete pobj_DBTheme;
1080
1081 //不揮発性のデータを保存
1082 pobj_nv->save();
1083 delete pobj_nv;
1084 pobj_nv=0;
1085
1086 //メインメニューオブジェクトを破棄
1087 delete pobj_MainMenu;
1088 pobj_MainMenu=0;
1089
1090 extern HFONT hStatusFont;
1091 DeleteObject(hStatusFont);
1092 extern HFONT hHyperLinkFont;
1093 DeleteObject(hHyperLinkFont);
1094 extern HFONT hRulerFont;
1095 DeleteObject(hRulerFont);
1096 extern HFONT hFont_LineNumber;
1097 DeleteObject(hFont_LineNumber);
1098 extern METHODCHECKINFO MethodCheckInfo;
1099 DeleteObject(MethodCheckInfo.hFont);
1100 DeleteObject(MethodCheckInfo.hBoldFont);
1101 extern HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon;
1102 DestroyIcon(hOwnerIcon);
1103 DestroyIcon(hBasicProgramIcon);
1104 DestroyIcon(hTextDocumentIcon);
1105 DestroyIcon(hWindowDocumentIcon);
1106 extern HMENU hEditMenuBase,hRebarMenuBase,hTabMenuBase;
1107 DestroyMenu(hEditMenuBase);
1108 DestroyMenu(hRebarMenuBase);
1109 DestroyMenu(hTabMenuBase);
1110 extern HMENU hFileTreeMenuBase;
1111 DestroyMenu(hFileTreeMenuBase);
1112 extern HMENU hProcedureTreeMenuBase;
1113 DestroyMenu(hProcedureTreeMenuBase);
1114 extern HMENU hMaterialTreeMenuBase;
1115 DestroyMenu(hMaterialTreeMenuBase);
1116 extern HMENU hRadMenuBase;
1117 DestroyMenu(hRadMenuBase);
1118
1119 //背景ブラシ
1120 extern HBRUSH h3DFaceBackBrush;
1121 DeleteObject(h3DFaceBackBrush);
1122
1123 //スタンダードツールバーを破棄
1124 if(pobj_StandardToolbar){
1125 pobj_StandardToolbar->Release();
1126 pobj_StandardToolbar=0;
1127 }
1128
1129 //ビルドツールバーを破棄
1130 if(pobj_ReleaseToolbar){
1131 pobj_ReleaseToolbar->Release();
1132 pobj_ReleaseToolbar=0;
1133 }
1134
1135 //デバッガ用ツールバーを破棄
1136 if(pobj_DebuggerToolbar){
1137 pobj_DebuggerToolbar->Release();
1138 pobj_DebuggerToolbar=0;
1139 }
1140
1141 //ヒープオブジェクトを解放
1142 extern HANDLE hHeap;
1143 HeapDestroy(hHeap);
1144
1145 //////////////////////////////////////
1146 // バックアップ用ファイルを削除
1147 //////////////////////////////////////
1148 extern char szBackupDirPath[MAX_PATH];
1149 RemoveDirectoryStrong(szBackupDirPath);
1150
1151 //DLLを解放
1152 FreeLibrary(hResInst);
1153 FreeLibrary(hIconResInst);
1154 FreeLibrary(hLib_LuxCtrl);
1155}
1156
1157//各ウィンドウ生成
1158void SetupWindow(HWND hwnd)
1159{
1160 extern HINSTANCE hInst;
1161 extern HMENU hFirstMainMenu;
1162
1163 INITCOMMONCONTROLSEX InitCommCtrl;
1164 InitCommCtrl.dwSize=sizeof(INITCOMMONCONTROLSEX);
1165 InitCommCtrl.dwICC=ICC_COOL_CLASSES|ICC_PAGESCROLLER_CLASS|ICC_WIN95_CLASSES|ICC_TAB_CLASSES;
1166 InitCommonControlsEx(&InitCommCtrl);
1167
1168 //タブウィンドウ
1169 pobj_MainTab=new CMainTab(hwnd);
1170
1171 //レバーオブジェクトを生成
1172 pobj_Rebar=new CMainRebar(hwnd);
1173
1174 //ステータスバー
1175 extern HWND hStatusBar;
1176 extern HFONT hStatusFont;
1177 hStatusBar=CreateStatusWindow(
1178 WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBARS_SIZEGRIP|CCS_BOTTOM,
1179 NULL,hwnd,NULL);
1180 SetWindowFont(hStatusBar,hStatusFont,FALSE);
1181
1182 //プロジェクト ビュー
1183 extern HWND hProjectView;
1184 extern HWND hProjectView_ToolWindow;
1185 RECT *prc;
1186 prc=&pobj_nv->rectProjectView;
1187 hProjectView_ToolWindow=CreateWindowEx(WS_EX_TOOLWINDOW,"ProjectView_ToolWindow","ProjectView",
1188 WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_CLIPCHILDREN,
1189 prc->left,prc->top,prc->right-prc->left,prc->bottom-prc->top,
1190 hwnd,0,hInst,0);
1191 hProjectView=CreateWindowEx(WS_EX_STATICEDGE,"ProjectView","ProjectView",
1192 WS_CHILD|WS_CLIPCHILDREN,
1193 0,0,0,0,
1194 hwnd,0,hInst,0);
1195 if(pobj_nv->bClipProjectView==0){
1196 SetWindowLongPtr(hProjectView,GWL_EXSTYLE,0);
1197 SetParent(hProjectView,hProjectView_ToolWindow);
1198 ResizeProjectView_ToolWindow();
1199 }
1200
1201 //メニュー状態を設定
1202 ResetState_DocMenu();
1203
1204
1205 //SideWebを生成
1206 //pobj_SideWeb=new CSideWeb(hwnd);
1207}
1208
1209//実行コマンド
1210BOOL SetRunning(HWND hChild){
1211 extern const LPCSTR DefFileFilter;
1212 int WndNum;
1213 char temp2[MAX_PATH];
1214 HANDLE hFind;
1215 WIN32_FIND_DATA wfd;
1216
1217 extern ActiveBasic::Common::Platform::EnumType selectingPlatform;
1218 hFind=FindFirstFile(ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(),&wfd);
1219 if(hFind==INVALID_HANDLE_VALUE){
1220 //"BasicCompiler.exe が見つかりません"
1221 MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION);
1222 return FALSE;
1223 }
1224 FindClose(hFind);
1225
1226 WndNum=GetWndNum(hChild);
1227 if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){
1228 if(MdiInfo[WndNum]->path.empty()){
1229 //"保存先のファイルを指定してください"
1230 if(!GetFilePathDialog(hOwner,temp2,DefFileFilter,STRING_FILESAVETITLE_DEFAULT,0)) return FALSE;
1231
1232 if(!SaveDocument(hChild,temp2)) return 0;
1233 }
1234 else{
1235 if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){
1236 if(!SaveDocument(hChild,NULL)) return 0;
1237 }
1238 else{
1239 hFind=FindFirstFile(MdiInfo[WndNum]->path.c_str(),&wfd);
1240 if(hFind==INVALID_HANDLE_VALUE){
1241 if(!SaveDocument(hChild,NULL)) return 0;
1242 }
1243 else FindClose(hFind);
1244 }
1245 }
1246 }
1247 return 1;
1248}
1249
1250BOOL IsNeedCompile( const std::string &filepath, BOOL bDebug )
1251{
1252 char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH];
1253 HANDLE hFind;
1254 WIN32_FIND_DATA wfd;
1255 FILETIME SourceTime,ExeTime;
1256
1257 _splitpath(filepath.c_str(),temporary,temp2,temp3,NULL);
1258 lstrcat(temporary,temp2);
1259 lstrcat(temporary,temp3);
1260 if(bDebug) lstrcat(temporary,"_debug.exe");
1261 else lstrcat(temporary,".exe");
1262
1263 hFind=FindFirstFile(temporary,&wfd);
1264 if(hFind==INVALID_HANDLE_VALUE) return 1;
1265 FindClose(hFind);
1266
1267 {
1268 CHandle hFile(CreateFile(filepath.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1269 GetFileTime(hFile,NULL,NULL,&SourceTime);
1270 }
1271 {
1272 CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL));
1273 GetFileTime(hFile,NULL,NULL,&ExeTime);
1274 }
1275
1276 if(SourceTime.dwHighDateTime<ExeTime.dwHighDateTime) return 0;
1277 else if(SourceTime.dwHighDateTime==ExeTime.dwHighDateTime&&
1278 SourceTime.dwLowDateTime<=ExeTime.dwLowDateTime) return 0;
1279 return 1;
1280}
1281
1282std::string GetLastErrorString(){
1283 char *lpMsgBuf;
1284
1285 FormatMessage(
1286 FORMAT_MESSAGE_ALLOCATE_BUFFER |
1287 FORMAT_MESSAGE_FROM_SYSTEM |
1288 FORMAT_MESSAGE_IGNORE_INSERTS,
1289 NULL,
1290 GetLastError(),
1291 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // デフォルト言語
1292 (LPTSTR) &lpMsgBuf,
1293 0,
1294 NULL
1295 );
1296
1297 std::string result = lpMsgBuf;
1298
1299 LocalFree( lpMsgBuf );
1300
1301 return result;
1302}
Note: See TracBrowser for help on using the repository browser.