void CTabPanelWin::ShowSearchPane(bool bShow) { if (bShow && gpSet->isMultiShowSearch) { _ASSERTE(isMainThread()); if (!IsSearchShownInt(false)) { REBARBANDINFO rbBand = {REBARBANDINFO_SIZE}; // не используем size, т.к. приходит "новый" размер из висты и в XP обламываемся HWND hFindPane = NULL; if (!mp_Find) mp_Find = new CFindPanel(gpConEmu); int iPaneHeight; SIZE sz = {0,0}; if (mn_TabHeight > 0) { iPaneHeight = mn_TabHeight; } else if (mh_Toolbar) { SendMessage(mh_Toolbar, TB_GETMAXSIZE, 0, (LPARAM)&sz); iPaneHeight = sz.cy; } else { iPaneHeight = QueryTabbarHeight() - 4; } hFindPane = mp_Find->CreatePane(mh_Rebar, iPaneHeight); if (hFindPane) { rbBand.fMask = RBBIM_SIZE | RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_ID | RBBIM_STYLE; rbBand.fStyle = RBBS_CHILDEDGE | RBBS_FIXEDSIZE /*| RBBS_VARIABLEHEIGHT*/; #if 0 rbBand.fMask |= RBBIM_COLORS; rbBand.clrFore = RGB(255,255,255); rbBand.clrBack = RGB(0,255,0); #endif rbBand.wID = rbi_FindBar; rbBand.hwndChild = hFindPane; rbBand.cx = rbBand.cxMinChild = rbBand.cxIdeal = mp_Find->GetMinWidth(); rbBand.cyChild = rbBand.cyMinChild = rbBand.cyMaxChild = iPaneHeight; // + mn_ThemeHeightDiff; } // Insert before toolbar INT_PTR nPaneIndex = SendMessage(mh_Rebar, RB_IDTOINDEX, rbi_ToolBar, 0); if (nPaneIndex < 0) nPaneIndex = -1; if (!hFindPane || !SendMessage(mh_Rebar, RB_INSERTBAND, nPaneIndex, (LPARAM)&rbBand) || !mp_Find->OnCreateFinished()) { DisplayLastError(_T("Can't initialize rebar (searchbar)")); bShow = false; } } } // Delete band? if (!bShow) { _ASSERTEX(!bShow); INT_PTR nPaneIndex = SendMessage(mh_Rebar, RB_IDTOINDEX, rbi_FindBar, 0); if (nPaneIndex >= 0) { SendMessage(mh_Rebar, RB_DELETEBAND, nPaneIndex, 0); SafeDelete(mp_Find); } } }
HWND CTabPanelWin::CreateTabbar() { gpSetCls->CheckTheming(); if (!mh_Rebar) return NULL; // создаётся только как Band в ReBar if (mh_Tabbar) return mh_Tabbar; // Уже создали // Важно проверку делать после создания главного окна, иначе IsAppThemed будет возвращать FALSE BOOL bAppThemed = FALSE, bThemeActive = FALSE; FAppThemed pfnThemed = NULL; HMODULE hUxTheme = LoadLibrary(L"UxTheme.dll"); if (hUxTheme) { pfnThemed = (FAppThemed)GetProcAddress(hUxTheme, "IsAppThemed"); if (pfnThemed) bAppThemed = pfnThemed(); pfnThemed = (FAppThemed)GetProcAddress(hUxTheme, "IsThemeActive"); if (pfnThemed) bThemeActive = pfnThemed(); FreeLibrary(hUxTheme); hUxTheme = NULL; } if (!bAppThemed || !bThemeActive) mn_ThemeHeightDiff = 2; RECT rcClient = {-32000, -32000, -32000+300, -32000+100}; if (ghWnd) { rcClient = gpConEmu->GetGuiClientRect(); } else { _ASSERTE(ghWnd!=NULL && "ConEmu main window must be created already!"); } DWORD nPlacement = TCS_SINGLELINE|WS_VISIBLE|WS_CHILD; mh_Tabbar = CreateWindow(WC_TABCONTROL, NULL, nPlacement | WS_CLIPSIBLINGS | TCS_FOCUSNEVER, 0, 0, rcClient.right, 0, mh_Rebar, NULL, g_hInstance, NULL); if (mh_Tabbar == NULL) { return NULL; } // Надо TabPanelWinMap map = {this}; //{ CTabPanelWin* object; HWND hWnd; WNDPROC defaultProc; }; map.defaultProc = (WNDPROC)SetWindowLongPtr(mh_Tabbar, GWLP_WNDPROC, (LONG_PTR)_TabProc); map.hWnd = mh_Tabbar; gp_TabPanelWinMap->Set(mh_Tabbar, map); SendMessage(mh_Tabbar, TCM_SETIMAGELIST, 0, (LPARAM)mp_Owner->GetTabIcons()); if (!mh_TabTip || !IsWindow(mh_TabTip)) InitTooltips(mh_Tabbar); TabCtrl_SetToolTips(mh_Tabbar, mh_TabTip); UpdateTabFontInt(); if (!mh_Balloon || !IsWindow(mh_Balloon)) { InitTooltips(mh_Tabbar); } // Добавляет закладку, или меняет (при необходимости) заголовок существующей AddTabInt(gpConEmu->GetDefaultTabLabel(), 0, gpConEmu->mb_IsUacAdmin, -1); // нас интересует смещение клиентской области. Т.е. начало - из 0. Остальное не важно rcClient = MakeRect(600, 400); QueryTabbarHeight(); return mh_Tabbar; }
HWND CTabPanelWin::CreateTabbar() { gpSetCls->CheckTheming(); if (!mh_Rebar) return NULL; // Табы создаются только как Band в ReBar if (mh_Tabbar) return mh_Tabbar; // Уже создали //if (!m_TabIcons.IsInitialized()) //{ // InitIconList(); //} // Важно проверку делать после создания главного окна, иначе IsAppThemed будет возвращать FALSE BOOL bAppThemed = FALSE, bThemeActive = FALSE; FAppThemed pfnThemed = NULL; HMODULE hUxTheme = LoadLibrary(L"UxTheme.dll"); if (hUxTheme) { pfnThemed = (FAppThemed)GetProcAddress(hUxTheme, "IsAppThemed"); if (pfnThemed) bAppThemed = pfnThemed(); pfnThemed = (FAppThemed)GetProcAddress(hUxTheme, "IsThemeActive"); if (pfnThemed) bThemeActive = pfnThemed(); FreeLibrary(hUxTheme); hUxTheme = NULL; } if (!bAppThemed || !bThemeActive) mn_ThemeHeightDiff = 2; /*mh_TabbarP = CreateWindow(_T("VirtualConsoleClassBar"), _T(""), WS_VISIBLE|WS_CHILD, 0,0,340,22, ghWnd, 0, 0, 0); if (!mh_TabbarP) return NULL;*/ RECT rcClient = {-32000, -32000, -32000+300, -32000+100}; if (ghWnd) { rcClient = gpConEmu->GetGuiClientRect(); } else { _ASSERTE(ghWnd!=NULL && "ConEmu main window must be created already!"); } DWORD nPlacement = TCS_SINGLELINE|WS_VISIBLE|WS_CHILD/*|TCS_BUTTONS*//*|TCS_TOOLTIPS*/; //|((gpSet->nTabsLocation == 1) ? TCS_BOTTOM : 0); mh_Tabbar = CreateWindow(WC_TABCONTROL, NULL, nPlacement | WS_CLIPSIBLINGS | TCS_FOCUSNEVER, 0, 0, rcClient.right, 0, mh_Rebar, NULL, g_hInstance, NULL); if (mh_Tabbar == NULL) { return NULL; } //#if !defined(__GNUC__) //#pragma warning (disable : 4312) //#endif // Надо TabPanelWinMap map = {this}; //{ CTabPanelWin* object; HWND hWnd; WNDPROC defaultProc; }; map.defaultProc = (WNDPROC)SetWindowLongPtr(mh_Tabbar, GWLP_WNDPROC, (LONG_PTR)_TabProc); map.hWnd = mh_Tabbar; gp_TabPanelWinMap->Set(mh_Tabbar, map); SendMessage(mh_Tabbar, TCM_SETIMAGELIST, 0, (LPARAM)mp_Owner->GetTabIcons()); if (!mh_TabTip || !IsWindow(mh_TabTip)) InitTooltips(mh_Tabbar); TabCtrl_SetToolTips(mh_Tabbar, mh_TabTip); UpdateTabFontInt(); //HFONT hFont = CreateFont(gpSet->nTabFontHeight, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, gpSet->nTabFontCharSet, OUT_DEFAULT_PRECIS, // CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, gpSet->sTabFontFace); //SendMessage(mh_Tabbar, WM_SETFONT, WPARAM(hFont), TRUE); if (!mh_Balloon || !IsWindow(mh_Balloon)) { InitTooltips(mh_Tabbar); } // Добавляет закладку, или меняет (при необходимости) заголовок существующей //AddTab(gpConEmu->isFar() ? gpSet->szTabPanels : gpSet->pszTabConsole, 0); AddTabInt(gpConEmu->GetDefaultTabLabel(), 0, gpConEmu->mb_IsUacAdmin, -1); // нас интересует смещение клиентской области. Т.е. начало - из 0. Остальное не важно rcClient = MakeRect(600, 400); QueryTabbarHeight(); return mh_Tabbar; }