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

📄 ui.c

📁 这是一个编写输入法程序的代码。演示了怎样利用输入法接口。
💻 C
字号:
//***********************************************************************
//	这个文件处理UI消息,导出UIWndProc接口,一些和界面相关的工具函数也在此
//	文件中定义。
//***********************************************************************
#include "imesample.h"

/**********************************************************************/
/* 显示状态栏                                                       */
/**********************************************************************/
void PASCAL UIWnd_OpenStatus( HWND hUIWnd ,BOOL bShow)
{
    HGLOBAL        hUIPrivate;
    LPUIPRIV       lpUIPrivate;
    HIMC           hIMC;
    int            nShowCmd=bShow?SW_SHOWNOACTIVATE:SW_HIDE;

    hUIPrivate = (HGLOBAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
    if (!hUIPrivate)           // can not darw status window
       return;
    

    lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
    if (!lpUIPrivate)          // can not draw status window
       return;
    

    hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
    if (!hIMC) {
       nShowCmd = SW_HIDE;
    } 
    else if (!ImmLockIMC(hIMC))
	{
        nShowCmd = SW_HIDE;
    }else
	{
		ImmUnlockIMC(hIMC);
	}
	
	if(!lpUIPrivate->hStatusWnd)
	{
		RECT rcWorkArea;
	    LPINPUTCONTEXT lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
		SystemParametersInfo(SPI_GETWORKAREA,0,&rcWorkArea,0);
        lpUIPrivate->hStatusWnd = CreateWindowEx(
                                     0,
                                     CLSNAME_STATUS, NULL, 
                                     WS_POPUP|WS_DISABLED,
                                     rcWorkArea.right -200,rcWorkArea.bottom-25,
                                     200,25,
                                     hUIWnd, (HMENU)NULL, g_hInst, NULL);
	}

	ShowWindow( lpUIPrivate->hStatusWnd, nShowCmd);
    GlobalUnlock(hUIPrivate);
    return;
}

/**********************************************************************/
/* 显示状态栏                                                       */
/**********************************************************************/
void PASCAL UIWnd_OpenInput( HWND hUIWnd ,BOOL bShow)
{
    HGLOBAL        hUIPrivate;
    LPUIPRIV       lpUIPrivate;
    HIMC           hIMC;
	LPINPUTCONTEXT lpIMC;
	POINT		   pt;
    int            nShowCmd=bShow?SW_SHOWNOACTIVATE:SW_HIDE;

    hUIPrivate = (HGLOBAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
    if (!hUIPrivate)           // can not darw status window
       return;
    

    lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
    if (!lpUIPrivate)          // can not draw status window
       return;
    

    hIMC = (HIMC)GetWindowLong(hUIWnd, IMMGWL_IMC);
 	lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
	pt.x=LOWORD(lpIMC->dwReserve[0]);
	pt.y=HIWORD(lpIMC->dwReserve[0]);
	ImmUnlockIMC(hIMC);
	
	if(!lpUIPrivate->hInputWnd)
	{
        lpUIPrivate->hInputWnd = CreateWindowEx(
                                     0,
                                     CLSNAME_INPUT, NULL, 
                                     WS_POPUP|WS_DISABLED,
                                     pt.x ,pt.y ,
                                     200,50,
                                     hUIWnd, (HMENU)NULL, g_hInst, NULL);
	}else if(bShow)
	{
		SetWindowPos(lpUIPrivate->hInputWnd,NULL,pt.x,pt.y,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
	}

	ShowWindow( lpUIPrivate->hInputWnd, nShowCmd);
    GlobalUnlock(hUIPrivate);
    return;
}

/**********************************************************************/
/* UIWnd_GetStatusWnd                                                         */
/* Return Value :                                                     */
/*      window handle of candidatte                                   */
/**********************************************************************/
HWND PASCAL UIWnd_GetStatusWnd(
    HWND hUIWnd)                // UI window
{
    HGLOBAL  hUIPrivate;
    LPUIPRIV lpUIPrivate;
    HWND     hWnd;

    hUIPrivate = (HGLOBAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
    if (!hUIPrivate) {          // can not darw candidate window
        return (HWND)NULL;
    }

    lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
    if (!lpUIPrivate) {         // can not draw candidate window
        return (HWND)NULL;
    }

    hWnd = lpUIPrivate->hStatusWnd;

    GlobalUnlock(hUIPrivate);
    return (hWnd);
}

/**********************************************************************/
/* UIWnd_GetInputWnd                                                         */
/* Return Value :                                                     */
/*      window handle of candidatte                                   */
/**********************************************************************/
HWND PASCAL UIWnd_GetInputWnd(
    HWND hUIWnd)                // UI window
{
    HGLOBAL  hUIPrivate;
    LPUIPRIV lpUIPrivate;
    HWND     hWnd;

    hUIPrivate = (HGLOBAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
    if (!hUIPrivate) {          // can not darw candidate window
        return (HWND)NULL;
    }

    lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
    if (!lpUIPrivate) {         // can not draw candidate window
        return (HWND)NULL;
    }

    hWnd = lpUIPrivate->hInputWnd;

    GlobalUnlock(hUIPrivate);
    return (hWnd);
}

//设置输入窗口位置
void UIWnd_SetInputWndPos(HWND hUIWnd,LPINPUTCONTEXT lpIMC)
{
	POINT pt=lpIMC->cfCompForm.ptCurrentPos;
	int	 hLineHei=16;
	HFONT hUIFont=(HFONT)SendMessage(lpIMC->hWnd,WM_GETFONT,0,0);
	ClientToScreen(lpIMC->hWnd,&pt);
	if(hUIFont)
	{
		HDC hDC = GetDC(lpIMC->hWnd);
		HFONT oldFont = SelectObject(hDC, hUIFont);
		SIZE sizeChar;
		GetTextExtentPoint(hDC,"A",1,&sizeChar);
		SelectObject(hDC, oldFont);
		ReleaseDC(lpIMC->hWnd,hDC);
		hLineHei=sizeChar.cy;
	}
	lpIMC->dwReserve[0]=MAKELONG(pt.x,pt.y);	//将坐标保存在lpIMC->dwReserve[0],在显示输入窗口时再从它取数据
}

/**********************************************************************/
/*                                                                    */
/* NotifyHandle()                                                     */
/*                                                                    */
/* Handle WM_IME_NOTIFY messages.                                     */
/*                                                                    */
/**********************************************************************/

LONG UIWnd_Notify(HIMC hIMC, HWND hUIWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	LONG lRet = 0L;
    LPINPUTCONTEXT lpIMC;

    if (!(lpIMC = ImmLockIMC(hIMC)))
        return 0L;

	
    switch (wParam)
    {
	case IMN_OPENSTATUSWINDOW:
		UIWnd_OpenStatus(hUIWnd,TRUE);
		break;
	case IMN_CLOSESTATUSWINDOW:
		UIWnd_OpenStatus(hUIWnd,FALSE);
		break;
    case IMN_OPENCANDIDATE:
        UIWnd_OpenInput(hUIWnd,TRUE);
        break;
    case IMN_CLOSECANDIDATE:
        UIWnd_OpenInput(hUIWnd,FALSE);
        break;
    case IMN_CHANGECANDIDATE:
        break;
	case IMN_SETOPENSTATUS:
		break;
	case IMN_SETCONVERSIONMODE://freepy do like this
		break;
	case IMN_SETSENTENCEMODE:
		break;
	case IMN_SETCOMPOSITIONWINDOW:
		UIWnd_SetInputWndPos(hUIWnd,lpIMC);
		break;
	case IMN_SETSTATUSWINDOWPOS:
		break;
	default:
		break;
    }
    ImmUnlockIMC(hIMC);

    return lRet;
}

/**********************************************************************/
/* UIPaint()                                                          */
/**********************************************************************/
LRESULT PASCAL UIWnd_Paint(HWND   hUIWnd)
{
    PAINTSTRUCT ps;
	MSG sMsg;
    // for safety
    BeginPaint(hUIWnd, &ps);
    EndPaint(hUIWnd, &ps);

    // some application will not remove the WM_PAINT messages
    PeekMessage(&sMsg, hUIWnd, WM_PAINT, WM_PAINT, PM_REMOVE|PM_NOYIELD);
    return (0L);
}

/**********************************************************************/
/* UIWnd_Create()                                                   */
/**********************************************************************/
void PASCAL UIWnd_Create( HWND hUIWnd)
{
    HGLOBAL hUIPrivate;

    // create storage for UI setting
    hUIPrivate = GlobalAlloc(GHND, sizeof(UIPRIV));
    if (!hUIPrivate) {     
        return;
    }

    SetWindowLong(hUIWnd, IMMGWL_PRIVATE, (LONG)hUIPrivate);

    // set the default position for UI window, it is hide now
    SetWindowPos(hUIWnd, NULL, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOZORDER);

    ShowWindow(hUIWnd, SW_SHOWNOACTIVATE);

    return;
}

/**********************************************************************/
/* DestroyUIWindow()                                                  */
/**********************************************************************/
void PASCAL UIWnd_Destroy(HWND hUIWnd)
{
    HGLOBAL  hUIPrivate;
    LPUIPRIV lpUIPrivate;

    hUIPrivate = (HGLOBAL)GetWindowLong(hUIWnd, IMMGWL_PRIVATE);
    if (!hUIPrivate) {     
        return;
    }

    lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
    if (!lpUIPrivate) {    
        return;
    }
    // status window need to be destroyed
    if (lpUIPrivate->hStatusWnd) {
        DestroyWindow(lpUIPrivate->hStatusWnd);
    }

    // status window need to be destroyed
    if (lpUIPrivate->hInputWnd) {
        DestroyWindow(lpUIPrivate->hInputWnd);
    }

    GlobalUnlock(hUIPrivate);

    // free storage for UI settings
    GlobalFree(hUIPrivate);

    return;
}



/**********************************************************************/
/*                                                                    */
/* UIWndProc()                                                   */
/*                                                                    */
/* IME UI window procedure                                            */
/*                                                                    */
/**********************************************************************/
LRESULT WINAPI UIWndProc(HWND hUIWnd,	UINT message,WPARAM wParam,	LPARAM lParam)
{
    LONG           lRet = 0L;
    HIMC hIMC = (HIMC)GetWindowLong(hUIWnd,IMMGWL_IMC);
    //**************************************************************
    // Even if there is no current UI. these messages should not be pass to 
    // DefWindowProc().
    //**************************************************************
    if (!hIMC)
    {
		if(Helper_IsIMEMessage(message)) return 0;
    }
	
    switch (message)
    {
	case WM_CREATE://做窗口的初始化工作
		UIWnd_Create(hUIWnd);
		break;
	case WM_DESTROY:
		UIWnd_Destroy(hUIWnd);
		break;
	case WM_IME_NOTIFY:
		lRet = UIWnd_Notify(hIMC, hUIWnd,message,wParam,lParam);
		break; 
    case WM_PAINT:
        lRet= UIWnd_Paint(hUIWnd);
		break;
    case WM_IME_STARTCOMPOSITION:
        UIWnd_OpenInput(hUIWnd,TRUE);
        break;
    case WM_IME_ENDCOMPOSITION:
        UIWnd_OpenInput(hUIWnd,FALSE);
        break;
	case WM_IME_COMPOSITION:
		if(lParam & GCS_COMPSTR) InvalidateRect(UIWnd_GetInputWnd(hUIWnd),NULL,FALSE);
		break;
	case WM_IME_SETCONTEXT://更新当前的状态
		break;
    case WM_MOUSEACTIVATE:
        return MA_NOACTIVATE;
	default:
		return DefWindowProc(hUIWnd,message,wParam,lParam);
    }
    return lRet;
}

⌨️ 快捷键说明

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