📄 ui.c
字号:
// ShowUIWindows(hWnd, FALSE);
break;
case WM_IME_STARTCOMPOSITION:
//
// Start composition! Ready to display the composition string.
//
lpIMC = ImmLockIMC(hUICurIMC);
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
CreateCompWindow(hWnd,lpUIExtra,lpIMC );
GlobalUnlock(hUIExtra);
ImmUnlockIMC(hUICurIMC);
break;
// Windows XP notepad bug ??
// 茄臂 IME老 版快 STARTCOMPOSITION 皋矫瘤啊 力措肺 傈崔登瘤
// 臼绰促.
case WM_IME_COMPOSITION:
//
// Update to display the composition string.
//
lpIMC = ImmLockIMC(hUICurIMC);
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
// STARTCOMPOSITION 皋矫瘤啊 傈崔登瘤 臼绰 版快
if (lpIMC && !(dwImeFlag & SAENARU_ONTHESPOT))
{
LPCOMPOSITIONSTRING lpCompStr;
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr);
if (lpCompStr->dwCompStrLen)
{
CreateCompWindow(hWnd,lpUIExtra,lpIMC );
}
}
//
MoveCompWindow(lpUIExtra,lpIMC);
MoveCandWindow(hWnd,lpIMC,lpUIExtra, TRUE);
GlobalUnlock(hUIExtra);
ImmUnlockIMC(hUICurIMC);
break;
case WM_IME_ENDCOMPOSITION:
//
// Finish to display the composition string.
//
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
//hangul_ic_init(&ic);
HideCompWindow(lpUIExtra);
GlobalUnlock(hUIExtra);
break;
case WM_IME_COMPOSITIONFULL:
break;
case WM_IME_SELECT:
if (wParam)
{
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
lpUIExtra->hIMC = hUICurIMC;
GlobalUnlock(hUIExtra);
}
// XXX
//
break;
case WM_IME_CONTROL:
lRet = ControlCommand(hUICurIMC, hWnd,message,wParam,lParam);
break;
case WM_IME_NOTIFY:
lRet = NotifyCommand(hUICurIMC, hWnd,message,wParam,lParam);
break;
case WM_DESTROY:
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
if (IsWindow(lpUIExtra->uiStatus.hWnd))
DestroyWindow(lpUIExtra->uiStatus.hWnd);
if (IsWindow(lpUIExtra->uiCand.hWnd))
DestroyWindow(lpUIExtra->uiCand.hWnd);
if (IsWindow(lpUIExtra->uiDefComp.hWnd))
DestroyWindow(lpUIExtra->uiDefComp.hWnd);
#if 1
if (IsWindow(lpUIExtra->uiSoftKbd.hWnd))
ImmDestroySoftKeyboard(lpUIExtra->uiSoftKbd.hWnd);
#endif
for (i = 0; i < MAXCOMPWND; i++)
{
if (IsWindow(lpUIExtra->uiComp[i].hWnd))
DestroyWindow(lpUIExtra->uiComp[i].hWnd);
}
if (IsWindow(lpUIExtra->uiGuide.hWnd))
DestroyWindow(lpUIExtra->uiGuide.hWnd);
if (lpUIExtra->hFont)
DeleteObject(lpUIExtra->hFont);
GlobalUnlock(hUIExtra);
GlobalFree(hUIExtra);
MyDebugPrint((TEXT("WM_DELETE\n")));
UnsetHookFunc();
break;
case WM_UI_STATEMOVE:
//
// Set the position of the status window to UIExtra.
// This message is sent by the status window.
//
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
lpUIExtra->uiStatus.pt.x = (long)LOWORD(lParam);
lpUIExtra->uiStatus.pt.y = (long)HIWORD(lParam);
GlobalUnlock(hUIExtra);
break;
case WM_UI_DEFCOMPMOVE:
//
// Set the position of the composition window to UIExtra.
// This message is sent by the composition window.
//
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
if (!lpUIExtra->dwCompStyle)
{
lpUIExtra->uiDefComp.pt.x = (long)LOWORD(lParam);
lpUIExtra->uiDefComp.pt.y = (long)HIWORD(lParam);
}
GlobalUnlock(hUIExtra);
break;
case WM_UI_CANDMOVE:
//
// Set the position of the candidate window to UIExtra.
// This message is sent by the candidate window.
//
lpIMC = ImmLockIMC(hUICurIMC);
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
lpUIExtra->uiCand.pt.x = (long)LOWORD(lParam);
lpUIExtra->uiCand.pt.y = (long)HIWORD(lParam);
MyDebugPrint((TEXT(" * CANDMOVE %dx%d\n"),LOWORD(lParam),HIWORD(lParam)));
//MoveCandWindow(hWnd,lpIMC,lpUIExtra,FALSE);
ImmUnlockIMC(hUICurIMC);
GlobalUnlock(hUIExtra);
break;
case WM_UI_GUIDEMOVE:
//
// Set the position of the status window to UIExtra.
// This message is sent by the status window.
//
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
lpUIExtra->uiGuide.pt.x = (long)LOWORD(lParam);
lpUIExtra->uiGuide.pt.y = (long)HIWORD(lParam);
GlobalUnlock(hUIExtra);
break;
default:
if (HIWORD(lParam) == WM_LBUTTONDOWN)
{
if (hUICurIMC && IsCompStr(hUICurIMC))
MakeResultString(hUICurIMC,TRUE);
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
return lRet;
}
int PASCAL GetCompFontHeight(LPUIEXTRA lpUIExtra)
{
HDC hIC;
HFONT hOldFont = 0;
SIZE sz;
hIC = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
if (lpUIExtra->hFont)
hOldFont = SelectObject(hIC,lpUIExtra->hFont);
GetTextExtentPoint(hIC,TEXT("A"),1,&sz);
if (hOldFont)
SelectObject(hIC,hOldFont);
DeleteDC(hIC);
return sz.cy;
}
/**********************************************************************/
/* */
/* NotifyCommand() */
/* */
/* Handle WM_IME_NOTIFY messages. */
/* */
/**********************************************************************/
LONG PASCAL NotifyCommand(HIMC hUICurIMC, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
LONG lRet = 0L;
LPINPUTCONTEXT lpIMC;
HGLOBAL hUIExtra;
LPUIEXTRA lpUIExtra;
RECT rc;
LOGFONT lf;
if (!(lpIMC = ImmLockIMC(hUICurIMC)))
return 0L;
hUIExtra = (HGLOBAL)GetWindowLongPtr(hWnd,IMMGWLP_PRIVATE);
lpUIExtra = (LPUIEXTRA)GlobalLock(hUIExtra);
switch (wParam)
{
case IMN_CLOSESTATUSWINDOW:
#ifndef NO_USE_SOFTKBD
if (IsWindow(lpUIExtra->uiSoftKbd.hWnd))
{
GetWindowRect(lpUIExtra->uiSoftKbd.hWnd,(LPRECT)&rc);
lpUIExtra->uiSoftKbd.pt.x = rc.left;
lpUIExtra->uiSoftKbd.pt.y = rc.top;
//ShowWindow(lpUIExtra->uiSoftKbd.hWnd,SW_HIDE);
ImmShowSoftKeyboard(lpUIExtra->uiSoftKbd.hWnd,SW_HIDE);
lpUIExtra->uiSoftKbd.bShow = FALSE;
}
#endif
#ifdef USE_STATUS_WIN98_XXX
if (IsWindow(lpUIExtra->uiStatus.hWnd))
{
GetWindowRect(lpUIExtra->uiStatus.hWnd,(LPRECT)&rc);
lpUIExtra->uiStatus.pt.x = rc.left;
lpUIExtra->uiStatus.pt.y = rc.top;
ShowWindow(lpUIExtra->uiStatus.hWnd,SW_HIDE);
lpUIExtra->uiStatus.bShow = FALSE;
}
#endif
break;
case IMN_OPENSTATUSWINDOW:
#ifndef NO_USE_SOFTKBD
if (lpUIExtra->uiSoftKbd.pt.x == -1)
{
GetWindowRect(lpIMC->hWnd,&rc);
lpUIExtra->uiSoftKbd.pt.x = rc.right + 1;
lpUIExtra->uiSoftKbd.pt.y = rc.top;
}
if (!IsWindow(lpUIExtra->uiSoftKbd.hWnd))
{
lpUIExtra->uiSoftKbd.hWnd =
ImmCreateSoftKeyboard(SOFTKEYBOARD_TYPE_C1, hWnd,
0, 0);
}
//ShowWindow(lpUIExtra->uiSoftKbd.hWnd,SW_SHOWNOACTIVATE);
ImmShowSoftKeyboard(lpUIExtra->uiSoftKbd.hWnd,SW_HIDE);
//lpUIExtra->uiSoftKbd.bShow = TRUE;
//SetWindowLongPtr(lpUIExtra->uiSoftKbd.hWnd,FIGWL_SVRWND,(LONG_PTR)hWnd);
#endif
#ifdef USE_STATUS_WIN98_XXX
if (lpUIExtra->uiStatus.pt.x == -1)
{
GetWindowRect(lpIMC->hWnd,&rc);
lpUIExtra->uiStatus.pt.x = rc.right + 1;
lpUIExtra->uiStatus.pt.y = rc.top;
}
if (!IsWindow(lpUIExtra->uiStatus.hWnd))
{
lpUIExtra->uiStatus.hWnd =
CreateWindowEx(WS_EX_WINDOWEDGE,
(LPTSTR)szStatusClassName,NULL,
WS_COMPDEFAULT | WS_DLGFRAME,
lpUIExtra->uiStatus.pt.x,
lpUIExtra->uiStatus.pt.y,
BTX * 2 + 2 * GetSystemMetrics(SM_CXBORDER)
+ 2 * GetSystemMetrics(SM_CXEDGE),
BTX // + GetSystemMetrics(SM_CYSMCAPTION)
+ 2 * GetSystemMetrics(SM_CYBORDER)
+ 2 * GetSystemMetrics(SM_CYEDGE),
hWnd,NULL,hInst,NULL);
}
ShowWindow(lpUIExtra->uiStatus.hWnd,SW_SHOWNOACTIVATE);
lpUIExtra->uiStatus.bShow = TRUE;
SetWindowLongPtr(lpUIExtra->uiStatus.hWnd,FIGWL_SVRWND,(LONG_PTR)hWnd);
#endif
break;
case IMN_SETCONVERSIONMODE:
UpdateStatusWindow(lpUIExtra);
UpdateSoftKeyboard(lpUIExtra,
lpIMC->fdwConversion & IME_CMODE_SOFTKBD);
#if 0
if (!lpIMC->fdwConversion & IME_CMODE_SOFTKBD )
ImmShowSoftKeyboard(lpUIExtra->uiSoftKbd.hWnd,SW_HIDE);
else
ImmShowSoftKeyboard(lpUIExtra->uiSoftKbd.hWnd,SW_SHOWNOACTIVATE);
#endif
break;
case IMN_SETSENTENCEMODE:
break;
case IMN_SETCOMPOSITIONFONT:
lf = lpIMC->lfFont.W;
if (lpUIExtra->hFont)
DeleteObject(lpUIExtra->hFont);
if (lf.lfEscapement == 2700)
lpUIExtra->bVertical = TRUE;
else
{
lf.lfEscapement = 0;
lpUIExtra->bVertical = FALSE;
}
//
// if current font can't display Korean characters,
// try to find Korean font
//
if (lf.lfCharSet != NATIVE_CHARSET) {
lf.lfCharSet = NATIVE_CHARSET;
lf.lfFaceName[0] = TEXT('\0');
}
lpUIExtra->hFont = CreateFontIndirect((LPLOGFONT)&lf);
SetFontCompWindow(lpUIExtra);
MoveCompWindow(lpUIExtra,lpIMC);
break;
case IMN_SETOPENSTATUS:
UpdateStatusWindow(lpUIExtra);
UpdateSoftKeyboard(lpUIExtra,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -