Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2128 lines
71 KiB

/*++
Copyright (c) 1995-1999 Microsoft Corporation, All Rights Reserved
Module Name:
STATUSUI.c
++*/
#include <windows.h>
#include <htmlhelp.h>
#include <immdev.h>
#include <string.h>
#include <regstr.h>
#include <imedefs.h>
#include <resource.h>
extern HWND hCrtDlg;
HWND hChildDlg;
/**********************************************************************/
/* GetStatusWnd */
/* Return Value : */
/* window handle of status window */
/**********************************************************************/
HWND PASCAL GetStatusWnd(
HWND hUIWnd) // UI window
{
HGLOBAL hUIPrivate;
LPUIPRIV lpUIPrivate;
HWND hStatusWnd;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
if (!hUIPrivate) { // can not darw status window
return (HWND)NULL;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) { // can not draw status window
return (HWND)NULL;
}
hStatusWnd = lpUIPrivate->hStatusWnd;
GlobalUnlock(hUIPrivate);
return (hStatusWnd);
}
/**********************************************************************/
/* AdjustStatusBoundary() */
/**********************************************************************/
void PASCAL AdjustStatusBoundary(
LPPOINTS lppt,
HWND hUIWnd)
{
RECT rcWorkArea;
#if 1 // MultiMonitor support
{
RECT rcStatusWnd;
rcStatusWnd.left = lppt->x;
rcStatusWnd.top = lppt->y;
rcStatusWnd.right = rcStatusWnd.left + sImeG.xStatusWi;
rcStatusWnd.bottom = rcStatusWnd.top + sImeG.yStatusHi;
rcWorkArea = ImeMonitorWorkAreaFromRect(&rcStatusWnd);
}
#else
rcWorkArea = sImeG.rcWorkArea;
#endif
// display boundary check
if (lppt->x < rcWorkArea.left) {
lppt->x = (short)rcWorkArea.left;
} else if (lppt->x + sImeG.xStatusWi > rcWorkArea.right) {
lppt->x = (short)(rcWorkArea.right - sImeG.xStatusWi);
}
if (lppt->y < rcWorkArea.top) {
lppt->y = (short)rcWorkArea.top;
} else if (lppt->y + sImeG.yStatusHi > rcWorkArea.bottom) {
lppt->y = (short)(rcWorkArea.bottom - sImeG.yStatusHi);
}
if(MBIndex.IMEChara[0].IC_Trace) {
} else {
int Comp_CandWndLen;
Comp_CandWndLen = 0;
if(uStartComp) {
Comp_CandWndLen += lpImeL->xCompWi + UI_MARGIN;
}
if(uOpenCand) {
Comp_CandWndLen += sImeG.xCandWi + UI_MARGIN;
}
if(lppt->x + sImeG.xStatusWi + Comp_CandWndLen > rcWorkArea.right) {
lppt->x=(SHORT)(rcWorkArea.right-sImeG.xStatusWi-Comp_CandWndLen);
}
}
return;
}
/**********************************************************************/
/* SetStatusWindowPos() */
/**********************************************************************/
LRESULT PASCAL SetStatusWindowPos(
HWND hStatusWnd)
{
HWND hUIWnd;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
//RECT rcStatusWnd;
POINTS ptPos;
hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
if (!hUIWnd) {
return (1L);
}
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
return (1L);
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { // Oh! Oh!
return (1L);
}
ptPos.x = (short)lpIMC->ptStatusWndPos.x;
ptPos.y = (short)lpIMC->ptStatusWndPos.y;
// display boundary adjust
AdjustStatusBoundary(&ptPos, hUIWnd);
SetWindowPos(hStatusWnd, NULL,
ptPos.x, ptPos.y,
0, 0, SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOSIZE|SWP_NOZORDER);
ImmUnlockIMC(hIMC);
return (0L);
}
/**********************************************************************/
/* ShowStatus() */
/**********************************************************************/
void PASCAL ShowStatus( // Show the status window - shape / soft KBD
// alphanumeric ...
HWND hUIWnd,
int nShowStatusCmd)
{
HGLOBAL hUIPrivate;
LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
if (!hUIPrivate) { // can not darw status window
return;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) { // can not draw status window
return;
}
if (!lpUIPrivate->hStatusWnd) {
// not in show status window mode
} else if (lpUIPrivate->nShowStatusCmd != nShowStatusCmd) {
SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
SetStatusWindowPos(lpUIPrivate->hStatusWnd);
ShowWindow(lpUIPrivate->hStatusWnd, nShowStatusCmd);
lpUIPrivate->nShowStatusCmd = nShowStatusCmd;
} else {
}
GlobalUnlock(hUIPrivate);
return;
}
/**********************************************************************/
/* OpenStatus() */
/**********************************************************************/
void PASCAL OpenStatus( // open status window
HWND hUIWnd)
{
HGLOBAL hUIPrivate;
LPUIPRIV lpUIPrivate;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
POINT ptPos;
int nShowStatusCmd;
RECT rcWorkArea;
rcWorkArea = sImeG.rcWorkArea;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
if (!hUIPrivate) { // can not darw status window
return;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) { // can not draw status window
return;
}
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
ptPos.x = rcWorkArea.left;
ptPos.y = rcWorkArea.bottom - sImeG.yStatusHi;
nShowStatusCmd = SW_HIDE;
} else if (lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC)) {
POINTS TempPoints;
// for MUL_MONITOR
rcWorkArea = ImeMonitorWorkAreaFromWindow(lpIMC->hWnd);
TempPoints.x = (short) lpIMC->ptStatusWndPos.x;
TempPoints.y = (short) lpIMC->ptStatusWndPos.y;
AdjustStatusBoundary(&TempPoints, hUIWnd);
lpIMC->ptStatusWndPos.x = TempPoints.x;
lpIMC->ptStatusWndPos.y = TempPoints.y;
if (MBIndex.IMEChara[0].IC_Trace) {
ptPos = lpIMC->ptStatusWndPos;
}
else {
ptPos.x = sImeG.rcWorkArea.left;
ptPos.y = sImeG.rcWorkArea.bottom - sImeG.yStatusHi;
}
ImmUnlockIMC(hIMC);
nShowStatusCmd = SW_SHOWNOACTIVATE;
} else {
ptPos.x = rcWorkArea.left;
ptPos.y = rcWorkArea.bottom - sImeG.yStatusHi;
nShowStatusCmd = SW_HIDE;
}
if (lpUIPrivate->hStatusWnd) {
SetWindowPos(lpUIPrivate->hStatusWnd, NULL,
ptPos.x, ptPos.y,
0, 0,
SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
} else { // create status window
lpUIPrivate->hStatusWnd = CreateWindowEx(
WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME,
szStatusClassName, NULL,
WS_POPUP|WS_DISABLED,
ptPos.x, ptPos.y,
sImeG.xStatusWi, sImeG.yStatusHi,
hUIWnd, (HMENU)NULL, hInst, NULL);
SetWindowLong(lpUIPrivate->hStatusWnd, UI_MOVE_OFFSET,
WINDOW_NOT_DRAG);
SetWindowLong(lpUIPrivate->hStatusWnd, UI_MOVE_XY, 0L);
}
lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
if (hIMC) {
ShowStatus(
hUIWnd, SW_SHOWNOACTIVATE);
}
GlobalUnlock(hUIPrivate);
return;
}
/**********************************************************************/
/* DestroyStatusWindow() */
/**********************************************************************/
void PASCAL DestroyStatusWindow(
HWND hStatusWnd)
{
HWND hUIWnd;
HGLOBAL hUIPrivate;
LPUIPRIV lpUIPrivate;
if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
// undo the drag border
DrawDragBorder(hStatusWnd,
GetWindowLong(hStatusWnd, UI_MOVE_XY),
GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
}
hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
if (!hUIWnd) {
return;
}
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE);
if (!hUIPrivate) { // can not darw status window
return;
}
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate);
if (!lpUIPrivate) { // can not draw status window
return;
}
lpUIPrivate->nShowStatusCmd = SW_HIDE;
lpUIPrivate->hStatusWnd = (HWND)NULL;
GlobalUnlock(hUIPrivate);
return;
}
/**********************************************************************/
/* SetStatus */
/**********************************************************************/
void PASCAL SetStatus(
HWND hStatusWnd,
LPPOINT lpptCursor)
{
HWND hUIWnd;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
if (!hUIWnd) {
return;
}
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
return;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return;
}
if (!lpIMC->fOpen) {
ImmSetOpenStatus(hIMC, TRUE);
} else if (PtInRect(&sImeG.rcImeIcon, *lpptCursor)) {
DWORD fdwConversion;
if (lpIMC->fdwConversion & (IME_CMODE_CHARCODE|IME_CMODE_EUDC)) {
// change to native mode
fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) &
~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
} else if (lpIMC->fdwConversion & IME_CMODE_NATIVE) {
// change to alphanumeric mode
fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_CHARCODE |
IME_CMODE_NATIVE | IME_CMODE_EUDC);
} else {
BYTE lpbKeyState[256];
if (!GetKeyboardState(lpbKeyState))
{
ImmUnlockIMC(hIMC);
return;
}
if (lpbKeyState[VK_CAPITAL] & 1)
{
// Simulate a key press
keybd_event( VK_CAPITAL,
0x3A,
KEYEVENTF_EXTENDEDKEY | 0,
0 );
// Simulate a key release
keybd_event( VK_CAPITAL,
0x3A,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
}
fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) &
~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
uCaps = 0;
}
// init ime Private status
{
LPPRIVCONTEXT lpImcP;
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
if(lpImcP) {
lpImcP->PrivateArea.Comp_Status.dwSTLX = 0;
lpImcP->PrivateArea.Comp_Status.dwSTMULCODE = 0;
lpImcP->PrivateArea.Comp_Status.dwInvalid = 0;
ImmUnlockIMCC(lpIMC->hPrivate);
}
}
ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
} else if (PtInRect(&sImeG.rcImeName, *lpptCursor)) {
} else if (PtInRect(&sImeG.rcShapeText, *lpptCursor)) {
DWORD dwConvMode;
if (lpIMC->fdwConversion & IME_CMODE_CHARCODE) {
MessageBeep((UINT)-1);
} else if (lpIMC->fdwConversion & IME_CMODE_EUDC) {
MessageBeep((UINT)-1);
} else {
dwConvMode = lpIMC->fdwConversion ^ IME_CMODE_FULLSHAPE;
ImmSetConversionStatus(hIMC, dwConvMode, lpIMC->fdwSentence);
}
} else if (PtInRect(&sImeG.rcSymbol, *lpptCursor)) {
DWORD fdwConversion;
if (lpIMC->fdwConversion & IME_CMODE_CHARCODE) {
MessageBeep((UINT)-1);
} else {
fdwConversion = lpIMC->fdwConversion ^ IME_CMODE_SYMBOL;
ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
}
} else if (PtInRect(&sImeG.rcSKText, *lpptCursor)) {
DWORD fdwConversion;
LPPRIVCONTEXT lpImcP;
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
if(lpImcP) {
if(!(lpImeL->hSKMenu)) {
lpImeL->hSKMenu = LoadMenu (hInst, TEXT("SKMENU"));
}
lpImeL->dwSKState[lpImeL->dwSKWant] =
lpImeL->dwSKState[lpImeL->dwSKWant]^1;
fdwConversion = lpIMC->fdwConversion ^ IME_CMODE_SOFTKBD;
ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
ImmUnlockIMCC(lpIMC->hPrivate);
} else {
MessageBeep((UINT)-1);
}
} else {
MessageBeep((UINT)-1);
}
ImmUnlockIMC(hIMC);
return;
}
/**********************************************************************/
/* StatusSetCursor() */
/**********************************************************************/
void PASCAL StatusSetCursor(
HWND hStatusWnd,
LPARAM lParam)
{
POINT ptCursor, ptSavCursor;
RECT rcWnd;
if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
SetCursor(LoadCursor(NULL, IDC_SIZEALL));
return;
}
GetCursorPos(&ptCursor);
ptSavCursor = ptCursor;
ScreenToClient(hStatusWnd, &ptCursor);
if (PtInRect(&sImeG.rcStatusText, ptCursor)) {
SetCursor(LoadCursor(hInst, szHandCursor));
if (HIWORD(lParam) == WM_LBUTTONDOWN) {
SetStatus(hStatusWnd, &ptCursor);
} else if (HIWORD(lParam) == WM_RBUTTONUP) {
if (PtInRect(&sImeG.rcSKText, ptCursor)) {
static BOOL fSoftkey= FALSE;
// prevent recursive
if (fSoftkey) {
// configuration already bring up
return;
}
fSoftkey = TRUE;
SoftkeyMenu(hStatusWnd, ptSavCursor.x, ptSavCursor.y);
fSoftkey = FALSE;
}else{
static BOOL fCmenu=FALSE;
// prevent recursive
if (fCmenu) {
// configuration already bring up
return;
}
fCmenu = TRUE;
ContextMenu(hStatusWnd, ptSavCursor.x, ptSavCursor.y);
fCmenu = FALSE;
}
}
return;
} else {
SetCursor(LoadCursor(NULL, IDC_SIZEALL));
if (HIWORD(lParam) == WM_LBUTTONDOWN) {
// start drag
SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
} else {
return;
}
}
SetCapture(hStatusWnd);
SetWindowLong(hStatusWnd, UI_MOVE_XY,
MAKELONG(ptSavCursor.x, ptSavCursor.y));
GetWindowRect(hStatusWnd, &rcWnd);
SetWindowLong(hStatusWnd, UI_MOVE_OFFSET,
MAKELONG(ptSavCursor.x - rcWnd.left, ptSavCursor.y - rcWnd.top));
DrawDragBorder(hStatusWnd, MAKELONG(ptSavCursor.x, ptSavCursor.y),
GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
return;
}
/**********************************************************************/
/* PaintStatusWindow() */
/**********************************************************************/
void PASCAL PaintStatusWindow(
HDC hDC,
HWND hStatusWnd)
{
HWND hUIWnd;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPPRIVCONTEXT lpImcP;
HGDIOBJ hOldFont;
HBITMAP hImeIconBmp, hShapeBmp, hSymbolBmp, hSKBmp;
HBITMAP hOldBmp;
HDC hMemDC;
hUIWnd = GetWindow(hStatusWnd, GW_OWNER);
if (!hUIWnd) {
MessageBeep((UINT)-1);
return;
}
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) {
MessageBeep((UINT)-1);
return;
}
if (!(lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC))) {
MessageBeep((UINT)-1);
return;
}
// get lpImcP
if(!(lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate))) {
MessageBeep((UINT)-1);
return;
}
// set font
if (sImeG.fDiffSysCharSet) {
LOGFONT lfFont;
ZeroMemory(&lfFont, sizeof(lfFont));
hOldFont = GetCurrentObject(hDC, OBJ_FONT);
lfFont.lfHeight = -MulDiv(12, GetDeviceCaps(hDC, LOGPIXELSY), 72);
lfFont.lfCharSet = NATIVE_CHARSET;
lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
SelectObject(hDC, CreateFontIndirect(&lfFont));
}
// draw Ime Name
{
if (lpIMC->fOpen) {
SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
} else {
SetTextColor(hDC, RGB(0x80, 0x80, 0x80));
}
SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));
DrawText(hDC, MBIndex.MBDesc[0].szName, lstrlen(MBIndex.MBDesc[0].szName),
&sImeG.rcImeName, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
DrawConvexRect(hDC,
sImeG.rcImeName.left,
sImeG.rcImeName.top,
sImeG.rcImeName.right - 1,
sImeG.rcImeName.bottom - 1);
DrawConvexRectP(hDC,
sImeG.rcImeName.left,
sImeG.rcImeName.top,
sImeG.rcImeName.right,
sImeG.rcImeName.bottom);
// load all bitmap
hSymbolBmp = (HBITMAP)NULL;
hShapeBmp = (HBITMAP)NULL;
hSKBmp = (HBITMAP)NULL;
if (!lpIMC->fOpen) {
hSymbolBmp = LoadBitmap(hInst, szNone);
hShapeBmp = LoadBitmap(hInst, szNone);
hSKBmp = LoadBitmap(hInst, szNone);
hImeIconBmp = LoadBitmap(hInst, szChinese);
} else if (lpIMC->fdwConversion & IME_CMODE_NATIVE) {
if(!lpImcP->PrivateArea.Comp_Status.OnLineCreWord){
hImeIconBmp = LoadBitmap(hInst, szChinese);
} else {
hImeIconBmp = LoadBitmap(hInst, szCZ);
}
} else {
hImeIconBmp = LoadBitmap(hInst, szEnglish);
}
if (!hShapeBmp) {
if (lpIMC->fdwConversion & IME_CMODE_FULLSHAPE) {
hShapeBmp = LoadBitmap(hInst, szFullShape);
} else {
hShapeBmp = LoadBitmap(hInst, szHalfShape);
}
}
if (!hSymbolBmp) {
if (lpIMC->fdwConversion & IME_CMODE_SYMBOL) {
hSymbolBmp = LoadBitmap(hInst, szSymbol);
} else {
hSymbolBmp = LoadBitmap(hInst, szNoSymbol);
}
}
if (!hSKBmp) {
if (lpIMC->fdwConversion & IME_CMODE_SOFTKBD) {
hSKBmp = LoadBitmap(hInst, szSoftKBD);
} else {
hSKBmp = LoadBitmap(hInst, szNoSoftKBD);
}
}
ImmUnlockIMC(hIMC);
ImmUnlockIMCC(lpIMC->hPrivate);
hMemDC = CreateCompatibleDC(hDC);
hOldBmp = SelectObject(hMemDC, hImeIconBmp);
BitBlt(hDC, sImeG.rcImeIcon.left, sImeG.rcImeIcon.top,
sImeG.rcImeIcon.right - sImeG.rcImeIcon.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hShapeBmp);
BitBlt(hDC, sImeG.rcShapeText.left, sImeG.rcShapeText.top,
sImeG.rcShapeText.right - sImeG.rcShapeText.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hSymbolBmp);
BitBlt(hDC, sImeG.rcSymbol.left, sImeG.rcSymbol.top,
sImeG.rcSymbol.right - sImeG.rcSymbol.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hSKBmp);
BitBlt(hDC, sImeG.rcSKText.left, sImeG.rcSKText.top,
sImeG.xStatusWi - sImeG.rcSKText.left,
STATUS_DIM_Y,
hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hOldBmp);
DeleteDC(hMemDC);
DeleteObject(hImeIconBmp);
DeleteObject(hSymbolBmp);
DeleteObject(hShapeBmp);
DeleteObject(hSKBmp);
if (sImeG.fDiffSysCharSet) {
DeleteObject(SelectObject(hDC, hOldFont));
}
return;
}
/**********************************************************************/
/* StatusWndProc() */
/**********************************************************************/
LRESULT CALLBACK StatusWndProc(
HWND hStatusWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg) {
case WM_DESTROY:
DestroyStatusWindow(hStatusWnd);
break;
case WM_SETCURSOR:
StatusSetCursor(hStatusWnd, lParam);
break;
case WM_MOUSEMOVE:
if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
POINT ptCursor;
DrawDragBorder(hStatusWnd,
GetWindowLong(hStatusWnd, UI_MOVE_XY),
GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
GetCursorPos(&ptCursor);
SetWindowLong(hStatusWnd, UI_MOVE_XY,
MAKELONG(ptCursor.x, ptCursor.y));
DrawDragBorder(hStatusWnd, MAKELONG(ptCursor.x, ptCursor.y),
GetWindowLong(hStatusWnd, UI_MOVE_OFFSET));
} else {
return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
}
break;
case WM_LBUTTONUP:
if (GetWindowLong(hStatusWnd, UI_MOVE_OFFSET) != WINDOW_NOT_DRAG) {
LONG lTmpCursor, lTmpOffset;
lTmpCursor = GetWindowLong(hStatusWnd, UI_MOVE_XY);
// calculate the org by the offset
lTmpOffset = GetWindowLong(hStatusWnd, UI_MOVE_OFFSET);
DrawDragBorder(hStatusWnd, lTmpCursor, lTmpOffset);
(*(LPPOINTS)&lTmpCursor).x -= (*(LPPOINTS)&lTmpOffset).x;
(*(LPPOINTS)&lTmpCursor).y -= (*(LPPOINTS)&lTmpOffset).y;
SetWindowLong(hStatusWnd, UI_MOVE_OFFSET, WINDOW_NOT_DRAG);
ReleaseCapture();
AdjustStatusBoundary((LPPOINTS)&lTmpCursor,
GetWindow(hStatusWnd, GW_OWNER));
SendMessage(GetWindow(hStatusWnd, GW_OWNER), WM_IME_CONTROL,
IMC_SETSTATUSWINDOWPOS, lTmpCursor);
} else {
return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
}
break;
case WM_IME_NOTIFY:
// get work area for changing
SystemParametersInfo(SPI_GETWORKAREA, 0, &sImeG.rcWorkArea, 0);
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;
case WM_MOUSEACTIVATE:
return (MA_NOACTIVATE);
default:
return DefWindowProc(hStatusWnd, uMsg, wParam, lParam);
}
return (0L);
}
///////
int CheckCodeKey (TCHAR szInputCode[]);
BOOL CrtIsUsedCode(TCHAR wCharCode);
int CheckKey (TCHAR szInputWord[]);
void BreakString (LPTSTR, LPTSTR, LPTSTR);
int DelItem (HIMCC, LPTSTR, LPTSTR);
void AddStringTolist ( LPINPUTCONTEXT lpIMC, HWND hDlg);
BOOL GetUDCItem(HIMCC, UINT, LPTSTR, LPTSTR);
void DelSelCU (HIMCC, int);
int GetUDCIndex(HIMCC, LPTSTR, LPTSTR);
INT_PTR CALLBACK ListWordProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK ModiWordDlgProc(HWND, UINT, WPARAM, LPARAM);
FARPROC lpListWordOld;
#define LBN_DELETE 6
static TCHAR szModiWord [MAXINPUTWORD + 1];
static TCHAR szModiCode [MAXCODE + 1];
/**********************************************************************/
/* CrtWordDlgProc() */
/* Return Value: */
/* TRUE - successful, FALSE - failure */
/**********************************************************************/
INT_PTR CALLBACK CrtWordDlgProc(
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
RECT rc;
LONG DlgWidth, DlgHeight;
static TCHAR szInputWord [MAXINPUTWORD + 1];
static TCHAR szInputCode [MAXCODE + 1];
static TCHAR szInputWordOld [MAXINPUTWORD + 1] ;
static TCHAR szInputCodeOld [MAXCODE + 1] ;
switch (uMessage) {
case WM_PAINT:
{
GetClientRect(hDlg, &rc);
DrawConvexRect(GetDC(hDlg),
rc.left + 10,
rc.top + 10,
rc.right - 10 - 1,
rc.bottom - 20 - 1);
DrawConvexRectP(GetDC(hDlg),
rc.left + 10,
rc.top + 10,
rc.right - 10,
rc.bottom - 20);
}
return (FALSE);
case WM_INITDIALOG:
{
TCHAR szStr[54];
HDC hDC;
DWORD nStrLenth;
RECT rcWorkArea;
hCrtDlg = hDlg;
#ifdef UNICODE
{
TCHAR UniTmp1[] = {0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x006D, 0x0000};
TCHAR UniTmp2[] = {0x96F6, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x96F6, 0x4E00, 0x4E8C, 0x4E09, 0x56DB, 0x4E94, 0x516D, 0x4E03, 0x516B, 0x4E5D, 0x0000};
MyStrFormat (szStr, sizeof(szStr)/sizeof(szStr[0]), UniTmp1, UniTmp2);
}
#else
MyStrFormat (szStr, sizeof(szStr)/sizeof(szStr[0]), TEXT("mmmmmmmmmmmm"), TEXT("零一二三四五六七八九零一二三四五六七八九"));
#endif //UNICODE
// reset position
GetWindowRect(hDlg, &rc);
DlgWidth = rc.right - rc.left;
DlgHeight = rc.bottom - rc.top;
rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
SetWindowPos(hDlg, HWND_TOP,
(int)(rcWorkArea.right - DlgWidth)/2,
(int)(rcWorkArea.bottom - DlgHeight)/2,
(int)0, (int)0, SWP_NOSIZE);
CheckRadioButton (hDlg, IDC_RADIOADD, IDC_RADIOMOD, IDC_RADIOADD);
lpListWordOld = (FARPROC)GetWindowLongPtr(GetDlgItem (hDlg,IDC_LIST_WORD),
GWLP_WNDPROC);
SetWindowLongPtr(GetDlgItem (hDlg,IDC_LIST_WORD), GWLP_WNDPROC,
(LONG_PTR)ListWordProc);
EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), TRUE);
EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), TRUE);
EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), TRUE);
SendDlgItemMessage (hDlg, IDC_INPUTWORD, EM_LIMITTEXT, MAXINPUTWORD, 0);
SendDlgItemMessage (hDlg, IDC_INPUTCODE, EM_LIMITTEXT, MBIndex.MBDesc[0].wMaxCodes, 0);
hDC = GetDC (hDlg);
nStrLenth = GetTabbedTextExtent (hDC, szStr, lstrlen(szStr), 0, (LPINT)NULL);
ReleaseDC (hDlg, hDC);
SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_SETHORIZONTALEXTENT, nStrLenth, 0);
return (TRUE); // don't want to set focus to special control
}
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_RADIOADD:
EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), TRUE);
EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), TRUE);
EnableWindow (GetDlgItem (hDlg,IDC_STATIC), TRUE);
EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), TRUE);
SendDlgItemMessage (hDlg, IDC_BT_INS, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
SendDlgItemMessage (hDlg, IDC_CLOSE, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_RESETCONTENT, 0, 0L);
SetFocus (GetDlgItem (hDlg, IDC_INPUTWORD));
break;
case IDC_RADIOMOD:
EnableWindow (GetDlgItem (hDlg,IDC_BT_MODIFY), TRUE);
EnableWindow (GetDlgItem (hDlg,IDC_BT_DEL), TRUE);
EnableWindow (GetDlgItem (hDlg,IDC_INPUTWORD), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_INPUTCODE), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_STATIC), FALSE);
EnableWindow (GetDlgItem (hDlg,IDC_BT_INS), FALSE);
SendDlgItemMessage (hDlg, IDC_CLOSE, BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
SendDlgItemMessage (hDlg, IDC_BT_INS, BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_RESETCONTENT, 0, 0L);
SetDlgItemText (hDlg,IDC_INPUTCODE, TEXT(""));
SetDlgItemText (hDlg,IDC_INPUTWORD, TEXT(""));
lstrcpy (szInputWordOld, TEXT(""));
lstrcpy (szInputCodeOld, TEXT(""));
{
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
HCURSOR hOldCursor;
WORD wTabStops [1];
wTabStops[0] = 80;
hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
if (!hIMC) {
return (0L);
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { // Oh! Oh!
return (0L);
}
hOldCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_SETTABSTOPS, 1, (LPARAM)&wTabStops[0]);
AddStringTolist (lpIMC, hDlg);
SetCursor(hOldCursor);
ImmUnlockIMC(hIMC);
ImmReleaseContext (GetParent(hDlg), hIMC);
}
SetFocus (GetDlgItem (hDlg,IDC_LIST_WORD));
break;
case IDC_INPUTCODE:
{
HIMC hIMC;
hIMC = (HIMC)ImmGetContext(hDlg);
if (!hIMC) {
return FALSE;
}
switch(HIWORD(wParam)) {
case EN_SETFOCUS:
if(hIMC) {
ImmSetOpenStatus(hIMC, FALSE);
ImmUnlockIMC(hIMC);
}
break;
case EN_KILLFOCUS:
if(hIMC) {
ImmSetOpenStatus(hIMC, TRUE);
ImmUnlockIMC(hIMC);
}
break;
default:
break;
}
}
GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
if (SendDlgItemMessage(hDlg,IDC_INPUTCODE,EM_GETMODIFY,0,0)){
int i, CaretPos;
GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
if (((CaretPos = CheckCodeKey (szInputCode)) != (-1))) {
StringCbCopy(szInputCode, sizeof(szInputCode), szInputCodeOld);
SetDlgItemText (hDlg,IDC_INPUTCODE, szInputCode);
for (i = 0; i < 1; i++){
MessageBeep (0xFFFFFFFF);
}
}
StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szInputCode);
}
break;
case IDC_INPUTWORD:
GetDlgItemText (hDlg, IDC_INPUTWORD, szInputWord, MAXINPUTWORD);
if (SendDlgItemMessage(hDlg,IDC_INPUTWORD,EM_GETMODIFY,0,0)){
int i, CaretPos;
GetDlgItemText(hDlg,IDC_INPUTWORD,szInputWord,MAXINPUTWORD);
if (((CaretPos = CheckKey (szInputWord)) != (-1))) {
StringCbCopy(szInputWord, sizeof(szInputWord), szInputWordOld);
SetDlgItemText (hDlg,IDC_INPUTWORD, szInputWord);
SendDlgItemMessage(hDlg,
IDC_INPUTWORD,
EM_SETSEL,
CaretPos,
CaretPos);
for (i = 0; i < 1; i++){
MessageBeep (0xFFFFFFFF);
}
}
if (MBIndex.MBDesc[0].wNumRulers != 0){
TCHAR MBName[MAXSTRLEN];
static TCHAR szAutoCode [MAXCODE + 1];
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPPRIVCONTEXT lpImcP;
hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
if (!hIMC) {
return (0L);
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { // Oh! Oh!
return (0L);
}
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
if (!lpImcP) { // Oh! Oh!
return (0L);
}
// auto coding
StringCbCopy(MBName, sizeof(MBName), sImeG.szIMESystemPath);
StringCbCat(MBName,sizeof(MBName), TEXT("\\"));
StringCbCat(MBName, sizeof(MBName), (LPCTSTR)lpImcP->MB_Name);
ConvCreateWord(lpIMC->hWnd,
(LPCTSTR)MBName,
(LPTSTR)szInputWord,
(LPTSTR)szAutoCode);
ImmUnlockIMC(hIMC);
ImmUnlockIMCC(lpIMC->hPrivate);
ImmReleaseContext (GetParent(hDlg), hIMC);
SetDlgItemText (hDlg,IDC_INPUTCODE, szAutoCode);
SendDlgItemMessage(hDlg,IDC_INPUTCODE,EM_SETSEL, 0, -1);
StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szAutoCode);
}
StringCbCopy (szInputWordOld, sizeof(szInputWordOld), szInputWord);
}
break;
case IDC_LIST_WORD:
if (SendDlgItemMessage(hDlg,IDC_RADIOADD,BM_GETCHECK,0,0))
break;
if (HIWORD(wParam) == LBN_DBLCLK) {
SendMessage(hDlg,WM_COMMAND,MAKELONG(IDC_BT_MODIFY,0),0);
break;
}
if (!(HIWORD(wParam) == LBN_DELETE)) {
break;
}
MessageBeep (0xFFFFFFFF);
case IDC_BT_DEL:
{
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
TCHAR szList [80];
TCHAR szCode [MAXCODE + 1];
TCHAR szWord [MAXINPUTWORD + 1];
WORD nLenth;
int SelFlag;
int SelIndex [MAXNUMBER_EMB], NewIndex;
WORD SelCount, i;
if ((SelCount=(WORD)SendDlgItemMessage(hDlg,
IDC_LIST_WORD,
LB_GETSELITEMS,
(WPARAM)MAXNUMBER_EMB,
(LPARAM)SelIndex)) == LB_ERR)
break;
if(SelCount) {
TCHAR szDelMessageString [40];
wsprintf (szDelMessageString, TEXT("%d"), SelCount);
#ifdef UNICODE
{
TCHAR UniTmp[] = {0x0020, 0x4E2A, 0x8BCD, 0x6761,
0x5C06, 0x88AB, 0x5220, 0x9664,
0x0021, 0x0020, 0x0020, 0x0020,
0x0020, 0x0020, 0x0020, 0x0020,
0x0020, 0x0000};
lstrcat (szDelMessageString, UniTmp);
}
#else
lstrcat(szDelMessageString,
TEXT(" 个词条将被删除! "));
#endif
if (IDNO == MessageBox (hDlg,
szDelMessageString,
szWarnTitle,
MB_YESNO|MB_ICONINFORMATION))
break;
} else {
break;
}
hIMC = (HIMC)ImmGetContext(GetParent(hDlg));
if (!hIMC) {
return 0L;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { // Oh! Oh!
return (0L);
}
for (i = 0; i < SelCount; i++){
nLenth = (WORD)SendDlgItemMessage(hDlg,
IDC_LIST_WORD,
LB_GETTEXT,
(WPARAM)SelIndex[SelCount-i-1],
(LPARAM)(LPTSTR)szList);
if ( nLenth == LB_ERR) break;
BreakString((LPTSTR)szList,(LPTSTR)szCode,(LPTSTR)szWord);
NewIndex=GetUDCIndex(lpIMC->hPrivate,
(LPTSTR)szCode,
(LPTSTR)szWord);
DelSelCU (lpIMC->hPrivate, NewIndex);
#ifdef EUDC
if(strlen((const char *)szWord) == sizeof(WORD)){
ImeUnregisterWord(szCode,IME_REGWORD_STYLE_EUDC,szWord);
}
#endif
//For modify
SendDlgItemMessage (hDlg,IDC_LIST_WORD,
LB_DELETESTRING, SelIndex [SelCount - i - 1], 0L);
SelFlag = SelIndex [SelCount - i - 1];
}
if (SelFlag>=SendDlgItemMessage(hDlg,IDC_LIST_WORD,
LB_GETCOUNT, 0,0)){
SelFlag = (int) SendDlgItemMessage(hDlg,
IDC_LIST_WORD,
LB_GETCOUNT,
(WPARAM)0,
(LPARAM)0) -1;
} // Keep current item
SendDlgItemMessage (hDlg,IDC_LIST_WORD,
LB_SELITEMRANGE, 1, MAKELONG(SelFlag, SelFlag));
SendDlgItemMessage (hDlg,IDC_LIST_WORD,
LB_SETCARETINDEX, SelFlag, 0L);
ImmUnlockIMC(hIMC);
ImmReleaseContext (GetParent(hDlg), hIMC);
SetFocus (GetDlgItem (hDlg, IDC_LIST_WORD));
break;
}
case IDC_BT_MODIFY:
{
// get string in listbox
TCHAR szList [80];
WORD nLenth;
int SelIndex [50];
WORD SelCount;
SelCount=(WORD)SendDlgItemMessage(hDlg,
IDC_LIST_WORD,
LB_GETSELITEMS,
(WPARAM)50,
(LPARAM)SelIndex);
if ((SelCount == LB_ERR)||(SelCount != 1)) break;
nLenth=(WORD)SendDlgItemMessage(hDlg,
IDC_LIST_WORD,
LB_GETTEXT,
(WPARAM)SelIndex[0],
(LPARAM)(LPTSTR)szList);
if (nLenth == LB_ERR) break;
BreakString((LPTSTR)szList,
(LPTSTR)szModiCode,
(LPTSTR)szModiWord);
SendDlgItemMessage (hDlg,IDC_LIST_WORD,
LB_DELETESTRING, SelIndex [0], 0L);
}
DialogBox(hInst, TEXT("MODIWORD"), hDlg, ModiWordDlgProc);
SetFocus(GetDlgItem (hDlg, IDC_BT_MODIFY));
SendDlgItemMessage (hDlg,
IDC_BT_MODIFY,
BM_SETSTYLE,
BS_DEFPUSHBUTTON,
TRUE);
{
TCHAR WCodeStr[MAXCODE + 1];
TCHAR DBCSStr [MAXINPUTWORD + 1];
TCHAR szOutList[80];
int ModiIndex;
StringCbCopy (WCodeStr, sizeof(WCodeStr), szModiCode);
StringCbCopy(DBCSStr , sizeof(DBCSStr), szModiWord);
MyStrFormat (szOutList, sizeof(szOutList)/sizeof(szOutList[0]), WCodeStr, DBCSStr);
SendDlgItemMessage (hDlg,
IDC_LIST_WORD,
LB_ADDSTRING,
(WPARAM)0,
(LPARAM)(LPTSTR)szOutList);
ModiIndex =(int)SendDlgItemMessage(hDlg,
IDC_LIST_WORD,
LB_FINDSTRING,
(WPARAM) -1,
(LPARAM)(LPTSTR)szOutList);
SendDlgItemMessage (hDlg,IDC_LIST_WORD,
LB_SELITEMRANGE,
1,
MAKELONG(ModiIndex, ModiIndex));
SendDlgItemMessage (hDlg,IDC_LIST_WORD,
LB_SETCARETINDEX,
ModiIndex,
0L);
SetFocus (GetDlgItem (hDlg, IDC_BT_MODIFY));
}
break;
case IDC_BT_INS:
{
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
int fAddWordFlag;
HWND hControl;
TCHAR szListWord [80];
{
TCHAR szWord [MAXINPUTWORD + 1];
TCHAR szCode1 [MAXCODE + 1] ;
GetDlgItemText(hDlg,IDC_INPUTWORD,szWord,MAXINPUTWORD);
GetDlgItemText (hDlg, IDC_INPUTCODE, szCode1, MAXCODE);
if (lstrlen(szWord) == 0){
SetFocus (GetDlgItem (hDlg,IDC_INPUTWORD));
break;
} else if (lstrlen(szCode1) == 0){
SetFocus (GetDlgItem (hDlg,IDC_INPUTCODE));
break;
}
}
GetDlgItemText(hDlg,IDC_INPUTWORD,szInputWord,MAXINPUTWORD);
GetDlgItemText (hDlg, IDC_INPUTCODE, szInputCode, MAXCODE);
MyStrFormat (szListWord, sizeof(szListWord)/sizeof(szListWord[0]), szInputCode, szInputWord);
if(lstrlen(szInputWord) && lstrlen(szInputCode)) {
hIMC = (HIMC)ImmGetContext(GetParent (hDlg));
if (!hIMC) {
return 0L;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { // Oh! Oh!
return (0L);
}
CharLowerBuff(szInputCode, lstrlen(szInputCode));
{
UINT i;
for(i=0;i<strlen((const char *)szInputCode);i++){
if(!IsUsedCode(szInputCode[i], NULL)){
InfoMessage(NULL, IDS_WARN_INVALIDCODE);
ImmUnlockIMC(hIMC);
ImmReleaseContext(GetParent(GetParent(hDlg)),
hIMC);
return(0L);
}
}
}
fAddWordFlag = AddZCItem(lpIMC->hPrivate,
szInputCode,
szInputWord);
ImmUnlockIMC(hIMC);
ImmReleaseContext (GetParent(hDlg), hIMC);
if (fAddWordFlag == ADD_REP){
InfoMessage(NULL, IDS_WARN_DUPPRASE);
break;
} else if (fAddWordFlag == ADD_FULL){
InfoMessage(NULL, IDS_WARN_OVEREMB);
break;
}
hControl = GetDlgItem (hDlg,IDC_LIST_WORD);
SendMessage (hControl, LB_ADDSTRING, (WPARAM) 0,
(LPARAM)(LPTSTR)szListWord);
} else {
szInputWord[0] = 0;
szInputCode[0] = 0;
}
}
SetDlgItemText (hDlg,IDC_INPUTWORD, TEXT(""));
SetDlgItemText (hDlg,IDC_INPUTCODE, TEXT(""));
lstrcpy (szInputWordOld, TEXT(""));
lstrcpy (szInputCodeOld, TEXT(""));
SetFocus (GetDlgItem (hDlg,IDC_INPUTWORD));
break;
case IDC_CLOSE:
hCrtDlg = NULL;
lstrcpy (szInputWordOld, TEXT(""));
lstrcpy (szInputCodeOld, TEXT(""));
EndDialog (hDlg, FALSE);
break;
case IDCANCEL:
hCrtDlg = NULL;
lstrcpy (szInputWordOld, TEXT(""));
lstrcpy (szInputCodeOld, TEXT(""));
EndDialog(hDlg, FALSE);
break;
default:
return (FALSE);
break;
}
return (TRUE);
case WM_CLOSE:
if (hChildDlg) SendMessage(hChildDlg, WM_CLOSE, 0, 0);
hCrtDlg = NULL;
lstrcpy (szInputWordOld, TEXT(""));
lstrcpy (szInputCodeOld, TEXT(""));
EndDialog(hDlg, FALSE);
return (TRUE);
default:
return (FALSE);
}
return (TRUE);
}
/*********************************************************************/
/* void AddStringTolist ( LPINPUTCONTEXT lpIMC) */
/*********************************************************************/
void AddStringTolist ( LPINPUTCONTEXT lpIMC,
HWND hDlg)
{
TCHAR WCodeStr[MAXCODE + 1];
TCHAR DBCSStr [MAXINPUTWORD + 1];
TCHAR szOutList[80];
int i = 0, n = 0;
while (GetUDCItem(lpIMC->hPrivate, i, (LPTSTR)WCodeStr, (LPTSTR)DBCSStr)){
MyStrFormat(szOutList, sizeof(szOutList)/sizeof(szOutList[0]), WCodeStr, DBCSStr);
SendDlgItemMessage (hDlg, IDC_LIST_WORD, LB_ADDSTRING, (WPARAM)0,
(LPARAM)(LPTSTR)szOutList);
i ++;
}
}
/*********************************************************************/
/* int CheckKey (char szInputWord[]) */
/* */
/*********************************************************************/
int CheckKey (TCHAR szInputWord[])
{
int i;
#ifdef UNICODE
for (i = 0; i < lstrlen (szInputWord); i++ ){
if ((WORD)szInputWord [i] < 0x100) return i;
}
#else
for (i = 0; i < lstrlen (szInputWord); i += 2 ){
if ((BYTE)szInputWord [i] < 128) return i;
}
#endif
return (-1);
}
/************************************************************************/
/*BOOL CrtIsUsedCode(TCHAR wCharCode) */
/************************************************************************/
BOOL CrtIsUsedCode(TCHAR wCharCode)
{
WORD wFlg;
for(wFlg=0; wFlg<MBIndex.MBDesc[0].wNumCodes; wFlg++){
if (wCharCode == MBIndex.MBDesc[0].szUsedCode[wFlg])
break;
}
if(wFlg < MBIndex.MBDesc[0].wNumCodes)
return (TRUE);
return (FALSE);
}
/*********************************************************************/
/* int CheckCodeKey (TCHAR szInputCode[]) */
/* */
/*********************************************************************/
int CheckCodeKey (TCHAR szInputCode[])
{
int i;
for (i = 0; i < lstrlen (szInputCode); i++){
#ifdef UNICODE
if (szInputCode[i] > 0x100) return i;
#else
if ((BYTE)szInputCode [i] > 128) return i;
#endif
if(IsCharUpper(szInputCode [i])) {
szInputCode [i] |= 0x20;
}
if (!CrtIsUsedCode (szInputCode [i])) return i;
}
return (-1);
}
/********************************************************************/
/*INT_PTR CALLBACK ListWordProc( HWND hwnd, */
/* UINT uMessage, */
/* WPARAM wParam, */
/* LPARAM lParam) */
/********************************************************************/
INT_PTR CALLBACK ListWordProc(
HWND hwnd,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
switch (uMessage){
case WM_KEYDOWN:
if (wParam == VK_DELETE){
SendMessage (GetParent (hwnd), WM_COMMAND,
MAKELONG(IDC_LIST_WORD, (WORD)LBN_DELETE), (LPARAM)hwnd);
return TRUE;
}
break;
default :
break;
}
return (BOOL) CallWindowProc ((WNDPROC)lpListWordOld, hwnd, uMessage, wParam, lParam);
}
/**********************************************************************/
/* ModiWordDlgProc() */
/* Return Value: */
/* TRUE - successful, FALSE - failure */
/**********************************************************************/
INT_PTR CALLBACK ModiWordDlgProc(
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
RECT rc;
LONG DlgWidth, DlgHeight;
RECT rcWorkArea;
static TCHAR szInputWord [MAXINPUTWORD + 1];
static TCHAR szInputCode [MAXCODE + 1];
static TCHAR szInputWordOld [MAXINPUTWORD + 1] ;
static TCHAR szInputCodeOld [MAXCODE + 1] ;
switch (uMessage) {
case WM_INITDIALOG:
// reset position
hChildDlg = hDlg;
GetWindowRect(hDlg, &rc);
DlgWidth = rc.right - rc.left;
DlgHeight = rc.bottom - rc.top;
rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
SetWindowPos(hDlg, HWND_TOP,
(int)(rcWorkArea.right - DlgWidth)/2,
(int)(rcWorkArea.bottom - DlgHeight)/2,
(int) 0, (int) 0, SWP_NOSIZE);
SendDlgItemMessage (hDlg, IDC_MODI_WORD, EM_LIMITTEXT, MAXINPUTWORD, 0);
SendDlgItemMessage (hDlg, IDC_MODI_CODE, EM_LIMITTEXT, MBIndex.MBDesc[0].wMaxCodes, 0);
SetDlgItemText (hDlg,IDC_MODI_CODE, szModiCode);
SetDlgItemText (hDlg,IDC_MODI_WORD, szModiWord);
SetFocus (GetDlgItem (hDlg,IDC_MODI_WORD));
StringCbCopy (szInputWordOld, sizeof(szInputWordOld), szModiWord);
StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szModiCode);
return (TRUE); // don't want to set focus to special control
case WM_PAINT:
{
GetClientRect(hDlg, &rc);
DrawConvexRect(GetDC(hDlg),
rc.left + 5,
rc.top + 5,
rc.right - 5 - 1,
rc.bottom - 10 - 1);
DrawConvexRectP(GetDC(hDlg),
rc.left + 5,
rc.top + 5,
rc.right - 5,
rc.bottom - 10);
}
return (FALSE);
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_MODI_CODE:
{
HIMC hIMC;
hIMC = (HIMC)ImmGetContext(hDlg);
if (!hIMC) {
return 0L;
}
switch(HIWORD(wParam)) {
case EN_SETFOCUS:
if(hIMC) {
ImmSetOpenStatus(hIMC, FALSE);
ImmUnlockIMC(hIMC);
}
break;
case EN_KILLFOCUS:
if(hIMC) {
ImmSetOpenStatus(hIMC, TRUE);
ImmUnlockIMC(hIMC);
}
break;
default:
break;
}
}
GetDlgItemText (hDlg, IDC_MODI_CODE, szInputCode, MAXCODE);
if (SendDlgItemMessage (hDlg,IDC_MODI_CODE, EM_GETMODIFY, 0, 0)){
int i, CaretPos;
GetDlgItemText (hDlg, IDC_MODI_CODE, szInputCode, MAXCODE);
if ( ((CaretPos = CheckCodeKey (szInputCode)) != (-1))) {
StringCbCopy (szInputCode, sizeof(szInputCode), szInputCodeOld);
SetDlgItemText (hDlg,IDC_MODI_CODE, szInputCode);
for (i = 0; i < 1; i++){
MessageBeep (0XFFFFFFFF);
}
}
StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szInputCode);
}
break;
case IDC_MODI_WORD:
GetDlgItemText (hDlg, IDC_MODI_WORD, szInputWord, MAXINPUTWORD);
if (SendDlgItemMessage (hDlg,IDC_MODI_WORD, EM_GETMODIFY, 0, 0)){
int i, CaretPos;
GetDlgItemText (hDlg, IDC_MODI_WORD, szInputWord, MAXINPUTWORD);
if (((CaretPos = CheckKey (szInputWord)) != (-1))) {
StringCbCopy (szInputWord, sizeof(szInputWord), szInputWordOld);
SetDlgItemText (hDlg,IDC_MODI_WORD, szInputWord);
SendDlgItemMessage (hDlg,
IDC_MODI_WORD,
EM_SETSEL,
CaretPos,
CaretPos);
for (i = 0; i < 1; i++){
MessageBeep (0xFFFFFFFF);
}
}
if (MBIndex.MBDesc[0].wNumRulers != 0){
TCHAR MBName[MAXSTRLEN];
TCHAR szAutoCode [MAXCODE + 1];
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPPRIVCONTEXT lpImcP;
hIMC = (HIMC)ImmGetContext(GetParent(GetParent(hDlg)));
if (!hIMC) {
return 0L;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { // Oh! Oh!
return (0L);
}
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
if (!lpImcP) { // Oh! Oh!
return (0L);
}
// auto coding
StringCbCopy(MBName, sizeof(MBName), sImeG.szIMESystemPath);
StringCbCat((LPTSTR)MBName, sizeof(MBName), TEXT("\\"));
StringCbCat((LPTSTR)MBName, sizeof(MBName), (LPCTSTR)lpImcP->MB_Name);
ConvCreateWord( lpIMC->hWnd,
(LPCTSTR)MBName,
(LPTSTR)szInputWord,
(LPTSTR)szAutoCode);
ImmUnlockIMC(hIMC);
ImmUnlockIMCC(lpIMC->hPrivate);
ImmReleaseContext(GetParent(GetParent (hDlg)), hIMC);
SetDlgItemText (hDlg,IDC_MODI_CODE, szAutoCode);
SendDlgItemMessage (hDlg,IDC_MODI_CODE, EM_SETSEL, 0, -1);
StringCbCopy (szInputCodeOld, sizeof(szInputCodeOld), szAutoCode);
}
StringCbCopy (szInputWordOld, sizeof(szInputWordOld), szInputWord);
}
break;
case IDOK:
{
int iIndexFind;
TCHAR szFinalCode [MAXCODE + 1];
TCHAR szFinalWord [MAXINPUTWORD + 1];
GetDlgItemText (hDlg, IDC_MODI_WORD, szFinalWord, MAXINPUTWORD);
GetDlgItemText (hDlg, IDC_MODI_CODE, szFinalCode, MAXCODE);
CharLowerBuff (szFinalWord, lstrlen(szFinalWord));
CharLowerBuff (szFinalCode, lstrlen(szFinalCode));
if (lstrlen(szFinalWord) == 0){
SetFocus (GetDlgItem (hDlg,IDC_MODI_WORD));
break;
} else if (lstrlen(szFinalCode) == 0){
SetFocus (GetDlgItem (hDlg,IDC_MODI_CODE));
break;
}
if ((!lstrcmpi (szFinalCode, szModiCode)) && (!lstrcmpi (szFinalWord, szModiWord))){
//hadn't modify
hCrtDlg = NULL;
EndDialog(hDlg, FALSE);
break;
}else {
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
hIMC = (HIMC)ImmGetContext(GetParent(GetParent (hDlg)));
if (!hIMC) {
return 0L;
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { // Oh! Oh!
return (0L);
}
{
UINT i;
for(i=0;i<strlen((const char *)szFinalCode);i++){
if(!IsUsedCode(szFinalCode[i], NULL)){
InfoMessage(NULL, IDS_WARN_INVALIDCODE);
ImmUnlockIMC(hIMC);
ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
return(0L);
}
}
}
iIndexFind = GetUDCIndex(lpIMC->hPrivate, szFinalCode, szFinalWord);
if (iIndexFind == -1 || iIndexFind >= MAXNUMBER_EMB){
//hadn't found
DelItem (lpIMC->hPrivate, szModiCode, szModiWord);
AddZCItem(lpIMC->hPrivate, szFinalCode, szFinalWord);
StringCbCopy (szModiWord,sizeof(szModiWord), szFinalWord);
StringCbCopy (szModiCode, sizeof(szModiCode), szFinalCode);
ImmUnlockIMC(hIMC);
ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
hCrtDlg = NULL;
EndDialog(hDlg, FALSE);
break;
}else{
InfoMessage(NULL, IDS_WARN_DUPPRASE);
break;
}
ImmUnlockIMC(hIMC);
ImmReleaseContext (GetParent(GetParent (hDlg)), hIMC);
}
}
hCrtDlg = NULL;
EndDialog(hDlg, FALSE);
break;
case IDCANCEL:
hCrtDlg = NULL;
EndDialog(hDlg, FALSE);
break;
default:
return (FALSE);
break;
}
return (TRUE);
case WM_CLOSE:
hChildDlg = NULL;
EndDialog(hDlg, FALSE);
return (TRUE);
default:
return (FALSE);
}
return (TRUE);
}
/*************************************************************************/
/* int DelItem (HIMCC, LPTSTR, LPTSTR) */
/*************************************************************************/
int DelItem (HIMCC hPrivate, LPTSTR szCode, LPTSTR szWord)
{
int iStringIndex;
iStringIndex = GetUDCIndex(hPrivate, szCode, szWord);
if (iStringIndex == -1 || iStringIndex >= MAXNUMBER_EMB){
return -1;
}else{
DelSelCU (hPrivate, iStringIndex);
}
return iStringIndex;
}
/*************************************************************************/
/* void BreakString (LPTSTR szList, LPTSTR szCode, LPTSTR szWord) */
/*************************************************************************/
void BreakString (LPTSTR szList,
LPTSTR szCode,
LPTSTR szWord)
{
int i = 0, j = 0;
while (szList[i] != TEXT(' ')){
szCode[j] = szList[i];
i ++;
j ++;
}
szCode[j] = TEXT('\0');
lstrcpy(szWord, &szList[20]);
}
/**********************************************************************/
/* ImeVerDlgProc() */
/* Return Value: */
/* TRUE - successful, FALSE - failure */
/**********************************************************************/
INT_PTR CALLBACK ImeVerDlgProc( // dialog procedure of configuration
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
RECT rc;
LONG DlgWidth, DlgHeight;
RECT rcWorkArea;
rcWorkArea = ImeMonitorWorkAreaFromWindow(hDlg);
switch (uMessage) {
case WM_INITDIALOG:
hCrtDlg = hDlg;
// reset position
GetWindowRect(hDlg, &rc);
DlgWidth = rc.right - rc.left;
DlgHeight = rc.bottom - rc.top;
SetWindowPos(hDlg, HWND_TOP,
(int)(rcWorkArea.right - DlgWidth)/2,
(int)(rcWorkArea.bottom - DlgHeight)/2,
(int) 0, (int) 0, SWP_NOSIZE);
return (TRUE); // don't want to set focus to special control
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog(hDlg, FALSE);
break;
case IDCANCEL:
EndDialog(hDlg, FALSE);
break;
default:
return (FALSE);
break;
}
return (TRUE);
case WM_CLOSE:
EndDialog(hDlg, FALSE);
return FALSE;
case WM_PAINT:
{
HDC hDC;
PAINTSTRUCT ps;
RECT rcVerInfo, rcOrgAuthorName;
HGDIOBJ hOldFont=NULL;
LOGFONT lfFont;
HFONT hNewFont=NULL;
hDC = BeginPaint(hDlg, &ps);
GetClientRect(hDlg, &rc);
DrawConvexRect(hDC,
rc.left + 10,
rc.top + 10,
rc.right - 10 - 1,
rc.bottom - 43 - 1);
DrawConvexRectP(hDC,
rc.left + 10,
rc.top + 10,
rc.right - 10,
rc.bottom - 43);
// draw ver info and org&auther name
rcVerInfo.left = rc.left+10;
rcVerInfo.right = rc.right;
rcVerInfo.top = rc.top + 30;
rcVerInfo.bottom = rcVerInfo.top + 19;
rcOrgAuthorName.left = rc.left;
rcOrgAuthorName.right = rc.right;
//rcOrgAuthorName.top = rcVerInfo.bottom + 12;
rcOrgAuthorName.top = rcVerInfo.bottom + 4;
rcOrgAuthorName.bottom = rcOrgAuthorName.top + 19;
SetTextColor(hDC, RGB(0x00, 0x00, 0x00));
SetBkColor(hDC, RGB(0xC0, 0xC0, 0xC0));
// set font
if (sImeG.fDiffSysCharSet) {
hOldFont = GetCurrentObject(hDC, OBJ_FONT);
GetObject(hOldFont, sizeof(lfFont), &lfFont);
lfFont.lfCharSet = NATIVE_CHARSET;
lstrcpy(lfFont.lfFaceName, TEXT("Simsun"));
hNewFont = CreateFontIndirect(&lfFont);
if ( hNewFont )
SelectObject(hDC, (HGDIOBJ)hNewFont);
}
DrawText(hDC, szVerInfo, lstrlen(szVerInfo),
&rcVerInfo, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
if (sImeG.fDiffSysCharSet){
SelectObject(hDC, hOldFont);
if ( hNewFont )
DeleteObject( (HGDIOBJ) hNewFont );
}
EndPaint(hDlg, &ps);
}
return (FALSE);
default:
return (FALSE);
}
return (TRUE);
}
/**********************************************************************/
/* InitImeCharac() */
/**********************************************************************/
void InitImeCharac(
DWORD ObjImeIndex)
{
HKEY hKeyCurrVersion;
DWORD retCode;
DWORD retValue;
HKEY hKey;
#ifdef UNICODE
TCHAR ValueName[][9] = {
{0x8BCD, 0x8BED, 0x8054, 0x60F3, 0x0000},
{0x8BCD, 0x8BED, 0x8F93, 0x5165, 0x0000},
{0x9010, 0x6E10, 0x63D0, 0x793A, 0x0000},
{0x5916, 0x7801, 0x63D0, 0x793A, 0x0000},
{0x63D2, 0x7A7A, 0x683C, 0x0000},
{0x5149, 0x6807, 0x8DDF, 0x968F, 0x0000},
#else
TCHAR ValueName[][9] = { TEXT("词语联想"),
TEXT("词语输入"),
TEXT("逐渐提示"),
TEXT("外码提示"),
TEXT("插空格"),
TEXT("光标跟随"),
#endif
TEXT("<SPACE>"),
TEXT("<ENTER>"),
//CHP
TEXT("FC input"),
TEXT("FC aid")
};
DWORD dwcValueName = MAXSTRLEN;
BYTE bData[MAXSTRLEN];
LONG bcData = MAXSTRLEN;
UINT i;
retCode = OpenReg_PathSetup(&hKeyCurrVersion);
if (retCode) {
RegCreateKey(HKEY_CURRENT_USER, REGSTR_PATH_SETUP, &hKeyCurrVersion);
}
if ( hKeyCurrVersion )
retCode = OpenReg_User (hKeyCurrVersion,
MBIndex.MBDesc[ObjImeIndex].szName,
&hKey);
else
return;
if ( hKey == NULL )
{
RegCloseKey(hKeyCurrVersion);
return;
}
//CHP
for(i=0; i<10; i++) {
bData[0] = 0;
bcData = MAXSTRLEN;
retValue = RegQueryValueEx (hKey, ValueName[i],
NULL,
NULL, //&dwType,
bData, //&bData,
&bcData); //&bcData);
switch (i)
{
case 0:
MBIndex.IMEChara[ObjImeIndex].IC_LX = *((LPDWORD)bData);
break;
case 1:
MBIndex.IMEChara[ObjImeIndex].IC_CZ = *((LPDWORD)bData);
break;
case 2:
MBIndex.IMEChara[ObjImeIndex].IC_TS = *((LPDWORD)bData);
break;
case 3:
MBIndex.IMEChara[ObjImeIndex].IC_CTC = *((LPDWORD)bData);
break;
case 4:
MBIndex.IMEChara[ObjImeIndex].IC_INSSPC = *((LPDWORD)bData);
break;
case 5:
MBIndex.IMEChara[ObjImeIndex].IC_Trace = *((LPDWORD)bData);
break;
case 6:
MBIndex.IMEChara[ObjImeIndex].IC_Space = *((LPDWORD)bData);
break;
case 7:
MBIndex.IMEChara[ObjImeIndex].IC_Enter = *((LPDWORD)bData);
break;
case 8:
MBIndex.IMEChara[ObjImeIndex].IC_FCSR = *((LPDWORD)bData);
break;
case 9:
MBIndex.IMEChara[ObjImeIndex].IC_FCTS = *((LPDWORD)bData);
break;
default:
break;
}
}
#ifdef EUDC
//just query the value, do not set any value here
bcData = sizeof(TCHAR) * MAX_PATH;
RegQueryValueEx (hKey, szRegEudcDictName,
NULL,
NULL, //null-terminate string
(unsigned char *)MBIndex.EUDCData.szEudcDictName, //&bData,
&bcData); //&bcData);
bcData = sizeof(TCHAR) * MAX_PATH;
RegQueryValueEx (hKey, szRegEudcMapFileName,
NULL,
NULL, //null-terminate string
(unsigned char *)MBIndex.EUDCData.szEudcMapFileName, //&bData,
&bcData); //&bcData);
#endif //EUDC
#ifdef CROSSREF
bcData = sizeof(HKL);
if(RegQueryValueEx (hKey, szRegRevKL,
NULL,
NULL, //null-terminate string
(LPBYTE)&MBIndex.hRevKL, //&bData,
&bcData) != ERROR_SUCCESS)
MBIndex.hRevKL = NULL;
bcData = sizeof(DWORD);
if(RegQueryValueEx (hKey, szRegRevMaxKey,
NULL,
NULL, //null-terminate string
(LPBYTE)&MBIndex.nRevMaxKey, //&bData,
&bcData) != ERROR_SUCCESS)
MBIndex.hRevKL = NULL;
#endif
RegCloseKey(hKey);
RegCloseKey(hKeyCurrVersion);
return;
}
// Combine 's1' and 's2' and fill space chars in between, result str stored in 'dest'.
void MyStrFormat(LPTSTR dest, int cch, LPTSTR s1, LPTSTR s2)
{
int i;
int len = lstrlen(s1);
if (len >= cch)
{
return; // can't do anything further
}
StringCchCopy(dest, cch, s1);
if (cch < STR_FORMAT_POS)
return;
for (i = 0; i < STR_FORMAT_POS-len && len+i < cch; i++)
dest[len+i] = STR_FORMAT_CHAR;
StringCchCopy(&dest[STR_FORMAT_POS],cch-STR_FORMAT_POS, s2);
return;
}