📄 candui.cpp
字号:
/*++
Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved
Module Name:
candui.c
++*/
#include <windows.h>
#include <imm.h>
#include "imedefs.h"
/**********************************************************************/
/* GetCandWnd */
/* Return Value : */
/* window handle of candidatte */
/**********************************************************************/
HWND PASCAL GetCandWnd(
HWND hUIWnd) // UI window
{
HGLOBAL hUIPrivate;
LPUIPRIV lpUIPrivate;
HWND hCandWnd;
hUIPrivate = (HGLOBAL)GetWindowLong(hUIWnd, IMMGWLP_PRIVATE);
if (!hUIPrivate) { // can not darw candidate window
return (HWND)NULL;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) { // can not draw candidate window
return (HWND)NULL;
}
hCandWnd = lpUIPrivate->hCandWnd;
GlobalUnlock(hUIPrivate);
return (hCandWnd);
}
void PASCAL CalcCandPos(
HIMC hIMC,
HWND hUIWnd,
LPPOINT lpptWnd) // the composition window position
{
POINT ptNew;
RECT rcWorkArea;
rcWorkArea = sImeG.rcWorkArea;
ptNew.x = lpptWnd->x ;
if(lpptWnd->y - (lpImeL->yCompHi +sImeG.yCandHi) > 0){
ptNew.y = lpptWnd->y- sImeG.yCandHi ;
}else{
ptNew.y = rcWorkArea.bottom - (sImeG.yCandHi+lpImeL->yCompHi);
}
lpptWnd->x = ptNew.x;
lpptWnd->y = ptNew.y;
return;
}
/**********************************************************************/
/* AdjustCandPos */
/**********************************************************************/
void AdjustCandPos(
HIMC hIMC,
LPPOINT lpptWnd) // the composition window position
{
LPINPUTCONTEXT lpIMC;
LONG ptFontHi;
UINT uEsc;
RECT rcWorkArea;
rcWorkArea = sImeG.rcWorkArea;
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return;
}
if (lpIMC->lfFont.A.lfHeight > 0) {
ptFontHi = lpIMC->lfFont.A.lfHeight;
} else if (lpIMC->lfFont.A.lfWidth == 0) {
ptFontHi = lpImeL->yCompHi;
} else {
ptFontHi = -lpIMC->lfFont.A.lfHeight;
}
if (ptFontHi > lpImeL->yCompHi * 8) {
ptFontHi = lpImeL->yCompHi * 8;
}
if (ptFontHi < sImeG.yChiCharHi) {
ptFontHi = sImeG.yChiCharHi;
}
// -450 to 450 index 0
// 450 to 1350 index 1
// 1350 to 2250 index 2
// 2250 to 3150 index 3
uEsc = (UINT)((lpIMC->lfFont.A.lfEscapement + 450) / 900 % 4);
// find the location after IME do an adjustment
ptFontHi = ptFontHi * ptInputEsc[uEsc].y;
if(lpptWnd->y + ptFontHi + sImeG.yCandHi <= rcWorkArea.bottom) {
lpptWnd->y += ptFontHi;
} else {
lpptWnd->y -= (ptFontHi + sImeG.yCandHi);
}
ImmUnlockIMC(hIMC);
return;
}
/**********************************************************************/
/* AdjustCandBoundry */
/**********************************************************************/
void PASCAL AdjustCandBoundry(
LPPOINT lpptCandWnd) // the position
{
RECT rcWorkArea;
rcWorkArea = sImeG.rcWorkArea;
if (lpptCandWnd->x < rcWorkArea.left) {
lpptCandWnd->x = rcWorkArea.left;
} else if (lpptCandWnd->x + sImeG.xCandWi > rcWorkArea.right) {
lpptCandWnd->x = rcWorkArea.right - sImeG.xCandWi;
}
if (lpptCandWnd->y < rcWorkArea.top) {
lpptCandWnd->y = rcWorkArea.top;
} else if (lpptCandWnd->y + sImeG.yCandHi > rcWorkArea.bottom) {
lpptCandWnd->y = rcWorkArea.bottom - sImeG.yCandHi;
}
return;
}
/**********************************************************************/
/* SetCandPosition() */
/**********************************************************************/
LRESULT PASCAL SetCandPosition(
HWND hCandWnd)
{
HWND hUIWnd;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
POINT ptNew;
hUIWnd = GetWindow(hCandWnd, GW_OWNER);
hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
return (1L);
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return (1L);
}
ptNew = lpIMC->cfCandForm[0].ptCurrentPos;
ClientToScreen((HWND)lpIMC->hWnd, &ptNew);
if (lpIMC->cfCandForm[0].dwStyle & CFS_FORCE_POSITION) {
} else if (lpIMC->cfCandForm[0].dwStyle == CFS_CANDIDATEPOS) {
AdjustCandBoundry(&ptNew);
} else if (lpIMC->cfCandForm[0].dwStyle == CFS_EXCLUDE) {
CalcCandPos(hIMC, hUIWnd, &ptNew);
AdjustCandBoundry(&ptNew);
}
SetWindowPos(hCandWnd, NULL, ptNew.x, ptNew.y,
0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
ImmUnlockIMC(hIMC);
return (0L);
}
/**********************************************************************/
/* ShowCand() */
/**********************************************************************/
void PASCAL ShowCand( // Show the candidate window
HWND hUIWnd,
int nShowCandCmd)
{
HGLOBAL hUIPrivate;
LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLong(hUIWnd, IMMGWLP_PRIVATE);
if (!hUIPrivate) { // can not darw candidate window
return;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) { // can not draw candidate window
return;
}
if (lpUIPrivate->nShowCandCmd == nShowCandCmd) {
goto SwCandNoChange;
}
if (nShowCandCmd == SW_HIDE) {
lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_CAND_WINDOW);
}
if (!lpUIPrivate->hCandWnd) {
// not in show candidate window mode
} else if (lpUIPrivate->nShowCandCmd == nShowCandCmd) {
} else {
if(nShowCandCmd == SW_HIDE) {
uOpenCand = 0;
} else {
HIMC hIMC;
POINT ptSTWPos;
int Comp_CandWndLen;
RECT rcWorkArea;
uOpenCand = 1;
// reset status window for LINE_UI(FIX_UI)
hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
goto ShowCand;
}
ImmGetStatusWindowPos(hIMC, (LPPOINT)&ptSTWPos);
rcWorkArea = sImeG.rcWorkArea;
Comp_CandWndLen = 0;
if(uOpenCand) {
Comp_CandWndLen += sImeG.xCandWi + UI_MARGIN;
if(uStartComp) {
Comp_CandWndLen += lpImeL->xCompWi + UI_MARGIN;
}
if(ptSTWPos.x + sImeG.xStatusWi + Comp_CandWndLen > rcWorkArea.right) {
PostMessage(GetCompWnd(hUIWnd),
WM_IME_NOTIFY,
IMN_SETCOMPOSITIONWINDOW,
0);
}
}
}
ShowCand:
ShowWindow(lpUIPrivate->hCandWnd, nShowCandCmd);
lpUIPrivate->nShowCandCmd = nShowCandCmd;
}
SwCandNoChange:
GlobalUnlock(hUIPrivate);
return;
}
/**********************************************************************/
/* OpenCand */
/**********************************************************************/
void PASCAL OpenCand(
HWND hUIWnd)
{
HGLOBAL hUIPrivate;
LPUIPRIV lpUIPrivate;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
POINT ptWnd;
hUIPrivate = (HGLOBAL)GetWindowLong(hUIWnd, IMMGWLP_PRIVATE);
if (!hUIPrivate) { // can not darw candidate window
return;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) { // can not draw candidate window
return;
}
lpUIPrivate->fdwSetContext |= ISC_SHOWUICANDIDATEWINDOW;
hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
goto OpenCandUnlockUIPriv;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
goto OpenCandUnlockUIPriv;
}
if (lpIMC->cfCandForm[0].dwIndex == 0) {
ptWnd = lpIMC->cfCandForm[0].ptCurrentPos;
ClientToScreen(lpIMC->hWnd, &ptWnd);
if (lpIMC->cfCandForm[0].dwStyle & CFS_FORCE_POSITION) {
} else if (lpIMC->cfCandForm[0].dwStyle == CFS_EXCLUDE) {
POINT ptCaret;
AdjustCandBoundry(&ptWnd);
if( (!GetCaretPos(&ptCaret))) {
if(GetCompWnd(hUIWnd)) {
ptWnd.x = ptWnd.y = 0;
ClientToScreen(lpIMC->hWnd, &ptWnd);
ptWnd.x -= lpImeL->cxCompBorder + 1;
ptWnd.y -= lpImeL->cyCompBorder + 1;
} else {
ptWnd.x = lpImeL->cxCompBorder + 1;
ptWnd.y = lpImeL->cyCompBorder + 1;
}
CalcCandPos(hIMC, hUIWnd, &ptWnd);
lpIMC->cfCandForm[0].dwStyle |= CFS_CANDIDATEPOS;
lpIMC->cfCandForm[0].ptCurrentPos = ptWnd;
ScreenToClient(lpIMC->hWnd, &lpIMC->cfCandForm[0].ptCurrentPos);
} else {
AdjustCandPos(hIMC, &ptWnd);
}
} else if (lpIMC->cfCandForm[0].dwStyle == CFS_CANDIDATEPOS) {
AdjustCandBoundry(&ptWnd);
} else {
if (lpUIPrivate->nShowCompCmd != SW_HIDE) {
ptWnd.x = ptWnd.y = 0;
ClientToScreen(lpUIPrivate->hCompWnd, &ptWnd);
} else {
ptWnd = lpIMC->cfCompForm.ptCurrentPos;
ClientToScreen(lpIMC->hWnd, &ptWnd);
}
ptWnd.x -= lpImeL->cxCompBorder + 1;
ptWnd.y -= lpImeL->cyCompBorder + 1;
CalcCandPos(hIMC, hUIWnd, &ptWnd);
lpIMC->cfCandForm[0].dwStyle |= CFS_CANDIDATEPOS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -