// Общая DlgProc на _все_ вкладки INT_PTR CSetPgBase::pageOpProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { TabHwndIndex pgId = thi_Last; CSetPgBase* pObj = NULL; if (messg != WM_INITDIALOG) { ConEmuSetupPages* pPage = NULL; pgId = gpSetCls->GetPageId(hDlg, &pPage); if ((pgId == thi_Last) || !pPage || !pPage->pPage) { _ASSERTE(FALSE && "Page was not created properly yet"); return TRUE; } pObj = pPage->pPage; _ASSERTE(pObj && (pObj->mn_ActivateTabMsg != WM_APP)); if (!pObj) { return TRUE; } if (pObj && pObj->mp_DpiAware && pObj->mp_DpiAware->ProcessDpiMessages(hDlg, messg, wParam, lParam)) { return TRUE; } } if ((messg == WM_INITDIALOG) || (pObj && (messg == pObj->mn_ActivateTabMsg))) { bool bInitial = (messg == WM_INITDIALOG); if (bInitial) { if (!lParam) { _ASSERTE(lParam != 0); return 0; } pObj = (CSetPgBase*)lParam; } if (!pObj || (pObj->GetPageType() < thi_Fonts) || (pObj->GetPageType() >= thi_Last)) { _ASSERTE(pObj && (pObj->GetPageType() >= thi_Fonts && pObj->GetPageType() < thi_Last)); return 0; } _ASSERTE(pObj->Dlg() == NULL || pObj->Dlg() == hDlg); pgId = pObj->GetPageType(); if (bInitial) { _ASSERTE(pObj->mp_InfoPtr && pObj->mp_InfoPtr->PageIndex >= 0 && pObj->mp_InfoPtr->hPage == NULL); pObj->mp_InfoPtr->hPage = hDlg; pObj->mh_Dlg = hDlg; CDynDialog* pDynDialog = CDynDialog::GetDlgClass(hDlg); _ASSERTE(pObj->mp_DynDialog==NULL || pObj->mp_DynDialog==pDynDialog); #ifdef _DEBUG // pObj->mp_DynDialog is NULL on first WM_INIT if (pObj->mp_DynDialog) { _ASSERTE(pObj->mp_DynDialog->mh_Dlg == hDlg); } #endif HWND hPlace = GetDlgItem(pObj->mh_Parent, tSetupPagePlace); RECT rcClient; GetWindowRect(hPlace, &rcClient); MapWindowPoints(NULL, pObj->mh_Parent, (LPPOINT)&rcClient, 2); if (pObj->mp_DpiAware) pObj->mp_DpiAware->Attach(hDlg, pObj->mh_Parent, pDynDialog); MoveWindowRect(hDlg, rcClient); } else { _ASSERTE(pObj->mp_InfoPtr->PageIndex >= 0 && pObj->mp_InfoPtr->hPage == hDlg); } MSetter lockSelChange(&pObj->mb_SkipSelChange); pObj->OnInitDialog(hDlg, bInitial); if (bInitial) { EditIconHint_Subclass(hDlg, pObj->mh_Parent); gpSetCls->RegisterTipsFor(hDlg); } pObj->OnPostLocalize(hDlg); } else if ((messg == WM_HELP) || (messg == HELP_WM_HELP)) { _ASSERTE(messg == WM_HELP); return gpSetCls->wndOpProc(hDlg, messg, wParam, lParam); } else if (pgId == thi_Apps) { // Страничка "App distinct" в некотором смысле особенная. // У многих контролов ИД дублируются с другими вкладками. CSetPgApps* pAppsPg; if (gpSetCls->GetPageObj(pAppsPg)) { return pAppsPg->PageDlgProc(hDlg, messg, wParam, lParam); } else { _ASSERTE(pAppsPg!=NULL); return 0; } } else if (pgId == thi_Integr) { return pObj->PageDlgProc(hDlg, messg, wParam, lParam); } else if (pgId == thi_Startup) { return pObj->PageDlgProc(hDlg, messg, wParam, lParam); } else // All other messages switch (messg) { #ifdef _DEBUG case WM_INITDIALOG: // Должно быть обработано выше _ASSERTE(messg != WM_INITDIALOG); break; #endif case WM_COMMAND: { switch (HIWORD(wParam)) { case BN_CLICKED: return CSetDlgButtons::OnButtonClicked(hDlg, wParam, lParam); case EN_CHANGE: // TODO: Remove duplicate condition! if (!pObj->mb_SkipSelChange && !pObj->mb_IgnoreEditChanged) pObj->OnEditChanged(hDlg, LOWORD(wParam)); return 0; case CBN_EDITCHANGE: case CBN_SELCHANGE/*LBN_SELCHANGE*/: if (!pObj->mb_SkipSelChange) pObj->OnComboBox(hDlg, LOWORD(wParam), HIWORD(wParam)); return 0; case LBN_DBLCLK: gpSetCls->OnListBoxDblClk(hDlg, wParam, lParam); return 0; case CBN_KILLFOCUS: if (gpSetCls->mn_LastChangingFontCtrlId && (LOWORD(wParam) == gpSetCls->mn_LastChangingFontCtrlId)) { _ASSERTE(pgId == thi_Fonts); PostMessage(hDlg, gpSetCls->mn_MsgRecreateFont, gpSetCls->mn_LastChangingFontCtrlId, 0); gpSetCls->mn_LastChangingFontCtrlId = 0; return 0; } break; default: if (HIWORD(wParam) == 0xFFFF && LOWORD(wParam) == lbConEmuHotKeys) { dynamic_cast<CSetPgKeys*>(pObj)->OnHotkeysNotify(hDlg, wParam, 0); } } // switch (HIWORD(wParam)) } // WM_COMMAND break; case WM_MEASUREITEM: return gpSetCls->OnMeasureFontItem(hDlg, messg, wParam, lParam); case WM_DRAWITEM: return gpSetCls->OnDrawFontItem(hDlg, messg, wParam, lParam); case WM_CTLCOLORSTATIC: return pObj->OnCtlColorStatic(hDlg, (HDC)wParam, (HWND)lParam, GetDlgCtrlID((HWND)lParam)); case WM_SETCURSOR: return pObj->OnSetCursor(hDlg, (HWND)wParam, GetDlgCtrlID((HWND)wParam), LOWORD(lParam), HIWORD(lParam)); case WM_HSCROLL: { if ((pgId == thi_Backgr) && (HWND)lParam == GetDlgItem(hDlg, slDarker)) { int newV = SendDlgItemMessage(hDlg, slDarker, TBM_GETPOS, 0, 0); if (newV != gpSet->bgImageDarker) { gpSetCls->SetBgImageDarker(newV, true); //gpSet->bgImageDarker = newV; //TCHAR tmp[10]; //_wsprintf(tmp, SKIPLEN(countof(tmp)) L"%i", gpSet->bgImageDarker); //SetDlgItemText(hDlg, tDarker, tmp); //// Картинку может установить и плагин //if (gpSet->isShowBgImage && gpSet->sBgImage[0]) // gpSetCls->LoadBackgroundFile(gpSet->sBgImage); //else // gpSetCls->NeedBackgroundUpdate(); //gpConEmu->Update(true); } } else if ((pgId == thi_Transparent) && (HWND)lParam == GetDlgItem(hDlg, slTransparent)) { int newV = SendDlgItemMessage(hDlg, slTransparent, TBM_GETPOS, 0, 0); if (newV != gpSet->nTransparent) { CSettings::checkDlgButton(hDlg, cbTransparent, (newV != MAX_ALPHA_VALUE) ? BST_CHECKED : BST_UNCHECKED); gpSet->nTransparent = newV; if (!gpSet->isTransparentSeparate) SendDlgItemMessage(hDlg, slTransparentInactive, TBM_SETPOS, (WPARAM)true, (LPARAM)gpSet->nTransparent); gpConEmu->OnTransparent(); } } else if ((pgId == thi_Transparent) && (HWND)lParam == GetDlgItem(hDlg, slTransparentInactive)) { int newV = SendDlgItemMessage(hDlg, slTransparentInactive, TBM_GETPOS, 0, 0); if (gpSet->isTransparentSeparate && (newV != gpSet->nTransparentInactive)) { //checkDlgButton(hDlg, cbTransparentInactive, (newV!=MAX_ALPHA_VALUE) ? BST_CHECKED : BST_UNCHECKED); gpSet->nTransparentInactive = newV; gpConEmu->OnTransparent(); } } } // WM_HSCROLL break; case WM_NOTIFY: { if (((NMHDR*)lParam)->code == TTN_GETDISPINFO) { return gpSetCls->ProcessTipHelp(hDlg, messg, wParam, lParam); } else switch (((NMHDR*)lParam)->idFrom) { case lbActivityLog: if (!pObj->mb_SkipSelChange) return gpSetCls->OnActivityLogNotify(hDlg, wParam, lParam); break; case lbConEmuHotKeys: if (!pObj->mb_SkipSelChange) return dynamic_cast<CSetPgKeys*>(pObj)->OnHotkeysNotify(hDlg, wParam, lParam); break; } return 0; } // WM_NOTIFY break; case WM_TIMER: if (wParam == BALLOON_MSG_TIMERID) { KillTimer(hDlg, BALLOON_MSG_TIMERID); SendMessage(gpSetCls->hwndBalloon, TTM_TRACKACTIVATE, FALSE, (LPARAM)&gpSetCls->tiBalloon); SendMessage(gpSetCls->hwndTip, TTM_ACTIVATE, TRUE, 0); } break; default: { if (messg == gpSetCls->mn_MsgRecreateFont) { gpSetCls->RecreateFont(LOWORD(wParam)); } else if (messg == gpSetCls->mn_MsgLoadFontFromMain) { CSetPgFonts* pFonts = NULL; if (gpSetCls->GetPageObj(pFonts)) { if (pgId == thi_Views) pFonts->CopyFontsTo(hDlg, tThumbsFontName, tTilesFontName, 0); else if (pgId == thi_Tabs) pFonts->CopyFontsTo(hDlg, tTabFontFace, 0); else if (pgId == thi_Status) pFonts->CopyFontsTo(hDlg, tStatusFontFace, 0); } } else if (messg == gpSetCls->mn_MsgUpdateCounter) { gpSetCls->PostUpdateCounters(true); } else if (messg == DBGMSG_LOG_ID && pgId == thi_Debug) { MSetter lockSelChange(&pObj->mb_SkipSelChange); if (wParam == DBGMSG_LOG_SHELL_MAGIC) { DebugLogShellActivity *pShl = (DebugLogShellActivity*)lParam; gpSetCls->debugLogShell(hDlg, pShl); } // DBGMSG_LOG_SHELL_MAGIC else if (wParam == DBGMSG_LOG_INPUT_MAGIC) { CESERVER_REQ_PEEKREADINFO* pInfo = (CESERVER_REQ_PEEKREADINFO*)lParam; gpSetCls->debugLogInfo(hDlg, pInfo); } // DBGMSG_LOG_INPUT_MAGIC else if (wParam == DBGMSG_LOG_CMD_MAGIC) { CSettings::LogCommandsData* pCmd = (CSettings::LogCommandsData*)lParam; gpSetCls->debugLogCommand(hDlg, pCmd); } // DBGMSG_LOG_CMD_MAGIC } // if (messg == DBGMSG_LOG_ID && hDlg == gpSetCls->hDebug) else { pObj->PageDlgProc(hDlg, messg, wParam, lParam); } } // default: } //switch (messg) return 0; }
INT_PTR CSetPgApps::pageOpProc_AppsChild(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { static int nLastScrollPos = 0; CSetPgApps* pObj; if (!gpSetCls->GetPageObj(pObj)) { _ASSERTE(FALSE && "CSetPgApps was not created yet"); return FALSE; } switch (messg) { case WM_INITDIALOG: nLastScrollPos = 0; gpSetCls->RegisterTipsFor(hDlg); return FALSE; case WM_NOTIFY: { LPNMHDR phdr = (LPNMHDR)lParam; if (phdr->code == TTN_GETDISPINFO) { return gpSetCls->ProcessTipHelp(hDlg, messg, wParam, lParam); } break; } case WM_MOUSEWHEEL: { SHORT nDir = (SHORT)HIWORD(wParam); if (nDir) { pageOpProc_AppsChild(hDlg, WM_VSCROLL, (nDir > 0) ? SB_PAGEUP : SB_PAGEDOWN, 0); } } return 0; case WM_VSCROLL: { int dx = 0, dy = 0; SCROLLINFO si = {sizeof(si)}; si.fMask = SIF_POS|SIF_RANGE|SIF_PAGE; GetScrollInfo(hDlg, SB_VERT, &si); int nPos = 0; SHORT nCode = (SHORT)LOWORD(wParam); if ((nCode == SB_THUMBPOSITION) || (nCode == SB_THUMBTRACK)) { nPos = (SHORT)HIWORD(wParam); } else { nPos = si.nPos; int nDelta = 16; // Высота CheckBox'a RECT rcChild = {}; if (GetWindowRect(GetDlgItem(hDlg, cbExtendFontsOverride), &rcChild)) nDelta = rcChild.bottom - rcChild.top; switch (nCode) { case SB_LINEDOWN: case SB_PAGEDOWN: nPos = min(si.nMax,si.nPos+nDelta); break; //case SB_PAGEDOWN: // nPos = min(si.nMax,si.nPos+si.nPage); // break; case SB_LINEUP: case SB_PAGEUP: nPos = max(si.nMin,si.nPos-nDelta); break; //case SB_PAGEUP: // nPos = max(si.nMin,si.nPos-si.nPage); // break; } } dy = nLastScrollPos - nPos; nLastScrollPos = nPos; si.fMask = SIF_POS; si.nPos = nPos; SetScrollInfo(hDlg, SB_VERT, &si, TRUE); if (dy) { ScrollWindowEx(hDlg, dx, dy, NULL, NULL, NULL, NULL, SW_SCROLLCHILDREN|SW_INVALIDATE|SW_ERASE); } } return FALSE; default: if (pObj->mp_DpiDistinct2 && pObj->mp_DpiDistinct2->ProcessDpiMessages(hDlg, messg, wParam, lParam)) { return TRUE; } } HWND hParent = GetParent(hDlg); return pObj->PageDlgProc(hParent, messg, wParam, lParam); }