📄 candui.cpp
字号:
}
break;
case SB_THUMBPOSITION:
dwMax = lpUIPriv->lpCandList->dwCount - lpUIPriv->lpCandList->dwPageSize;
dwMax = wPos > dwMax ? dwMax : wPos;
if (wPos != lpCandList->dwPageStart && dwMax != lpCandList->dwPageStart) {
lpCandList->dwPageStart = dwMax;
lpCandList->dwSelection = lpCandList->dwPageStart;
DrawCandWnd(hCandWnd);
}
SetScrollPos(lpUIPriv->hScrBar, SB_CTL, (int)lpCandList->dwPageStart, TRUE);
break;
default:
break;
}
return 0L;
}
/**********************************************************************/
/* SetCandPosition() */
/**********************************************************************/
void SetCandPosition(HWND hCandWnd)
{
LPUIPRIV lpUIPriv;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
POINT ptNew;
lpUIPriv = (LPUIPRIV)GetWindowLong(hCandWnd, IMMGWL_PRIVATE);
if (!lpUIPriv) {
return;
}
if (!lpUIPriv->lpCandList) {
return;
}
hIMC = (HIMC)GetWindowLong(hCandWnd, IMMGWL_IMC);
if (!hIMC) {
return;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
ImmUnlockIMC(hIMC);
return;
}
if (IsWindowVisible(lpUIPriv->hCompWnd)) {
ptNew.x = lpUIPriv->ptComp.x;
ptNew.y = lpUIPriv->ptComp.y + lpUIPriv->nCompHi - g_sImeUIG.cyBorder;
} else {
ptNew = lpIMC->cfCandForm[0].ptCurrentPos;
ClientToScreen(lpIMC->hWnd, &ptNew);
}
ImmUnlockIMC(hIMC);
AdjustCandWnd(hCandWnd, ptNew);
return;
}
/**********************************************************************/
/* CandUIWndProc() */
/**********************************************************************/
LRESULT CALLBACK CandWndProc(HWND hCandWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
LPUIPRIV lpUIPriv;
switch(uMsg) {
case WM_CREATE:
return OnCandCreate(hCandWnd, (LPCREATESTRUCT)lParam);
case WM_DESTROY:
return OnCandDestroy(hCandWnd);
case WM_PAINT:
return OnCandPaint(hCandWnd);
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
return OnCandSetCursor(hCandWnd, uMsg, lParam);
case WM_VSCROLL:
return OnCandScroll(hCandWnd, LOWORD(wParam), HIWORD(wParam));
case WM_IME_NOTIFY:
lpUIPriv = (LPUIPRIV)GetWindowLong(hCandWnd, IMMGWL_PRIVATE);
if (!lpUIPriv->lpCandList) {
break;
}
if (wParam == IMN_SETCANDIDATEPOS) {
SetCandPosition(hCandWnd);
}
break;
default:
return DefWindowProc(hCandWnd, uMsg, wParam, lParam);
}
return 0L;
}
//=====================================================================//
// Exported API //
//=====================================================================//
/**********************************************************************/
/* ShowCand() : Show the candidate window */
/**********************************************************************/
void ShowCand(HWND hUIWnd, int nShowCandCmd)
{
LPUIPRIV lpUIPriv;
BOOL bCandShowed;
// show or hid the UI window
lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
if (!lpUIPriv) {
return;
}
if (!(lpUIPriv->fdwUIFlags & UI_CAND_ALREADY_OPEN)) {
return;
}
if (!lpUIPriv->hCandWnd) {
return;
}
bCandShowed = IsWindowVisible(lpUIPriv->hCandWnd);
if (nShowCandCmd == SW_SHOWNOACTIVATE) {
if (!IsWindowVisible(lpUIPriv->hCandWnd)) {
ShowWindow(lpUIPriv->hCandWnd, nShowCandCmd);
}
if (lpUIPriv->fdwUIFlags & UI_CAND_DO_SCROLL &&
!IsWindowVisible(lpUIPriv->hScrBar)) {
ShowWindow(lpUIPriv->hScrBar, nShowCandCmd);
} else if (!(lpUIPriv->fdwUIFlags & UI_CAND_DO_SCROLL) &&
IsWindowVisible(lpUIPriv->hScrBar)) {
ShowWindow(lpUIPriv->hScrBar, SW_HIDE);
}
} else if (nShowCandCmd == SW_HIDE) {
if (IsWindowVisible(lpUIPriv->hCandWnd)) {
ShowWindow(lpUIPriv->hCandWnd, SW_HIDE);
}
if (IsWindowVisible(lpUIPriv->hScrBar)) {
ShowWindow(lpUIPriv->hScrBar, SW_HIDE);
}
} else {
}
return;
}
/**********************************************************************/
/* OpenCand() */
/**********************************************************************/
void OpenCand(HWND hUIWnd)
{
LPUIPRIV lpUIPriv;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPCANDIDATEINFO lpCandInfo;
int nCandWi, nCandHi;
POINT ptNew;
lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
if (!lpUIPriv) { return; }
lpUIPriv->lpCandList = NULL;
hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
if (!hIMC) {
return;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return;
}
if (!lpIMC->hCandInfo) {
ImmUnlockIMC(hIMC);
return;
}
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
if (!lpCandInfo) {
ImmUnlockIMC(hIMC);
return;
}
lpUIPriv->lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo +
lpCandInfo->dwOffset[0]);
if (lpUIPriv->lpCandList->dwPageSize > MAX_PAGESIZE) {
lpUIPriv->lpCandList->dwPageSize = MAX_PAGESIZE;
}
lpUIPriv->dwPageSize = lpUIPriv->lpCandList->dwCount > lpUIPriv->lpCandList->dwPageSize ?
lpUIPriv->lpCandList->dwPageSize : lpUIPriv->lpCandList->dwCount;
lpUIPriv->lpCandList->dwPageSize = lpUIPriv->dwPageSize;
if (!lpUIPriv->hCandWnd) {
lpUIPriv->hCandWnd = CreateWindowEx(
WS_EX_NOACTIVATE|WS_EX_TOPMOST,
v_szCandClassName, NULL,
WS_POPUP|WS_BORDER|WS_NOTIFY|CLS_FRACTION,
0, 0, 50, 50,
hUIWnd, (HMENU)NULL, lpUIPriv->hInst, NULL);
if (!lpUIPriv->hCandWnd) {
lpUIPriv->lpCandList = NULL;
ImmUnlockIMCC(lpIMC->hCandInfo);
goto OpenCandUnlockIMCC;
}
}
lpUIPriv->fdwUIFlags |= UI_CAND_ALREADY_OPEN;
nCandWi = lpUIPriv->nCandWi;
nCandHi = lpUIPriv->nCandHi;
CalcCandSize(lpUIPriv->hCandWnd);
if (nCandWi != lpUIPriv->nCandWi ||
nCandHi != lpUIPriv->nCandHi) {
SetWindowPos(lpUIPriv->hCandWnd, HWND_TOPMOST, 0, 0,
lpUIPriv->nCandWi, lpUIPriv->nCandHi,
SWP_NOACTIVATE|SWP_NOMOVE); //|SWP_NOZORDER);
SetWindowPos(lpUIPriv->hScrBar, NULL,
lpUIPriv->rcCandText.right, lpUIPriv->rcCandText.top,
g_sImeUIG.cxVScroll, (lpUIPriv->rcCandText.bottom - lpUIPriv->rcCandText.top),
SWP_NOACTIVATE|SWP_NOZORDER);
}
if (IsWindowVisible(lpUIPriv->hCompWnd)) {
ptNew.x = lpUIPriv->ptComp.x;
ptNew.y = lpUIPriv->ptComp.y + lpUIPriv->nCompHi - g_sImeUIG.cyBorder;
} else {
ptNew = lpIMC->cfCandForm[0].ptCurrentPos;
ClientToScreen(lpIMC->hWnd, &ptNew);
}
AdjustCandWnd(lpUIPriv->hCandWnd, ptNew);
ShowCand(hUIWnd, SW_SHOWNOACTIVATE);
OpenCandUnlockIMCC:
ImmUnlockIMCC(lpIMC->hCandInfo);
ImmUnlockIMC(hIMC);
return;
}
/**********************************************************************/
/* CloseCand() */
/**********************************************************************/
void CloseCand(HWND hUIWnd)
{
LPUIPRIV lpUIPriv;
lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
if (!(lpUIPriv->fdwUIFlags & UI_CAND_ALREADY_OPEN)) {
return;
}
lpUIPriv->fdwUIFlags &= ~(UI_CAND_ALREADY_OPEN);
if (lpUIPriv->hCandWnd && IsWindowVisible(lpUIPriv->hCandWnd)) {
ShowWindow(lpUIPriv->hCandWnd, SW_HIDE);
}
if (lpUIPriv->hScrBar && IsWindowVisible(lpUIPriv->hScrBar)) {
ShowWindow(lpUIPriv->hScrBar, SW_HIDE);
}
if (lpUIPriv->lpCandList) {
lpUIPriv->lpCandList = NULL;
}
return;
}
/**********************************************************************/
/* ChangeCand() */
/**********************************************************************/
void ChangeCand(HWND hUIWnd)
{
LPUIPRIV lpUIPriv;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPCANDIDATEINFO lpCandInfo;
LPCANDIDATELIST lpCandList;
int nCandWi, nCandHi;
lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
if (!lpUIPriv) {
return;
}
if (!(lpUIPriv->fdwUIFlags & UI_CAND_ALREADY_OPEN)) {
return;
}
hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
if (!hIMC) {
return;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return;
}
if (!lpIMC->hCandInfo) {
ImmUnlockIMC(hIMC);
return;
}
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
if (!lpCandInfo) {
goto ChangeCandUnlockIMCC;
}
lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
lpUIPriv->lpCandList = lpCandList;
nCandWi = lpUIPriv->nCandWi;
nCandHi = lpUIPriv->nCandHi;
CalcCandSize(lpUIPriv->hCandWnd);
if (nCandWi != lpUIPriv->nCandWi ||
nCandHi != lpUIPriv->nCandHi) {
SetWindowPos(lpUIPriv->hCandWnd, NULL, 0, 0,
lpUIPriv->nCandWi, lpUIPriv->nCandHi,
SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOZORDER);
SetWindowPos(lpUIPriv->hScrBar, NULL,
lpUIPriv->rcCandText.right, lpUIPriv->rcCandText.top,
g_sImeUIG.cxVScroll, (lpUIPriv->rcCandText.bottom - lpUIPriv->rcCandText.top),
SWP_NOACTIVATE|SWP_NOZORDER);
}
InvalidateRect(lpUIPriv->hCandWnd, NULL, TRUE);
ShowCand(hUIWnd, SW_SHOWNOACTIVATE);
ChangeCandUnlockIMCC:
ImmUnlockIMCC(lpIMC->hCandInfo);
ImmUnlockIMC(hIMC);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -