source: dev/ProjectEditor/TabCtrl.cpp@ 24

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

保存されていないドキュメントのタブに(*)をつける機能に対応。
MDITEXTEDITINFOをCMdiTextEditに変更。今後、オブジェクト指向化を進める。

File size: 9.4 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 extern MDIINFO MdiInfo[MAX_WNDNUM];
247 char temporary[MAX_PATH];
248
249 int i;
250 i=TabCtrl_GetCurSel(hTab);
251
252 TC_ITEM tcItem;
253 tcItem.mask=TCIF_TEXT;
254 tcItem.pszText=temporary;
255 tcItem.cchTextMax=MAX_PATH;
256 TabCtrl_GetItem(hTab,i,&tcItem);
257
258 for(i=0;i<MAX_WNDNUM;i++){
259 if(lstrcmpi(temporary,MdiInfo[i].title)==0) break;
260 }
261 BringWindowToTop(MdiInfo[i].hwnd);
262}
263void CMainTab::MdiActiveEvent(char *lpszText){
264 int i2;
265 i2=SearchItemIndex(lpszText);
266 if(i2==-1) return;
267
268 TabCtrl_SetCurSel(hTab,i2);
269}
270
271void CMainTab::draw(HDC hdc){
272 COLORREF colorGray;
273 HBRUSH hGrayBrush;
274
275 int nMaxPage;
276 nMaxPage=TabCtrl_GetItemCount(hTab);
277
278 //ペンを生成
279 HPEN hPen,hOldPen;
280 COLORREF colorPen;
281 colorPen=RGB(127,140,155);
282 hPen=CreatePen(PS_SOLID,0,colorPen);
283 hOldPen=(HPEN)SelectObject(hdc,hPen);
284
285 //描画領域を塗りつぶす
286 RECT rc;
287 GetClientRect(hTab,&rc);
288 FillRect(hdc,&rc,GetSysColorBrush(COLOR_3DFACE));
289
290 //リージョンを生成
291 HRGN hDefaultRgn;
292 hDefaultRgn=CreateRectRgnIndirect(&rc);
293
294 int i;
295 char temporary[MAX_PATH];
296 HFONT hOldFont;
297 TCITEM item;
298 memset(&item,0,sizeof(TCITEM));
299 item.mask=TCIF_TEXT|TCIF_PARAM;
300 item.pszText=temporary;
301 item.cchTextMax=MAX_PATH;
302 for(i=nMaxPage-1;i>=0;i--){
303 if(i==TabCtrl_GetCurSel(hTab)){
304 //フォーカスを持つタブは最後に描画するため、飛び越す
305 continue;
306 }
307
308 TabCtrl_GetItem(hTab,i,&item);
309
310 //座標取得
311 TabCtrl_GetItemRect(hTab,i,&rc);
312
313
314
315 ////////////////////////////
316 // タブ枠を描画
317 ////////////////////////////
318 colorGray=item.lParam;
319
320 //ブラシを生成
321 hGrayBrush=CreateSolidBrush(colorGray);
322
323 SetBkColor(hdc,colorGray);
324
325 HBRUSH hOldBrush;
326 hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush);
327
328 HRGN hRgn1,hRgn2;
329 hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom);
330 hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom);
331
332 SelectObject(hdc,hRgn1);
333 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15);
334 SelectObject(hdc,hRgn2);
335 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3);
336 SelectObject(hdc,hDefaultRgn);
337
338 DeleteObject(hRgn1);
339 DeleteObject(hRgn2);
340
341 SelectObject(hdc,hOldBrush);
342 DeleteObject(hGrayBrush);
343
344
345 extern HFONT hStatusFont;
346 hOldFont=(HFONT)SelectObject(hdc,hStatusFont);
347
348
349
350 //文字を描画
351 DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
352
353
354 SelectObject(hdc,hOldFont);
355 }
356
357
358 /////////////////////////////////
359 // フォーカスを持つタブを描画
360 /////////////////////////////////
361 i=TabCtrl_GetCurSel(hTab);
362
363 TabCtrl_GetItem(hTab,i,&item);
364
365 //座標取得
366 TabCtrl_GetItemRect(hTab,i,&rc);
367
368 {
369 rc.top-=2;
370 ////////////////////////////
371 // タブ枠を描画
372 ////////////////////////////
373 colorGray=item.lParam;
374
375 //ブラシを生成
376 hGrayBrush=CreateSolidBrush(colorGray);
377
378 SetBkColor(hdc,colorGray);
379
380 HBRUSH hOldBrush;
381 hOldBrush=(HBRUSH)SelectObject(hdc,hGrayBrush);
382
383 HRGN hRgn1,hRgn2;
384 hRgn1=CreateRectRgn(rc.left,rc.top,rc.right-20,rc.bottom);
385 hRgn2=CreateRectRgn(rc.right-20,rc.top,rc.right+2,rc.bottom);
386
387 SelectObject(hdc,hRgn1);
388 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,20,15);
389 SelectObject(hdc,hRgn2);
390 RoundRect(hdc,rc.left,rc.top,rc.right+2,rc.bottom+20,3,3);
391 SelectObject(hdc,hDefaultRgn);
392
393 DeleteObject(hRgn1);
394 DeleteObject(hRgn2);
395
396 SelectObject(hdc,hOldBrush);
397 DeleteObject(hGrayBrush);
398
399 rc.top+=2;
400 }
401
402 hOldFont=(HFONT)SelectObject(hdc,hBoldFont);
403
404 //文字を描画
405 DrawText(hdc,item.pszText,-1,&rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
406
407 SelectObject(hdc,hOldFont);
408
409
410
411 SelectObject(hdc,hOldPen);
412 DeleteObject(hPen);
413
414 DeleteObject(hDefaultRgn);
415}
Note: See TracBrowser for help on using the repository browser.