334 lines
11 KiB
C
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);
|
|
}
|
|
|