source: dev/trunk/ab5.0/abdev/abdev/TabCtrl.cpp@ 481

Last change on this file since 481 was 475, checked in by dai_9181, 16 years ago

構成管理を変更中・・・(いったんコミット)

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