-
Notifications
You must be signed in to change notification settings - Fork 3
/
tabs.cpp
93 lines (78 loc) · 2.92 KB
/
tabs.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <windows.h>
#include <commctrl.h> // Tabs
char PropName[] = "TabCtrlCurWnd";
int AddTab(HWND TabWindow, HWND Window, char * Caption, int Index) {
TC_ITEM TabData;
RECT TabRect;
// Àêî èíäåêñà å -1, òúðñè ñå ïîñëåäíèÿ îò ðàçäåëèòå
if(Index == -1)
Index = SendMessage(TabWindow, TCM_GETITEMCOUNT, 0, 0);
TabData.mask = TCIF_TEXT | TCIF_PARAM;
TabData.pszText = Caption;
TabData.cchTextMax = strlen(Caption) + 1;
TabData.lParam = (LPARAM)Window;
Index = SendMessage(TabWindow, TCM_INSERTITEM, Index, (LPARAM)&TabData);
if(Index != -1) {
// Ñëåäâàùèòå ðåäîâå ãî ðàçìåñòâàò è îðàçìåðàâàò ãëàâíèÿ ïðîçîðåö
// çà äà ñå ñúáåðå â äèìåíçèèòå íà ðàçäåëà
GetWindowRect(TabWindow, &TabRect);
MapWindowPoints(HWND_DESKTOP, GetParent(TabWindow), (POINT *)&TabRect, 2);
SendMessage(TabWindow, TCM_ADJUSTRECT, FALSE, (LPARAM)&TabRect);
TabRect.right -= TabRect.left; // .right == width
TabRect.bottom -= TabRect.top; // .bottom == heigth
SetWindowPos(Window, HWND_BOTTOM, TabRect.left, TabRect.top, TabRect.right, TabRect.bottom, SWP_HIDEWINDOW);
// Ñòîéíîñòòà íà äðúæêàòà îò ïîäïðîçîðåöà ñå ñëàãà
// â ñâîéñòâîòî "TabCtrlCurWnd" íà êîíòðîëàòà çà ðàçäåëè
// çà ïîëåñíî íàìèðàíå ïðè èçòðèâàíåòî
SetProp(TabWindow, PropName, (HANDLE)Window);
}
return Index;
}
int TabToFront(HWND TabWindow, int Index) {
TC_ITEM TabData;
// Àêî èíäåêñà å -1, òúðñè ñå âèäèìèÿ ðàçäåë
if(Index == -1)
Index = SendMessage(TabWindow, TCM_GETCURSEL, 0, 0);
TabData.mask = TCIF_PARAM;
if(SendMessage(TabWindow, TCM_GETITEM, Index, (LPARAM)&TabData)) {
// Ñêðèâà ñå ïðåäèøíèÿ ïîäïðîçîðåö
ShowWindow((HWND)GetProp(TabWindow, PropName), SW_HIDE);
// Ïîêàçâà ñå òåêóùèÿ ïîäïðîçîðåö
SetWindowPos((HWND)TabData.lParam, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
// Çàïèñâà ñå ñòîéíîñòòà íà äðúæêàòà îò ïîäïðîçîðåöà â ñâîéñòâîòî íà êîíòðîëàòà çà ðàçäåëè
SetProp(TabWindow, PropName, (HANDLE)TabData.lParam);
SendMessage(TabWindow, TCM_SETCURSEL, Index, 0);
return Index;
}
return -1;
}
BOOL RemoveTab(HWND TabWindow, int Index) {
TC_ITEM TabData;
int CurIndex, Count;
TabData.mask = TCIF_PARAM;
if(SendMessage(TabWindow, TCM_GETITEM, Index, (LPARAM)&TabData)) {
CurIndex = SendMessage(TabWindow, TCM_GETCURSEL, 0, 0);
if(SendMessage(TabWindow, TCM_DELETEITEM, Index, 0)) {
Count = SendMessage(TabWindow, TCM_GETITEMCOUNT, 0, 0);
if(!Count){
ShowWindow((HWND)TabData.lParam, SW_HIDE);
RemoveProp(TabWindow, PropName);
} else if(Index == CurIndex){ // Àêî ñå èçòðèâà ðàçäåëà, êîéòî å âèäèì â ìîìåíòà
if(Index == Count) Index--; // Àêî å ïîñëåäíèÿ ðàçäåë
TabToFront(TabWindow, Index);
}
return TRUE;
}
}
return FALSE;
}
BOOL TabCleanup(HWND TabWindow) {
int Count, i;
BOOL Result = TRUE;
Count = SendMessage(TabWindow, TCM_GETITEMCOUNT, 0, 0);
// Âñåêè ðàçäåë ñå èçòðèâà ïîîòäåëíî
for(i = 1; i <= Count; i++) {
Result = RemoveTab(TabWindow, Count-i) && Result;
}
return Result;
}