📄 candui.cpp
字号:
lpIMC->cfCandForm[0].ptCurrentPos = ptWnd;
ScreenToClient(lpIMC->hWnd, &lpIMC->cfCandForm[0].ptCurrentPos);
}
} else {
// make cand windows trace comp window !
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;
lpIMC->cfCandForm[0].ptCurrentPos = ptWnd;
ScreenToClient(lpIMC->hWnd, &lpIMC->cfCandForm[0].ptCurrentPos);
}
ImmUnlockIMC(hIMC);
if (lpUIPrivate->hCandWnd) {
SetWindowPos(lpUIPrivate->hCandWnd,
NULL,
ptWnd.x,
ptWnd.y,
0,
0,
SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
} else {
lpUIPrivate->hCandWnd = CreateWindowEx(
// WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
WS_EX_NOACTIVATE|WS_EX_TOPMOST|WS_EX_TOOLWINDOW,
szCandClassName,
NULL,
WS_POPUP|WS_BORDER,
ptWnd.x,
ptWnd.y,
sImeG.xCandWi,
sImeG.yCandHi,
hUIWnd,
(HMENU)NULL,
hInst,
NULL);
SetWindowLong(lpUIPrivate->hCandWnd, UI_MOVE_OFFSET, WINDOW_NOT_DRAG);
SetWindowLong(lpUIPrivate->hCandWnd, UI_MOVE_XY, 0L);
}
ShowCand(hUIWnd, SW_SHOWNOACTIVATE);
OpenCandUnlockUIPriv:
GlobalUnlock(hUIPrivate);
return;
}
/**********************************************************************/
/* CloseCand */
/**********************************************************************/
void PASCAL CloseCand(
HWND hUIWnd)
{
uOpenCand = 0;
ShowCand(hUIWnd, SW_HIDE);
return;
}
/**********************************************************************/
/* DestroyCandWindow */
/**********************************************************************/
void PASCAL DestroyCandWindow(
HWND hCandWnd)
{
HGLOBAL hUIPrivate;
LPUIPRIV lpUIPrivate;
if (GetWindowLong(hCandWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
// undo the drag border
DrawDragBorder(hCandWnd,
GetWindowLong(hCandWnd, UI_MOVE_XY),
GetWindowLong(hCandWnd, UI_MOVE_OFFSET));
}
hUIPrivate = (HGLOBAL)GetWindowLong(GetWindow(hCandWnd, GW_OWNER),
IMMGWLP_PRIVATE);
if (!hUIPrivate) { // can not darw candidate window
return;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) { // can not draw candidate window
return;
}
lpUIPrivate->nShowCandCmd = SW_HIDE;
lpUIPrivate->hCandWnd = (HWND)NULL;
GlobalUnlock(hUIPrivate);
return;
}
/**********************************************************************/
/* MouseSelectCandStr() */
/**********************************************************************/
void PASCAL MouseSelectCandStr(
HWND hCandWnd,
LPPOINT lpCursor)
{
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPCANDIDATEINFO lpCandInfo;
DWORD dwValue;
hIMC = (HIMC)GetWindowLong(GetWindow(hCandWnd, GW_OWNER), IMMGWLP_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;
}
dwValue = (lpCursor->x - sImeG.rcCandText.left) /((sImeG.rcCandText.right - sImeG.rcCandText.left)/CANDPERPAGE);
if(dwValue<0 && dwValue>CANDPERPAGE){
MessageBeep((UINT)-1);
}else{
LPCANDIDATELIST lpCandList;
lpCandList = (LPCANDIDATELIST) ((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
NotifyIME(hIMC, NI_SELECTCANDIDATESTR, 0, (dwValue+lpCandList->dwSelection));
sImeG.iCandSelID = 0;
sImeG.bGetFocus = FALSE;
}
ImmUnlockIMCC(lpIMC->hCandInfo);
ImmUnlockIMC(hIMC);
return;
}
/**********************************************************************/
/* CandPageDownUP() */
/**********************************************************************/
void PASCAL CandPageDownUP(
HWND hCandWnd,
UINT uCandDownUp)
{
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPPRIVCONTEXT lpImcP;
LPCANDIDATEINFO lpCandInfo;
LPCANDIDATELIST lpCandList;
HDC hDC;
HBITMAP hCandHpBmp, hCandUpBmp, hCandDpBmp, hCandEpBmp;
HBITMAP hOldBmp;
HDC hMemDC;
// change candlist
hIMC = (HIMC)GetWindowLong(GetWindow(hCandWnd, GW_OWNER), IMMGWLP_IMC);
if (!hIMC) {
return;
}
// get lpIMC
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return;
}
// get lpImcP
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
if (!lpImcP) {
return;
}
// get lpCandInfo
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
if (!lpCandInfo) {
return;
}
// get lpCandList and init dwCount & dwSelection
lpCandList = (LPCANDIDATELIST)
((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
switch(uCandDownUp) {
case uCandHome:
ChooseCand(0x24, lpIMC, lpCandInfo, lpImcP);
NotifyIME(hIMC, NI_CHANGECANDIDATELIST, 0, 0);
break;
case uCandUp:
ChooseCand('-', lpIMC, lpCandInfo, lpImcP);
NotifyIME(hIMC, NI_CHANGECANDIDATELIST, 0, 0);
break;
case uCandDown:
ChooseCand('=', lpIMC, lpCandInfo, lpImcP);
NotifyIME(hIMC, NI_CHANGECANDIDATELIST, 0, 0);
break;
case uCandEnd:
ChooseCand(0x23, lpIMC, lpCandInfo, lpImcP);
NotifyIME(hIMC, NI_CHANGECANDIDATELIST, 0, 0);
break;
default:
break;
}
ImmUnlockIMCC(lpIMC->hPrivate);
ImmUnlockIMCC(lpIMC->hCandInfo);
ImmUnlockIMC(hIMC);
// draw button down
hDC = GetDC(hCandWnd);
hCandHpBmp = LoadBitmap(hInst, TEXT("CandHp"));
hCandUpBmp = LoadBitmap(hInst, TEXT("CandUp"));
hCandDpBmp = LoadBitmap(hInst, TEXT("CandDp"));
hCandEpBmp = LoadBitmap(hInst, TEXT("CandEp"));
hMemDC = CreateCompatibleDC(hDC);
switch(uCandDownUp) {
case uCandHome:
hOldBmp = (HBITMAP)SelectObject(hMemDC, hCandHpBmp);
BitBlt(hDC, sImeG.rcCandBTH.left, sImeG.rcCandBTH.top,
sImeG.rcCandBTH.right - sImeG.rcCandBTH.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
break;
case uCandUp:
hOldBmp = (HBITMAP)SelectObject(hMemDC, hCandUpBmp);
BitBlt(hDC, sImeG.rcCandBTU.left, sImeG.rcCandBTU.top,
sImeG.rcCandBTU.right - sImeG.rcCandBTU.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
break;
case uCandDown:
hOldBmp = (HBITMAP)SelectObject(hMemDC, hCandDpBmp);
BitBlt(hDC, sImeG.rcCandBTD.left, sImeG.rcCandBTD.top,
sImeG.rcCandBTD.right - sImeG.rcCandBTD.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
break;
case uCandEnd:
hOldBmp = (HBITMAP)SelectObject(hMemDC, hCandEpBmp);
BitBlt(hDC, sImeG.rcCandBTE.left, sImeG.rcCandBTE.top,
sImeG.rcCandBTE.right - sImeG.rcCandBTE.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
break;
default:
break;
}
SelectObject(hMemDC, hOldBmp);
DeleteDC(hMemDC);
DeleteObject(hCandEpBmp);
DeleteObject(hCandDpBmp);
DeleteObject(hCandUpBmp);
DeleteObject(hCandHpBmp);
ReleaseDC(hCandWnd, hDC);
return;
}
/**********************************************************************/
/* CandButtonUp() */
/**********************************************************************/
BOOL PASCAL CandButtonUp(
HWND hCandWnd)
{
LONG lTmpCursor, lTmpOffset;
POINT pt;
HWND hUIWnd;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
if (GetWindowLong(hCandWnd, UI_MOVE_OFFSET) == WINDOW_NOT_DRAG) {
return (FALSE);
}
lTmpCursor = GetWindowLong(hCandWnd, UI_MOVE_XY);
// calculate the org by the offset
lTmpOffset = GetWindowLong(hCandWnd, UI_MOVE_OFFSET);
pt.x = (*(LPPOINTS)&lTmpCursor).x - (*(LPPOINTS)&lTmpOffset).x;
pt.y = (*(LPPOINTS)&lTmpCursor).y - (*(LPPOINTS)&lTmpOffset).y;
DrawDragBorder(hCandWnd, lTmpCursor, lTmpOffset);
SetWindowLong(hCandWnd, UI_MOVE_OFFSET, WINDOW_NOT_DRAG);
ReleaseCapture();
hUIWnd = GetWindow(hCandWnd, GW_OWNER);
hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
return (FALSE);
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return (FALSE);
}
AdjustCandBoundry(&pt);
ScreenToClient(lpIMC->hWnd, &pt);
lpIMC->cfCandForm[0].dwStyle |= CFS_CANDIDATEPOS;
lpIMC->cfCandForm[0].ptCurrentPos = pt;
ImmUnlockIMC(hIMC);
PostMessage(hCandWnd, WM_IME_NOTIFY, IMN_SETCANDIDATEPOS, 0x0001);
return (TRUE);
}
/**********************************************************************/
/* PaintCandWindow() */
/**********************************************************************/
void PASCAL PaintCandWindow(
HWND hCandWnd,
HDC hDC)
{
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPCANDIDATEINFO lpCandInfo;
LPCANDIDATELIST lpCandList;
LPPRIVCONTEXT lpImcP;
HGDIOBJ hOldFont =NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -