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

📄 init.cpp

📁 基于Pocket PC的简体中文拼音输入法中的用户接口部分的源代码
💻 CPP
字号:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//

#include <windows.h>
#include <imm.h>
#include "uipriv.h"

PPOINT pptStatusPos;
CRITICAL_SECTION csStatusPos;

const TCHAR v_szImeUIClassName[]=TEXT("ChnImeUI");
const TCHAR v_szCompClassName[]=TEXT("ChnCompUI");
const TCHAR v_szCandClassName[]=TEXT("ChnCandUI");
const TCHAR v_szStatusClassName[]=TEXT("ChnStatusUI");

const TCHAR g_szChineseIMEUI[]=TEXT("ControlPanel\\Chinese IME UI\\Settings");
const TCHAR g_szShowState[]=TEXT("ShowState");
const TCHAR g_szAutoCandAccel[]=TEXT("AutoCandAccel");

IMEUIG g_sImeUIG={0};

/**********************************************************************/
/* ImeRegisterUIClass()                                               */
/**********************************************************************/
void ImeRegisterUIClass(HINSTANCE hInstance)
{
    WNDCLASS   wcWndCls;

    wcWndCls.cbClsExtra    = 0;
    wcWndCls.cbWndExtra    = sizeof(LONG) * 2;
    wcWndCls.hIcon         = NULL;
    wcWndCls.hInstance     = hInstance;
    wcWndCls.hCursor       = NULL;
    wcWndCls.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
    wcWndCls.lpszMenuName  = (LPTSTR)NULL;
    wcWndCls.style         = CS_IME;

    // IME UI class
    if (!GetClassInfo(hInstance, v_szImeUIClassName, &wcWndCls)) {
        wcWndCls.lpfnWndProc   = ImeUIWndProc;
        wcWndCls.lpszClassName = v_szImeUIClassName;

        RegisterClass(&wcWndCls);
    }

    // IME Comp Class
    if (!GetClassInfo(hInstance, v_szCompClassName, &wcWndCls)) {
        wcWndCls.lpfnWndProc   = CompWndProc;
        wcWndCls.lpszClassName = v_szCompClassName;

        RegisterClass(&wcWndCls);
    }

    // IME Cand class
    if (!GetClassInfo(hInstance, v_szCandClassName, &wcWndCls)) {
        wcWndCls.lpfnWndProc   = CandWndProc;
        wcWndCls.lpszClassName = v_szCandClassName;

        RegisterClass(&wcWndCls);
    }

    if (!GetClassInfo(hInstance, v_szStatusClassName, &wcWndCls)) {
        wcWndCls.lpfnWndProc   = StatusWndProc;
        wcWndCls.lpszClassName = v_szStatusClassName;

        RegisterClass(&wcWndCls);
    }
    return;
}

/**********************************************************************/
/* ImeUnregisterUIClass()                                             */
/**********************************************************************/
void ImeUnregisterUIClass(HINSTANCE hInstance)
{
    WNDCLASS   wcWndCls;

    if (GetClassInfo(hInstance, v_szImeUIClassName, &wcWndCls)) {
        UnregisterClass(v_szImeUIClassName, hInstance);
    }

    if (GetClassInfo(hInstance, v_szCompClassName, &wcWndCls)) {
        UnregisterClass(v_szCompClassName, hInstance);
    }

    if (GetClassInfo(hInstance, v_szCandClassName, &wcWndCls)) {
        UnregisterClass(v_szCandClassName, hInstance);
    }

    if (GetClassInfo(hInstance, v_szStatusClassName, &wcWndCls)) {
        UnregisterClass(v_szStatusClassName, hInstance);
    }
    return;
}


/**********************************************************************/
/* InitUIGlobalData()                                                 */
/**********************************************************************/
void InitUIGlobalData(void)
{
    HDC     hDC;
    HFONT   hSysFont, hOldFont;
    LOGFONT lfFont;
    SIZE    lSize;
    TCHAR   szCandChar[2] = {0x4E2D,0};
    TCHAR   szFraction[6] = {'9','9','/','9','9',0};
    int     i;

	HKEY	hkey;
	if (RegOpenKeyEx(HKEY_CURRENT_USER, g_szChineseIMEUI, 0, 0, &hkey) == ERROR_SUCCESS) {
		DWORD	cb = sizeof(DWORD);
		DWORD	dw = 1;
		RegQueryValueEx(hkey, g_szShowState, NULL, NULL, (LPBYTE)&dw, &cb);
		g_sImeUIG.bNoStatus = dw ? FALSE : TRUE;
		cb = sizeof(DWORD);
		dw = 0;
		RegQueryValueEx(hkey, g_szAutoCandAccel, NULL, NULL, (LPBYTE)&dw, &cb);
		g_sImeUIG.bAutoCandAccel = dw ? TRUE : FALSE;
	}
	else {
		g_sImeUIG.bNoStatus = g_sImeUIG.bAutoCandAccel = FALSE;
	}

    g_sImeUIG.cxBorder = GetSystemMetrics(SM_CXBORDER);
    g_sImeUIG.cyBorder = GetSystemMetrics(SM_CYBORDER);

    g_sImeUIG.cxVScroll = GetSystemMetrics(SM_CXVSCROLL);

    g_sImeUIG.crWindow = GetSysColor(COLOR_WINDOW);
    g_sImeUIG.crWindowText = GetSysColor(COLOR_WINDOWTEXT);
    g_sImeUIG.crHighlight = GetSysColor(COLOR_HIGHLIGHT);
    g_sImeUIG.crHighlightText = GetSysColor(COLOR_HIGHLIGHTTEXT);
    g_sImeUIG.crBtnFace = GetSysColor(COLOR_BTNFACE);
    g_sImeUIG.crBtnText = GetSysColor(COLOR_BTNTEXT);

    hDC = GetDC(NULL);

    GetTextExtentPoint(hDC, szCandChar, lstrlen(szCandChar), &lSize);

    g_sImeUIG.nCandCharWi = lSize.cx;

    g_sImeUIG.nCandLineWi = lSize.cx*2 + CAND_TEXTMARGIN * 2;
    g_sImeUIG.nCandLineHi = lSize.cy + CAND_LINEGAP;

    g_sImeUIG.nCandDx = CAND_TEXTMARGIN;
    for (i=0; i <= MAX_PAGESIZE; i++) {
        g_sImeUIG.nCandDy[i] = g_sImeUIG.nCandLineHi * i + CAND_LINEGAP;
    }

    hSysFont = (HFONT)GetStockObject(SYSTEM_FONT);
    GetObject(hSysFont, sizeof(LOGFONT), &lfFont);

    lfFont.lfWidth = 0;
    lfFont.lfHeight = 11;
    lfFont.lfWeight = FW_EXTRALIGHT;

    g_sImeUIG.hFracFont = CreateFontIndirect(&lfFont);

    hOldFont = (HFONT)SelectObject(hDC, g_sImeUIG.hFracFont);
    GetTextExtentPoint(hDC, szFraction, lstrlen(szFraction), &lSize);
    g_sImeUIG.nCandFracWi = lSize.cx + CAND_LINEGAP * 2;
    g_sImeUIG.nCandFracHi = lSize.cy + CAND_LINEGAP * 2;
    SelectObject(hDC, hOldFont);
    ReleaseDC(NULL, hDC);

    return;
}

/**********************************************************************/
/* DestroyUIGlobalData()                                              */
/**********************************************************************/
void DestroyUIGlobalData(void)
{
    if (g_sImeUIG.hFracFont) {
        DeleteObject(g_sImeUIG.hFracFont);
        g_sImeUIG.hFracFont = NULL;
    }

    return;
}

/**********************************************************************/
/* DllMain()                                                          */
/* Return Value:                                                      */
/*      TRUE - successful                                             */
/*      FALSE - failure                                               */
/**********************************************************************/
BOOL WINAPI DllMain(HANDLE hinstDLL,        // instance handle of this library
                    DWORD  fdwReason,       // reason called
                    LPVOID lpvReserved)     // reserve pointer
{
	static	HANDLE hMapFile1 = NULL;
	BOOL	fInit;
	
    switch (fdwReason) {
    case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls((HMODULE)hinstDLL);
        ImeRegisterUIClass((HINSTANCE)hinstDLL);
        InitUIGlobalData();

		InitializeCriticalSection( &csStatusPos);
		EnterCriticalSection(&csStatusPos);
		
		hMapFile1 = CreateFileMapping((HANDLE)-1, (LPSECURITY_ATTRIBUTES) NULL, PAGE_READWRITE, (DWORD) 0, (DWORD) sizeof(POINT), TEXT("ImeStatusPos") );
		pptStatusPos = (PPOINT)MapViewOfFile( hMapFile1, FILE_MAP_ALL_ACCESS, (DWORD) 0, (DWORD) 0, (DWORD) sizeof(POINT));
		
		fInit = (GetLastError() != ERROR_ALREADY_EXISTS);
		if (fInit)
			pptStatusPos->x = pptStatusPos->y = -1;
			
		LeaveCriticalSection(&csStatusPos);

        break;
    case DLL_PROCESS_DETACH:
        ImeUnregisterUIClass((HINSTANCE)hinstDLL);
        DestroyUIGlobalData();

		EnterCriticalSection(&csStatusPos);

		UnmapViewOfFile( (LPCVOID) pptStatusPos);
		CloseHandle(hMapFile1);

		LeaveCriticalSection(&csStatusPos);

        break;
    default:
        break;
    }

    return (TRUE);
}


//=====================================================================//
//  Exported API                                                       //
//=====================================================================//

/**********************************************************************/
/* ImeGetUIClassName()                                                */
/**********************************************************************/
extern "C"
void CALLBACK ImeGetUIClassName(LPTSTR lpszImeUIClassName)
{
    lstrcpy(lpszImeUIClassName, v_szImeUIClassName);

    return;
}

⌨️ 快捷键说明

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