#include "stdafx.h" #include "Common.h" 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; 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;i2title.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); } 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; //ブラシを生成 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; //ブラシを生成 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); }