source: dev/ProjectEditor/TabCtrl.cpp@ 25

Last change on this file since 25 was 25, checked in by dai_9181, 17 years ago

アスタリスク付きのタブの移動ができないバグを修正。

File size: 9.6 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::SearchItemIndex( const 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
89 //アスタリスクを取り除いて評価する
90 if( tcItem.pszText[ lstrlen( tcItem.pszText ) -1 ] == '*' ){
91 tcItem.pszText[ lstrlen( tcItem.pszText ) -1 ] = 0;
92 }
93
94 if(lstrcmpi(lpszText,tcItem.pszText)==0) break;
95 }
96 if(i2==i3) return -1;
97
98 return i2;
99}
100void CMainTab::SetItemText( int index, const char *ItemText ){
101 TC_ITEM tcItem;
102 tcItem.mask=TCIF_TEXT;
103 tcItem.pszText=(LPSTR)ItemText;
104 tcItem.cchTextMax=MAX_PATH;
105
106 TabCtrl_SetItem(hTab,index,&tcItem);
107}
108void CMainTab::GetItemText( int index, char *ItemText ){
109 TC_ITEM tcItem;
110 tcItem.mask = TCIF_TEXT;
111 tcItem.pszText = ItemText;
112 tcItem.cchTextMax = MAX_PATH;
113 TabCtrl_GetItem( hTab, index, &tcItem );
114}
115bool CMainTab::IsModified( int index ){
116 //アスタリスク表示かどうかを判断する
117
118 //アイテム文字列を取得
119 char ItemText[MAX_PATH];
120 GetItemText( index, ItemText );
121
122 if( ItemText[ lstrlen( ItemText ) -1 ] == '*' ){
123 //アスタリスクがあったとき
124 return true;
125 }
126
127 //その他
128 return false;
129}
130
131
132CMainTab::CMainTab(HWND hParent){
133 extern HFONT hStatusFont;
134 hTab=CreateWindowEx(0,WC_TABCONTROL,NULL,
135 WS_CHILD|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_VISIBLE|TCS_OWNERDRAWFIXED,
136 0,0,0,0,
137 hParent,0,hInst,0);
138
139 TabCtrl_SetPadding(hTab,5,4);
140
141 DWORD dwStyle;
142 dwStyle = TabCtrl_GetExtendedStyle(hTab);
143 dwStyle &= ~TCS_EX_FLATSEPARATORS;
144 TabCtrl_SetExtendedStyle(hTab, dwStyle);
145
146
147 //サブクラス化
148 OldMainTabWndProc=(WNDPROC)GetWindowLong(hTab,GWL_WNDPROC);
149 SetWindowLong(hTab,GWL_WNDPROC,(LONG_PTR)MainTabWndProc);
150
151 //ボールド体フォントを生成
152 LOGFONT lf;
153 GetObject(hStatusFont,sizeof(LOGFONT),&lf);
154 lf.lfWeight=FW_BOLD;
155 hBoldFont=CreateFontIndirect(&lf);
156
157 SendMessage(hTab,WM_SETFONT,(long)hBoldFont,0);
158}
159
160CMainTab::~CMainTab(){
161 DeleteObject(hBoldFont);
162}
163
164void CMainTab::InsertItem( const char *lpszText, bool isResize, COLORREF color ){
165 int sw=0;
166 if(TabCtrl_GetItemCount(hTab)==0) sw=1;
167
168 if(color==-1) color=RGB(230,230,230);
169
170 TC_ITEM tcItem;
171 tcItem.mask=TCIF_TEXT|TCIF_PARAM;
172 tcItem.pszText=(LPSTR)lpszText;
173 tcItem.lParam=color;
174 TabCtrl_InsertItem(hTab,0,&tcItem);
175 TabCtrl_SetCurSel(hTab,0);
176
177 if(isResize){
178 if(sw) ResizeOwnerWnd();
179 }
180}
181
182void CMainTab::DeleteItem( const char *lpszText, bool isResize ){
183 int i2;
184 i2=SearchItemIndex(lpszText);
185 if(i2==-1) return;
186
187 TabCtrl_DeleteItem(hTab,i2);
188
189 if(isResize){
190 if(TabCtrl_GetItemCount(hTab)==0) ResizeOwnerWnd();
191 }
192}
193
194void CMainTab::RenameItem( const char *lpszOldText, const char *lpszNewText ){
195 int i2;
196 i2=SearchItemIndex(lpszOldText);
197 if(i2==-1) return;
198
199 SetItemText( i2, lpszNewText );
200}
201
202void CMainTab::NofityModifyDocument( const char *ItemText ){
203 //ドキュメントが変更されたとき、アスタリスクを付けて表示する
204
205 //インデックスを取得
206 int index = SearchItemIndex( ItemText );
207 if( index == -1 ) return;
208
209 //既にアスタリスク表示されていた場合は抜ける
210 if( IsModified( index ) ) return;
211
212 //アスタリスクを付加
213 char temporary[MAX_PATH];
214 lstrcpy( temporary, ItemText );
215 lstrcat( temporary, "*" );
216
217 //タブアイテムを更新
218 SetItemText( index, temporary );
219}
220void CMainTab::NofityUnModifyDocument( const char *ItemText ){
221 //ドキュメントが保存されたとき、アスタリスクを非表示にする
222
223 //インデックスを取得
224 int index = SearchItemIndex( ItemText );
225 if( index == -1 ) return;
226
227 //既にアスタリスクが非表示の場合は抜ける
228 if( ! IsModified( index ) ) return;
229
230 //タブアイテムを更新
231 SetItemText( index, ItemText );
232}
233
234COLORREF CMainTab::GetItemColor( char *ItemText ){
235 //インデックスを取得
236 int index = SearchItemIndex( ItemText );
237 if( index == -1 ) return -1;
238
239 TC_ITEM tcItem;
240 tcItem.mask = TCIF_PARAM;
241 TabCtrl_GetItem( hTab, index, &tcItem );
242 return tcItem.lParam;
243}
244
245void CMainTab::SelChangeEvent(){
246 int i;
247 i=TabCtrl_GetCurSel(hTab);
248
249 char ItemText[MAX_PATH];
250 TC_ITEM tcItem;
251 tcItem.mask=TCIF_TEXT;
252 tcItem.pszText=ItemText;
253 tcItem.cchTextMax=MAX_PATH;
254 TabCtrl_GetItem(hTab,i,&tcItem);
255
256 if( ItemText[ lstrlen( ItemText ) -1 ] == '*' ){
257 //アスタリスクがあったときは取り除く
258 ItemText[ lstrlen( ItemText ) -1 ] = 0;
259 }
260
261 extern MDIINFO MdiInfo[MAX_WNDNUM];
262 for(i=0;i<MAX_WNDNUM;i++){
263 if(lstrcmpi(ItemText,MdiInfo[i].title)==0) break;
264 }
265 BringWindowToTop(MdiInfo[i].hwnd);
266}
267void CMainTab::MdiActiveEvent(char *lpszText){
268 int i2;
269 i2=SearchItemIndex(lpszText);
270 if(i2==-1) return;
271
272 TabCtrl_SetCurSel(hTab,i2);
273}
274
275void CMainTab::draw(HDC hdc){
276 COLORREF colorGray;
277 HBRUSH hGrayBrush;
278
279 int nMaxPage;
280 nMaxPage=TabCtrl_GetItemCount(hTab);
281
282 //ペンを生成
283 HPEN hPen,hOldPen;
284 COLORREF colorPen;
285 colorPen=RGB(127,140,155);
286 hPen=CreatePen(PS_SOLID,0,colorPen);
287 hOldPen=(HPEN)SelectObject(hdc,hPen);
288
289 //描画領域を塗りつぶす
290 RECT rc;
291 GetClientRect(hTab,&rc);
292 FillRect(hdc,&rc,GetSysColorBrush(COLOR_3DFACE));
293
294 //リージョンを生成
295 HRGN hDefaultRgn;
296 hDefaultRgn=CreateRectRgnIndirect(&rc);
297
298 int i;
299 char temporary[MAX_PATH];
300 HFONT hOldFont;
301 TCITEM item;
302 memset(&item,0,sizeof(TCITEM));
303 item.mask=TCIF_TEXT|TCIF_PARAM;
304 item.pszText=temporary;
305 item.cchTextMax=MAX_PATH;
306 for(i=nMaxPage-1;i>=0;i--){
307 if(i==TabCtrl_GetCurSel(hTab)){
308 //フォーカスを持つタブは最後に描画するため、飛び越す
309 continue;
310 }
311
312 TabCtrl_GetItem(hTab,i,&item);
313
314 //座標取得
315 TabCtrl_GetItemRect(hTab,i,&rc);
316
317
318
319 ////////////////////////////
320 // タブ枠を描画
321 ////////////////////////////
322 colorGray=item.lParam;
323
324 //ブラシを生成
325 hGrayBrush=CreateSolidBrush(colorGray);
326
327 SetBkColor(hdc,colorGray);
328
329 HBRUSH hOldBrush;
330 hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush);
331
332 HRGN hRgn1,hRgn2;
333 hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom);
334 hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom);
335
336 SelectObject(hdc,hRgn1);
337 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15);
338 SelectObject(hdc,hRgn2);
339 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3);
340 SelectObject(hdc,hDefaultRgn);
341
342 DeleteObject(hRgn1);
343 DeleteObject(hRgn2);
344
345 SelectObject(hdc,hOldBrush);
346 DeleteObject(hGrayBrush);
347
348
349 extern HFONT hStatusFont;
350 hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
351
352
353
354 //文字を描画
355 DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
356
357
358 SelectObject(hdc,hOldFont);
359 }
360
361
362 /////////////////////////////////
363 // フォーカスを持つタブを描画
364 /////////////////////////////////
365 i=TabCtrl_GetCurSel(hTab);
366
367 TabCtrl_GetItem(hTab,i,&item);
368
369 //座標取得
370 TabCtrl_GetItemRect(hTab,i,&rc);
371
372 {
373 rc.top-=2;
374 ////////////////////////////
375 // タブ枠を描画
376 ////////////////////////////
377 colorGray=item.lParam;
378
379 //ブラシを生成
380 hGrayBrush=CreateSolidBrush(colorGray);
381
382 SetBkColor(hdc,colorGray);
383
384 HBRUSH hOldBrush;
385 hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush);
386
387 HRGN hRgn1,hRgn2;
388 hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom);
389 hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom);
390
391 SelectObject(hdc,hRgn1);
392 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15);
393 SelectObject(hdc,hRgn2);
394 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3);
395 SelectObject(hdc,hDefaultRgn);
396
397 DeleteObject(hRgn1);
398 DeleteObject(hRgn2);
399
400 SelectObject(hdc,hOldBrush);
401 DeleteObject(hGrayBrush);
402
403 rc.top+=2;
404 }
405
406 hOldFont=(HFONT)SelectObject(hdc,hBoldFont);
407
408 //文字を描画
409 DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
410
411 SelectObject(hdc,hOldFont);
412
413
414
415 SelectObject(hdc,hOldPen);
416 DeleteObject(hPen);
417
418 DeleteObject(hDefaultRgn);
419}
Note: See TracBrowser for help on using the repository browser.