#include "stdafx.h" #include "Common.h" struct ItemInfo { HWND hwndChild; COLORREF Color; ItemInfo( HWND hChild, COLORREF color) : hwndChild( hChild ), Color( color ) { } }; ItemInfo* GetItemInfo( HWND hTab, int i ) { TC_ITEM tcItem; tcItem.mask=TCIF_PARAM; TabCtrl_GetItem( hTab, i, &tcItem ); return reinterpret_cast( tcItem.lParam ); } void SetTabOrder( HWND hTab, ItemInfo* itemInfo, int pos ) { HWND next = pos + 1 < TabCtrl_GetItemCount( hTab ) ? GetItemInfo( hTab, pos + 1 )->hwndChild : 0 ; ActiveBasic::IDE::Program::mainFrame.SetTabOrder( itemInfo->hwndChild, next ); } CMainTab *pobj_MainTab=0; WNDPROC OldMainTabWndProc; LRESULT CALLBACK MainTabWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){ static BOOL indexDrag=-1; TCHITTESTINFO tcHitTest; int iNewPos; char temporary[MAX_PATH]; switch(message){ case WM_LBUTTONDOWN: //クリックされたアイテムインデックスを取得 GetCursorPos(&tcHitTest.pt); ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt); indexDrag=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest); if(indexDrag==-1) break; SetCapture(hwnd); break; case WM_LBUTTONUP: indexDrag=-1; ReleaseCapture(); break; case WM_MOUSEMOVE: if(indexDrag!=-1){ GetCursorPos(&tcHitTest.pt); ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt); iNewPos=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest); if(iNewPos==-1) break; if(indexDrag!=iNewPos){ LockWindowUpdate(hOwner); TC_ITEM tcItem; tcItem.mask=TCIF_TEXT|TCIF_PARAM; tcItem.pszText=temporary; tcItem.cchTextMax=MAX_PATH; TabCtrl_GetItem(pobj_MainTab->hTab,indexDrag,&tcItem); TabCtrl_DeleteItem(pobj_MainTab->hTab,indexDrag); TabCtrl_InsertItem(pobj_MainTab->hTab,iNewPos,&tcItem); int iTemp; iTemp=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest); if(iTemp!=iNewPos){ TabCtrl_DeleteItem(pobj_MainTab->hTab,iNewPos); TabCtrl_InsertItem(pobj_MainTab->hTab,indexDrag,&tcItem); LockWindowUpdate(0); break; } indexDrag=iNewPos; SetTabOrder( hwnd, GetItemInfo( hwnd, iNewPos ), iNewPos ); LockWindowUpdate(0); } } return 0; case WM_PAINT: HDC hdc; PAINTSTRUCT ps; hdc=BeginPaint(hwnd,&ps); if(pobj_MainTab) pobj_MainTab->draw(hdc); EndPaint(hwnd,&ps); return 0; } return CallWindowProc(OldMainTabWndProc,hwnd,message,wParam,lParam); } int CMainTab::SearchItemIndex( const char *lpszText ){ int i2,i3; char temporary[MAX_PATH]; i3=TabCtrl_GetItemCount(hTab); TC_ITEM tcItem; tcItem.mask=TCIF_TEXT; tcItem.pszText=temporary; tcItem.cchTextMax=MAX_PATH; for(i2=0;i2( itemInfo ); TabCtrl_InsertItem(hTab,0,&tcItem); TabCtrl_SetCurSel(hTab,0); ActiveBasic::IDE::Program::mainFrame.AddChildWindow( hwnd ); SetTabOrder( hTab, itemInfo, 0 ); if(isResize){ if(sw) ActiveBasic::IDE::Program::mainFrame.Resized(); } } void CMainTab::DeleteItem( const char *lpszText, bool isResize ){ int i2; i2=SearchItemIndex(lpszText); if(i2==-1) return; OutputDebugString("CMainTab::DeleteItem--------------------------------------------------------\r\n"); ItemInfo* p = GetItemInfo( hTab, i2 ); ActiveBasic::IDE::Program::mainFrame.DeleteChildWindow( p->hwndChild ); delete p; TabCtrl_DeleteItem(hTab,i2); if(isResize){ if(TabCtrl_GetItemCount(hTab)==0) ActiveBasic::IDE::Program::mainFrame.Resized(); } } void CMainTab::RenameItem( const char *lpszOldText, const char *lpszNewText ){ int i2=SearchItemIndex(lpszOldText); if(i2==-1) return; SetItemText( i2, lpszNewText ); } void CMainTab::NofityModifyDocument( const char *ItemText ){ //ドキュメントが変更されたとき、アスタリスクを付けて表示する //インデックスを取得 int index = SearchItemIndex( ItemText ); if( index == -1 ) return; //既にアスタリスク表示されていた場合は抜ける if( IsModified( index ) ) return; //アスタリスクを付加 char temporary[MAX_PATH]; lstrcpy( temporary, ItemText ); lstrcat( temporary, "*" ); //タブアイテムを更新 SetItemText( index, temporary ); } void CMainTab::NofityUnModifyDocument( const char *ItemText ){ //ドキュメントが保存されたとき、アスタリスクを非表示にする //インデックスを取得 int index = SearchItemIndex( ItemText ); if( index == -1 ) return; //既にアスタリスクが非表示の場合は抜ける if( ! IsModified( index ) ) return; //タブアイテムを更新 SetItemText( index, ItemText ); } COLORREF CMainTab::GetItemColor( char const *ItemText ){ //インデックスを取得 int index = SearchItemIndex( ItemText ); if( index == -1 ) return static_cast(-1); TC_ITEM tcItem; tcItem.mask = TCIF_PARAM; TabCtrl_GetItem( hTab, index, &tcItem ); return reinterpret_cast( tcItem.lParam )->Color; } void CMainTab::SelChangeEvent(){ int i; i=TabCtrl_GetCurSel(hTab); char ItemText[MAX_PATH]; TC_ITEM tcItem; tcItem.mask=TCIF_TEXT; tcItem.pszText=ItemText; tcItem.cchTextMax=MAX_PATH; TabCtrl_GetItem(hTab,i,&tcItem); if( ItemText[ lstrlen( ItemText ) -1 ] == '*' ){ //アスタリスクがあったときは取り除く ItemText[ lstrlen( ItemText ) -1 ] = 0; } for(i=0;ititle.c_str())==0) break; } BringWindowToTop(MdiInfo[i]->hwnd); } void CMainTab::MdiActiveEvent(const char *lpszText){ int i2; i2=SearchItemIndex(lpszText); if(i2==-1) return; TabCtrl_SetCurSel(hTab,i2); // ActiveBasic::IDE::Program::mainFrame.ActivateChildWindow( *GetItemInfo( hTab, i2 )->TaskbarButtonWindow ); } void CMainTab::draw(HDC hdc){ COLORREF colorGray; HBRUSH hGrayBrush; int nMaxPage; nMaxPage=TabCtrl_GetItemCount(hTab); //ペンを生成 HPEN hPen,hOldPen; COLORREF colorPen; colorPen=RGB(127,140,155); hPen=CreatePen(PS_SOLID,0,colorPen); hOldPen=(HPEN)SelectObject(hdc,hPen); //描画領域を塗りつぶす RECT rc; GetClientRect(hTab,&rc); FillRect(hdc,&rc,GetSysColorBrush(COLOR_3DFACE)); //リージョンを生成 HRGN hDefaultRgn; hDefaultRgn=CreateRectRgnIndirect(&rc); int i; char temporary[MAX_PATH]; HFONT hOldFont; TCITEM item; memset(&item,0,sizeof(TCITEM)); item.mask=TCIF_TEXT|TCIF_PARAM; item.pszText=temporary; item.cchTextMax=MAX_PATH; for(i=nMaxPage-1;i>=0;i--){ if(i==TabCtrl_GetCurSel(hTab)){ //フォーカスを持つタブは最後に描画するため、飛び越す continue; } TabCtrl_GetItem(hTab,i,&item); //座標取得 TabCtrl_GetItemRect(hTab,i,&rc); //////////////////////////// // タブ枠を描画 //////////////////////////// colorGray=item.lParam ? reinterpret_cast( item.lParam )->Color : RGB(0xcc, 0xcc, 0xcc); //ブラシを生成 hGrayBrush=CreateSolidBrush(colorGray); SetBkColor(hdc,colorGray); HBRUSH hOldBrush; hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush); HRGN hRgn1,hRgn2; hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom); hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom); SelectObject(hdc,hRgn1); RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15); SelectObject(hdc,hRgn2); RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3); SelectObject(hdc,hDefaultRgn); DeleteObject(hRgn1); DeleteObject(hRgn2); SelectObject(hdc,hOldBrush); DeleteObject(hGrayBrush); extern HFONT hStatusFont; hOldFont=(HFONT)SelectObject(hdc,hStatusFont); //文字を描画 DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE); SelectObject(hdc,hOldFont); } ///////////////////////////////// // フォーカスを持つタブを描画 ///////////////////////////////// i=TabCtrl_GetCurSel(hTab); TabCtrl_GetItem(hTab,i,&item); //座標取得 TabCtrl_GetItemRect(hTab,i,&rc); { rc.top-=2; //////////////////////////// // タブ枠を描画 //////////////////////////// colorGray=item.lParam ? reinterpret_cast( item.lParam )->Color : RGB(0xcc, 0xcc, 0xcc); //ブラシを生成 hGrayBrush=CreateSolidBrush(colorGray); SetBkColor(hdc,colorGray); HBRUSH hOldBrush; hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush); HRGN hRgn1,hRgn2; hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom); hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom); SelectObject(hdc,hRgn1); RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15); SelectObject(hdc,hRgn2); RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3); SelectObject(hdc,hDefaultRgn); DeleteObject(hRgn1); DeleteObject(hRgn2); SelectObject(hdc,hOldBrush); DeleteObject(hGrayBrush); rc.top+=2; } hOldFont=(HFONT)SelectObject(hdc,hBoldFont); //文字を描画 DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE); SelectObject(hdc,hOldFont); SelectObject(hdc,hOldPen); DeleteObject(hPen); DeleteObject(hDefaultRgn); }