source: dev/ProjectEditor/TabCtrl.cpp@ 3

Last change on this file since 3 was 3, checked in by dai_9181, 17 years ago
File size: 7.9 KB
Line 
1#include "Common.h"
2
3
4CMainTab *pobj_MainTab=0;
5WNDPROC OldMainTabWndProc;
6
7
8LRESULT CALLBACK MainTabWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
9 static BOOL indexDrag=-1;
10 TCHITTESTINFO tcHitTest;
11 int iNewPos;
12 char temporary[MAX_PATH];
13 switch(message){
14 case WM_LBUTTONDOWN:
15 //クリックされたアイテムインデックスを取得
16 GetCursorPos(&tcHitTest.pt);
17 ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt);
18 indexDrag=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
19 if(indexDrag==-1) break;
20
21 SetCapture(hwnd);
22 break;
23 case WM_LBUTTONUP:
24 indexDrag=-1;
25 ReleaseCapture();
26 break;
27 case WM_MOUSEMOVE:
28 if(indexDrag!=-1){
29 GetCursorPos(&tcHitTest.pt);
30 ScreenToClient(pobj_MainTab->hTab,&tcHitTest.pt);
31 iNewPos=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
32 if(iNewPos==-1) break;
33 if(indexDrag!=iNewPos){
34 LockWindowUpdate(hOwner);
35
36 TC_ITEM tcItem;
37 tcItem.mask=TCIF_TEXT|TCIF_PARAM;
38 tcItem.pszText=temporary;
39 tcItem.cchTextMax=MAX_PATH;
40 TabCtrl_GetItem(pobj_MainTab->hTab,indexDrag,&tcItem);
41
42 TabCtrl_DeleteItem(pobj_MainTab->hTab,indexDrag);
43
44 TabCtrl_InsertItem(pobj_MainTab->hTab,iNewPos,&tcItem);
45
46 int iTemp;
47 iTemp=TabCtrl_HitTest(pobj_MainTab->hTab,&tcHitTest);
48 if(iTemp!=iNewPos){
49 TabCtrl_DeleteItem(pobj_MainTab->hTab,iNewPos);
50 TabCtrl_InsertItem(pobj_MainTab->hTab,indexDrag,&tcItem);
51
52 LockWindowUpdate(0);
53 break;
54 }
55
56 indexDrag=iNewPos;
57
58 LockWindowUpdate(0);
59 }
60 }
61 return 0;
62 case WM_PAINT:
63 HDC hdc;
64 PAINTSTRUCT ps;
65 hdc=BeginPaint(hwnd,&ps);
66 if(pobj_MainTab)
67 pobj_MainTab->draw(hdc);
68 EndPaint(hwnd,&ps);
69 return 0;
70 }
71 return CallWindowProc(OldMainTabWndProc,hwnd,message,wParam,lParam);
72}
73
74
75int CMainTab::search(char *lpszText){
76 int i2,i3;
77 char temporary[MAX_PATH];
78
79 i3=TabCtrl_GetItemCount(hTab);
80
81 TC_ITEM tcItem;
82 tcItem.mask=TCIF_TEXT;
83 tcItem.pszText=temporary;
84 tcItem.cchTextMax=MAX_PATH;
85
86 for(i2=0;i2<i3;i2++){
87 TabCtrl_GetItem(hTab,i2,&tcItem);
88 if(lstrcmpi(lpszText,tcItem.pszText)==0) break;
89 }
90 if(i2==i3) return -1;
91
92 return i2;
93}
94
95
96CMainTab::CMainTab(HWND hParent){
97 extern HFONT hStatusFont;
98 hTab=CreateWindowEx(0,WC_TABCONTROL,NULL,
99 WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE|TCS_OWNERDRAWFIXED,
100 0,0,0,0,
101 hParent,0,hInst,0);
102
103 TabCtrl_SetPadding(hTab,5,4);
104
105 DWORD dwStyle;
106 dwStyle = TabCtrl_GetExtendedStyle(hTab);
107 dwStyle &= ~TCS_EX_FLATSEPARATORS;
108 TabCtrl_SetExtendedStyle(hTab, dwStyle);
109
110
111 //サブクラス化
112 OldMainTabWndProc=(WNDPROC)GetWindowLong(hTab,GWL_WNDPROC);
113 SetWindowLong(hTab,GWL_WNDPROC,(LONG_PTR)MainTabWndProc);
114
115 //ボールド体フォントを生成
116 LOGFONT lf;
117 GetObject(hStatusFont,sizeof(LOGFONT),&lf);
118 lf.lfWeight=FW_BOLD;
119 hBoldFont=CreateFontIndirect(&lf);
120
121 SendMessage(hTab,WM_SETFONT,(long)hBoldFont,0);
122}
123
124CMainTab::~CMainTab(){
125 DeleteObject(hBoldFont);
126}
127
128void CMainTab::insert(char *lpszText,BOOL bResize,COLORREF color){
129 int sw=0;
130 if(TabCtrl_GetItemCount(hTab)==0) sw=1;
131
132 if(color==-1) color=RGB(230,230,230);
133
134 TC_ITEM tcItem;
135 tcItem.mask=TCIF_TEXT|TCIF_PARAM;
136 tcItem.pszText=lpszText;
137 tcItem.lParam=color;
138 TabCtrl_InsertItem(hTab,0,&tcItem);
139 TabCtrl_SetCurSel(hTab,0);
140
141 if(bResize){
142 if(sw) ResizeOwnerWnd();
143 }
144}
145
146void CMainTab::delete_item(char *lpszText,BOOL bResize){
147 int i2;
148 i2=search(lpszText);
149 if(i2==-1) return;
150
151 TabCtrl_DeleteItem(hTab,i2);
152
153 if(bResize){
154 if(TabCtrl_GetItemCount(hTab)==0) ResizeOwnerWnd();
155 }
156}
157
158void CMainTab::reset_item(char *lpszOldText,char *lpszNewText){
159 int i2;
160 i2=search(lpszOldText);
161 if(i2==-1) return;
162
163 TC_ITEM tcItem;
164 tcItem.mask=TCIF_TEXT;
165 tcItem.pszText=lpszNewText;
166 tcItem.cchTextMax=MAX_PATH;
167
168 TabCtrl_SetItem(hTab,i2,&tcItem);
169}
170
171COLORREF CMainTab::GetItemColor(char *lpszText){
172 int i2,i3;
173 char temporary[MAX_PATH];
174
175 i3=TabCtrl_GetItemCount(hTab);
176
177 TC_ITEM tcItem;
178 tcItem.mask=TCIF_TEXT|TCIF_PARAM;
179 tcItem.pszText=temporary;
180 tcItem.cchTextMax=MAX_PATH;
181
182 for(i2=0;i2<i3;i2++){
183 TabCtrl_GetItem(hTab,i2,&tcItem);
184 if(lstrcmpi(lpszText,tcItem.pszText)==0) return tcItem.lParam;
185 }
186 return -1;
187}
188
189void CMainTab::SelChangeEvent(){
190 extern MDIINFO MdiInfo[MAX_WNDNUM];
191 char temporary[MAX_PATH];
192
193 int i;
194 i=TabCtrl_GetCurSel(hTab);
195
196 TC_ITEM tcItem;
197 tcItem.mask=TCIF_TEXT;
198 tcItem.pszText=temporary;
199 tcItem.cchTextMax=MAX_PATH;
200 TabCtrl_GetItem(hTab,i,&tcItem);
201
202 for(i=0;i<MAX_WNDNUM;i++){
203 if(lstrcmpi(temporary,MdiInfo[i].title)==0) break;
204 }
205 BringWindowToTop(MdiInfo[i].hwnd);
206}
207void CMainTab::MdiActiveEvent(char *lpszText){
208 int i2;
209 i2=search(lpszText);
210 if(i2==-1) return;
211
212 TabCtrl_SetCurSel(hTab,i2);
213}
214
215void CMainTab::draw(HDC hdc){
216 COLORREF colorGray;
217 HBRUSH hGrayBrush;
218
219 int nMaxPage;
220 nMaxPage=TabCtrl_GetItemCount(hTab);
221
222 //ペンを生成
223 HPEN hPen,hOldPen;
224 COLORREF colorPen;
225 colorPen=RGB(127,140,155);
226 hPen=CreatePen(PS_SOLID,0,colorPen);
227 hOldPen=(HPEN)SelectObject(hdc,hPen);
228
229 //描画領域を塗りつぶす
230 RECT rc;
231 GetClientRect(hTab,&rc);
232 FillRect(hdc,&rc,GetSysColorBrush(COLOR_3DFACE));
233
234 //リージョンを生成
235 HRGN hDefaultRgn;
236 hDefaultRgn=CreateRectRgnIndirect(&rc);
237
238 int i;
239 char temporary[MAX_PATH];
240 HFONT hOldFont;
241 TCITEM item;
242 memset(&item,0,sizeof(TCITEM));
243 item.mask=TCIF_TEXT|TCIF_PARAM;
244 item.pszText=temporary;
245 item.cchTextMax=MAX_PATH;
246 for(i=nMaxPage-1;i>=0;i--){
247 if(i==TabCtrl_GetCurSel(hTab)){
248 //フォーカスを持つタブは最後に描画するため、飛び越す
249 continue;
250 }
251
252 TabCtrl_GetItem(hTab,i,&item);
253
254 //座標取得
255 TabCtrl_GetItemRect(hTab,i,&rc);
256
257
258
259 ////////////////////////////
260 // タブ枠を描画
261 ////////////////////////////
262 colorGray=item.lParam;
263
264 //ブラシを生成
265 hGrayBrush=CreateSolidBrush(colorGray);
266
267 SetBkColor(hdc,colorGray);
268
269 HBRUSH hOldBrush;
270 hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush);
271
272 HRGN hRgn1,hRgn2;
273 hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom);
274 hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom);
275
276 SelectObject(hdc,hRgn1);
277 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15);
278 SelectObject(hdc,hRgn2);
279 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3);
280 SelectObject(hdc,hDefaultRgn);
281
282 DeleteObject(hRgn1);
283 DeleteObject(hRgn2);
284
285 SelectObject(hdc,hOldBrush);
286 DeleteObject(hGrayBrush);
287
288
289 extern HFONT hStatusFont;
290 hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
291
292
293
294 //文字を描画
295 DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
296
297
298 SelectObject(hdc,hOldFont);
299 }
300
301
302 /////////////////////////////////
303 // フォーカスを持つタブを描画
304 /////////////////////////////////
305 i=TabCtrl_GetCurSel(hTab);
306
307 TabCtrl_GetItem(hTab,i,&item);
308
309 //座標取得
310 TabCtrl_GetItemRect(hTab,i,&rc);
311
312 {
313 rc.top-=2;
314 ////////////////////////////
315 // タブ枠を描画
316 ////////////////////////////
317 colorGray=item.lParam;
318
319 //ブラシを生成
320 hGrayBrush=CreateSolidBrush(colorGray);
321
322 SetBkColor(hdc,colorGray);
323
324 HBRUSH hOldBrush;
325 hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush);
326
327 HRGN hRgn1,hRgn2;
328 hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom);
329 hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom);
330
331 SelectObject(hdc,hRgn1);
332 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15);
333 SelectObject(hdc,hRgn2);
334 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3);
335 SelectObject(hdc,hDefaultRgn);
336
337 DeleteObject(hRgn1);
338 DeleteObject(hRgn2);
339
340 SelectObject(hdc,hOldBrush);
341 DeleteObject(hGrayBrush);
342
343 rc.top+=2;
344 }
345
346 hOldFont=(HFONT)SelectObject(hdc,hBoldFont);
347
348 //文字を描画
349 DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
350
351 SelectObject(hdc,hOldFont);
352
353
354
355 SelectObject(hdc,hOldPen);
356 DeleteObject(hPen);
357
358 DeleteObject(hDefaultRgn);
359}
Note: See TracBrowser for help on using the repository browser.