bool RemoveTab(HWND TabWindow, int Index) { assert(IsWindow(TabWindow)); assert(Index >= 0); assert(Index < TabCtrl_GetItemCount(TabWindow)); TC_ITEM TabData; TabData.mask = TCIF_IMAGE | TCIF_PARAM; if(TabCtrl_GetItem(TabWindow, Index, &TabData)) { int CurIndex = TabCtrl_GetCurSel(TabWindow); assert(CurIndex >= -1); if(CurIndex != -1 && TabCtrl_DeleteItem(TabWindow, Index)) { if(TabData.iImage != -1) TabCtrl_RemoveImage(TabWindow, TabData.iImage); int Count = TabCtrl_GetItemCount(TabWindow); assert(Count >= 0); if(Count == 0) // We just removed the last one, do some addition cleanup { ShowWindow(reinterpret_cast<HWND>(TabData.lParam), SW_HIDE); HIMAGELIST ImageList = TabCtrl_GetImageList(TabWindow); if(ImageList) { ImageList_Destroy(ImageList); TabCtrl_SetImageList(TabWindow, NULL); } RemoveProp(TabWindow, PropName); } else if(Index == CurIndex) // We're deleting the currently visible tab { if(Index == Count) // Last tab Index--; TabToFront(TabWindow, Index); } SetTabThemeTexture(reinterpret_cast<HWND>(TabData.lParam), false); return true; } } return false; }
INT_PTR DlgAbout::dlg_proc(UINT message, WPARAM wParam, LPARAM lParam) { static HWND TabWindow; static TabInfo* TabDlgInfo; static TabLibraries* TabDlgLibs; static TabLicense* TabDlgLicense; switch(message) { case WM_INITDIALOG: { // Prepare tabs TabWindow = GetDlgItem(this->window, TabAbout); TabDlgInfo = new TabInfo(this->instance, this->window); TabDlgLibs = new TabLibraries(this->instance, this->window); TabDlgLicense = new TabLicense(this->instance, this->window); TabDlgInfo->modeless(); TabDlgLibs->modeless(); TabDlgLicense->modeless(); AddTab(TabWindow, TabDlgInfo->hwnd(), L"Info", -1); AddTab(TabWindow, TabDlgLibs->hwnd(), L"3rd-party", -1); AddTab(TabWindow, TabDlgLicense->hwnd(), L"License", -1); TabToFront(TabWindow, 0); // Set tab icons /* HICON TabIconFiles = (HICON)LoadImage(Instance, MAKEINTRESOURCE(IDI_SETTINGS_FILE), IMAGE_ICON, 16, 16, 0); HICON TabIconInterface = (HICON)LoadImage(Instance, MAKEINTRESOURCE(IDI_SETTINGS_UI), IMAGE_ICON, 16, 16, 0); SetTabIcon(TabWindow, TAB_FILE, TabIconFiles); SetTabIcon(TabWindow, TAB_UI, TabIconInterface); DestroyIcon(TabIconFiles); DestroyIcon(TabIconInterface); */ } break; case WM_NOTIFY: { const NMHDR* nmHdr = reinterpret_cast<const NMHDR*>(lParam); assert(nmHdr); switch(nmHdr->code) { case TCN_SELCHANGE: // Get selected tab window to front if(nmHdr->hwndFrom == TabWindow) { TabToFront(TabWindow, -1); break; } return false; default: return false; } } break; case WM_COMMAND: switch(LOWORD(wParam)) { case BnOKAbout: SendMessage(this->window, WM_CLOSE, 0, 0); break; default: return false; } break; case WM_CLOSE: TabDlgInfo->close(); TabDlgLibs->close(); TabDlgLicense->close(); delete TabDlgInfo; delete TabDlgLibs; delete TabDlgLicense; this->internal_close(0); break; default: return false; } return true; }
// Главна процедура BOOL CALLBACK MainHandler(HWND Window, UINT Message, WPARAM wParam, LPARAM lParam) { static HWND Window1, Window2; static HWND TabWindow; switch(Message) { case WM_INITDIALOG: { // Създаване два диалога като деца на главния диалог Window1 = CreateDialog(hInst, MAKEINTRESOURCE(IID_TAB1), Window, &TabHandler1); Window2 = CreateDialog(hInst, MAKEINTRESOURCE(IID_TAB2), Window, &TabHandler2); // Инициализиране на TabWindow дръжка със съответния ресурс - TAB_MAIN TabWindow = GetDlgItem(Window, TAB_MAIN); // Създаване на първия раздел (0 = пръв) AddTab(TabWindow, Window1, "Инсталиране Сервиз", 0); // Създаване на втория раздел AddTab(TabWindow, Window2, "Файлове", 1); // Показване на първия раздел TabToFront(TabWindow, 0); } break; case WM_NOTIFY: switch(((NMHDR *)lParam)->code) { case TCN_SELCHANGE: // При промяна на разделите... { char buf[50]; // Ако текущия контрол е TabWindow if (((LPNMHDR)lParam)->hwndFrom == TabWindow) { // Дали е селектиран втория раздел if (SendMessage(((LPNMHDR)lParam)->hwndFrom,(UINT)TCM_GETCURFOCUS,0,0) == 1) { GetDlgItemText(Window1, IDC_STATIC_STATUS, buf, 50); // Дали драйвера е инсталиран и работи if (strcmp("Installed And Running", buf) != 0) { MessageBox(Window, "Драйвера трябва да е стартуван", "FileHide", 0); TabToFront(TabWindow, 0); return FALSE; } } // Показване на следващия раздел (ако е последен -> пръв) TabToFront(TabWindow, -1); } } break; default: return FALSE; } break; case WM_CLOSE: { // Пращане на WM_CLOSE към втория диалог за стопиране и // изтриване на драйвера, преди да се изключи програмата SendMessage(Window1, WM_CLOSE, 0, 0); DestroyWindow(Window2); DestroyWindow(Window1); TabCleanup(TabWindow); EndDialog(Window, 0); } break; default: return FALSE; } return TRUE; }