📄 candui.cpp
字号:
DWORD dwStart, dwEnd;
TCHAR szStrBuf[2 * MAXSTRLEN * sizeof(WCHAR) / sizeof(TCHAR) + 1];
HBITMAP hCandIconBmp;
HBITMAP hOldBmp, hCandHBmp, hCandUBmp, hCandDBmp, hCandEBmp;
HDC hMemDC;
hIMC = (HIMC)GetWindowLong(GetWindow(hCandWnd, GW_OWNER), IMMGWLP_IMC);
if (!hIMC) return;
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) return;
if (!lpIMC->hCandInfo) goto UpCandW2UnlockIMC;
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
if (!lpCandInfo) goto UpCandW2UnlockIMC;
if (!lpIMC->hPrivate) goto UpCandW2UnlockCandInfo;
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
if (!lpImcP) goto UpCandW2UnlockCandInfo;
lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]);
dwStart = lpCandList->dwSelection;
dwEnd = dwStart + lpCandList->dwPageSize;
if (dwEnd > lpCandList->dwCount) dwEnd = lpCandList->dwCount;
{
RECT rcWnd;
GetClientRect(hCandWnd, &rcWnd);
DrawConcaveRect(hDC,
sImeG.rcCandText.left - 1,
rcWnd.top,
sImeG.rcCandText.right + 1,
rcWnd.bottom - 1);
}
SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));
{
int nX = 0 , i;
BOOL HighLight ;
ExtTextOut(hDC,
sImeG.rcCandText.left,
sImeG.rcCandText.top + 1,
ETO_OPAQUE,
&sImeG.rcCandText,
NULL, 0, NULL);
for (i = 0; dwStart < dwEnd; dwStart++, i++)
{
int iLen;
int j;
TCHAR AnsiStr[MAXCODE+1];
SIZE StrSize;
//display numbers
AnsiStr[0] = szDigit[i + CAND_START];
AnsiStr[1] = TEXT(':');
AnsiStr[2] = 0;
ExtTextOut(hDC,
sImeG.rcCandText.left + nX,
sImeG.rcCandText.top + 1,
ETO_CLIPPED,
&sImeG.rcCandText,
AnsiStr,
lstrlen(AnsiStr), NULL);
if(!GetTextExtentPoint(hDC,
(LPCTSTR)AnsiStr,
lstrlen(AnsiStr),
&StrSize))
memset(&StrSize,
0, sizeof(SIZE));
nX += StrSize.cx;
// display chinese word and code
iLen = lstrlen((LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[dwStart]));
CopyMemory(szStrBuf,
((LPBYTE)lpCandList + lpCandList->dwOffset[dwStart]),
iLen*sizeof(TCHAR));
j = 0;
while(j<iLen &&szStrBuf[j] > 0x100){
AnsiStr[j] =szStrBuf[j];
j++;
}
AnsiStr[j] = 0;
if(sImeG. iCandSelID == i && sImeG.bGetFocus){
HighLight = TRUE;
SetTextColor(hDC, RGB(0x00, 0x00, 0xFF));
}
ExtTextOut(hDC,
sImeG.rcCandText.left + nX,
sImeG.rcCandText.top + 1,
ETO_CLIPPED,
&sImeG.rcCandText,
AnsiStr,
lstrlen(AnsiStr), NULL);
if(HighLight && sImeG.bGetFocus) {
SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
HighLight = FALSE;
}
if(!GetTextExtentPoint(hDC, (LPCTSTR)AnsiStr, lstrlen(AnsiStr), &StrSize))
memset(&StrSize, 0, sizeof(SIZE));
nX += StrSize.cx;
}
}
// load all bitmap
hCandHBmp = LoadBitmap(hInst, TEXT("CandH"));
hCandUBmp = LoadBitmap(hInst, TEXT("CandU"));
hCandDBmp = LoadBitmap(hInst, TEXT("CandD"));
hCandEBmp = LoadBitmap(hInst, TEXT("CandE"));
hCandIconBmp = LoadBitmap(hInst, TEXT("CandSel"));
hMemDC = CreateCompatibleDC(hDC);
hOldBmp = (HBITMAP)SelectObject(hMemDC, hCandIconBmp);
BitBlt(hDC, sImeG.rcCandIcon.left,
sImeG.rcCandIcon.top,
sImeG.rcCandIcon.right - sImeG.rcCandIcon.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hCandHBmp);
BitBlt(hDC, sImeG.rcCandBTH.left,
sImeG.rcCandBTH.top,
sImeG.rcCandBTH.right - sImeG.rcCandBTH.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hCandUBmp);
BitBlt(hDC, sImeG.rcCandBTU.left,
sImeG.rcCandBTU.top,
sImeG.rcCandBTU.right - sImeG.rcCandBTU.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hCandDBmp);
BitBlt(hDC, sImeG.rcCandBTD.left,
sImeG.rcCandBTD.top,
sImeG.rcCandBTD.right - sImeG.rcCandBTD.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hCandEBmp);
BitBlt(hDC, sImeG.rcCandBTE.left,
sImeG.rcCandBTE.top,
sImeG.rcCandBTE.right - sImeG.rcCandBTE.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hOldBmp);
DeleteDC(hMemDC);
DeleteObject(hCandIconBmp);
DeleteObject(hCandEBmp);
DeleteObject(hCandDBmp);
DeleteObject(hCandUBmp);
DeleteObject(hCandHBmp);
if (sImeG.fDiffSysCharSet){
DeleteObject(SelectObject(hDC, hOldFont));
}
ImmUnlockIMCC(lpIMC->hPrivate);
UpCandW2UnlockCandInfo:
ImmUnlockIMCC(lpIMC->hCandInfo);
UpCandW2UnlockIMC:
ImmUnlockIMC(hIMC);
return;
}
/**********************************************************************/
/* CandWndProc() */
/**********************************************************************/
LRESULT CALLBACK CandWndProc(
HWND hCandWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
// __asm int 3;
switch (uMsg) {
case WM_DESTROY:
DestroyCandWindow(hCandWnd);
break;
case WM_SETCURSOR:
{
POINT ptCursor;
if (GetWindowLong(hCandWnd, UI_MOVE_OFFSET) !=
WINDOW_NOT_DRAG) {
SetCursor(LoadCursor(NULL, IDC_SIZEALL));
break;
}
SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
GetCursorPos(&ptCursor);
ScreenToClient(hCandWnd, &ptCursor);
if (PtInRect(&sImeG.rcCandText, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
} else if (PtInRect(&sImeG.rcCandBTH, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
} else if (PtInRect(&sImeG.rcCandBTU, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
} else if (PtInRect(&sImeG.rcCandBTD, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
} else if (PtInRect(&sImeG.rcCandBTE, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
} else {
SetCursor(LoadCursor(NULL, IDC_SIZEALL));
}
}
break;
case WM_LBUTTONDOWN:
{
POINT ptCursor;
if (GetWindowLong(hCandWnd, UI_MOVE_OFFSET) !=
WINDOW_NOT_DRAG) {
SetCursor(LoadCursor(NULL, IDC_SIZEALL));
break;
}
SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
ptCursor.x = LOWORD(lParam);
ptCursor.y = HIWORD(lParam);
if (PtInRect(&sImeG.rcCandText, ptCursor)){
SetCursor(LoadCursor(hInst, szHandCursor));
MouseSelectCandStr(hCandWnd, &ptCursor);
break;
} else if (PtInRect(&sImeG.rcCandBTH, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
CandPageDownUP(hCandWnd, uCandHome);
break;
} else if (PtInRect(&sImeG.rcCandBTU, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
CandPageDownUP(hCandWnd, uCandUp);
break;
} else if (PtInRect(&sImeG.rcCandBTD, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
CandPageDownUP(hCandWnd, uCandDown);
break;
} else if (PtInRect(&sImeG.rcCandBTE, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
CandPageDownUP(hCandWnd, uCandEnd);
break;
} else {
SetCursor(LoadCursor(NULL, IDC_SIZEALL));
}
}
break;
case WM_LBUTTONUP:
{
HDC hDC;
HBITMAP hCandHBmp, hCandUBmp, hCandDBmp, hCandEBmp;
HBITMAP hOldBmp;
HDC hMemDC;
if (GetWindowLong(hCandWnd, UI_MOVE_OFFSET) !=
WINDOW_NOT_DRAG) {
SetCursor(LoadCursor(NULL, IDC_SIZEALL));
break;
}
hDC = GetDC(hCandWnd);
hCandHBmp = LoadBitmap(hInst, TEXT("CandH"));
hCandUBmp = LoadBitmap(hInst, TEXT("CandU"));
hCandDBmp = LoadBitmap(hInst, TEXT("CandD"));
hCandEBmp = LoadBitmap(hInst, TEXT("CandE"));
hMemDC = CreateCompatibleDC(hDC);
hOldBmp =(HBITMAP)SelectObject(hMemDC, hCandHBmp);
BitBlt(hDC, sImeG.rcCandBTH.left,
sImeG.rcCandBTH.top,
sImeG.rcCandBTH.right - sImeG.rcCandBTH.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hCandUBmp);
BitBlt(hDC, sImeG.rcCandBTU.left,
sImeG.rcCandBTU.top,
sImeG.rcCandBTU.right - sImeG.rcCandBTU.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hCandDBmp);
BitBlt(hDC, sImeG.rcCandBTD.left,
sImeG.rcCandBTD.top,
sImeG.rcCandBTD.right - sImeG.rcCandBTD.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hCandEBmp);
BitBlt(hDC, sImeG.rcCandBTE.left,
sImeG.rcCandBTE.top,
sImeG.rcCandBTE.right - sImeG.rcCandBTE.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hOldBmp);
DeleteObject(hCandEBmp);
DeleteObject(hCandDBmp);
DeleteObject(hCandUBmp);
DeleteObject(hCandEBmp);
DeleteDC(hMemDC);
ReleaseDC(hCandWnd, hDC);
}
break;
case WM_IME_NOTIFY:
if (wParam == IMN_SETCANDIDATEPOS){
return SetCandPosition(hCandWnd);
}
break;
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
hDC = BeginPaint(hCandWnd, &ps);
PaintCandWindow(hCandWnd, hDC);
EndPaint(hCandWnd, &ps);
}
break;
case WM_MOUSEACTIVATE:
return (MA_NOACTIVATE);
default:
return DefWindowProc(hCandWnd, uMsg, wParam, lParam);
}
return (0L);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -