⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 candui.cpp

📁 基于Pocket PC的简体中文拼音输入法中的用户接口部分的源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
        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 + -