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

📄 statusui.cpp

📁 基于Pocket PC的简体中文拼音输入法中的用户接口部分的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************/
void PASCAL SetStatus(HWND hStatusWnd,    LPPOINT lpptCursor)
{
    HWND           hUIWnd;
    HIMC           hIMC;
    LPINPUTCONTEXT lpIMC;
    
    HLOCAL   hUIPrivate;
    LPUIPRIV lpUIPrivate;
	DWORD fdwConversion;

    hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
    hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
    if (!hIMC)
    	return;

    lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
    if (!lpIMC)
    	return;

    hUIPrivate = (HLOCAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
    if (!hUIPrivate)
    	return;

    lpUIPrivate = (LPUIPRIV)LocalLock(hUIPrivate);
    if (!lpUIPrivate) 
	    return;

    if (!lpIMC->fOpen)
		ImmSetOpenStatus(hIMC, FALSE);
    else if (PtInRect(&lpUIPrivate->rcStatusButton, *lpptCursor)) {

		if (lpIMC->fdwConversion & IME_CMODE_NATIVE)
	    // change to alphanumeric mode
	    	fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_CHARCODE | IME_CMODE_NATIVE | IME_CMODE_EUDC);
		else
		    fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) &	~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);

		ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
    } 
    else if (PtInRect(&lpUIPrivate->rcFullButton, *lpptCursor)) {
    	if (lpIMC->fdwConversion & IME_CMODE_FULLSHAPE)
    		fdwConversion = lpIMC->fdwConversion & ~IME_CMODE_FULLSHAPE;
    	else
    		fdwConversion = lpIMC->fdwConversion | IME_CMODE_FULLSHAPE;
		ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
    }
    else
		MessageBeep((UINT)-1);

	LocalUnlock(hUIPrivate);
    ImmUnlockIMC(hIMC);

    return;
}

/**********************************************************************/
/* PaintStatusWindow()                                                */
/**********************************************************************/
void PASCAL PaintStatusWindow(HDC  hDC, HWND hStatusWnd)
{
    HWND           hUIWnd;
    HIMC           hIMC;
    LPINPUTCONTEXT lpIMC;
    HANDLE		   hUIPrivate;
    LPUIPRIV	   lpUIPrivate;
    HBRUSH		   hbr, hbrold;

    hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
	
    hUIPrivate = (HLOCAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
    if (!hUIPrivate)
    	return;

    lpUIPrivate = (LPUIPRIV)LocalLock(hUIPrivate);
    if (!lpUIPrivate) 
	    return;
	

    hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
    if (!hIMC) {
    	LocalUnlock(hUIPrivate);
		MessageBeep((UINT)-1);
		return;
    }

    if (!(lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC))) {
    	LocalUnlock(hUIPrivate);
		MessageBeep((UINT)-1);
		return;
    }

    if (lpIMC->fOpen)
		SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
	else
		SetTextColor(hDC, RGB(0x80, 0x80, 0x80));

    SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));
    hbr = CreateSolidBrush(RGB(0xC0, 0xC0, 0xC0));
    hbrold = (HBRUSH) SelectObject(hDC, hbr);
    FillRect(hDC, &lpUIPrivate->rcStatusWnd, hbr);
    Rectangle(hDC, lpUIPrivate->rcStatusButton.left, lpUIPrivate->rcStatusButton.top, lpUIPrivate->rcStatusButton.right, lpUIPrivate->rcStatusButton.bottom);
    Rectangle(hDC, lpUIPrivate->rcFullButton.left, lpUIPrivate->rcFullButton.top, lpUIPrivate->rcFullButton.right, lpUIPrivate->rcFullButton.bottom);
    
	DrawText(hDC, lpIMC->fdwConversion & IME_CMODE_NATIVE ? TEXT("\x4e2d") : TEXT("A"), 1, &lpUIPrivate->rcStatusButton, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	DrawText(hDC, lpIMC->fdwConversion & IME_CMODE_FULLSHAPE ? TEXT("\x5168") : TEXT("\x534a"), 1, &lpUIPrivate->rcFullButton, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    SelectObject(hDC, hbrold);
	DeleteObject(hbr);
    ImmUnlockIMC(hIMC);
   	LocalUnlock(hUIPrivate);
    return;
}

static __inline LRESULT OnStatusCreate(HWND hStatusWnd, LPCREATESTRUCT lpCS)
{
    HWND     hUIWnd;
    LPUIPRIV lpUIPriv;
    HIMC     hIMC;
    HDC      hDC;
    SIZE	 size;

    hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
    if (!hUIWnd) {
        return -1L;
    }

    lpUIPriv = (LPUIPRIV)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
    if (!lpUIPriv) {
        return -1L;
    }
    SetWindowLong(hStatusWnd, IMMGWL_PRIVATE, (LONG)lpUIPriv);

    hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
    if (!lpUIPriv) {
        return -1L;
    }
    SetWindowLong(hStatusWnd, IMMGWL_IMC, (LONG)hIMC);

    hDC = GetDC(NULL);

    GetTextExtentPoint(hDC, TEXT("\x4e2d"), 1, &size);

    ReleaseDC(NULL, hDC);

    lpUIPriv->nStatusWidth = lpCS->cx;
    lpUIPriv->nStatusHeight = lpCS->cy;


	lpUIPriv->rcStatusWnd.left = lpUIPriv->rcStatusWnd.top = 0;
	lpUIPriv->rcStatusWnd.right = lpCS->cx;
	lpUIPriv->rcStatusWnd.bottom = lpCS->cy;
	
	lpUIPriv->rcStatusButton.left = lpUIPriv->rcStatusButton.top = SPACING;
    lpUIPriv->rcStatusButton.right = lpUIPriv->rcStatusButton.left + 20;
    lpUIPriv->rcStatusButton.bottom = lpUIPriv->rcStatusButton.top + 20;

	lpUIPriv->rcFullButton.left = lpUIPriv->rcStatusButton.right + SPACING;
	lpUIPriv->rcFullButton.top = SPACING;
    lpUIPriv->rcFullButton.right = lpUIPriv->rcFullButton.left + 20;
    lpUIPriv->rcFullButton.bottom = lpUIPriv->rcFullButton.top + 20;
    return 0L;
}


/**********************************************************************/
/* StatusWndProc()                                                    */
/**********************************************************************/
LRESULT CALLBACK StatusWndProc(HWND hStatusWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HWND           hUIWnd;
    HANDLE		   hUIPrivate;
    LPUIPRIV	   lpUIPrivate;

    switch (uMsg) {
    case WM_CREATE:
    	return OnStatusCreate(hStatusWnd, (LPCREATESTRUCT)lParam);
    case WM_DESTROY:
		DestroyStatusWindow(hStatusWnd);
		break;
			
    case WM_MOUSEMOVE:
    	{
		    hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
			
		    hUIPrivate = (HLOCAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
		    if (!hUIPrivate)
		    	return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
		
		    lpUIPrivate = (LPUIPRIV)LocalLock(hUIPrivate);
		    if (!lpUIPrivate) 
			    return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
			    
			if (lpUIPrivate->dwUIMoveOffset != WINDOW_NOT_DRAG) {
			    POINT ptCursor;
		
			    DrawDragBorder(hStatusWnd, lpUIPrivate->dwUIMoveXY, lpUIPrivate->dwUIMoveOffset, g_sImeUIG.rcWorkArea);
				ptCursor.x = LOWORD(lParam);
				ptCursor.y = HIWORD(lParam);
			    lpUIPrivate->dwUIMoveXY = MAKELONG(ptCursor.x, ptCursor.y);
			    DrawDragBorder(hStatusWnd, lpUIPrivate->dwUIMoveXY, lpUIPrivate->dwUIMoveOffset, g_sImeUIG.rcWorkArea);
			} 
			else {
				LocalUnlock(hUIPrivate);
			    return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
			}
					
   			LocalUnlock(hUIPrivate);
		}
		
		break;

	case WM_LBUTTONDOWN:
		{
		    POINT ptCursor, ptSavCursor;
		    RECT  rcWnd;

		    hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
			
		    hUIPrivate = (HLOCAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
		    if (!hUIPrivate)
		    	return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
		
		    lpUIPrivate = (LPUIPRIV)LocalLock(hUIPrivate);
		    if (!lpUIPrivate) 
			    return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
		

			ptCursor.x = LOWORD(lParam); 
			ptCursor.y = HIWORD(lParam); 
		    ptSavCursor = ptCursor;
		
	
		    if (PtInRect(&lpUIPrivate->rcStatusButton, ptCursor) || PtInRect(&lpUIPrivate->rcFullButton, ptCursor)) {
			    SetStatus(hStatusWnd, &ptCursor);			    
				break;
		    } 
		    else {
			    GetWorkArea(&g_sImeUIG.rcWorkArea);
		    }
		
		    SetCapture(hStatusWnd);
		    lpUIPrivate->dwUIMoveXY = MAKELONG(ptSavCursor.x, ptSavCursor.y);
		    GetWindowRect(hStatusWnd, &rcWnd);
		    lpUIPrivate->dwUIMoveOffset = MAKELONG(ptSavCursor.x - rcWnd.left, ptSavCursor.y - rcWnd.top);
		
		    DrawDragBorder(hStatusWnd, lpUIPrivate->dwUIMoveXY, lpUIPrivate->dwUIMoveOffset, g_sImeUIG.rcWorkArea);
		
			LocalUnlock(hUIPrivate);
		}
		break;		
    case WM_LBUTTONUP:
    	{
		    hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
		    hUIPrivate = (HLOCAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
		    if (!hUIPrivate)
		    	return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
		
		    lpUIPrivate = (LPUIPRIV)LocalLock(hUIPrivate);
		    if (!lpUIPrivate) 
			    return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);

			if (lpUIPrivate->dwUIMoveOffset != WINDOW_NOT_DRAG) {
			    LPARAM lTmpCursor, lTmpOffset;
		
			    lTmpCursor = lpUIPrivate->dwUIMoveXY;
		
			    // calculate the org by the offset
			    lTmpOffset = lpUIPrivate->dwUIMoveOffset;
		
			    DrawDragBorder(hStatusWnd, lTmpCursor, lTmpOffset, g_sImeUIG.rcWorkArea);
		
			    (*(LPPOINTS)&lTmpCursor).x -= (*(LPPOINTS)&lTmpOffset).x;
			    (*(LPPOINTS)&lTmpCursor).y -= (*(LPPOINTS)&lTmpOffset).y;
		
			    lpUIPrivate->dwUIMoveOffset = WINDOW_NOT_DRAG;
			    ReleaseCapture();
		
			    AdjustStatusBoundary((LPPOINTS)&lTmpCursor, GetWindow(hStatusWnd, GW_OWNER));
		
			    SendMessage(GetWindow(hStatusWnd, GW_OWNER), WM_IME_CONTROL, IMC_SETSTATUSWINDOWPOS, lTmpCursor);
			} 
			else {
   				LocalUnlock(hUIPrivate);
			    return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
			}
   			LocalUnlock(hUIPrivate);
		}
			
		break;

    case WM_IME_NOTIFY:
	    // get work area for changing
	    {
		    hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
			
		    hUIPrivate = (HLOCAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
		    if (!hUIPrivate)
		    	return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
		
		    lpUIPrivate = (LPUIPRIV)LocalLock(hUIPrivate);
		    if (!lpUIPrivate) 
			    return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
	    	GetWorkArea(&g_sImeUIG.rcWorkArea);
   			LocalUnlock(hUIPrivate);
	    }
	    

		if (wParam == IMN_SETSTATUSWINDOWPOS) {
		    SetStatusWindowPos(hStatusWnd);
		}
		break;
    case WM_PAINT:
	    {
		    HDC         hDC;
		    PAINTSTRUCT ps;
	
		    hDC = BeginPaint(hStatusWnd, &ps);
		    PaintStatusWindow(hDC, hStatusWnd);
		    EndPaint(hStatusWnd, &ps);
		}
		break;
    default:
	    return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
    }

    return (0L);
}

⌨️ 快捷键说明

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