📄 ui.c
字号:
/**********************************************************************/
BOOL UpdateStatusWindow(
HWND hUIWnd)
{
HWND hStatusWnd;
if (!(hStatusWnd = GetStatusWnd(hUIWnd))) {
return (FALSE);
}
InvalidateRect(hStatusWnd, &(sImeG.rcStatusText), TRUE);
UpdateWindow(hStatusWnd);
return (TRUE);
}
/**********************************************************************/
/* NotifyUI() */
/**********************************************************************/
void PASCAL NotifyUI(
HWND hUIWnd,
WPARAM wParam,
LPARAM lParam)
{
HWND hStatusWnd;
switch (wParam) {
case IMN_OPENSTATUSWINDOW:
//PostStatus(hUIWnd, TRUE);
StatusWndMsg(hUIWnd, TRUE);
break;
case IMN_CLOSESTATUSWINDOW:
//PostStatus(hUIWnd, FALSE);
StatusWndMsg(hUIWnd, FALSE);
break;
case IMN_OPENCANDIDATE:
if (lParam & 0x00000001) {
OpenCand(hUIWnd);
}
break;
case IMN_CHANGECANDIDATE:
if (lParam & 0x00000001) {
HDC hDC;
HWND hCandWnd;
hCandWnd = GetCandWnd(hUIWnd);
if (!hCandWnd) {
return;
}
hDC = GetDC(hCandWnd);
PaintCandWindow(hCandWnd, hDC);
ReleaseDC(hCandWnd, hDC);
}
break;
case IMN_CLOSECANDIDATE:
if (lParam & 0x00000001) {
CloseCand(hUIWnd);
}
break;
case IMN_SETSENTENCEMODE:
break;
case IMN_SETOPENSTATUS:
case IMN_SETCONVERSIONMODE:
hStatusWnd = GetStatusWnd(hUIWnd);
if (!hStatusWnd) {
return;
}
{
RECT rcRect;
rcRect = sImeG.rcStatusText;
// off by 1
rcRect.right += 1;
rcRect.bottom += 1;
RedrawWindow(hStatusWnd, &rcRect, NULL, RDW_INVALIDATE);
}
break;
case IMN_SETCOMPOSITIONFONT:
// we are not going to change font, but an IME can do this if it want
break;
case IMN_SETCOMPOSITIONWINDOW:
{
HWND hCompWnd;
hCompWnd = GetCompWnd(hUIWnd);
if (!hCompWnd) {
return;
}
PostMessage(hCompWnd, WM_IME_NOTIFY, wParam, lParam);
}
break;
case IMN_SETCANDIDATEPOS:
{
HWND hCandWnd;
hCandWnd = GetCandWnd(hUIWnd);
if (!hCandWnd) {
return;
}
PostMessage(hCandWnd, WM_IME_NOTIFY, wParam, lParam);
}
break;
case IMN_SETSTATUSWINDOWPOS:
hStatusWnd = GetStatusWnd(hUIWnd);
if (hStatusWnd) {
PostMessage(hStatusWnd, WM_IME_NOTIFY, wParam, lParam);
} else {
}
break;
case IMN_GUIDELINE:
ShowGuideLine(hUIWnd);
break;
case IMN_PRIVATE:
switch (lParam) {
case IMN_PRIVATE_UPDATE_SOFTKBD:
UpdateSoftKbd(hUIWnd);
break;
case IMN_PRIVATE_UPDATE_STATUS:
UpdateStatusWindow(hUIWnd);
break;
case IMN_PRIVATE_DESTROYCANDWIN:
SendMessage(GetCandWnd(hUIWnd), WM_DESTROY, (WPARAM)0, (LPARAM)0);
break;
case IMN_PRIVATE_CMENUDESTROYED:
CMenuDestroyed(hUIWnd);
break;
case IMN_PRIVATE_SOFTKEYMENUDESTROYED:
SoftkeyMenuDestroyed(hUIWnd);
break;
}
break;
case IMN_SOFTKBDDESTROYED:
SoftKbdDestroyed(hUIWnd);
break;
default:
break;
}
return;
}
/**********************************************************************/
/* SetContext() */
/**********************************************************************/
void PASCAL SetContext( // the context activated/deactivated
HWND hUIWnd,
BOOL fOn,
LPARAM lShowUI)
{
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPPRIVCONTEXT lpImcP;
HGLOBAL hUIPrivate;
register LPUIPRIV lpUIPrivate;
#if defined(COMBO_IME)
DWORD dwRegImeIndex;
#endif
RECT rcWorkArea;
#ifdef MUL_MONITOR
rcWorkArea = ImeMonitorWorkAreaFromWindow(hUIWnd);
#else
rcWorkArea = sImeG.rcWorkArea;
#endif
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
return ;
}
// get lpIMC
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return;
}
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
if (!hUIPrivate) {
ImmUnlockIMC(hIMC);
return;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) {
ImmUnlockIMC(hIMC);
return;
}
if (fOn) {
register DWORD fdwSetContext;
lpUIPrivate->fdwSetContext = lpUIPrivate->fdwSetContext &
~(ISC_SHOWUIALL|ISC_HIDE_SOFTKBD);
lpUIPrivate->fdwSetContext |= (lShowUI & ISC_SHOWUIALL) |
ISC_SHOW_SOFTKBD;
{
HKEY hKey;
DWORD bcData;
char buf[256];
bcData=256;
if(RegOpenKeyEx (HKEY_CURRENT_USER,
TEXT("Control Panel\\Input Method"),
0,
KEY_ENUMERATE_SUB_KEYS |
KEY_EXECUTE |
KEY_QUERY_VALUE,
&hKey)){
goto SetShowStatus;
}
if(RegQueryValueEx (hKey, TEXT("show status"),
NULL,
NULL, //null-terminate string
(LPBYTE)buf, //&bData,
&bcData) != ERROR_SUCCESS){
// Set default as ON if no entry in registry
lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
goto SetShowStatus;
}
if(strcmp(buf, "1")==0)
lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
else
lpUIPrivate->fdwSetContext &= ~ISC_OPEN_STATUS_WINDOW;
SetShowStatus:
RegCloseKey(hKey);
}
fdwSetContext = lpUIPrivate->fdwSetContext &
(ISC_SHOWUICOMPOSITIONWINDOW|ISC_HIDE_COMP_WINDOW);
if (fdwSetContext == ISC_HIDE_COMP_WINDOW) {
ShowComp(
hUIWnd, SW_HIDE);
} else if (fdwSetContext & ISC_HIDE_COMP_WINDOW) {
lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_COMP_WINDOW);
} else {
}
fdwSetContext = lpUIPrivate->fdwSetContext &
(ISC_SHOWUICANDIDATEWINDOW|ISC_HIDE_CAND_WINDOW);
if (fdwSetContext == ISC_HIDE_CAND_WINDOW) {
ShowCand(
hUIWnd, SW_HIDE);
} else if (fdwSetContext & ISC_HIDE_CAND_WINDOW) {
lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_CAND_WINDOW);
} else {
}
if (lpIMC->cfCandForm[0].dwIndex != 0) {
lpIMC->cfCandForm[0].dwStyle = CFS_DEFAULT;
}
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
if (!lpImcP) {
GlobalUnlock(hUIPrivate);
ImmUnlockIMC(hIMC);
return;
}
// init ime properties & reset context
{
HKEY hKeyCurrVersion;
HKEY hKeyGB;
DWORD ValueType;
DWORD ValueSize;
LONG retCode;
retCode = OpenReg_PathSetup(&hKeyCurrVersion);
if (retCode) {
TCHAR Buf[MAX_PATH];
wsprintf (Buf, TEXT("Error: RegOpenKeyEx = %d"), retCode);
MessageBox (lpIMC->hWnd, Buf, szWarnTitle, MB_OK | MB_ICONINFORMATION);
return;
}
#if defined(COMBO_IME)
retCode = OpenReg_User (hKeyCurrVersion,
szImeRegName,
&hKeyGB);
#else
retCode = OpenReg_User (hKeyCurrVersion,
szImeName,
&hKeyGB);
#endif //COMBO_IME
// query 光标跟随 value
ValueSize = sizeof(DWORD);
RegQueryValueEx (hKeyGB,szTrace ,
(DWORD)0,
(LPDWORD)&ValueType,
(LPBYTE)&sImeG.IC_Trace,
(LPDWORD)&ValueSize);
#ifdef CROSSREF
if(RegQueryValueEx (hKeyGB, szRegRevKL,
NULL,
NULL, //null-terminate string
(LPBYTE)&sImeG.hRevKL, //&bData,
&ValueSize) != ERROR_SUCCESS)
sImeG.hRevKL = NULL;
if(RegQueryValueEx (hKeyGB, szRegRevMaxKey,
NULL,
NULL, //null-terminate string
(LPBYTE)&sImeG.nRevMaxKey, //&bData,
&ValueSize) != ERROR_SUCCESS)
sImeG.hRevKL = NULL;
#endif
#if defined(COMBO_IME)
// query 光标跟随 value
ValueSize = sizeof(DWORD);
RegQueryValueEx (hKeyGB, szRegImeIndex,
(DWORD)0,
(LPDWORD)&ValueType,
(LPBYTE)&dwRegImeIndex,
(LPDWORD)&ValueSize);
#endif
RegCloseKey(hKeyGB);
RegCloseKey(hKeyCurrVersion);
}
#if defined(COMBO_IME)
if(sImeL.dwRegImeIndex != dwRegImeIndex) {
DWORD dwConvMode;
int cxBorder, cyBorder;
//change current IME index
dwConvMode = lpIMC->fdwConversion ^ (IME_CMODE_INDEX_FIRST << sImeL.dwRegImeIndex);
sImeL.dwRegImeIndex = dwRegImeIndex;
szImeName = pszImeName[dwRegImeIndex];
dwConvMode |= (IME_CMODE_INDEX_FIRST << dwRegImeIndex);
// re-caculate statusuidata
cxBorder = GetSystemMetrics(SM_CXBORDER);
cyBorder = GetSystemMetrics(SM_CYBORDER);
InitStatusUIData(cxBorder, cyBorder);
ImmSetConversionStatus(hIMC, dwConvMode, lpIMC->fdwSentence);
}
#endif //COMBO_IME
if(sImeG.IC_Trace != SaTC_Trace) {
int UI_MODE;
lpImcP->iImeState = CST_INIT;
CompCancel(hIMC, lpIMC);
// init fields of hPrivate
lpImcP->fdwImeMsg = (DWORD)0;
lpImcP->dwCompChar = (DWORD)0;
lpImcP->fdwGcsFlag = (DWORD)0;
lpImcP->uSYHFlg = 0x00000000;
lpImcP->uDYHFlg = 0x00000000;
// change compwnd size
// init fields of hIMC
lpIMC->fOpen = TRUE;
SendMessage(GetCandWnd(hUIWnd), WM_DESTROY, (WPARAM)0, (LPARAM)0);
// set cand window data
if(sImeG.IC_Trace) {
UI_MODE = BOX_UI;
} else {
POINT ptSTFixPos;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -