📄 statusui.cpp
字号:
/**********************************************************************/
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 + -