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

📄 findword.c

📁 屏幕取词源码.zip
💻 C
📖 第 1 页 / 共 2 页
字号:

#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 + -