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

📄 candui.cpp

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