📄 findword.c
字号:
g_TotalWordRect.right = StringRect.right;
//Added by XGL, Sep 29th, 1998
if (!strchr(g_szTotalWord, ' ') && (*(szBuff + nBegin) != ' '))
{
g_rcFirstWordRect.right = StringRect.right;
}
//Adding ends.
if (bInCurWord)
{
g_bMouseInTotalWord = TRUE;
//Added by XGL, Sep 17th, 1998
//When the word pointed to by mouse was got,
//attain it's char-type.
g_nPhraseCharType = nCharType ;
g_nWordsInPhrase++ ;
//Adding ends.
//Added by XGL, Sep 29th, 1998
g_rcFirstWordRect.left = StringRect.left;
g_rcFirstWordRect.right = StringRect.right;
g_rcFirstWordRect.top = StringRect.top;
g_rcFirstWordRect.bottom = StringRect.bottom;
//Adding ends.
}
}
else
{
if (!g_bMouseInTotalWord)
{
CopyWord(g_szTotalWord, szBuff, nBegin, nEnd);
g_TotalWordRect.left = StringRect.left;
g_TotalWordRect.right = StringRect.right;
g_TotalWordRect.top = StringRect.top;
g_TotalWordRect.bottom = StringRect.bottom;
g_CharType = nCharType;
g_bMouseInTotalWord = FALSE;
g_nCurCaretPlaceInTotalWord = -1;
if (g_nCurCaretPlace != -1)
{
g_nCurCaretPlaceInTotalWord = g_nCurCaretPlace;
}
if (bInCurWord)
{
g_bMouseInTotalWord = TRUE;
//Added by XGL, Sep 17th, 1998
//When the word pointed to by mouse was got,
//attain it's char-type.
g_nPhraseCharType = nCharType ;
g_nWordsInPhrase++ ;
//Adding ends.
//Added by XGL, Sep 29th, 1998
g_rcFirstWordRect.left = StringRect.left;
g_rcFirstWordRect.right = StringRect.right;
g_rcFirstWordRect.top = StringRect.top;
g_rcFirstWordRect.bottom = StringRect.bottom;
//Adding ends.
}
}
}
}
////////////////////////////////////////////////////////////////////
// Deal with memdc string.
void AddToTextOutBuffer(HDC hMemDC, LPSTR szBuff, int cbLen, int x, int y, int FAR* lpDx)
{
int nPrevWord, nCurrentWord, CharType;
RECT PrevWordRect, NextWordRect;
int nLen, i;
if (cbLen >= (int)(BUFFERLENGTH - strlen(szMemDCWordBuff) - 2))
{
// buffer too small.
return;
}
// Write string to buffer.
nLen = strlen(szMemDCWordBuff);
strncpy(szMemDCWordBuff + nLen, szBuff, cbLen);
szMemDCWordBuff[nLen + cbLen ] = ' ';
szMemDCWordBuff[nLen + cbLen + 1] = 0x00;
nPrevWord = nCurrentWord = -1;
while (nCurrentWord < cbLen)
{
//////////////////////////////////////////////////////////////
// Modified by Yan/gang 1998.02.20
// Reason:
// It cause the system destroy when the user run "WBLASTER"
// The reason is the the array is overflow.
// The WordBuffer array size is MEMDC_MAXNUM.
// But it's point (nWordNum) is large than MEMDC_MAXNUM,
// also, nWordNum is small than MAXNUM.
// if (nWordNum >= MAXNUM)
if (nWordNum >= MEMDC_MAXNUM)
break;
// Modify end.
//////////////////////////////////////////////////////////////
CharType = GetCharType(szBuff[nCurrentWord + 1]);
nPrevWord = nCurrentWord;
nCurrentWord = GetCurWordEnd(szBuff, nPrevWord + 1, cbLen, CharType);
GetStringRect(hMemDC, szBuff, nPrevWord + 1, x, y, &PrevWordRect, lpDx);
GetStringRect(hMemDC, szBuff, nCurrentWord + 1 , x, y, &NextWordRect, lpDx);
WordBuffer[nWordNum].nBegin = nLen + nPrevWord + 1;
WordBuffer[nWordNum].nEnd = nLen + nCurrentWord;
WordBuffer[nWordNum].hMemDC = hMemDC;
WordBuffer[nWordNum].CharType = CharType;
WordBuffer[nWordNum].wordRect.left = PrevWordRect.right;
WordBuffer[nWordNum].wordRect.right = NextWordRect.right;
WordBuffer[nWordNum].wordRect.top = NextWordRect.top;
WordBuffer[nWordNum].wordRect.bottom = NextWordRect.bottom;
nWordNum++;
if (nCurrentWord >= cbLen - 1)
break;
}
GetStringLeftRight(hMemDC, szBuff, 0, x, &PrevWordRect, lpDx);
for (i = 0; i < cbLen; i++)
{
GetStringLeftRight(hMemDC, szBuff, i+1, x, &NextWordRect, lpDx);
pnMemDCCharLeft[nLen + i] = PrevWordRect.right;
pnMemDCCharRight[nLen + i] = NextWordRect.right;
CopyRect(&PrevWordRect, &NextWordRect);
}
}
void GetMemWordStringRect(int nWordCode, int nOffset, LPRECT lpStringRect)
{
POINT WndPos;
int nNum;
if (nWordCode >= nWordNum)
{
lpStringRect->left = 0;
lpStringRect->right = 0;
lpStringRect->top = 0;
lpStringRect->bottom = 0;
return;
}
CopyRect(lpStringRect, &(WordBuffer[nWordCode].wordRect));
if (nOffset != MEMDC_TOTALWORD)
{
nNum = WordBuffer[nWordCode].nBegin + nOffset;
lpStringRect->left = pnMemDCCharLeft[nNum];
// lpStringRect->left = pnMemDCCharRight[nNum];
lpStringRect->right = pnMemDCCharRight[nNum];
}
WndPos.x = LOWORD(g_dwDCOrg);
WndPos.y = HIWORD(g_dwDCOrg);
lpStringRect->top = lpStringRect->top + WndPos.y;
lpStringRect->bottom = lpStringRect->bottom + WndPos.y;
lpStringRect->left = lpStringRect->left + WndPos.x;
lpStringRect->right = lpStringRect->right + WndPos.x;
}
void CheckMemDCWordBuffer(HDC hdcdest, HDC hdcSrc)
{
int i;
for (i = 0; i < nWordNum; i++)
{
if (WordBuffer[i].hMemDC == hdcSrc)
{
CheckMouseInMemDCWord(i);
}
else
{
#ifdef _DICTING_
if (CheckDCWndClassName(hdcdest))
{
CheckMouseInMemDCWord(i);
}
#endif
}
// CheckMouseInMemDCWord(i);
}
}
#ifdef _DICTING_
#define IE4_CLIENT_CLASSNAME "Internet Explorer_Server"// 定义取词中 DC 所属窗口的类名。
#define OUTLOOK_EDIT_CLASSNAME "RichEdit20A"
#define MAX_CLASS_NAME 256
extern WINDOWFROMDC_PROC WindowFromDC;
int g_nWorkOnClassNum = 2;
char g_szWorkOnClassName[2][MAX_CLASS_NAME] = {
IE4_CLIENT_CLASSNAME, // IE 4.0
OUTLOOK_EDIT_CLASSNAME // OutLook
};
_inline BOOL CheckDCWndClassName(HDC hDC)
{
HWND hWndFromDC;
char szClassName[MAX_CLASS_NAME];
int i;
hWndFromDC = WindowFromDC(hDC);
GetClassName(hWndFromDC, szClassName, MAX_CLASS_NAME);
for (i = 0; i < g_nWorkOnClassNum; i++)
{
if (lstrcmp(szClassName, (LPSTR)g_szWorkOnClassName[i]) == 0)
{
return TRUE;
}
}
return FALSE;
}
#endif
__inline DWORD CheckMouseInMemDCWord(int nWordCode)
{
RECT StringRect;
GetMemWordStringRect(nWordCode, MEMDC_TOTALWORD, &StringRect);
// if (PtInRect(&StringRect, g_CurMousePos))
if ( (StringRect.left <= g_CurMousePos.x)
&&(StringRect.right >= g_CurMousePos.x)
&&(StringRect.top <= g_CurMousePos.y)
&&(StringRect.bottom >= g_CurMousePos.y))
{
switch (WordBuffer[nWordCode].CharType)
{
case CHAR_TYPE_HZ:
case CHAR_TYPE_ASCII:
CopyWord(g_szCurWord, szMemDCWordBuff, WordBuffer[nWordCode].nBegin, WordBuffer[nWordCode].nEnd);
g_CurWordRect.left = StringRect.left;
g_CurWordRect.right = StringRect.right;
g_CurWordRect.top = StringRect.top;
g_CurWordRect.bottom = StringRect.bottom;
g_nCurCaretPlace = -1;
CalculateCaretPlaceInMemDCWord(nWordCode);
break;
case CHAR_TYPE_OTHER:
break;
}
AddToTotalWord(szMemDCWordBuff,
0, // Ignor
WordBuffer[nWordCode].nBegin,
WordBuffer[nWordCode].nEnd,
WordBuffer[nWordCode].CharType,
StringRect,
TRUE);
if ( (WordBuffer[nWordCode].CharType == CHAR_TYPE_OTHER)
&&(g_CurMousePos.x == StringRect.right))
{
return NO_CURMOUSEWORD;
}
return HAS_CURMOUSEWORD;
}
else
{
}
AddToTotalWord(szMemDCWordBuff,
0, // Ignor
WordBuffer[nWordCode].nBegin,
WordBuffer[nWordCode].nEnd,
WordBuffer[nWordCode].CharType,
StringRect,
FALSE);
return NO_CURMOUSEWORD;
}
// 用於计算指定位置在字串中的位置·
__inline DWORD CalculateCaretPlaceInMemDCWord(int nWordCode)
{
RECT StringRect;
int i;
if ( (WordBuffer[nWordCode].CharType == CHAR_TYPE_HZ)
&&(WordBuffer[nWordCode].nBegin == WordBuffer[nWordCode].nEnd))
{
g_nCurCaretPlace = -1;
return 0L;
}
GetMemWordStringRect(nWordCode, MEMDC_TOTALWORD, &StringRect);
if (CalcCaretInThisPlace(g_CurMousePos.x, StringRect.left))
{
// g_nCurCaretPlace = WordBuffer[nWordCode].nBegin;
g_nCurCaretPlace = 0;
return 0l;
}
if (CalcCaretInThisPlace(g_CurMousePos.x, StringRect.right))
{
// g_nCurCaretPlace = WordBuffer[nWordCode].nEnd + 1;
g_nCurCaretPlace = WordBuffer[nWordCode].nEnd - WordBuffer[nWordCode].nBegin + 1;
return 0l;
}
for (i = WordBuffer[nWordCode].nBegin; i <= WordBuffer[nWordCode].nEnd; i++)
{
GetMemWordStringRect(nWordCode, i - WordBuffer[nWordCode].nBegin, &StringRect);
if (CalcCaretInThisPlace(g_CurMousePos.x, StringRect.right))
{
// g_nCurCaretPlace = i + 1;
g_nCurCaretPlace = i - WordBuffer[nWordCode].nBegin + 1;
return 0l;
}
}
return 0L;
}
/*
if (nCurCharNum != nFromPlace)
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL nCurCharNum != nFromPlace");
#endif
return TRUE;
}
if ( (nCurCharNum == nLength - 1)
&&(lpString[nCurCharNum] == CHAR_LINK)
||(lpString[nCurCharNum] == '?')
||(lpString[nCurCharNum] == '*'))
{
return FALSE;
}
if ( (nCurCharNum != nFromPlace)
&& (lpString[nCurCharNum] == CHAR_LINK)
||(lpString[nCurCharNum] == '?')
||(lpString[nCurCharNum] == '*'))
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL 3");
#endif
return TRUE;
}
if ((nCurCharNum == '?') || (nCurCharNum == '*'))
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL *?");
#endif
if (nCurCharNum == nLength - 1)
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL nCurCharNum == nLength - 1");
#endif
return FALSE;
}
if (GetCharType(lpString[nCurCharNum + 1]) != CHAR_TYPE_ASCII)
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL etCharType(lpString[nCurCharNum + 1]) != CHAR_TYPE_ASCII");
#endif
return FALSE;
}
if (nCurCharNum == nFromPlace)
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL nCurCharNum == nFromPlace");
#endif
return FALSE;
}
return TRUE;
}
__inline int FindAWord(LPCSTR lpString, int nFromPlace, int nLength)
{
int i = nFromPlace;
int j;
while (i < nLength)
{
if ( (lpString[i] == '?')
||(lpString[i] == '*'))
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL ?*");
#endif
if (i == nLength - 1)
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL i == nLength - 1");
#endif
// return i - 1;
return i;
}
j = i;
while(j < nLength)
{
if ((lpString[j] != '?')&&(lpString[j] != '*'))
{
#ifdef _DEBUG
DbgPrintf("NhWSrh.DLL is not ?*");
#endif
break;
}
j++;
}
if (j == nLength)
return j-1;
if (IsASCIIWord(lpString, nFromPlace, nLength, j))
{
i = j;
}
else
{
// return i - 1;
return j - 1;
}
}
// 用於处理 '-' 的几种情况·
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_LINK)
{
if (nCurCharNum == nLength - 1)
{
return FALSE;
}
if (GetCharType(lpString[nCurCharNum + 1]) == CHAR_TYPE_ASCII)
{
return TRUE;
}
}
/* if ( (lpString[nCurCharNum] == '?')
||(lpString[nCurCharNum] == '*'))
{
if (nCurCharNum == nLength - 1)
{
return FALSE;
}
nCurCharNum++;
while(nCurCharNum < nLength)
{
if (GetCharType(lpString[nCurCharNum]) ==
}
// if (GetCharType(lpString[nCurCharNum + 1]) == CHAR_TYPE_ASCII)
// {
// return TRUE;
// }
}*/
// return FALSE;
//}
//*/
/*
__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))
// 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;
}
// if (lpString[nCurCharNum] == CHAR_LINK)
// {
// if (nCurCharNum == nLength - 1)
// {
// return FALSE;
// }
// if (GetCharType(lpString[nCurCharNum + 1]) == CHAR_TYPE_ASCII)
// {
// return TRUE;
// }
// }
return FALSE;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -