#include "stdafx.h" #include "Common.h" using namespace ActiveBasic::IDE; void ScreenToClient(HWND hwnd,RECT *pRect){ ScreenToClient(hwnd,reinterpret_cast(pRect)); ScreenToClient(hwnd,reinterpret_cast(reinterpret_cast(pRect)+sizeof(POINT))); } void ClientToScreen(HWND hwnd,RECT *pRect){ ClientToScreen(hwnd,reinterpret_cast(pRect)); ClientToScreen(hwnd,reinterpret_cast(reinterpret_cast(pRect)+sizeof(POINT))); } typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE hProcess,PBOOL Wow64Process); BOOL IsWow64(void){ /////////////////////////////////////////////////////////// // ProjectEditor.exeがWOW64技術で動作しているのかどうか /////////////////////////////////////////////////////////// BOOL bIsWow64 = FALSE; LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process"); if (NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) { // handle error bIsWow64 = FALSE; } } return bIsWow64; } void URLEncode(LPSTR pszSrc){ char *temp; temp=(char *)malloc(65535); int i,i2; for (i = 0,i2=0; ; i++,i2++) { if(pszSrc[i]=='\0'){ temp[i2] = 0; break; } // 英数字 _ . - は変換しないでそのまま if (isalnum((BYTE)pszSrc[i]) || pszSrc[i] == '_' || pszSrc[i] == '.' || pszSrc[i] == '-'){ temp[i2] = pszSrc[i]; } // それ以外は %3B のような形式に変換 else{ sprintf(temp+i2,"%%%02X", (BYTE)pszSrc[i]); i2+=lstrlen(temp+i2); i2--; } } lstrcpy(pszSrc,temp); free(temp); } void Digit(int num,char *buffer){ char temporary[255]; int i,iPos; sprintf(temporary,"%d",abs(num)); //カンマが不要の場合は抜ける if(lstrlen(temporary)<=3){ wsprintf(buffer,"%d",num); return; } //合計の文字数からバッファを確保 if(num<0){ buffer[0]='-'; iPos=1; } else{ buffer[0]=0; iPos=0; } //3桁毎にカンマを加えながら文字列をコピーする int iFirst; iFirst=lstrlen(temporary)%3; if(iFirst==0) iFirst=3; memcpy(buffer+iPos,temporary,iFirst); iPos+=iFirst; int i2; i2=(lstrlen(temporary)-4)/3; for(i=0;i<=i2;i++){ buffer[iPos]=','; iPos++; memcpy(buffer+iPos,temporary+i*3+iFirst,3); iPos+=3; buffer[iPos]=0; } } void RectNaturalFormat(RECT *ReadRect,RECT *CopyRect){ if(ReadRect->left > ReadRect->right){ CopyRect->left=ReadRect->right; CopyRect->right=ReadRect->left; } else{ CopyRect->left=ReadRect->left; CopyRect->right=ReadRect->right; } if(ReadRect->top > ReadRect->bottom){ CopyRect->top=ReadRect->bottom; CopyRect->bottom=ReadRect->top; } else{ CopyRect->top=ReadRect->top; CopyRect->bottom=ReadRect->bottom; } } void RectNaturalFormat(int *x1,int *y1,int *x2,int *y2){ int temp; if(*x1>*x2){ temp=*x1; *x1=*x2; *x2=temp; } if(*y1>*y2){ temp=*y1; *y1=*y2; *y2=temp; } } void KillSpaces(char *str1,char *str2){ int i,i2,IsStr; for(i=0,i2=0,IsStr=0;;i++,i2++){ while((str1[i]==' '||str1[i]=='\t')&&IsStr==0&&str1[i]!='\0') i++; if(str1[i]=='\"') IsStr^=1; str2[i2]=str1[i]; if(str1[i]=='\0') break; } } void RemoveStringQuotes(char *str){ int i; if(str[0]!='\"') return; for(i=0;;i++){ str[i]=str[i+1]; if(str[i]=='\"') break; } str[i]=0; } void SlideString(char *buffer, int slide){ char *temp; temp=(char *)malloc(lstrlen(buffer)+1); lstrcpy(temp,buffer); lstrcpy(buffer+slide,temp); free(temp); } void SlideBuffer(char *buffer,int length,int slide){ void *temp; temp=malloc(length+1); memcpy(temp,buffer,length); memcpy(buffer+slide,temp,length); free(temp); } BOOL IsVariableTopChar(char c){ if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_') return 1; return 0; } bool IsNumberChar( char c ){ if(c>='0'&&c<='9'){ return true; } return false; } BOOL IsVariableChar(char c){ if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')|| c=='_'||c=='.'||c=='$') return 1; return 0; } BOOL IsCommandBackDelimitation(char *buffer,int pos){ if(buffer[pos]=='\n'||buffer[pos]==':') return 1; return 0; } BOOL IsCommandDelimitation(char *buffer,int p){ if(buffer[p]=='\r'&&buffer[p+1]=='\n') return 2; if(buffer[p]=='\n'||buffer[p]==':'||buffer[p]=='\0') return 1; return 0; } char *ComparisonString( char *str1, char *str2, bool isBigSmall, bool isWordUnit ){ char *temp1 = (char *)malloc( lstrlen( str1 ) +1 ); char *temp2 = (char *)malloc( lstrlen( str2 ) +1 ); lstrcpy( temp1, str1 ); lstrcpy( temp2, str2 ); if( isBigSmall == false ){ // 大文字小文字を区別しない場合 // すべて大文字にしておく CharUpper( temp1 ); CharUpper( temp2 ); } int len2 = lstrlen( temp2 ); const char *temp3 = strstr( temp1, temp2 ); while( temp3 ){ if( isWordUnit ){ int pos = (int)temp3 - (int)temp1; if( pos == 0 ){ if( !( IsVariableTopChar( temp1[len2] ) || IsNumberChar( temp1[len2] ) ) ){ break; } } else{ if( !( IsVariableTopChar( temp1[pos-1] ) || IsNumberChar( temp1[pos-1] ) ) && !( IsVariableTopChar( temp1[pos+len2] ) || IsNumberChar( temp1[pos+len2] ) ) ){ break; } } } else{ break; } temp3 = strstr( temp3 + 1, temp2 ); } char *result = NULL; if( temp3 ){ int pos = (int)temp3 - (int)temp1; result = str1 + pos; } free( temp1 ); free( temp2 ); return result; } int GetOneParameter(char *Parameter,int pos,char *retAns){ int i,i2,IsStr,PareNum; for(i=pos,i2=0,IsStr=0,PareNum=0;;i++,i2++){ if(IsDBCSLeadByte(Parameter[i])){ retAns[i2]=Parameter[i]; retAns[++i2]=Parameter[++i]; continue; } if(Parameter[i]=='\"') IsStr^=1; if(Parameter[i]=='('&&IsStr==0) PareNum++; if(Parameter[i]==')'&&IsStr==0) PareNum--; if(Parameter[i]==','&&IsStr==0&&PareNum==0){ retAns[i2]=0; break; } retAns[i2]=Parameter[i]; if(Parameter[i]=='\0'||Parameter[i]=='\r'&&Parameter[i+1]=='\n'){ retAns[i2]=0; break; } } if(Parameter[i]==',') i++; return i; } int GetStringInPare(char *buffer,char *ReadBuffer){ int i,IsStr,PareNum; for(i=0,IsStr=0,PareNum=0;;i++){ buffer[i]=ReadBuffer[i]; if(ReadBuffer[i]=='\"') IsStr^=1; else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++; else if(ReadBuffer[i]==')'&&IsStr==0){ PareNum--; if(PareNum==0){ i++; buffer[i]=0; break; } } else if(ReadBuffer[i]=='\0') return 0; } return i; } int GetStringInBracket(char *buffer,char *ReadBuffer){ int i,IsStr,PareNum; for(i=0,IsStr=0,PareNum=0;;i++){ buffer[i]=ReadBuffer[i]; if(IsDBCSLeadByte(ReadBuffer[i])){ i++; buffer[i]=ReadBuffer[i]; continue; } if(ReadBuffer[i]=='\"') IsStr^=1; else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++; else if(ReadBuffer[i]==']'&&IsStr==0){ PareNum--; if(PareNum==0){ i++; buffer[i]=0; break; } } else if(ReadBuffer[i]=='\0') return 0; } return i; } void JumpBlank(char *pBuf,int *piPos){ int i; i=*piPos; while(1){ while(pBuf[i]==' '||pBuf[i]=='\t') i++; if(pBuf[i]=='\0') break; if(pBuf[i]=='\''){ //注釈文(一行) for(i++;;i++){ if(pBuf[i]=='\0') break; if(pBuf[i]=='\r'&&pBuf[i+1]=='\n'){ i+=2; break; } } while(pBuf[i]==' '||pBuf[i]=='\t') i++; } if(pBuf[i]=='/'&&pBuf[i+1]=='*'){ //注釈文(複数行) i+=2; while(!(pBuf[i]=='*'&&pBuf[i+1]=='/')){ i++; if(pBuf[i]=='\0') break; } if(pBuf[i]){ i+=2; } } while(pBuf[i]=='\r'&&pBuf[i+1]=='\n') i+=2; if(!( pBuf[i]==' '|| pBuf[i]=='\t'|| pBuf[i]=='\''|| (pBuf[i]=='/'&&pBuf[i+1]=='*') )) break; } *piPos=i; } BOOL CheckParenthesis(char *buffer){ int i,IsStr,PareNum,sw; _int8 bracket[1024]; for(i=0,IsStr=0,PareNum=0,sw=0;;i++){ if(buffer[i]=='\"'){ IsStr^=1; continue; } else if(buffer[i]=='('&&IsStr==0){ bracket[PareNum]=0; PareNum++; } else if(buffer[i]=='['&&IsStr==0){ bracket[PareNum]=1; PareNum++; } else if(buffer[i]==')'&&IsStr==0){ PareNum--; if(bracket[PareNum]!=0||PareNum<0){ //"カッコ \'( )\'" return 0; } } else if(buffer[i]==']'&&IsStr==0){ PareNum--; if(bracket[PareNum]!=1||PareNum<0){ //"カッコ \'( )\'" return 0; } } else if(buffer[i]=='\n'||buffer[i]=='\0'){ //"カッコ \'( )\'" if(buffer[i]=='\0'){ if(PareNum!=0){ return 0; } if(IsStr!=0){ return 0; } } if(buffer[i]=='\0') break; sw=0; } } return 1; } DWORD GetValue(char *value){ unsigned long ans; if(value[0]=='&'){ if(value[1]=='o'||value[1]=='O') sscanf(value+2,"%o",&ans); if(value[1]=='h'||value[1]=='H') sscanf(value+2,"%x",&ans); } else ans=atol(value); return ans; } HBITMAP CreateGradationBitmap(SIZE *pSize,COLORREF color1,COLORREF color2){ //グラデーションビットマップを生成 BITMAPINFO BitmapInfo; memset(&BitmapInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER)); BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); BitmapInfo.bmiHeader.biWidth=pSize->cx; BitmapInfo.bmiHeader.biHeight=pSize->cy; BitmapInfo.bmiHeader.biPlanes=1; BitmapInfo.bmiHeader.biBitCount=24; HDC hdc; hdc=GetDC(GetDesktopWindow()); HBITMAP hBitmap; BYTE *pByte; hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0); int i,i2,x,y; COLORREF rgb; i=BitmapInfo.bmiHeader.biWidth*3; if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG)); for(y=0;yBitmapInfo.bmiHeader.biHeight/2+2) rgb=color1; else{ double ratio; ratio=((double)y-((double)BitmapInfo.bmiHeader.biHeight/(double)2-(double)2))/(double)4; //ratio=(double)y/(double)BitmapInfo.bmiHeader.biHeight; rgb=RGB( LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*(ratio), //赤要素 HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*(ratio), //緑要素 LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*(ratio) //青要素 ); } for(x=0;xcx; BitmapInfo.bmiHeader.biHeight=pSize->cy; BitmapInfo.bmiHeader.biPlanes=1; BitmapInfo.bmiHeader.biBitCount=24; HDC hdc; hdc=GetDC(GetDesktopWindow()); HBITMAP hBitmap; BYTE *pByte; hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0); int i,i2,x,y; COLORREF rgb; i=BitmapInfo.bmiHeader.biWidth*3; if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG)); for(y=0;yBitmapInfo.bmiHeader.biHeight/2+2) rgb=color1; else{ double ratio; ratio=(double)y/(double)BitmapInfo.bmiHeader.biHeight; rgb=RGB( LOBYTE(LOWORD(color2))+(int)(double)(LOBYTE(LOWORD(color1))-LOBYTE(LOWORD(color2)))*(ratio), //赤要素 HIBYTE(LOWORD(color2))+(int)(double)(HIBYTE(LOWORD(color1))-HIBYTE(LOWORD(color2)))*(ratio), //緑要素 LOBYTE(HIWORD(color2))+(int)(double)(LOBYTE(HIWORD(color1))-LOBYTE(HIWORD(color2)))*(ratio) //青要素 ); } for(x=0;xcx; BitmapInfo.bmiHeader.biHeight=pSize->cy; BitmapInfo.bmiHeader.biPlanes=1; BitmapInfo.bmiHeader.biBitCount=24; HDC hdc; hdc=GetDC(GetDesktopWindow()); HBITMAP hBitmap; BYTE *pByte; hBitmap=CreateDIBSection(hdc,&BitmapInfo,DIB_RGB_COLORS,(void **)&pByte,0,0); int i,i2,x,y; COLORREF rgb; i=BitmapInfo.bmiHeader.biWidth*3; if(i%sizeof(LONG)!=0) i+=sizeof(LONG)-(i%sizeof(LONG)); for(x=0;xcx=pRect->right-pRect->left; pSize->cy=pRect->bottom-pRect->top; } BOOL HitTest(RECT *pRect,POINT *pPos){ if(pRect->left<=pPos->x&&pPos->xright&& pRect->top<=pPos->y&&pPos->ybottom) return 1; return 0; } BOOL Rectangle(HDC hdc,RECT *pRect){ return Rectangle(hdc,pRect->left,pRect->top,pRect->right,pRect->bottom); } void ComboBox_SetSelText(HWND hCombo,char *lpszText){ SendMessage(hCombo,CB_SETCURSEL, SendMessage(hCombo,CB_FINDSTRINGEXACT,0,(LPARAM)lpszText), 0); } void SetCursorByState(int state){ if(state==FRAME_UPPER_LEFT||state==FRAME_LOWER_RIGHT) SetCursor(LoadCursor(0,IDC_SIZENWSE)); else if(state==FRAME_UPPER_RIGHT||state==FRAME_LOWER_LEFT) SetCursor(LoadCursor(0,IDC_SIZENESW)); else if(state==FRAME_LEFT||state==FRAME_RIGHT) SetCursor(LoadCursor(0,IDC_SIZEWE)); else if(state==FRAME_UPPER||state==FRAME_LOWER) SetCursor(LoadCursor(0,IDC_SIZENS)); else if(state==FRAME_INSIDE) SetCursor(LoadCursor(0,IDC_SIZEALL)); else SetCursor(LoadCursor(0,IDC_ARROW)); } void SetTextEditColorDesign(TEXTEDIT_COLOR_INFO *pColorInfo,CTheme *pobj_Theme,BOOL bRedraw){ pColorInfo->rgbDefault=pobj_Theme->TextColorInfo.rgbDefault; pColorInfo->rgbComment=pobj_Theme->TextColorInfo.rgbComment; pColorInfo->rgbStatement=pobj_Theme->TextColorInfo.rgbStatement; pColorInfo->rgbString=pobj_Theme->TextColorInfo.rgbString; pColorInfo->rgbCursorBack=pobj_Theme->TextColorInfo.rgbCursorBack; pColorInfo->rgbBackground=pobj_Theme->TextColorInfo.rgbBackground; //アクティブテーマにセット lstrcpy(pobj_nv->szActiveTheme,pobj_Theme->m_name); //テーマ依存の描画リソースを取得 pobj_DBTheme->unlock(); pobj_DBTheme->lock(); if(bRedraw){ //再描画 int i; for(i=0;ihwnd){ if(IS_DOCUMENT_TEXT(MdiInfo[i]->DocType)){ SetTextEditWordColor(i); InvalidateRect(MdiInfo[i]->pMdiTextEdit->hEdit,NULL,0); } } } } } BOOL SetupProjectEditor(void){ extern HINSTANCE hInst; int i; char str[MAX_PATH],temporary[MAX_PATH]; //リソース用DLLをマッピング const std::string resDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\res.dll"; hResInst = LoadLibrary( resDllPath.c_str() ); //アイコンリソースDLLをマッピング const std::string iconResDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\icon_res.dll"; hIconResInst = LoadLibrary( iconResDllPath.c_str() ); //LuxCtrl.dllをマッピング const std::string luxCtrlDllPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\LuxCtrl.dll"; hLib_LuxCtrl = LoadLibrary( luxCtrlDllPath.c_str() ); if(!hLib_LuxCtrl){ MessageBox(0,"LuxCtrl.dllの読み込みに失敗しました。",APPLICATION_NAME,MB_OK|MB_ICONEXCLAMATION); return 0; } LuxToolbar_CreateInstance= (PROC_LuxToolbar_CreateInstance)GetProcAddress(hLib_LuxCtrl,"LuxToolbar_CreateInstance"); //モジュールディレクトリを取得 GetModuleFileName(hInst,temporary,MAX_PATH); _splitpath(temporary,pj_editor_Dir,str,NULL,NULL); lstrcat(pj_editor_Dir,str); //ヒープオブジェクトを作成 extern HANDLE hHeap; hHeap=HeapCreate(HEAP_GENERATE_EXCEPTIONS,0,0); //自動バックアップ用のディレクトリを生成 CreateBackupDir(); //COMを初期化 CoInitialize(0); //スクリーンサイズを取得 ScreenX=GetSystemMetrics(SM_CXSCREEN); ScreenY=GetSystemMetrics(SM_CYSCREEN); //不揮発性のデータを取得 pobj_nv=new CNonVolatile; pobj_nv->load(); //アルファブレンド用のAPIを取得 extern FWINLAYER pSetLayeredWindowAttributes; extern HINSTANCE hUser32Lib; hUser32Lib=GetModuleHandle("user32.dll"); pSetLayeredWindowAttributes=reinterpret_cast(GetProcAddress(hUser32Lib,"SetLayeredWindowAttributes")); ///////////////////// // フォントを定義 ///////////////////// //パラメータ ヒント フォント extern METHODCHECKINFO MethodCheckInfo; MethodCheckInfo.hFont=CreateFontIndirect(&MethodCheckInfo.LogFont); i=MethodCheckInfo.LogFont.lfWeight; MethodCheckInfo.LogFont.lfWeight=FW_BOLD; MethodCheckInfo.hBoldFont=CreateFontIndirect(&MethodCheckInfo.LogFont); MethodCheckInfo.LogFont.lfWeight=i; //ステータスバー フォント LOGFONT LogFont; extern HFONT hStatusFont; LogFont.lfHeight=-12; LogFont.lfWidth=0; LogFont.lfEscapement=0; LogFont.lfOrientation=0; LogFont.lfWeight=FW_REGULAR; LogFont.lfItalic=NULL; LogFont.lfUnderline=NULL; LogFont.lfStrikeOut=NULL; LogFont.lfCharSet=SHIFTJIS_CHARSET; LogFont.lfOutPrecision=OUT_STRING_PRECIS; LogFont.lfClipPrecision=CLIP_STROKE_PRECIS; LogFont.lfQuality=DRAFT_QUALITY; LogFont.lfPitchAndFamily=VARIABLE_PITCH; sprintf(LogFont.lfFaceName,"MS Pゴシック"); hStatusFont=CreateFontIndirect(&LogFont); //ハイパーリンク フォント extern HFONT hHyperLinkFont; LogFont.lfHeight=-12; LogFont.lfWidth=0; LogFont.lfEscapement=0; LogFont.lfOrientation=0; LogFont.lfWeight=FW_REGULAR; LogFont.lfItalic=NULL; LogFont.lfUnderline=TRUE; LogFont.lfStrikeOut=NULL; LogFont.lfCharSet=SHIFTJIS_CHARSET; LogFont.lfOutPrecision=OUT_STRING_PRECIS; LogFont.lfClipPrecision=CLIP_STROKE_PRECIS; LogFont.lfQuality=DRAFT_QUALITY; LogFont.lfPitchAndFamily=VARIABLE_PITCH; sprintf(LogFont.lfFaceName,"MS Pゴシック"); hHyperLinkFont=CreateFontIndirect(&LogFont); //ルーラー フォント extern HFONT hRulerFont; LogFont.lfHeight=-10; LogFont.lfWidth=0; LogFont.lfEscapement=0; LogFont.lfOrientation=0; LogFont.lfWeight=FW_REGULAR; LogFont.lfItalic=NULL; LogFont.lfUnderline=0; LogFont.lfStrikeOut=NULL; LogFont.lfCharSet=SHIFTJIS_CHARSET; LogFont.lfOutPrecision=OUT_STRING_PRECIS; LogFont.lfClipPrecision=CLIP_STROKE_PRECIS; LogFont.lfQuality=DRAFT_QUALITY; LogFont.lfPitchAndFamily=VARIABLE_PITCH; sprintf(LogFont.lfFaceName,"MS ゴシック"); hRulerFont=CreateFontIndirect(&LogFont); //行番号の描画用 extern HFONT hFont_LineNumber; LogFont.lfHeight=-11; LogFont.lfWidth=0; LogFont.lfEscapement=0; LogFont.lfOrientation=0; LogFont.lfWeight=FW_BOLD; LogFont.lfItalic=NULL; LogFont.lfUnderline=NULL; LogFont.lfStrikeOut=NULL; LogFont.lfCharSet=ANSI_CHARSET; LogFont.lfOutPrecision=OUT_STRING_PRECIS; LogFont.lfClipPrecision=CLIP_STROKE_PRECIS; LogFont.lfQuality=DRAFT_QUALITY; LogFont.lfPitchAndFamily=VARIABLE_PITCH; sprintf(LogFont.lfFaceName,"Courier New"); hFont_LineNumber=CreateFontIndirect(&LogFont); //メニューフォント NONCLIENTMETRICS NCMetrics; int sizeof_NONCLIENTMETRICS = sizeof( NONCLIENTMETRICS ); #if WINVER >= 0x0600 sizeof_NONCLIENTMETRICS -= sizeof(int); #endif NCMetrics.cbSize = sizeof_NONCLIENTMETRICS; SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof_NONCLIENTMETRICS, &NCMetrics, 0 ); hMenuFont=CreateFontIndirect(&NCMetrics.lfMenuFont); //背景ブラシ extern HBRUSH h3DFaceBackBrush; h3DFaceBackBrush=CreateSolidBrush(GetSysColor(COLOR_3DFACE)); //アイコン extern HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon; hOwnerIcon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_MAIN),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); hBasicProgramIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_BASICPROGRAM),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); hTextDocumentIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_TEXTDOCUMENT),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); hWindowDocumentIcon=(HICON)LoadImage(hResInst,MAKEINTRESOURCE(IDI_WINDOW),IMAGE_ICON,16,16,LR_DEFAULTCOLOR); //メインメニュー pobj_MainMenu=new CMenuEx(LoadMenu(hResInst,MAKEINTRESOURCE(IDR_MAINMENU))); pobj_MainMenu->InitOwnerDraw(1); //オーナー描画の初期化 CSubMenuEx *pobj_FileMenu; pobj_FileMenu=pobj_MainMenu->ppobj_MenuItemData[0]->pobj_SubMenu; //未完成 extern HMENU hFirstMainMenu; hFirstMainMenu=0; //「最近使ったファイル」サブメニューを取得(と同時にも正規のメニュー文字列を指定) for(i=0;iiMenuItemNum;i++){ if(pobj_FileMenu->ppobj_MenuItemData[i]->str){ if(lstrcmp(pobj_FileMenu->ppobj_MenuItemData[i]->str,"FileHistory")==0){ pobj_FileMenu->RenameMenuItem(i,"最近使ったファイル(&F)"); extern CSubMenuEx *pobj_FileHistoryMenu; pobj_FileHistoryMenu=pobj_FileMenu->ppobj_MenuItemData[i]->pobj_SubMenu; } #ifndef THETEXT //「最近使ったプロジェクト」サブメニューを取得(と同時にも正規のメニュー文字列を指定) //※ProjectEditorのみ if(lstrcmp(pobj_FileMenu->ppobj_MenuItemData[i]->str,"ProjectHistory")==0){ pobj_FileMenu->RenameMenuItem(i,"最近使ったプロジェクト(&J)"); extern CSubMenuEx *pobj_ProjectHistoryMenu; pobj_ProjectHistoryMenu=pobj_FileMenu->ppobj_MenuItemData[i]->pobj_SubMenu; } #endif } } #define ICONSET(itemID,iconID) pobj_MainMenu->SetIcon(itemID,(HICON)LoadImage(hIconResInst,MAKEINTRESOURCE(iconID),IMAGE_ICON,16,16,0)); //メニューアイコンをセット //ファイル ICONSET(IDM_NEW,IDI_NEW); ICONSET(IDM_OPEN,IDI_OPEN); ICONSET(IDM_SAVE,IDI_SAVE); ICONSET(IDM_ALLSAVE,IDI_ALLSAVE); ICONSET(IDM_PREVIEW,IDI_PREVIEW); ICONSET(IDM_PRINTOUT,IDI_PRINT); //編集 ICONSET(IDM_CUT,IDI_CUT); ICONSET(IDM_COPY,IDI_COPY); ICONSET(IDM_PASTE,IDI_PASTE); ICONSET(IDM_UNDO,IDI_UNDO); ICONSET(IDM_REDO,IDI_REDO); ICONSET(IDM_FIND,IDI_FIND); //表示 ICONSET(IDM_SET,IDI_OPTION); //変換 ICONSET(IDM_CONV_ALPHA_SMALL,IDI_CONV_ALPHA_SMALL); ICONSET(IDM_CONV_ALPHA_BIG,IDI_CONV_ALPHA_BIG); ICONSET(IDM_CONV_HALF,IDI_CONV_HALF); ICONSET(IDM_CONV_MULTI,IDI_CONV_MULTI); ICONSET(IDM_CONV_KATAKANA,IDI_CONV_KATAKANA); ICONSET(IDM_CONV_HIRAGANA,IDI_CONV_HIRAGANA); //ヘルプ ICONSET(IDM_TOPIC,IDI_HELP); #ifdef THETEXT //TheTextのみの機能 ICONSET(IDM_STRING_COUNT,IDI_STRINGCOUNT); #else //ProjectEditorのみの機能 //リリース ICONSET(IDM_RELEASECOMPILE,IDI_RELEASECOMPILE); ICONSET(IDM_RELEASERUN,IDI_RELEASERUN); //デバッグ ICONSET(IDM_ATTACH,IDI_ATTACH); ICONSET(IDM_DEBUGCOMPILE,IDI_DEBUGCOMPILE); ICONSET(IDM_DEBUG,IDI_DEBUGRUN); ICONSET(IDM_BREAKPOINT,IDI_BREAKPOINT); ICONSET(IDM_STEP_IN,IDI_STEPIN); ICONSET(IDM_STEP_OVER,IDI_STEPOVER); ICONSET(IDM_STEP_CURSOR,IDI_STEPTOCURSOR); ICONSET(IDM_DEBUG_PAUSE,IDI_DEBUGPAUSE); ICONSET(IDM_DEBUG_STOP,IDI_DEBUGSTOP); //コミュニティ ICONSET(IDM_COMMUNITY,IDI_COMMUNITY_MAIN); ICONSET(IDM_COMMU_SEARCH,IDI_COMMUNITY_FIND); ICONSET(IDM_COMMU_PM,IDI_COMMUNITY_PRIVATEMSG); ICONSET(ID_COMMU_FORUM1,IDI_COMMUNITY_FORUM); ICONSET(ID_COMMU_FORUM2,IDI_COMMUNITY_FORUM); ICONSET(ID_COMMU_FORUM3,IDI_COMMUNITY_FORUM); ICONSET(ID_COMMU_FORUM4,IDI_COMMUNITY_FORUM); ICONSET(ID_COMMU_FORUM5,IDI_COMMUNITY_FORUM); ICONSET(ID_COMMU_FORUM6,IDI_COMMUNITY_FORUM_SECRET); ICONSET(ID_COMMU_FORUM7,IDI_COMMUNITY_FORUM); ICONSET(ID_COMMU_FORUM8,IDI_COMMUNITY_FORUM); #endif #undef ICONSET extern HMENU hEditMenuBase,hEditMenu; hEditMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_EDITMENU)); hEditMenu=GetSubMenu(hEditMenuBase,0); extern HMENU hRebarMenuBase,hRebarMenu; hRebarMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_REBARMENU)); hRebarMenu=GetSubMenu(hRebarMenuBase,0); extern HMENU hTabMenuBase,hTabMenu,hTabColorMenu; hTabMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_TABMENU)); hTabMenu=GetSubMenu(hTabMenuBase,0); hTabColorMenu=GetSubMenu(hTabMenu,0); extern HMENU hFileTreeMenuBase; hFileTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_FILETREEMENU)); extern HMENU hProcedureTreeMenuBase; hProcedureTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_PROCEDURETREEMENU)); extern HMENU hMaterialTreeMenuBase; hMaterialTreeMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_PROJECTVIEW_MATERIALTREEMENU)); extern HMENU hRadMenuBase; hRadMenuBase=LoadMenu(hResInst,MAKEINTRESOURCE(IDR_RADCONTEXTMENU)); //クリップボードのデータ形式(RAD用)を新規登録 extern DWORD dwRadClipboardID; dwRadClipboardID=RegisterClipboardFormat("ProjectEditor-RAD"); //256色の標準パレットを読み込む extern RGBQUAD DefaultColorTable256[256]; const std::string pltPath = ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\8bit.plt"; { ATL::CHandle hFile(CreateFile(pltPath.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)); if(hFile==INVALID_HANDLE_VALUE){ hFile.Detach(); //"\"%s\" ファイルの読み込みに失敗しました。" sprintf(str,STRING_ERROR_CANT_FILEOPEN,temporary); MessageBox(NULL,str,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION); return 0; } DWORD dw; ReadFile(hFile,DefaultColorTable256,sizeof(RGBQUAD)*256,&dw,NULL); } //デザインテーマオブジェクトを生成 pobj_DBTheme=new CDBTheme(); ///////////////////////// // カラーデザインを設定 CTheme *pobj_Theme; pobj_Theme=pobj_DBTheme->GetActiveTheme(); if(!pobj_Theme) pobj_Theme=pobj_DBTheme->ppobj_Theme[0]; SetTextEditColorDesign(&tci,pobj_Theme,0); #ifndef THETEXT ///////////////////////////////////////////////////// // ProjectEditorのみ ///////////////////////////////////////////////////// //クラスビュー管理オブジェクトを生成 pobj_ClassTreeView=new CClassTreeView(); ///////////////////////// // basic.sbpの内容を取得 ///////////////////////// extern char *pHeaderBuf; sprintf(temporary,"%sbasic.sbp",pobj_nv->szIncludeDir); GetFullPath( temporary, pj_editor_Dir ); pHeaderBuf = ReadBuffer_NonErrMsg( temporary ); if( !pHeaderBuf ){ pHeaderBuf=(char *)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,1); } //ファイルをインクルード pHeaderBuf=IncludeFiles(pHeaderBuf); //デバッガ管理オブジェクトを生成 pobj_Debugger=new CDebugger(); #endif //ブレークポイント管理オブジェクトを生成 extern CDBBreakPoint *pobj_DBBreakPoint; pobj_DBBreakPoint=new CDBBreakPoint(); return 1; } void EndProjectEditor(void){ #ifndef THETEXT ///////////////////////////////////////////////////// // ProjectEditorのみ ///////////////////////////////////////////////////// //クラスビュー管理オブジェクトを破棄 delete pobj_ClassTreeView; pobj_ClassTreeView=0; //basic.sbpのソースコードバッファを解放 extern char *pHeaderBuf; HeapDefaultFree(pHeaderBuf); //デバッガ管理オブジェクトを破棄 delete pobj_Debugger; #endif //ブレークポイント管理オブジェクトを破棄 extern CDBBreakPoint *pobj_DBBreakPoint; delete pobj_DBBreakPoint; //デザインテーマオブジェクトを破棄 delete pobj_DBTheme; //不揮発性のデータを保存 pobj_nv->save(); delete pobj_nv; pobj_nv=0; //メインメニューオブジェクトを破棄 delete pobj_MainMenu; pobj_MainMenu=0; extern HFONT hStatusFont; DeleteObject(hStatusFont); extern HFONT hHyperLinkFont; DeleteObject(hHyperLinkFont); extern HFONT hRulerFont; DeleteObject(hRulerFont); extern HFONT hFont_LineNumber; DeleteObject(hFont_LineNumber); extern METHODCHECKINFO MethodCheckInfo; DeleteObject(MethodCheckInfo.hFont); DeleteObject(MethodCheckInfo.hBoldFont); extern HICON hOwnerIcon,hBasicProgramIcon,hTextDocumentIcon,hWindowDocumentIcon; DestroyIcon(hOwnerIcon); DestroyIcon(hBasicProgramIcon); DestroyIcon(hTextDocumentIcon); DestroyIcon(hWindowDocumentIcon); extern HMENU hEditMenuBase,hRebarMenuBase,hTabMenuBase; DestroyMenu(hEditMenuBase); DestroyMenu(hRebarMenuBase); DestroyMenu(hTabMenuBase); extern HMENU hFileTreeMenuBase; DestroyMenu(hFileTreeMenuBase); extern HMENU hProcedureTreeMenuBase; DestroyMenu(hProcedureTreeMenuBase); extern HMENU hMaterialTreeMenuBase; DestroyMenu(hMaterialTreeMenuBase); extern HMENU hRadMenuBase; DestroyMenu(hRadMenuBase); //背景ブラシ extern HBRUSH h3DFaceBackBrush; DeleteObject(h3DFaceBackBrush); //スタンダードツールバーを破棄 if(pobj_StandardToolbar){ pobj_StandardToolbar->Release(); pobj_StandardToolbar=0; } //ビルドツールバーを破棄 if(pobj_ReleaseToolbar){ pobj_ReleaseToolbar->Release(); pobj_ReleaseToolbar=0; } //デバッガ用ツールバーを破棄 if(pobj_DebuggerToolbar){ pobj_DebuggerToolbar->Release(); pobj_DebuggerToolbar=0; } //ヒープオブジェクトを解放 extern HANDLE hHeap; HeapDestroy(hHeap); ////////////////////////////////////// // バックアップ用ファイルを削除 ////////////////////////////////////// extern char szBackupDirPath[MAX_PATH]; RemoveDirectoryStrong(szBackupDirPath); //DLLを解放 FreeLibrary(hResInst); FreeLibrary(hIconResInst); FreeLibrary(hLib_LuxCtrl); } //各ウィンドウ生成 void SetupWindow(HWND hwnd) { extern HINSTANCE hInst; extern HMENU hFirstMainMenu; INITCOMMONCONTROLSEX InitCommCtrl; InitCommCtrl.dwSize=sizeof(INITCOMMONCONTROLSEX); InitCommCtrl.dwICC=ICC_COOL_CLASSES|ICC_PAGESCROLLER_CLASS|ICC_WIN95_CLASSES|ICC_TAB_CLASSES; InitCommonControlsEx(&InitCommCtrl); //タブウィンドウ pobj_MainTab=new CMainTab(hwnd); //レバーオブジェクトを生成 pobj_Rebar=new CMainRebar(hwnd); //ステータスバー extern HWND hStatusBar; extern HFONT hStatusFont; hStatusBar=CreateStatusWindow( WS_VISIBLE|WS_CHILD|WS_CLIPSIBLINGS|SBARS_SIZEGRIP|CCS_BOTTOM, NULL,hwnd,NULL); SendMessage(hStatusBar,WM_SETFONT,(long)hStatusFont,0); //プロジェクト ビュー extern HWND hProjectView; extern HWND hProjectView_ToolWindow; RECT *prc; prc=&pobj_nv->rectProjectView; hProjectView_ToolWindow=CreateWindowEx(WS_EX_TOOLWINDOW,"ProjectView_ToolWindow","ProjectView", WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_CLIPCHILDREN, prc->left,prc->top,prc->right-prc->left,prc->bottom-prc->top, hwnd,0,hInst,0); hProjectView=CreateWindowEx(WS_EX_STATICEDGE,"ProjectView","ProjectView", WS_CHILD|WS_CLIPCHILDREN, 0,0,0,0, hwnd,0,hInst,0); if(pobj_nv->bClipProjectView==0){ SetWindowLongPtr(hProjectView,GWL_EXSTYLE,0); SetParent(hProjectView,hProjectView_ToolWindow); ResizeProjectView_ToolWindow(); } //メニュー状態を設定 ResetState_DocMenu(); //SideWebを生成 //pobj_SideWeb=new CSideWeb(hwnd); } //実行コマンド BOOL SetRunning(HWND hChild){ extern LPSTR DefFileFilter; int WndNum; char temp2[MAX_PATH]; HANDLE hFind; WIN32_FIND_DATA wfd; extern ActiveBasic::Common::Platform::EnumType selectingPlatform; hFind=FindFirstFile(ActiveBasic::Common::Environment::GetCompilerExePath( selectingPlatform ).c_str(),&wfd); if(hFind==INVALID_HANDLE_VALUE){ //"BasicCompiler.exe が見つかりません" MessageBox(hOwner,STRING_ERROR_NOBASICCOMPILER,STRING_ERROR,MB_OK|MB_ICONEXCLAMATION); return FALSE; } FindClose(hFind); WndNum=GetWndNum(hChild); if(IS_DOCUMENT_TEXT(MdiInfo[WndNum]->DocType)){ if(MdiInfo[WndNum]->path.empty()){ //"保存先のファイルを指定してください" if(!GetFilePathDialog(hOwner,temp2,DefFileFilter,STRING_FILESAVETITLE_DEFAULT,0)) return FALSE; if(!SaveDocument(hChild,temp2)) return 0; } else{ if( MdiInfo[WndNum]->pMdiTextEdit->IsModified() ){ if(!SaveDocument(hChild,NULL)) return 0; } else{ hFind=FindFirstFile(MdiInfo[WndNum]->path.c_str(),&wfd); if(hFind==INVALID_HANDLE_VALUE){ if(!SaveDocument(hChild,NULL)) return 0; } else FindClose(hFind); } } } return 1; } BOOL IsNeedCompile( const std::string &filepath, BOOL bDebug ) { char temporary[MAX_PATH],temp2[MAX_PATH],temp3[MAX_PATH]; HANDLE hFind; WIN32_FIND_DATA wfd; FILETIME SourceTime,ExeTime; _splitpath(filepath.c_str(),temporary,temp2,temp3,NULL); lstrcat(temporary,temp2); lstrcat(temporary,temp3); if(bDebug) lstrcat(temporary,"_debug.exe"); else lstrcat(temporary,".exe"); hFind=FindFirstFile(temporary,&wfd); if(hFind==INVALID_HANDLE_VALUE) return 1; FindClose(hFind); { CHandle hFile(CreateFile(filepath.c_str(),GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)); GetFileTime(hFile,NULL,NULL,&SourceTime); } { CHandle hFile(CreateFile(temporary,GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)); GetFileTime(hFile,NULL,NULL,&ExeTime); } if(SourceTime.dwHighDateTime