📄 uicomp.c
字号:
/*
* This file is part of Saenaru.
*
* Copyright (C) 2003 Hye-Shik Chang. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Perky$
*/
/*++
Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved
Module Name:
UICOMP.C
++*/
/**********************************************************************/
#include "windows.h"
#include "immdev.h"
#include "saenaru.h"
/**********************************************************************/
/* */
/* CompStrWndProc() */
/* */
/* IME UI window procedure */
/* */
/**********************************************************************/
LRESULT CALLBACK CompStrWndProc( hWnd, message, wParam, lParam )
HWND hWnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
{
HWND hUIWnd;
switch (message)
{
case WM_PAINT:
PaintCompWindow( hWnd);
break;
case WM_SETCURSOR:
case WM_MOUSEMOVE:
case WM_LBUTTONUP:
case WM_RBUTTONUP:
#if 1
// Comp芒篮 框流老 鞘夸啊 绝绰 芒捞促.
DragUI(hWnd,message,wParam,lParam);
if ((message == WM_SETCURSOR) &&
(HIWORD(lParam) != WM_LBUTTONDOWN) &&
(HIWORD(lParam) != WM_RBUTTONDOWN))
return DefWindowProc(hWnd,message,wParam,lParam);
#endif
#if 1
if ((message == WM_LBUTTONUP) || (message == WM_RBUTTONUP))
SetWindowLong(hWnd,FIGWL_MOUSE,0L);
#endif
break;
case WM_MOVE:
OutputDebugString(TEXT("MOVE\r\n"));
hUIWnd = (HWND)GetWindowLongPtr(hWnd,FIGWL_SVRWND);
if (IsWindow(hUIWnd))
SendMessage(hUIWnd,WM_UI_DEFCOMPMOVE,wParam,lParam);
break;
default:
if (!MyIsIMEMessage(message))
return DefWindowProc(hWnd,message,wParam,lParam);
break;
}
return 0;
}
/**********************************************************************/
/* */
/* CreateCompWindow() */
/* */
/**********************************************************************/
void PASCAL CreateCompWindow( HWND hUIWnd, LPUIEXTRA lpUIExtra,LPINPUTCONTEXT lpIMC )
{
int i;
RECT rc;
lpUIExtra->dwCompStyle = lpIMC->cfCompForm.dwStyle;
for (i=0; i < MAXCOMPWND ; i++)
{
if (!IsWindow(lpUIExtra->uiComp[i].hWnd))
{
lpUIExtra->uiComp[i].hWnd =
CreateWindowEx(0,
(LPTSTR)szCompStrClassName,NULL,
WS_COMPNODEFAULT,
0,0,1,1,
hUIWnd,NULL,hInst,NULL);
}
lpUIExtra->uiComp[i].rc.left = 0;
lpUIExtra->uiComp[i].rc.top = 0;
lpUIExtra->uiComp[i].rc.right = 1;
lpUIExtra->uiComp[i].rc.bottom = 1;
SetWindowLongPtr(lpUIExtra->uiComp[i].hWnd,FIGWL_FONT,(LONG_PTR)lpUIExtra->hFont);
SetWindowLongPtr(lpUIExtra->uiComp[i].hWnd,FIGWL_SVRWND,(LONG_PTR)hUIWnd);
ShowWindow(lpUIExtra->uiComp[i].hWnd,SW_HIDE);
lpUIExtra->uiComp[i].bShow = FALSE;
}
if (lpUIExtra->uiDefComp.pt.x == -1)
{
GetWindowRect(lpIMC->hWnd,&rc);
lpUIExtra->uiDefComp.pt.x = rc.left;
lpUIExtra->uiDefComp.pt.y = rc.bottom + 1;
}
// Root window style XXX
// skkime俊辑 捞巴捞 rootwindow style捞扼绊 唱客乐促. 弊矾唱
// 酒贰狼 扩档快绰 捞惑窍霸 凯府绊 儡惑捞 拌加 巢绰 锐救茄
// 巩力痢阑 啊柳促. 弊贰辑 酒抗 扁瓷阑 波滚啡促. 2003/11/15
if (1 && !IsWindow(lpUIExtra->uiDefComp.hWnd))
{
lpUIExtra->uiDefComp.hWnd =
CreateWindowEx( WS_EX_WINDOWEDGE,
(LPTSTR)szCompStrClassName,NULL,
WS_COMPDEFAULT | WS_DLGFRAME,
lpUIExtra->uiDefComp.pt.x,
lpUIExtra->uiDefComp.pt.y,
1,1,
hUIWnd,NULL,hInst,NULL);
}
SetWindowLongPtr(lpUIExtra->uiDefComp.hWnd,FIGWL_FONT,(LONG_PTR)lpUIExtra->hFont);
SetWindowLongPtr(lpUIExtra->uiDefComp.hWnd,FIGWL_SVRWND,(LONG_PTR)hUIWnd);
ShowWindow(lpUIExtra->uiDefComp.hWnd,SW_HIDE);
lpUIExtra->uiDefComp.bShow = FALSE;
return;
}
/**********************************************************************/
/* */
/* NumCharInDX() */
/* */
/* Count how may the char can be arranged in DX. */
/* */
/**********************************************************************/
int PASCAL NumCharInDX(HDC hDC,LPMYSTR lp,int dx)
{
SIZE sz;
int width = 0;
int num = 0;
int numT = 0;
if (!*lp)
return 0;
while ((width < dx) && *(lp + numT))
{
num = numT;
numT++;
GetTextExtentPointW(hDC,lp,numT,&sz);
width = sz.cx;
}
if (width < dx)
num = numT;
return num;
}
/**********************************************************************/
/* */
/* NumCharInDY() */
/* */
/* Count how may the char can be arranged in DY. */
/* */
/**********************************************************************/
int PASCAL NumCharInDY(HDC hDC,LPMYSTR lp,int dy)
{
SIZE sz;
int width = 0;
int num;
int numT = 0;
if (!*lp)
return 0;
while ((width < dy) && *(lp + numT))
{
num = numT;
numT++;
GetTextExtentPointW(hDC,lp,numT,&sz);
width = sz.cy;
}
return num;
}
/**********************************************************************/
/* */
/* MoveCompWindow() */
/* */
/* Calc the position of composition windows and move them. */
/* */
/**********************************************************************/
void PASCAL MoveCompWindow( LPUIEXTRA lpUIExtra,LPINPUTCONTEXT lpIMC )
{
HDC hDC;
HFONT hFont = (HFONT)NULL;
HFONT hOldFont = (HFONT)NULL;
LPCOMPOSITIONSTRING lpCompStr;
LPMYSTR lpstr;
RECT rc;
RECT oldrc;
SIZE sz;
int width;
int height;
int i;
//
// Save the composition form style into lpUIExtra.
//
lpUIExtra->dwCompStyle = lpIMC->cfCompForm.dwStyle;
if (lpIMC->cfCompForm.dwStyle) // Style is not DEFAULT.
{
POINT ptSrc = lpIMC->cfCompForm.ptCurrentPos;
RECT rcSrc;
LPMYSTR lpt;
int dx;
int dy;
int num;
int curx;
int cury;
//
// Lock the COMPOSITIONSTRING structure.
//
if (!(lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr)))
return;
//
// If there is no composition string, don't display anything.
//
if ((lpCompStr->dwSize <= sizeof(COMPOSITIONSTRING))
|| (lpCompStr->dwCompStrLen == 0))
{
ImmUnlockIMCC(lpIMC->hCompStr);
return;
}
//
// Set the rectangle for the composition string.
//
if (lpIMC->cfCompForm.dwStyle & CFS_RECT)
rcSrc = lpIMC->cfCompForm.rcArea;
else
GetClientRect(lpIMC->hWnd,(LPRECT)&rcSrc);
ClientToScreen(lpIMC->hWnd, &ptSrc);
ClientToScreen(lpIMC->hWnd, (LPPOINT)&rcSrc.left);
ClientToScreen(lpIMC->hWnd, (LPPOINT)&rcSrc.right);
//
// Check the start position.
//
if (!PtInRect((LPRECT)&rcSrc,ptSrc))
{
ImmUnlockIMCC(lpIMC->hCompStr);
return;
}
//
// Hide the default composition window.
//
if (IsWindow(lpUIExtra->uiDefComp.hWnd))
{
ShowWindow(lpUIExtra->uiDefComp.hWnd,SW_HIDE);
lpUIExtra->uiDefComp.bShow = FALSE;
}
lpt = lpstr = GETLPCOMPSTR(lpCompStr);
num = 1;
if (!lpUIExtra->bVertical)
{
dx = rcSrc.right - ptSrc.x;
curx = ptSrc.x;
cury = ptSrc.y;
//
// Set the composition string to each composition window.
// The composition windows that are given the compostion string
// will be moved and shown.
//
for (i = 0; i < MAXCOMPWND; i++)
{
if (IsWindow(lpUIExtra->uiComp[i].hWnd))
{
hDC = GetDC(lpUIExtra->uiComp[i].hWnd);
if (hFont = (HFONT)GetWindowLongPtr(lpUIExtra->uiComp[i].hWnd,FIGWL_FONT))
hOldFont = SelectObject(hDC,hFont);
sz.cy = 0;
oldrc = lpUIExtra->uiComp[i].rc;
if (num = NumCharInDX(hDC,lpt,dx))
{
GetTextExtentPoint(hDC,lpt,num,&sz);
lpUIExtra->uiComp[i].rc.left = curx;
lpUIExtra->uiComp[i].rc.top = cury;
lpUIExtra->uiComp[i].rc.right = sz.cx;
lpUIExtra->uiComp[i].rc.bottom = sz.cy;
SetWindowLong(lpUIExtra->uiComp[i].hWnd,FIGWL_COMPSTARTSTR,
(DWORD) (lpt - lpstr));
SetWindowLong(lpUIExtra->uiComp[i].hWnd,FIGWL_COMPSTARTNUM,
num);
MoveWindow(lpUIExtra->uiComp[i].hWnd,
curx,cury,sz.cx,sz.cy,TRUE);
ShowWindow(lpUIExtra->uiComp[i].hWnd, SW_SHOWNOACTIVATE);
lpUIExtra->uiComp[i].bShow = TRUE;
lpt+=num;
}
else
{
lpUIExtra->uiComp[i].rc.left = 0;
lpUIExtra->uiComp[i].rc.top = 0;
lpUIExtra->uiComp[i].rc.right = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -