📄 uicomp.c
字号:
lpUIExtra->uiComp[i].rc.bottom = 0;
SetWindowLong(lpUIExtra->uiComp[i].hWnd,FIGWL_COMPSTARTSTR,
0L);
SetWindowLong(lpUIExtra->uiComp[i].hWnd,FIGWL_COMPSTARTNUM,
0L);
ShowWindow(lpUIExtra->uiComp[i].hWnd, SW_HIDE);
lpUIExtra->uiComp[i].bShow = FALSE;
}
InvalidateRect(lpUIExtra->uiComp[i].hWnd,NULL,FALSE);
dx = rcSrc.right - rcSrc.left;
curx = rcSrc.left;
cury += sz.cy;
if (hOldFont)
SelectObject(hDC,hOldFont);
ReleaseDC(lpUIExtra->uiComp[i].hWnd,hDC);
}
}
}
else // when it is vertical fonts.
{
dy = rcSrc.bottom - ptSrc.y;
curx = ptSrc.x;
cury = ptSrc.y;
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;
if (num = NumCharInDY(hDC,lpt,dy))
{
GetTextExtentPoint(hDC,lpt,num,&sz);
lpUIExtra->uiComp[i].rc.left = curx - sz.cy;
lpUIExtra->uiComp[i].rc.top = cury;
lpUIExtra->uiComp[i].rc.right = sz.cy;
lpUIExtra->uiComp[i].rc.bottom = sz.cx;
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.cy,sz.cx,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;
lpUIExtra->uiComp[i].rc.bottom = 0;
SetWindowLong(lpUIExtra->uiComp[i].hWnd,FIGWL_COMPSTARTSTR,
0L);
SetWindowLong(lpUIExtra->uiComp[i].hWnd,FIGWL_COMPSTARTNUM,
0L);
ShowWindow(lpUIExtra->uiComp[i].hWnd, SW_HIDE);
lpUIExtra->uiComp[i].bShow = FALSE;
}
InvalidateRect(lpUIExtra->uiComp[i].hWnd,NULL,FALSE);
dy = rcSrc.bottom - rcSrc.top;
cury = rcSrc.top;
curx -= sz.cy;
if (hOldFont)
SelectObject(hDC,hOldFont);
ReleaseDC(lpUIExtra->uiComp[i].hWnd,hDC);
}
}
}
ImmUnlockIMCC(lpIMC->hCompStr);
}
else
{
//
// When the style is DEFAULT, show the default composition window.
//
if (IsWindow(lpUIExtra->uiDefComp.hWnd))
{
for (i = 0; i < MAXCOMPWND; i++)
{
if (IsWindow(lpUIExtra->uiComp[i].hWnd))
{
ShowWindow(lpUIExtra->uiComp[i].hWnd,SW_HIDE);
lpUIExtra->uiComp[i].bShow = FALSE;
}
}
hDC = GetDC(lpUIExtra->uiDefComp.hWnd);
if (lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr))
{
if ((lpCompStr->dwSize > sizeof(COMPOSITIONSTRING))
&& (lpCompStr->dwCompStrLen > 0))
{
lpstr = GETLPCOMPSTR(lpCompStr);
GetTextExtentPoint(hDC,lpstr,lstrlen(lpstr),&sz);
width = sz.cx;
height = sz.cy;
}
ImmUnlockIMCC(lpIMC->hCompStr);
}
ReleaseDC(lpUIExtra->uiDefComp.hWnd,hDC);
GetWindowRect(lpUIExtra->uiDefComp.hWnd,&rc);
lpUIExtra->uiDefComp.pt.x = rc.left;
lpUIExtra->uiDefComp.pt.y = rc.top;
MoveWindow(lpUIExtra->uiDefComp.hWnd,
rc.left,
rc.top,
width+ 2 * GetSystemMetrics(SM_CXEDGE),
height+ 2 * GetSystemMetrics(SM_CYEDGE),
TRUE);
ShowWindow(lpUIExtra->uiDefComp.hWnd, SW_SHOWNOACTIVATE);
lpUIExtra->uiDefComp.bShow = TRUE;
InvalidateRect(lpUIExtra->uiDefComp.hWnd,NULL,FALSE);
}
}
}
/**********************************************************************/
/* */
/* DrawTextOneLine(hDC, lpstr, lpattr, num) */
/* */
/**********************************************************************/
void PASCAL DrawTextOneLine( HWND hCompWnd, HDC hDC, LPMYSTR lpstr, LPBYTE lpattr, int num, BOOL fVert)
{
LPMYSTR lpStart = lpstr;
LPMYSTR lpEnd = lpstr + num - 1;
int x,y;
RECT rc;
if (num = 0)
return;
GetClientRect (hCompWnd,&rc);
if (!fVert)
{
x = 0;
y = 0;
}
else
{
x = rc.right;
y = 0;
}
while (lpstr <= lpEnd)
{
int cnt = 0;
BYTE bAttr = *lpattr;
SIZE sz;
while ((bAttr == *lpattr) || (cnt <= num))
{
lpattr++;
cnt++;
}
//TextOut(hDC,x,y,lpstr,cnt);
switch (bAttr)
{
case ATTR_INPUT:
SetTextColor(hDC,RGB(0,0,0));
//SetBkMode(hDC,TRANSPARENT);
MoveToEx(hDC, rc.right, rc.top, NULL);
LineTo (hDC, rc.right, rc.bottom);
break;
case ATTR_TARGET_CONVERTED:
SetTextColor(hDC,RGB(127,127,127));
if (!fVert)
TextOut(hDC,x + 1,y + 1,lpstr,cnt);
else
TextOut(hDC,x - 1,y + 1,lpstr,cnt);
SetTextColor(hDC,RGB(0,0,0));
SetBkMode(hDC,TRANSPARENT);
break;
case ATTR_CONVERTED:
SetTextColor(hDC,RGB(127,127,127));
if (!fVert)
TextOut(hDC,x + 1,y + 1,lpstr,cnt);
else
TextOut(hDC,x - 1,y + 1,lpstr,cnt);
SetTextColor(hDC,RGB(0,0,255));
SetBkMode(hDC,TRANSPARENT);
break;
case ATTR_TARGET_NOTCONVERTED:
break;
}
TextOut(hDC,x,y,lpstr,cnt);
GetTextExtentPoint(hDC,lpstr,cnt,&sz);
lpstr += cnt;
if (bAttr == ATTR_INPUT)
{
MoveToEx(hDC, rc.right, rc.top, NULL);
LineTo (hDC, rc.right, rc.bottom);
}
if (!fVert)
x += sz.cx;
else
y += sz.cx;
}
}
/**********************************************************************/
/* */
/* PaintCompWindow(hCompWnd) */
/* */
/**********************************************************************/
void PASCAL PaintCompWindow( HWND hCompWnd)
{
PAINTSTRUCT ps;
HIMC hIMC;
LPINPUTCONTEXT lpIMC;
LPCOMPOSITIONSTRING lpCompStr;
HDC hDC;
RECT rc;
HFONT hFont = (HFONT)NULL;
HFONT hOldFont = (HFONT)NULL;
HWND hSvrWnd;
hDC = BeginPaint(hCompWnd,&ps);
if (hFont = (HFONT)GetWindowLongPtr(hCompWnd,FIGWL_FONT))
hOldFont = SelectObject(hDC,hFont);
hSvrWnd = (HWND)GetWindowLongPtr(hCompWnd,FIGWL_SVRWND);
if (hIMC = (HIMC)GetWindowLongPtr(hSvrWnd,IMMGWLP_IMC))
{
lpIMC = ImmLockIMC(hIMC);
if (lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr))
{
if ((lpCompStr->dwSize > sizeof(COMPOSITIONSTRING))
&& (lpCompStr->dwCompStrLen > 0))
{
LPMYSTR lpstr;
LPBYTE lpattr;
LONG lstart;
LONG num;
BOOL fVert = FALSE;
if (hFont)
fVert = (lpIMC->lfFont.A.lfEscapement == 2700);
lpstr = GETLPCOMPSTR(lpCompStr);
lpattr = GETLPCOMPATTR(lpCompStr);
SetBkMode(hDC,TRANSPARENT);
if (lpIMC->cfCompForm.dwStyle)
{
HDC hPDC;
hPDC = GetDC(GetParent(hCompWnd));
GetClientRect (hCompWnd,&rc);
SetBkColor(hDC,GetBkColor(hPDC));
SetBkMode(hDC,OPAQUE);
lstart = GetWindowLong(hCompWnd,FIGWL_COMPSTARTSTR);
num = GetWindowLong(hCompWnd,FIGWL_COMPSTARTNUM);
if (!num || ((lstart + num) > Mylstrlen(lpstr)))
goto end_pcw;
lpstr+=lstart;
lpattr+=lstart;
DrawTextOneLine(hCompWnd, hDC, lpstr, lpattr, num, fVert);
ReleaseDC(GetParent(hCompWnd),hPDC);
}
else
{
num = Mylstrlen(lpstr);
DrawTextOneLine(hCompWnd, hDC, lpstr, lpattr, num, fVert);
}
}
end_pcw:
ImmUnlockIMCC(lpIMC->hCompStr);
}
ImmUnlockIMC(hIMC);
}
if (hFont && hOldFont)
SelectObject(hDC,hOldFont);
EndPaint(hCompWnd,&ps);
}
/**********************************************************************/
/* */
/* HideCompWindow(lpUIExtra) */
/* */
/**********************************************************************/
void PASCAL HideCompWindow(LPUIEXTRA lpUIExtra)
{
int i;
RECT rc;
if (IsWindow(lpUIExtra->uiDefComp.hWnd))
{
if (!lpUIExtra->dwCompStyle)
GetWindowRect(lpUIExtra->uiDefComp.hWnd,(LPRECT)&rc);
ShowWindow(lpUIExtra->uiDefComp.hWnd, SW_HIDE);
lpUIExtra->uiDefComp.bShow = FALSE;
}
for (i=0;i<MAXCOMPWND;i++)
{
if (IsWindow(lpUIExtra->uiComp[i].hWnd))
{
ShowWindow(lpUIExtra->uiComp[i].hWnd, SW_HIDE);
lpUIExtra->uiComp[i].bShow = FALSE;
}
}
}
/**********************************************************************/
/* */
/* SetFontCompWindow(lpUIExtra) */
/* */
/**********************************************************************/
void PASCAL SetFontCompWindow(LPUIEXTRA lpUIExtra)
{
int i;
for (i=0;i<MAXCOMPWND;i++)
if (IsWindow(lpUIExtra->uiComp[i].hWnd))
SetWindowLongPtr(lpUIExtra->uiComp[i].hWnd,FIGWL_FONT,(LONG_PTR)lpUIExtra->hFont);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -