📄 init.c
字号:
/*++
Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved
Module Name:
init.c
++*/
#include <windows.h>
#include <winerror.h>
#include <memory.h>
#include <imm.h>
#include <imedefs.h>
#include <regstr.h>
int strbytelen (LPTSTR);
void PASCAL InitStatusUIData(
int cxBorder,
int cyBorder)
{
int iContentHi;
// iContentHi is to get the maximum value of predefined STATUS_DIM_Y and
// a real Chinese character's height in the current HDC.
iContentHi = STATUS_DIM_Y;
if ( iContentHi < sImeG.yChiCharHi )
iContentHi = sImeG.yChiCharHi ;
// right bottom of status
sImeG.rcStatusText.left = 0;
sImeG.rcStatusText.top = 0;
sImeG.rcStatusText.right = sImeG.rcStatusText.left +
(strbytelen(szImeOutName) + strbytelen(szImeName)) * sImeG.xChiCharWi/2 + STATUS_NAME_MARGIN + STATUS_DIM_X * 3;
sImeG.rcStatusText.bottom = sImeG.rcStatusText.top + iContentHi;
sImeG.xStatusWi = STATUS_DIM_X * 3 + STATUS_NAME_MARGIN +
(strbytelen(szImeOutName) + strbytelen(szImeName)) * sImeG.xChiCharWi/2 + 6 * cxBorder;
sImeG.yStatusHi = iContentHi + 6 * cxBorder;
// left bottom of imeicon bar
sImeG.rcImeIcon.left = sImeG.rcStatusText.left;
sImeG.rcImeIcon.top = sImeG.rcStatusText.top;
sImeG.rcImeIcon.right = sImeG.rcImeIcon.left + STATUS_DIM_X;
sImeG.rcImeIcon.bottom = sImeG.rcImeIcon.top + iContentHi;
// left bottom of imename bar
sImeG.rcImeName.left = sImeG.rcImeIcon.right;
sImeG.rcImeName.top = sImeG.rcStatusText.top;
sImeG.rcImeName.right = sImeG.rcImeName.left +
strbytelen(szImeName) * sImeG.xChiCharWi/2 + STATUS_NAME_MARGIN;
sImeG.rcImeName.bottom = sImeG.rcImeName.top + iContentHi;
sImeG.rcImeOutName.left = sImeG.rcImeName.right;
sImeG.rcImeOutName.top = sImeG.rcStatusText.top;
sImeG.rcImeOutName.right = sImeG.rcImeOutName.left +
strbytelen(szImeOutName) * sImeG.xChiCharWi/2 + STATUS_NAME_MARGIN;
sImeG.rcImeOutName.bottom = sImeG.rcImeOutName.top + iContentHi;
// middle bottom of Shape bar
// sImeG.rcShapeText.left = sImeG.rcImeName.right;
// sImeG.rcShapeText.top = sImeG.rcStatusText.top;
// sImeG.rcShapeText.right = sImeG.rcShapeText.left + STATUS_DIM_X;
// sImeG.rcShapeText.bottom = sImeG.rcShapeText.top + iContentHi;
// middle bottom of Symbol bar
// sImeG.rcSymbol.left = sImeG.rcShapeText.right;
// sImeG.rcSymbol.top = sImeG.rcStatusText.top;
// sImeG.rcSymbol.right = sImeG.rcSymbol.left + STATUS_DIM_X;
// sImeG.rcSymbol.bottom = sImeG.rcSymbol.top + iContentHi;
// right bottom of SK bar
sImeG.rcSKText.left = sImeG.rcImeOutName.right;
sImeG.rcSKText.top = sImeG.rcStatusText.top;
sImeG.rcSKText.right = sImeG.rcSKText.left + STATUS_DIM_X;
sImeG.rcSKText.bottom = sImeG.rcSKText.top + iContentHi;
return;
}
void PASCAL InitCandUIData(
int cxBorder,
int cyBorder,
int UIMode)
{
int iContentHi;
// iContentHi is to get the maximum value of predefined COMP_TEXT_Y and
// a real Chinese character's height in the current HDC.
iContentHi = COMP_TEXT_Y;
if ( iContentHi < sImeG.yChiCharHi )
iContentHi = sImeG.yChiCharHi ;
sImeG.cxCandBorder = cxBorder * 2;
sImeG.cyCandBorder = cyBorder * 2;
if(UIMode == LIN_UI) {
sImeG.rcCandIcon.left = 0;
sImeG.rcCandIcon.top = cyBorder + 2;
sImeG.rcCandIcon.right = sImeG.rcCandIcon.left + UI_CANDICON;
sImeG.rcCandIcon.bottom = sImeG.rcCandIcon.top + UI_CANDICON;
sImeG.rcCandText.left = sImeG.rcCandIcon.right + 3;
sImeG.rcCandText.top = cyBorder ;
sImeG.rcCandText.right = sImeG.rcCandText.left + UI_CANDSTR;
sImeG.rcCandText.bottom = sImeG.rcCandText.top + iContentHi;
sImeG.rcCandBTH.top = cyBorder * 4;
sImeG.rcCandBTH.left = sImeG.rcCandText.right + 45;
sImeG.rcCandBTH.right = sImeG.rcCandBTH.left + UI_CANDBTW;
sImeG.rcCandBTH.bottom = sImeG.rcCandBTH.top + UI_CANDBTH;
sImeG.rcCandBTU.top = cyBorder * 4;
sImeG.rcCandBTU.left = sImeG.rcCandBTH.right;
sImeG.rcCandBTU.right = sImeG.rcCandBTU.left + UI_CANDBTW;
sImeG.rcCandBTU.bottom = sImeG.rcCandBTU.top + UI_CANDBTH;
sImeG.rcCandBTD.top = cyBorder * 4;
sImeG.rcCandBTD.left = sImeG.rcCandBTU.right;
sImeG.rcCandBTD.right = sImeG.rcCandBTD.left + UI_CANDBTW;
sImeG.rcCandBTD.bottom = sImeG.rcCandBTD.top + UI_CANDBTH;
sImeG.rcCandBTE.top = cyBorder * 4;
sImeG.rcCandBTE.left = sImeG.rcCandBTD.right;
sImeG.rcCandBTE.right = sImeG.rcCandBTE.left + UI_CANDBTW;
sImeG.rcCandBTE.bottom = sImeG.rcCandBTE.top + UI_CANDBTH;
sImeG.xCandWi = sImeG.rcCandBTE.right + sImeG.cxCandBorder * 2 + cxBorder * 4;
sImeG.yCandHi = sImeG.rcCandText.bottom + sImeG.cyCandBorder * 2 + cyBorder * 4;
//sImeG.xCandWi = sImeG.rcCandText.bottom + sImeG.cyCandBorder * 2 + cyBorder * 4;
//sImeG.yCandHi = sImeG.rcCandBTE.right + sImeG.cxCandBorder * 2 + cxBorder * 4;
} else {
sImeG.rcCandText.left = cxBorder;
sImeG.rcCandText.top = 2 * cyBorder + UI_CANDINF;
if(sImeG.xChiCharWi*9 > (UI_CANDICON*6 + UI_CANDBTH*4))
sImeG.rcCandText.right = sImeG.rcCandText.left + sImeG.xChiCharWi * 9 + 40;
else
sImeG.rcCandText.right = sImeG.rcCandText.left + (UI_CANDICON*6 + UI_CANDBTH*4) + 40;
sImeG.rcCandText.bottom = sImeG.rcCandText.top + sImeG.yChiCharHi * CANDPERPAGE;
sImeG.xCandWi = sImeG.rcCandText.right + sImeG.cxCandBorder * 2 + cxBorder * 4;
sImeG.yCandHi = sImeG.rcCandText.bottom + sImeG.cyCandBorder * 2 + cyBorder * 4;
//sImeG.xCandWi = sImeG.rcCandText.bottom + sImeG.cyCandBorder * 2 + cyBorder * 4;
//sImeG.yCandHi = sImeG.rcCandText.right + sImeG.cxCandBorder * 2 + cxBorder * 4;
sImeG.rcCandIcon.left = cxBorder;
sImeG.rcCandIcon.top = cyBorder + 2;
sImeG.rcCandIcon.right = sImeG.rcCandIcon.left + UI_CANDICON;
sImeG.rcCandIcon.bottom = sImeG.rcCandIcon.top + UI_CANDICON;
sImeG.rcCandInf.left = sImeG.rcCandIcon.right;
sImeG.rcCandInf.top = cyBorder + 3;
sImeG.rcCandInf.right = sImeG.rcCandInf.left + UI_CANDICON * 5;
sImeG.rcCandInf.bottom = sImeG.rcCandInf.top + UI_CANDBTH;
sImeG.rcCandBTE.top = cyBorder * 5;
sImeG.rcCandBTE.right = sImeG.rcCandText.right + cxBorder;
sImeG.rcCandBTE.bottom = sImeG.rcCandBTE.top + UI_CANDBTH;
sImeG.rcCandBTE.left = sImeG.rcCandBTE.right - UI_CANDBTW;
sImeG.rcCandBTD.top = cyBorder * 5;
sImeG.rcCandBTD.right = sImeG.rcCandBTE.left;
sImeG.rcCandBTD.bottom = sImeG.rcCandBTD.top + UI_CANDBTH;
sImeG.rcCandBTD.left = sImeG.rcCandBTD.right - UI_CANDBTW;
sImeG.rcCandBTU.top = cyBorder * 5;
sImeG.rcCandBTU.right = sImeG.rcCandBTD.left;
sImeG.rcCandBTU.bottom = sImeG.rcCandBTU.top + UI_CANDBTH;
sImeG.rcCandBTU.left = sImeG.rcCandBTU.right - UI_CANDBTW;
sImeG.rcCandBTH.top = cyBorder * 5;
sImeG.rcCandBTH.right = sImeG.rcCandBTU.left;
sImeG.rcCandBTH.bottom = sImeG.rcCandBTH.top + UI_CANDBTH;
sImeG.rcCandBTH.left = sImeG.rcCandBTH.right - UI_CANDBTW;
}
}
/**********************************************************************/
/* InitImeGlobalData() */
/**********************************************************************/
void PASCAL InitImeGlobalData(
HINSTANCE hInstance)
{
int cxBorder, cyBorder;
int UI_MODE;
HDC hDC;
HGDIOBJ hOldFont;
LOGFONT lfFont;
TCHAR szChiChar[4];
SIZE lTextSize;
HGLOBAL hResData;
int i;
DWORD dwSize;
HKEY hKeyIMESetting;
LONG lRet;
hInst = hInstance;
LoadString(hInst, IDS_IMEREGNAME, szImeRegName, MAX_PATH);
LoadString(hInst, IDS_IMENAME_MU_TM, pszImeName[0], MAX_PATH);
LoadString(hInst, IDS_IMENAME_MU_CM, pszImeName[1], MAX_PATH);
LoadString(hInst, IDS_IMENAME_MU_WM, pszImeName[2], MAX_PATH);
LoadString(hInst, IDS_IMENAME_MU_LM, pszImeName[3], MAX_PATH);
LoadString(hInst, IDS_IMENAME_MU_SS, pszImeName[4], MAX_PATH);
LoadString(hInst, IDS_IMEOUT_MU, pszImeOutName[0], MAX_PATH);
LoadString(hInst, IDS_IMEOUT_MK, pszImeOutName[1], MAX_PATH);
LoadString(hInst, IDS_IMEOUT_SN, pszImeOutName[2], MAX_PATH);
// get the UI class name
LoadString(hInst, IDS_IMEUICLASS, szUIClassName, CLASS_LEN);
// get the composition class name
LoadString(hInst, IDS_IMECOMPCLASS, szCompClassName, CLASS_LEN);
// get the candidate class name
LoadString(hInst, IDS_IMECANDCLASS, szCandClassName, CLASS_LEN);
// get the status class name
LoadString(hInst, IDS_IMESTATUSCLASS, szStatusClassName, CLASS_LEN);
//get the ContextMenu class name
LoadString(hInst, IDS_IMECMENUCLASS, szCMenuClassName, CLASS_LEN);
//get the softkeyboard Menu class name
LoadString(hInst, IDS_IMESOFTKEYMENUCLASS, szSoftkeyMenuClassName, CLASS_LEN);
// work area
SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
// border
cxBorder = GetSystemMetrics(SM_CXBORDER);
cyBorder = GetSystemMetrics(SM_CYBORDER);
// get the Chinese char
LoadString(hInst, IDS_CHICHAR, szChiChar, sizeof(szChiChar)/sizeof(TCHAR));
// get size of Chinese char
hDC = GetDC(NULL);
hOldFont = GetCurrentObject(hDC, OBJ_FONT);
GetObject(hOldFont, sizeof(LOGFONT), &lfFont);
sImeG.fDiffSysCharSet = TRUE;
ZeroMemory(&lfFont, sizeof(lfFont));
lfFont.lfHeight = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72);
lfFont.lfCharSet = NATIVE_CHARSET;
lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
SelectObject(hDC, CreateFontIndirect(&lfFont));
if(!GetTextExtentPoint(hDC, (LPTSTR)szChiChar, lstrlen(szChiChar), &lTextSize))
memset(&lTextSize, 0, sizeof(SIZE));
if (sImeG.rcWorkArea.right < 2 * UI_MARGIN) {
sImeG.rcWorkArea.left = 0;
sImeG.rcWorkArea.right = GetDeviceCaps(hDC, HORZRES);
}
if (sImeG.rcWorkArea.bottom < 2 * UI_MARGIN) {
sImeG.rcWorkArea.top = 0;
sImeG.rcWorkArea.bottom = GetDeviceCaps(hDC, VERTRES);
}
if (sImeG.fDiffSysCharSet) {
DeleteObject(SelectObject(hDC, hOldFont));
}
ReleaseDC(NULL, hDC);
// get text metrics to decide the width & height of composition window
// these IMEs always use system font to show
sImeG.xChiCharWi = lTextSize.cx;
sImeG.yChiCharHi = lTextSize.cy;
if(sImeG.IC_Trace) {
UI_MODE = BOX_UI;
} else {
UI_MODE = LIN_UI;
}
InitCandUIData(cxBorder, cyBorder, UI_MODE);
InitStatusUIData(cxBorder, cyBorder);
LoadString(hInst, IDS_STATUSERR, sImeG.szStatusErr,
sizeof(sImeG.szStatusErr)/sizeof(TCHAR));
sImeG.cbStatusErr = lstrlen(sImeG.szStatusErr);
sImeG.iCandStart = CAND_START;
// get the UI offset for near caret operation
RegCreateKey(HKEY_CURRENT_USER, szRegIMESetting, &hKeyIMESetting);
dwSize = sizeof(DWORD);
lRet = RegQueryValueEx(hKeyIMESetting,
szPara,
NULL,
NULL,
(LPBYTE)&sImeG.iPara,
&dwSize);
if (lRet != ERROR_SUCCESS) {
sImeG.iPara = 0;
RegSetValueEx(hKeyIMESetting,
szPara,
(DWORD)0,
REG_BINARY,
(LPBYTE)&sImeG.iPara,
sizeof(int));
}
dwSize = sizeof(DWORD);
lRet = RegQueryValueEx(hKeyIMESetting,
szPerp,
NULL,
NULL,
(LPBYTE)&sImeG.iPerp,
&dwSize);
if (lRet != ERROR_SUCCESS) {
sImeG.iPerp = sImeG.yChiCharHi;
RegSetValueEx(hKeyIMESetting,
szPerp,
(DWORD)0,
REG_BINARY,
(LPBYTE)&sImeG.iPerp,
sizeof(int));
}
dwSize = sizeof(DWORD);
lRet = RegQueryValueEx(hKeyIMESetting,
szParaTol,
NULL,
NULL,
(LPBYTE)&sImeG.iParaTol,
&dwSize);
if (lRet != ERROR_SUCCESS) {
sImeG.iParaTol = sImeG.xChiCharWi * 4;
RegSetValueEx(hKeyIMESetting,
szParaTol,
(DWORD)0,
REG_BINARY,
(LPBYTE)&sImeG.iParaTol,
sizeof(int));
}
dwSize = sizeof(DWORD);
lRet = RegQueryValueEx(hKeyIMESetting,
szPerpTol,
NULL,
NULL,
(LPBYTE)&sImeG.iPerpTol,
&dwSize);
if (lRet != ERROR_SUCCESS) {
sImeG.iPerpTol = lTextSize.cy;
RegSetValueEx(hKeyIMESetting,
szPerpTol,
(DWORD)0,
REG_BINARY,
(LPBYTE)&sImeG.iPerpTol,
sizeof(int));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -