📄 findword.c
字号:
#include <windows.h>
#include "findword.h"
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "..\pub3216.h"
#include <malloc.h>
#include "import.h"
extern char g_szCurWord[];
extern RECT g_CurWordRect;
extern int g_nCurCaretPlace;
extern BOOL g_bAllowGetCurWord;
extern POINT g_CurMousePos;
extern HWND g_hNotifyWnd;
extern UINT g_nTextAlign;
extern POINT g_dwDCOrg;
extern int g_nExtra;
extern POINT g_CurPos;
extern TEXTMETRIC g_tm;
#define CHAR_WILDCHAR1 '*'
#define CHAR_WILDCHAR2 '?'
///////////////////////////////////////////////////////////////////////////
// Modify by Yan/Gang 1997/11/18
// 用於修改在计算 TA_CENTER 情况的失误。
extern BOOL bRecAllRect;
extern RECT g_rcTotalRect;
// End Modify
///////////////////////////////////////////////////////////////////////////
#ifdef _DICTING_
/////////////////////////////////////////////////////////////////////////////////
// Modify by Yan/Gang 1997/11/19
// 主要解决通配符的问题。
extern int g_nGetWordStyle;
// End Add.
/////////////////////////////////////////////////////////////////////////////////
#endif
#define RIGHT 1
#define LEFT -1
//////////////////////////////////////////////////////////////////////////////////
// TODO: Return a char type.
__inline int GetCharType(char ch)
{
BYTE chitem = ch;
if (ch < 0)
return CHAR_TYPE_HZ;
if (((ch >= 'a')&&(ch <= 'z'))||
((ch >= 'A')&&(ch <= 'Z')))
{
return CHAR_TYPE_ASCII;
}
return CHAR_TYPE_OTHER;
}
#ifdef _DICTING_
/////////////////////////////////////////////////////////////////////////////////
// Modify by Yan/Gang 1997/11/19
// 主要解决通配符的问题。
__inline int FindAWord(LPCSTR lpString, int nFromPlace, int nLength)
{
if (g_nGetWordStyle == GETWORD_TW_ENABLE)
{
return FindTWWord(lpString, nFromPlace, nLength);
}
else
{
return FindDWord(lpString, nFromPlace, nLength);
}
return 0;
}
__inline int FindDWord(LPCSTR lpString, int nFromPlace, int nLength)
{
int i = nFromPlace;
while (i < nLength)
{
if (GetCharType(lpString[i]) == CHAR_TYPE_ASCII)
{
i++;
}
else
{
return i-1;
}
}
return nLength - 1;
}
__inline int FindTWWord(LPCSTR lpString, int nFromPlace, int nLength)
{
int i = nFromPlace;
while (i < nLength)
{
if (lpString[i] == CHAR_LINK)
{
if (IsASCIIWord(lpString, nFromPlace, nLength, i + 1))
{
i++;
}
else
{
return i-1;
}
}
else
{
// 用於处理 '-' 的几种情况·
if (IsASCIIWord(lpString, nFromPlace, nLength, i))
// if (GetCharType(lpString[i]) == CHAR_TYPE_ASCII)
{
i++;
}
else
{
return i-1;
}
}
}
return nLength - 1;
}
__inline BOOL IsASCIIWord(LPCSTR lpString, int nFromPlace, int nLength, int nCurCharNum)
{
if (GetCharType(lpString[nCurCharNum]) == CHAR_TYPE_ASCII)
{
return TRUE;
}
if (lpString[nCurCharNum] == CHAR_WILDCHAR1)
{
return TRUE;
}
if (lpString[nCurCharNum] == CHAR_WILDCHAR2)
{
return TRUE;
}
return FALSE;
}
// End Add.
/////////////////////////////////////////////////////////////////////////////////
#else
__inline int FindAWord(LPCSTR lpString, int nFromPlace, int nLength)
{
int i = nFromPlace;
// int j;
while (i < nLength)
{
if (lpString[i] == CHAR_LINK)
{
if (IsASCIIWord(lpString, nFromPlace, nLength, i + 1))
{
i++;
}
else
{
return i-1;
}
}
else
{
// 用於处理 '-' 的几种情况·
if (IsASCIIWord(lpString, nFromPlace, nLength, i))
{
i++;
}
else
{
return i-1;
}
}
}
return nLength - 1;
}
#define CHAR_WILDCHAR1 '*'
#define CHAR_WILDCHAR2 '?'
__inline BOOL IsASCIIWord(LPCSTR lpString, int nFromPlace, int nLength, int nCurCharNum)
{
if (GetCharType(lpString[nCurCharNum]) == CHAR_TYPE_ASCII)
{
return TRUE;
}
if (lpString[nCurCharNum] == CHAR_WILDCHAR1)
{
return TRUE;
}
if (lpString[nCurCharNum] == CHAR_WILDCHAR2)
{
return TRUE;
}
return FALSE;
}
#endif
__inline int FindHZWord(LPCSTR lpString, int nFromPlace, int nLength)
{
int i = nFromPlace;
while (i < nLength)
{
if (GetCharType(lpString[i]) == CHAR_TYPE_HZ)
{
i = i + 2;
}
else
{
return i - 1;
}
}
return nLength - 1;
}
__inline int FindNextWordBegin(LPCSTR lpString, int nFromPlace, int nLength)
{
int i = nFromPlace;
while (i < nLength)
{
if (GetCharType(lpString[i]) == CHAR_TYPE_OTHER)
{
i++;
}
else
{
return i-1;
}
}
return i - 1;
}
__inline int GetCurWordEnd(LPCSTR lpString, int nFromPlace, int nLength, int nCharType)
{
switch (nCharType)
{
case CHAR_TYPE_ASCII:
return FindAWord(lpString, nFromPlace, nLength);
break;
case CHAR_TYPE_HZ:
return FindHZWord(lpString, nFromPlace, nLength);
break;
case CHAR_TYPE_OTHER:
return FindNextWordBegin(lpString, nFromPlace, nLength);
break;
}
return FindAWord(lpString, nFromPlace, nLength);
}
__inline void CopyWord(LPSTR lpWord, LPCSTR lpString, int nBegin, int nEnd)
{
int i;
for ( i = nBegin; i <= nEnd; i++)
{
lpWord[i - nBegin] = lpString[i];
}
lpWord[nEnd - nBegin + 1] = '\0';
}
__inline void GetStringTopBottom(HDC hDC, int y, RECT* lpStringRect)
{
POINT WndPos;
WndPos.y = g_dwDCOrg.y;
if (TA_UPDATECP & g_nTextAlign)
{
y = g_CurPos.y;
}
switch ((TA_TOP | TA_BOTTOM)&g_nTextAlign)
{
case TA_BOTTOM:
lpStringRect->top = y - g_tm.tmHeight + g_tm.tmInternalLeading;
lpStringRect->bottom = y;
break;
case TA_BASELINE:
lpStringRect->top = y - g_tm.tmAscent;
lpStringRect->bottom = y + g_tm.tmDescent;
break;
case TA_TOP:
default:
lpStringRect->top = y;
lpStringRect->bottom = y + g_tm.tmHeight + g_tm.tmInternalLeading;
break;
}
LPtoDP(hDC, (LPPOINT)lpStringRect, 2);
lpStringRect->top = lpStringRect->top + WndPos.y;
lpStringRect->bottom = lpStringRect->bottom + WndPos.y;
}
__inline void GetStringLeftRight(HDC hDC, LPSTR szBuff, int cbLen, int x, RECT* lpStringRect, int FAR* lpDx)
{
SIZE StringSize;
POINT WndPos;
int i;
if (cbLen < 0)
{
lpStringRect->top = 0;
lpStringRect->bottom = 0;
lpStringRect->left = 0;
lpStringRect->right = 0;
return;
}
GetTextExtentPoint(hDC, szBuff, cbLen, &StringSize);
WndPos.x = g_dwDCOrg.x;
if (lpDx != NULL)
{
StringSize.cx = 0;
for (i = 0; i < cbLen; i++)
{
StringSize.cx += lpDx[i];
}
}
if (TA_UPDATECP & g_nTextAlign)
{
x = g_CurPos.x;
}
switch ((TA_LEFT | TA_CENTER | TA_RIGHT)&g_nTextAlign)
{
case TA_RIGHT:
///////////////////////////////////////////////////////////////////////////
// Modify by Yan/Gang 1997/11/21
// 用於修改在计算 TA_RIGHT 情况的失误。
// lpStringRect->right = x;
// lpStringRect->left = x - StringSize.cx;
if (!bRecAllRect)
{
lpStringRect->right = x;
lpStringRect->left = x - StringSize.cx;
}
else
{
lpStringRect->left = g_rcTotalRect.left;
lpStringRect->right= g_rcTotalRect.left + StringSize.cx;
}
// End Modify
///////////////////////////////////////////////////////////////////////////
// lpStringRect->right = x;
// lpStringRect->left = x - StringSize.cx;
break;
case TA_CENTER:
///////////////////////////////////////////////////////////////////////////
// Modify by Yan/Gang 1997/11/18
// 用於修改在计算 TA_CENTER 情况的失误。
// lpStringRect->right = x + StringSize.cx / 2;
// lpStringRect->left = x - StringSize.cx / 2;
if (!bRecAllRect)
{
lpStringRect->right = x + StringSize.cx / 2;
lpStringRect->left = x - StringSize.cx / 2;
}
else
{
lpStringRect->left = g_rcTotalRect.left;
lpStringRect->right= g_rcTotalRect.left + StringSize.cx;
}
// End Modify
///////////////////////////////////////////////////////////////////////////
// lpStringRect->right = x + StringSize.cx / 2;
// lpStringRect->left = x - StringSize.cx / 2;
break;
case TA_LEFT:
default:
lpStringRect->left = x ;
lpStringRect->right = x + StringSize.cx;
break;
}
LPtoDP(hDC, (LPPOINT)lpStringRect, 2);
lpStringRect->left = lpStringRect->left + WndPos.x;
lpStringRect->right = lpStringRect->right + WndPos.x;
}
void GetStringRect(HDC hDC, LPSTR szBuff, int cbLen, int x, int y, RECT* lpStringRect, int FAR* lpDx)
{
SIZE StringSize;
POINT WndPos;
int i;
if (cbLen < 0)
{
lpStringRect->top = 0;
lpStringRect->bottom = 0;
lpStringRect->left = 0;
lpStringRect->right = 0;
return;
}
GetTextExtentPoint(hDC, szBuff, cbLen, &StringSize);
WndPos.x = g_dwDCOrg.x;
WndPos.y = g_dwDCOrg.y;
if (lpDx != NULL)
{
StringSize.cx = 0;
for (i = 0; i < cbLen; i++)
{
StringSize.cx += lpDx[i];
}
}
if (TA_UPDATECP & g_nTextAlign)
{
x = g_CurPos.x;
y = g_CurPos.y;
}
switch ((TA_LEFT | TA_CENTER | TA_RIGHT)&g_nTextAlign)
{
case TA_RIGHT:
///////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -