// // utbdlgs.cpp // #include "private.h" #include "globals.h" #include "resource.h" #include "tipbar.h" #include "utbdlgs.h" #include "cregkey.h" #include "regstr.h" extern HINSTANCE g_hInst; const TCHAR c_szCTFMon[] = TEXT("CTFMON.EXE"); BOOL CUTBCloseLangBarDlg::_fIsDlgShown = FALSE; BOOL CUTBMinimizeLangBarDlg::_fIsDlgShown = FALSE; //+--------------------------------------------------------------------------- // // DoCloseLangbar // //---------------------------------------------------------------------------- void DoCloseLangbar() { CMyRegKey key; ITfLangBarMgr *putb = NULL; HRESULT hr = TF_CreateLangBarMgr(&putb); if (SUCCEEDED(hr) && putb) { hr = putb->ShowFloating(TF_SFT_HIDDEN); SafeReleaseClear(putb); } if (SUCCEEDED(hr)) TurnOffSpeechIfItsOn(); if (key.Open(HKEY_CURRENT_USER, REGSTR_PATH_RUN, KEY_ALL_ACCESS) == S_OK) { key.DeleteValue(c_szCTFMon); } } ////////////////////////////////////////////////////////////////////////////// // // CUTBLangBarDlg // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // DlgProc // //---------------------------------------------------------------------------- INT_PTR CALLBACK CUTBLangBarDlg::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: SetThis(hDlg, lParam); // // System could get cmdshow from USERSTARTUPDATA and it is // minimized. So we need to restore the window. // ShowWindow(hDlg, SW_RESTORE); UpdateWindow(hDlg); break; case WM_COMMAND: GetThis(hDlg)->OnCommand(hDlg, wParam, lParam); break; default: return FALSE; } return TRUE; } //+--------------------------------------------------------------------------- // // StartThread // //---------------------------------------------------------------------------- BOOL CUTBLangBarDlg::StartThread() { HANDLE hThread; DWORD dwThreadId; if (IsDlgShown()) return FALSE; SetDlgShown(TRUE); hThread = CreateThread(NULL, 0, s_ThreadProc, this, 0, &dwThreadId); if (hThread) { _AddRef(); CloseHandle(hThread); } else SetDlgShown(FALSE); return TRUE; } //+--------------------------------------------------------------------------- // // s_ThreadProc // //---------------------------------------------------------------------------- DWORD CUTBLangBarDlg::s_ThreadProc(void *pv) { CUTBLangBarDlg *_this = (CUTBLangBarDlg *)pv; return _this->ThreadProc(); } //+--------------------------------------------------------------------------- // // ThreadProc // //---------------------------------------------------------------------------- DWORD CUTBLangBarDlg::ThreadProc() { Assert(_pszDlgStr); MuiDialogBoxParam(g_hInst, _pszDlgStr, NULL, DlgProc, (LPARAM)this); SetDlgShown(FALSE); _Release(); return TRUE; } ////////////////////////////////////////////////////////////////////////////// // // CUTBCloseLangBarDlg // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // DoModal // //---------------------------------------------------------------------------- int CUTBCloseLangBarDlg::DoModal(HWND hWnd) { CMyRegKey key; BOOL bShow = TRUE; if (key.Open(HKEY_CURRENT_USER, c_szUTBKey, KEY_READ) == S_OK) { DWORD dwValue; if (key.QueryValue(dwValue, c_szDontShowCloseLangBarDlg) == S_OK) bShow = dwValue ? FALSE : TRUE; } if (!bShow) return 0; StartThread(); return 1; } //+--------------------------------------------------------------------------- // // OnCommand // //---------------------------------------------------------------------------- BOOL CUTBCloseLangBarDlg::OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { case IDOK: { DoCloseLangbar(); if (IsDlgButtonChecked(hDlg, IDC_DONTSHOWAGAIN)) { CMyRegKey key; if (key.Create(HKEY_CURRENT_USER, c_szUTBKey) == S_OK) key.SetValue(1, c_szDontShowCloseLangBarDlg); } EndDialog(hDlg, 1); break; } case IDCANCEL: EndDialog(hDlg, 0); break; default: return FALSE; } return TRUE; } ////////////////////////////////////////////////////////////////////////////// // // CUTBMinimizeLangBarDlg // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // DoModal // //---------------------------------------------------------------------------- int CUTBMinimizeLangBarDlg::DoModal(HWND hWnd) { CMyRegKey key; BOOL bShow = FALSE; // #478364: default is FALSE from now. if (key.Open(HKEY_CURRENT_USER, c_szUTBKey, KEY_READ) == S_OK) { DWORD dwValue; if (key.QueryValue(dwValue, c_szDontShowMinimizeLangBarDlg) == S_OK) bShow = dwValue ? FALSE : TRUE; } if (!bShow) return 0; StartThread(); return 1; } //+--------------------------------------------------------------------------- // // OnCommand // //---------------------------------------------------------------------------- BOOL CUTBMinimizeLangBarDlg::OnCommand(HWND hDlg, WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { case IDOK: if (IsDlgButtonChecked(hDlg, IDC_DONTSHOWAGAIN)) { CMyRegKey key; if (key.Create(HKEY_CURRENT_USER, c_szUTBKey) == S_OK) key.SetValue(1, c_szDontShowMinimizeLangBarDlg); } EndDialog(hDlg, 1); break; case IDCANCEL: EndDialog(hDlg, 0); break; default: return FALSE; } return TRUE; } //+--------------------------------------------------------------------------- // // ThreadProc // //---------------------------------------------------------------------------- DWORD CUTBMinimizeLangBarDlg::ThreadProc() { // // for JP MSIME2002. // // Japanese MSIME2002 always add and remove item at every focus change. // if we show the minimized dialog box immediately, the deskband // size won't include the items of MSIME2002. // Wait 700ms so the dialog box is shown after MSIME2002 add its item // and the langband can calc the size with them. // // And we think showing this dialog box is not good UI. Like a normal // window, we should show animation to let the end user know // where the minimzed is gone to. // Sleep(700); return CUTBLangBarDlg::ThreadProc(); }