⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 findword.c

📁 屏幕取词源码.zip
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -