windows-nt/Source/XPSP1/NT/windows/feime/ddk/jpn/uiguide.c
2020-09-26 16:20:57 +08:00

334 lines
11 KiB
C

/*++
Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved
Module Name:
UIGUIDE.C
++*/
/**********************************************************************/
#include "windows.h"
#include "immdev.h"
#include "fakeime.h"
/**********************************************************************/
/* */
/* GuideWndProc() */
/* IME UI window procedure */
/* */
/**********************************************************************/
LRESULT CALLBACK GuideWndProc( hWnd, message, wParam, lParam )
HWND hWnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
{
PAINTSTRUCT ps;
HWND hUIWnd;
HDC hDC;
HBITMAP hbmpGuide;
RECT rc;
switch (message)
{
case WM_UI_HIDE:
ShowWindow(hWnd, SW_HIDE);
break;
case WM_UI_UPDATE:
InvalidateRect(hWnd,NULL,FALSE);
break;
case WM_PAINT:
hDC = BeginPaint(hWnd,&ps);
PaintGuide(hWnd,hDC,NULL,0);
EndPaint(hWnd,&ps);
break;
case WM_MOUSEMOVE:
case WM_SETCURSOR:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
ButtonGuide(hWnd,message,wParam,lParam);
if ((message == WM_SETCURSOR) &&
(HIWORD(lParam) != WM_LBUTTONDOWN) &&
(HIWORD(lParam) != WM_RBUTTONDOWN))
return DefWindowProc(hWnd,message,wParam,lParam);
if ((message == WM_LBUTTONUP) || (message == WM_RBUTTONUP))
{
SetWindowLong(hWnd,FIGWL_MOUSE,0L);
SetWindowLong(hWnd,FIGWL_PUSHSTATUS,0L);
}
break;
case WM_MOVE:
hUIWnd = (HWND)GetWindowLongPtr(hWnd,FIGWL_SVRWND);
if (IsWindow(hUIWnd))
SendMessage(hUIWnd,WM_UI_GUIDEMOVE,wParam,lParam);
break;
case WM_CREATE:
hbmpGuide = LoadBitmap(hInst,TEXT("CLOSEBMP"));
SetWindowLongPtr(hWnd,FIGWL_CLOSEBMP,(LONG_PTR)hbmpGuide);
GetClientRect(hWnd,&rc);
break;
case WM_DESTROY:
hbmpGuide = (HBITMAP)GetWindowLongPtr(hWnd,FIGWL_CLOSEBMP);
DeleteObject(hbmpGuide);
break;
default:
if (!MyIsIMEMessage(message))
return DefWindowProc(hWnd,message,wParam,lParam);
break;
}
return 0;
}
/**********************************************************************/
/* */
/* CheckPushedGuide() */
/* */
/**********************************************************************/
DWORD PASCAL CheckPushedGuide( HWND hGuideWnd, LPPOINT lppt)
{
POINT pt;
RECT rc;
if (lppt)
{
pt = *lppt;
ScreenToClient(hGuideWnd,&pt);
GetClientRect(hGuideWnd,&rc);
if (!PtInRect(&rc,pt))
return 0;
rc.left = rc.right-STCLBT_DX-2;
rc.top = STCLBT_Y;
rc.right = rc.left + STCLBT_DX;
rc.bottom = rc.top + STCLBT_DY;
if (PtInRect(&rc,pt))
return PUSHED_STATUS_CLOSE;
}
return 0;
}
/**********************************************************************/
/* */
/* PaintGuide() */
/* */
/**********************************************************************/
void PASCAL PaintGuide( HWND hGuideWnd , HDC hDC, LPPOINT lppt, DWORD dwPushedGuide)
{
HIMC hIMC;
HDC hMemDC;
HBITMAP hbmpOld;
HWND hSvrWnd;
HANDLE hGLStr;
LPTSTR lpGLStr;
DWORD dwLevel;
DWORD dwSize;
hSvrWnd = (HWND)GetWindowLongPtr(hGuideWnd,FIGWL_SVRWND);
if (hIMC = (HIMC)GetWindowLongPtr(hSvrWnd,IMMGWLP_IMC))
{
HBITMAP hbmpGuide;
HBRUSH hOldBrush,hBrush;
int nCyCap = GetSystemMetrics(SM_CYSMCAPTION);
RECT rc;
hMemDC = CreateCompatibleDC(hDC);
// Paint Caption.
hBrush = CreateSolidBrush(GetSysColor(COLOR_ACTIVECAPTION));
hOldBrush = SelectObject(hDC,hBrush);
GetClientRect(hGuideWnd,&rc);
//rc.top = rc.left = 0;
//rc.right = BTX*3;
rc.bottom = nCyCap;
FillRect(hDC,&rc,hBrush);
SelectObject(hDC,hOldBrush);
DeleteObject(hBrush);
// Paint CloseButton.
hbmpGuide = (HBITMAP)GetWindowLongPtr(hGuideWnd,FIGWL_CLOSEBMP);
hbmpOld = SelectObject(hMemDC,hbmpGuide);
if (!(dwPushedGuide & PUSHED_STATUS_CLOSE))
BitBlt(hDC,rc.right-STCLBT_DX-2,STCLBT_Y,STCLBT_DX,STCLBT_DY,
hMemDC,0,0,SRCCOPY);
else
BitBlt(hDC,rc.right-STCLBT_DX-2,STCLBT_Y,STCLBT_DX,STCLBT_DY,
hMemDC,STCLBT_DX,0,SRCCOPY);
if (dwLevel = ImmGetGuideLine(hIMC,GGL_LEVEL,NULL,0))
{
dwSize = ImmGetGuideLine(hIMC,GGL_STRING,NULL,0) + 1;
if ((dwSize > 1) && (hGLStr = GlobalAlloc(GHND,dwSize)))
{
if (lpGLStr = (LPTSTR)GlobalLock(hGLStr))
{
COLORREF rgb = 0;
HBRUSH hbrLGR = GetStockObject(LTGRAY_BRUSH);
HBRUSH hbr;
hbr = SelectObject(hDC,hbrLGR);
GetClientRect(hGuideWnd,&rc);
PatBlt(hDC,0,nCyCap,rc.right,rc.bottom-nCyCap,PATCOPY);
SelectObject(hDC,hbr);
switch (dwLevel)
{
case GL_LEVEL_FATAL:
case GL_LEVEL_ERROR:
rgb = RGB(255,0,0);
break;
case GL_LEVEL_WARNING:
rgb = RGB(0,0,255);
break;
case GL_LEVEL_INFORMATION:
default:
rgb = RGB(0,0,0);
break;
}
if (dwSize = ImmGetGuideLine(hIMC,GGL_STRING,lpGLStr,dwSize))
{
SetTextColor(hDC,rgb);
SetBkMode(hDC,TRANSPARENT);
TextOut(hDC,0,nCyCap,lpGLStr,dwSize);
}
GlobalUnlock(hGLStr);
}
GlobalFree(hGLStr);
}
}
SelectObject(hMemDC,hbmpOld);
DeleteDC(hMemDC);
}
}
/**********************************************************************/
/* */
/* ButtonGuide(hGuideWnd,message,wParam,lParam) */
/* */
/**********************************************************************/
void PASCAL ButtonGuide( HWND hGuideWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
POINT pt;
HDC hDC;
DWORD dwMouse;
DWORD dwPushedGuide;
DWORD dwTemp;
HIMC hIMC;
HWND hSvrWnd;
static POINT ptdif;
static RECT drc;
static RECT rc;
static DWORD dwCurrentPushedGuide;
hDC = GetDC(hGuideWnd);
switch (message)
{
case WM_SETCURSOR:
if ( HIWORD(lParam) == WM_LBUTTONDOWN
|| HIWORD(lParam) == WM_RBUTTONDOWN )
{
GetCursorPos( &pt );
SetCapture(hGuideWnd);
GetWindowRect(hGuideWnd,&drc);
ptdif.x = pt.x - drc.left;
ptdif.y = pt.y - drc.top;
rc = drc;
rc.right -= rc.left;
rc.bottom -= rc.top;
SetWindowLong(hGuideWnd,FIGWL_MOUSE,FIM_CAPUTURED);
SetWindowLong(hGuideWnd, FIGWL_PUSHSTATUS, dwPushedGuide = CheckPushedGuide(hGuideWnd,&pt));
PaintGuide(hGuideWnd,hDC,&pt, dwPushedGuide);
dwCurrentPushedGuide = dwPushedGuide;
}
break;
case WM_MOUSEMOVE:
dwMouse = GetWindowLong(hGuideWnd,FIGWL_MOUSE);
if (!(dwPushedGuide = GetWindowLong(hGuideWnd, FIGWL_PUSHSTATUS)))
{
if (dwMouse & FIM_MOVED)
{
DrawUIBorder(&drc);
GetCursorPos( &pt );
drc.left = pt.x - ptdif.x;
drc.top = pt.y - ptdif.y;
drc.right = drc.left + rc.right;
drc.bottom = drc.top + rc.bottom;
DrawUIBorder(&drc);
}
else if (dwMouse & FIM_CAPUTURED)
{
DrawUIBorder(&drc);
SetWindowLong(hGuideWnd,FIGWL_MOUSE,dwMouse | FIM_MOVED);
}
}
else
{
GetCursorPos(&pt);
dwTemp = CheckPushedGuide(hGuideWnd,&pt);
if ((dwTemp ^ dwCurrentPushedGuide) & dwPushedGuide)
PaintGuide(hGuideWnd,hDC,&pt, dwPushedGuide & dwTemp);
dwCurrentPushedGuide = dwTemp;
}
break;
case WM_LBUTTONUP:
case WM_RBUTTONUP:
dwMouse = GetWindowLong(hGuideWnd,FIGWL_MOUSE);
if (dwMouse & FIM_CAPUTURED)
{
ReleaseCapture();
if (dwMouse & FIM_MOVED)
{
DrawUIBorder(&drc);
GetCursorPos( &pt );
MoveWindow(hGuideWnd,pt.x - ptdif.x,
pt.y - ptdif.y,
rc.right,
rc.bottom,TRUE);
}
}
hSvrWnd = (HWND)GetWindowLongPtr(hGuideWnd,FIGWL_SVRWND);
if (hIMC = (HIMC)GetWindowLongPtr(hSvrWnd,IMMGWLP_IMC))
{
GetCursorPos(&pt);
dwPushedGuide = GetWindowLong(hGuideWnd, FIGWL_PUSHSTATUS);
dwPushedGuide &= CheckPushedGuide(hGuideWnd,&pt);
if (!dwPushedGuide) {
} else if (dwPushedGuide == PUSHED_STATUS_CLOSE) {
PostMessage(hGuideWnd,WM_UI_HIDE,0,0);
}
}
PaintGuide(hGuideWnd,hDC,NULL,0);
break;
}
ReleaseDC(hGuideWnd,hDC);
}
/**********************************************************************/
/* */
/* UpdateGuideWindow(lpUIExtra) */
/* */
/**********************************************************************/
void PASCAL UpdateGuideWindow(LPUIEXTRA lpUIExtra)
{
if (IsWindow(lpUIExtra->uiGuide.hWnd))
SendMessage(lpUIExtra->uiGuide.hWnd,WM_UI_UPDATE,0,0L);
}