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

📄 imeui.cpp

📁 基于Pocket PC的简体中文拼音输入法中的用户接口部分的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			HIMC hIMC;
			LPINPUTCONTEXT lpIMC;
			hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
			if (!hIMC) 
				break;
			lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
			if (!lpIMC) 
				break;

			RETAILMSG(1,(TEXT("OnUINotify()::lpIMC->fdwConversion = 0x%x\n"), lpIMC->fdwConversion));
			ImmUnlockIMC(hIMC);
	    	InvalidateRect(lpUIPriv->hStatusWnd, NULL, NULL);
	    }
        break;

    case IMN_SETCOMPOSITIONFONT:
        // we are not going to change font, but an IME can do this if it want
        break;
    case IMN_SETCOMPOSITIONWINDOW:
        break;
    case IMN_SETCANDIDATEPOS:
        if (!lpUIPriv->hCandWnd) {
            break;
        }

        PostMessage(lpUIPriv->hCandWnd, WM_IME_NOTIFY, wParam, lParam);
        break;
    case IMN_GUIDELINE:
        ShowGuideLine(hUIWnd);
        break;
    case IMN_PRIVATE:
        switch (lParam) {
        case WM_IME_STARTCOMPOSITION:
            StartComp(hUIWnd);
            break;
        case WM_IME_COMPOSITION:
            OnComp(hUIWnd, lParam);
            break;
        case WM_IME_ENDCOMPOSITION:
            EndComp(hUIWnd);
            break;
        case IMN_PRIVATE_NONIME_TOGGLE_OFF:
			{
				HIMC hIMC;
				LPINPUTCONTEXT lpIMC;
				hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
				if (!hIMC) 
					break;
				lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
				if (!lpIMC) 
					break;

				lpUIPriv->bOpenStatus = FALSE;
				ImmSetOpenStatus(hIMC, FALSE);
				ShowUI(hUIWnd, SW_HIDE);				
    			ImmUnlockIMC(hIMC);
			}
			break;

        case IMN_PRIVATE_NONIME_TOGGLE_ON:
			{
				lpUIPriv->bOpenStatus = TRUE;
				ShowUI(hUIWnd, SW_SHOWNOACTIVATE);
			}
			break;

        case IMN_PRIVATE_SETACTIVECONTEXT:
			{
				HIMC hIMC;
				hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
				if (!hIMC) 
					break;
				if (ImmGetOpenStatus(hIMC) && !lpUIPriv->bOpenStatus)
    				PostMessage(hUIWnd, WM_IME_NOTIFY, IMN_PRIVATE, IMN_PRIVATE_NONIME_TOGGLE_OFF);
			}
			break; 
        default:
            break;
        }
        break;
    case IMN_SOFTKBDDESTROYED:
        // WinCE implement soft keyboard in different way.
        break;
    default:
        break;
    }

    return 0L;
}

/**********************************************************************/
/* UIChange()                                                       */
/**********************************************************************/
LRESULT UIChange(HWND hUIWnd)
{
    LPUIPRIV    lpUIPriv;

    lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);

    if (lpUIPriv->fdwSetContext & ISC_SHOWUIALL) {
        ShowUI(hUIWnd, SW_SHOWNOACTIVATE);
    } else {
        ShowUI(hUIWnd, SW_HIDE);
    }

    return (0L);
}

/**********************************************************************/
/* OnUISetContext()                                                   */
/**********************************************************************/
static __inline
LRESULT OnUISetContext(HWND hUIWnd, BOOL fOn, LPARAM lShowUI)
{
    LPUIPRIV lpUIPriv;

    lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);

    if (fOn) {
        lpUIPriv->fdwSetContext |= ISC_SHOWUIALL;
        SetTimer(hUIWnd, TIMER_UICHANGE, 200, NULL);
    } else {
        KillTimer(hUIWnd, TIMER_UICHANGE);
        lpUIPriv->fdwSetContext &= ~ISC_SHOWUIALL;
        UIChange(hUIWnd);
    }

    return 0L;
}

/**********************************************************************/
/* GetCandPos()                                                       */
/**********************************************************************/
LRESULT GetCandPos(HWND hUIWnd, LPCANDIDATEFORM lpCandForm)
{
    LPUIPRIV       lpUIPriv;
    RECT           rcCandWnd;
    HIMC           hIMC;
    LPINPUTCONTEXT lpIMC;

    if (lpCandForm->dwIndex != 0) {
        return (1L);
    }

    lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);

    if (!lpUIPriv->hCandWnd) {
        return (1L);
    }

    if (!GetWindowRect(lpUIPriv->hCandWnd, &rcCandWnd)) {
        return (1L);
    }

    lpCandForm->dwStyle = CFS_CANDIDATEPOS;
    lpCandForm->ptCurrentPos = *(LPPOINT)&rcCandWnd;
    lpCandForm->rcArea = rcCandWnd;

    hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);

    if (!hIMC) {
        return (1L);
    }

    lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);

    if (!lpIMC) {
        return (1L);
    }

    ScreenToClient(lpIMC->hWnd, &lpCandForm->ptCurrentPos);

    lpCandForm->rcArea.right += lpCandForm->ptCurrentPos.x -
        lpCandForm->rcArea.left;

    lpCandForm->rcArea.bottom += lpCandForm->ptCurrentPos.y -
        lpCandForm->rcArea.top;

    *(LPPOINT)&lpCandForm->rcArea = lpCandForm->ptCurrentPos;

    ImmUnlockIMC(hIMC);

    return (0L);
}

/**********************************************************************/
/* OnUIControl()                                                      */
/**********************************************************************/
static __inline
LRESULT OnUIControl(HWND hUIWnd, WPARAM wParam, LPARAM lParam)
{
    switch (wParam) {
    case IMC_GETCANDIDATEPOS:
        return GetCandPos(hUIWnd, (LPCANDIDATEFORM)lParam);
    case IMC_GETCOMPOSITIONWINDOW:
    case IMC_GETSOFTKBDPOS:
    case IMC_SETSOFTKBDPOS:
        return (0L);
    case IMC_GETSTATUSWINDOWPOS:
    	{
	        HWND   hStatusWnd;
	        RECT   rcStatusWnd;
	        LPARAM lParam;
	
	        hStatusWnd = GetStatusWnd(hUIWnd);
	        if (!hStatusWnd) {
	            return (0L); 
	        }
	
	        if (!GetWindowRect(hStatusWnd, &rcStatusWnd)) {
	             return (0L);    
	        }
	
	        lParam = MAKELRESULT(rcStatusWnd.left, rcStatusWnd.top);
		}
        return (lParam);

    case IMC_SETSTATUSWINDOWPOS:
    	{
            HIMC            hIMC;
            POINT           ptPos;

            ptPos.x = ((LPPOINTS)&lParam)->x;
            ptPos.y = ((LPPOINTS)&lParam)->y;

            hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
            if (!hIMC) {
                return (1L);
            }

            if(!ImmSetStatusWindowPos(hIMC, &ptPos)) {
                return (1L);
			}

        }
        return (0L);

    default:
        return (1L);
    }
}

/**********************************************************************/
/* UIWndProc()                                                        */
/**********************************************************************/
LRESULT CALLBACK ImeUIWndProc(HWND   hUIWnd,
                              UINT   uMsg,
                              WPARAM wParam,
                              LPARAM lParam)
{
#ifdef __SHOWIMEMSG_HPP_
    ShowImeMessage(hUIWnd, uMsg, wParam, lParam);
#endif
    switch (uMsg) {
    case WM_CREATE:
        return OnUICreate(hUIWnd, (LPCREATESTRUCT)lParam);
    case WM_DESTROY:
        return OnUIDestroy(hUIWnd);
    case WM_IME_STARTCOMPOSITION:
        StartComp(hUIWnd);
        break;
    case WM_IME_COMPOSITION:
        OnComp(hUIWnd, lParam);
        break;
    case WM_IME_ENDCOMPOSITION:
        EndComp(hUIWnd);
        break;
    case WM_IME_NOTIFY:
        return OnUINotify(hUIWnd, wParam, lParam);
    case WM_IME_SETCONTEXT:
        return OnUISetContext(hUIWnd, (BOOL)wParam, lParam);
    case WM_IME_CONTROL:
        return OnUIControl(hUIWnd, wParam, lParam);
    case WM_IME_COMPOSITIONFULL:
        return (0L);
    case WM_IME_SELECT:
        return (0L);
    case WM_TIMER:
        switch(wParam) {
        case TIMER_UICHANGE:
            KillTimer(hUIWnd, wParam);
            return UIChange(hUIWnd);
        default:
            break;
        }
        return (1L);
    default:
        return DefWindowProc(hUIWnd, uMsg, wParam, lParam);
    }

    return (0L);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -