📄 candui.cpp
字号:
SetTextColor(hDC, g_sImeUIG.crWindowText);
}
rcCandLine.left = lpUIPriv->rcCandText.left;
rcCandLine.right = lpUIPriv->rcCandText.right;
rcAccel.top = rcCandLine.top = g_sImeUIG.nCandDy[i] - CAND_LINEGAP;
rcAccel.bottom = rcCandLine.bottom = g_sImeUIG.nCandDy[i + 1];
rcAccel.left = 0; rcAccel.right = rcCandLine.left;
szCandStr[0] = *(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[dwIndex]);
ExtTextOut(hDC, g_sImeUIG.nCandDx, g_sImeUIG.nCandDy[i],
ETO_OPAQUE, &rcCandLine, szCandStr, 1, NULL);
if (!g_sImeUIG.bAutoCandAccel || !IsSIPOn()) {
szAccelStr[0] = (TCHAR)(TEXT('1') + i);
ExtTextOut(hDC, 3, g_sImeUIG.nCandDy[i], ETO_OPAQUE, &rcAccel, szAccelStr, 1, NULL);
}
return;
}
/**********************************************************************/
/* DrawFraction() */
/**********************************************************************/
void DrawFraction(HDC hDC, LPUIPRIV lpUIPriv)
{
HFONT hOldFont;
TCHAR szFraction[10];
hOldFont = (HFONT)SelectObject(hDC, g_sImeUIG.hFracFont);
SetBkColor(hDC, g_sImeUIG.crBtnFace);
SetTextColor(hDC, g_sImeUIG.crBtnText);
wsprintf(szFraction, TEXT("%d/%d"), lpUIPriv->lpCandList->dwSelection + 1,
lpUIPriv->lpCandList->dwCount);
ExtTextOut(hDC, lpUIPriv->rcFraction.left + CAND_LINEGAP,
lpUIPriv->rcFraction.top + CAND_LINEGAP, ETO_OPAQUE,
&lpUIPriv->rcFraction, szFraction, lstrlen(szFraction), NULL);
SelectObject(hDC, hOldFont);
return;
}
/**********************************************************************/
/* DrawCandText() */
/**********************************************************************/
void DrawCandText(HDC hDC, LPUIPRIV lpUIPriv)
{
LPCANDIDATELIST lpCandList = lpUIPriv->lpCandList;
DWORD dwStart, dwEnd, dwSelect;
int i;
RECT rcCandLine;
TCHAR szCandStr[2] = {0};
RECT rcAccel;
TCHAR szAccelStr[2] = {0};
dwStart = lpCandList->dwPageStart;
dwEnd = dwStart + lpCandList->dwPageSize;
dwEnd = dwEnd > lpCandList->dwCount ? lpCandList->dwCount : dwEnd;
dwSelect = lpCandList->dwSelection;
SetBkColor(hDC, g_sImeUIG.crWindow);
SetTextColor(hDC, g_sImeUIG.crWindowText);
rcCandLine.left = 0;
rcCandLine.right = lpUIPriv->rcCandText.right;
rcAccel.top = rcCandLine.top = lpUIPriv->rcCandText.top;
rcAccel.bottom = rcCandLine.bottom = g_sImeUIG.nCandDy[0];
ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &rcCandLine, NULL, 0, NULL);
rcCandLine.left = lpUIPriv->rcCandText.left;
rcAccel.left = 0;
rcAccel.right = rcCandLine.left;
for (i = 0; dwStart < dwEnd; dwStart++, i++) {
if (dwSelect == dwStart) {
rcAccel.top = rcCandLine.top = g_sImeUIG.nCandDy[i] - CAND_LINEGAP;
rcAccel.bottom = rcCandLine.bottom = g_sImeUIG.nCandDy[i + 1];
SetBkColor(hDC, g_sImeUIG.crHighlight);
SetTextColor(hDC, g_sImeUIG.crHighlightText);
} else {
rcAccel.top = rcCandLine.top = g_sImeUIG.nCandDy[i];
rcAccel.bottom = rcCandLine.bottom = g_sImeUIG.nCandDy[i + 1];
}
szCandStr[0] = *(LPTSTR)((LPBYTE)lpCandList + lpCandList->dwOffset[dwStart]);
ExtTextOut(hDC, g_sImeUIG.nCandDx, g_sImeUIG.nCandDy[i],
ETO_OPAQUE, &rcCandLine, szCandStr, 1, NULL);
if (!g_sImeUIG.bAutoCandAccel || !IsSIPOn()) {
szAccelStr[0] = (TCHAR)(TEXT('1')+i);
ExtTextOut(hDC, 3, g_sImeUIG.nCandDy[i], ETO_OPAQUE, &rcAccel, szAccelStr, 1, NULL);
}
if (dwSelect == dwStart) {
SetBkColor(hDC, g_sImeUIG.crWindow);
SetTextColor(hDC, g_sImeUIG.crWindowText);
}
}
if (i < (int)lpCandList->dwPageSize) {
rcCandLine.top = g_sImeUIG.nCandDy[i];
rcCandLine.bottom = lpUIPriv->rcCandText.bottom;
rcCandLine.left = rcAccel.left;
ExtTextOut(hDC, 0, 0, ETO_OPAQUE, &rcCandLine, NULL, 0, NULL);
}
return;
}
/**********************************************************************/
/* DrawCandWnd() */
/**********************************************************************/
void DrawCandWnd(HWND hCandWnd)
{
LPUIPRIV lpUIPriv;
HDC hDC;
lpUIPriv = (LPUIPRIV)GetWindowLong(hCandWnd, IMMGWL_PRIVATE);
if (!lpUIPriv) {
return;
}
hDC = GetDC(hCandWnd);
DrawCandText(hDC, lpUIPriv);
if (lpUIPriv->fdwUIFlags & UI_CAND_FRACTION) {
DrawFraction(hDC, lpUIPriv);
}
ReleaseDC(hCandWnd, hDC);
}
/**********************************************************************/
/* OnCandPaint() */
/**********************************************************************/
static __inline
LRESULT OnCandPaint(HWND hCandWnd)
{
LPUIPRIV lpUIPriv;
HDC hDC;
PAINTSTRUCT ps;
lpUIPriv = (LPUIPRIV)GetWindowLong(hCandWnd, IMMGWL_PRIVATE);
if (!lpUIPriv->lpCandList) {
return -1L;
}
hDC = BeginPaint(hCandWnd, (LPPAINTSTRUCT)&ps);
DrawCandText(hDC, lpUIPriv); // HIGHLIGHT_CURSEL
if (lpUIPriv->fdwUIFlags & UI_CAND_FRACTION) {
DrawFraction(hDC, lpUIPriv);
}
EndPaint(hCandWnd, (LPPAINTSTRUCT)&ps);
return 0L;
}
/**********************************************************************/
/* CandNotifyIME() */
/**********************************************************************/
void CandNotifyIME(HWND hCandWnd, WORD wCode)
{
LPUIPRIV lpUIPriv;
HIMC hIMC;
lpUIPriv = (LPUIPRIV)GetWindowLong(hCandWnd, IMMGWL_PRIVATE);
if (!lpUIPriv) {
return;
}
hIMC = (HIMC)GetWindowLong(hCandWnd, IMMGWL_IMC);
if (!hIMC) {
return;
}
switch(wCode) {
case CLN_SELECTION:
ImmNotifyIME(hIMC, NI_SELECTCANDIDATESTR, 0L,
lpUIPriv->lpCandList->dwSelection);
break;
case CLN_DETERMINE:
ImmNotifyIME(hIMC, NI_SELECTCANDIDATESTR, 0L,
lpUIPriv->lpCandList->dwSelection);
ImmEscape((HKL)NULL, hIMC, IME_ESC_PRIVATE_FIRST, NULL);
break;
case CLN_PAGESTART:
ImmNotifyIME(hIMC, NI_SETCANDIDATE_PAGESTART, 0L,
lpUIPriv->lpCandList->dwPageStart);
break;
default:
break;
}
return;
}
/**********************************************************************/
/* OnCandSetCursor() */
/**********************************************************************/
static __inline
LRESULT OnCandSetCursor(HWND hCandWnd, UINT uMsg, LPARAM lParam)
{
LPUIPRIV lpUIPriv;
LPCANDIDATELIST lpCandList;
POINT ptCursor;
DWORD dwSelection;
HDC hDC;
lpUIPriv = (LPUIPRIV)GetWindowLong(hCandWnd, IMMGWL_PRIVATE);
if (!lpUIPriv) {
return -1L;
}
ptCursor.x = LOWORD(lParam);
ptCursor.y = HIWORD(lParam);
lpCandList = lpUIPriv->lpCandList;
dwSelection = lpCandList->dwPageStart +
(ptCursor.y - lpUIPriv->rcCandText.top) / g_sImeUIG.nCandLineHi;
dwSelection = dwSelection >= (lpCandList->dwPageStart + lpCandList->dwPageSize) ?
lpCandList->dwPageStart + lpCandList->dwPageSize - 1 : dwSelection;
if (dwSelection > lpCandList->dwCount -1)
dwSelection = lpCandList->dwCount -1;
hDC = GetDC(hCandWnd);
switch (uMsg) {
case WM_MOUSEMOVE:
if (!PtInRect(&lpUIPriv->rcCandText, ptCursor)) {
break;
}
if (dwSelection != lpCandList->dwSelection) {
DrawCandLine(hDC, lpUIPriv, lpCandList->dwSelection, FALSE);
lpCandList->dwSelection = dwSelection;
DrawCandLine(hDC, lpUIPriv, lpCandList->dwSelection, TRUE);
if (lpUIPriv->fdwUIFlags & UI_CAND_FRACTION) {
DrawFraction(hDC, lpUIPriv);
}
}
break;
case WM_LBUTTONDOWN:
if (!PtInRect(&lpUIPriv->rcCandText, ptCursor)) {
break;
}
SetCapture(hCandWnd);
if (dwSelection != lpCandList->dwSelection) {
DrawCandLine(hDC, lpUIPriv, lpCandList->dwSelection, FALSE);
lpCandList->dwSelection = dwSelection;
DrawCandLine(hDC, lpUIPriv, lpCandList->dwSelection, TRUE);
if (lpUIPriv->fdwUIFlags & UI_CAND_FRACTION) {
DrawFraction(hDC, lpUIPriv);
}
}
break;
case WM_LBUTTONUP:
if (hCandWnd == GetCapture()) {
ReleaseCapture();
}
if (!PtInRect(&lpUIPriv->rcCandText, ptCursor)) {
break;
} else if (dwSelection != lpCandList->dwSelection) {
break;
} else {
HIMC hIMC;
hIMC = (HIMC)GetWindowLong(hCandWnd, IMMGWL_IMC);
ImmNotifyIME(hIMC, NI_SELECTCANDIDATESTR, 0L, lpCandList->dwSelection);
}
break;
default:
break;
}
ReleaseDC(hCandWnd, hDC);
return 0L;
}
/**********************************************************************/
/* OnCandScroll() */
/**********************************************************************/
static __inline
LRESULT OnCandScroll(HWND hCandWnd, WORD wScrollCode, WORD wPos)
{
LPUIPRIV lpUIPriv;
LPCANDIDATELIST lpCandList;
DWORD dwMax;
lpUIPriv = (LPUIPRIV)GetWindowLong(hCandWnd, IMMGWL_PRIVATE);
if (!lpUIPriv->lpCandList) {
return -1L;
}
lpCandList = lpUIPriv->lpCandList;
switch(wScrollCode) {
case SB_LINEDOWN:
if (lpCandList->dwPageStart <
(lpCandList->dwCount - lpCandList->dwPageSize)) {
lpCandList->dwPageStart++;
lpCandList->dwSelection = lpCandList->dwPageStart;
DrawCandWnd(hCandWnd);
SetScrollPos(lpUIPriv->hScrBar, SB_CTL, (int)lpCandList->dwPageStart, TRUE);
}
break;
case SB_LINEUP:
if (lpUIPriv->lpCandList->dwPageStart > 0){
lpUIPriv->lpCandList->dwPageStart--;
lpCandList->dwSelection = lpCandList->dwPageStart;
DrawCandWnd(hCandWnd);
SetScrollPos(lpUIPriv->hScrBar, SB_CTL, (int)lpCandList->dwPageStart, TRUE);
}
break;
case SB_PAGEDOWN:
if (lpCandList->dwPageStart <
(lpCandList->dwCount - lpCandList->dwPageSize)) {
lpCandList->dwPageStart += lpCandList->dwPageSize;
dwMax = lpCandList->dwCount - lpCandList->dwPageSize;
lpCandList->dwPageStart = lpCandList->dwPageStart < dwMax ?
lpCandList->dwPageStart : dwMax;
lpCandList->dwSelection = lpCandList->dwPageStart;
DrawCandWnd(hCandWnd);
SetScrollPos(lpUIPriv->hScrBar, SB_CTL, (int)lpCandList->dwPageStart, TRUE);
}
break;
case SB_PAGEUP:
if (lpCandList->dwPageStart > 0) {
if (lpCandList->dwPageStart <= lpCandList->dwPageSize) {
lpCandList->dwPageStart = 0;
} else {
lpCandList->dwPageStart -= lpCandList->dwPageSize;
}
lpCandList->dwSelection = lpCandList->dwPageStart;
DrawCandWnd(hCandWnd);
SetScrollPos(lpUIPriv->hScrBar, SB_CTL, (int)lpCandList->dwPageStart, TRUE);
}
break;
case SB_THUMBTRACK:
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -