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

📄 dbcsedit.c

📁 windows环境下的一套汉字处理引擎,可以对汉字进行相应的处理
💻 C
📖 第 1 页 / 共 2 页
字号:
	    {
	      HANDLE hMem;

	      hMem = RemoveProp ( hWnd, szNoEnter);
	      GlobalFree ( hMem );
	    }
	    break;
	case	WM_MOUSEMOVE:
	    if (!bMouseDown)
		break;

	    CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam);
	    if(IsBetweenHanzi(hWnd))
		{
		if (GetWindowLong (hWnd, GWL_EXSTYLE) & ES_MULTILINE)
		    {
		    hDC = GetDC (hWnd);
		    ptm = (NPTEXTMETRIC)LocalAlloc (LPTR, sizeof(TEXTMETRIC));
		    GetTextMetrics (hDC, ptm);
		    if (LOWORD(lParam) > xMousePos)
			lParam += ptm->tmAveCharWidth;
		    else
			lParam -= ptm->tmAveCharWidth;
		    CallWindowProc (fpOldEditProc,hWnd,message,wParam, lParam);
		    LocalFree ((HANDLE)ptm);
		    ReleaseDC (hWnd, hDC);
		    InvalidateRect (hWnd, NULL, FALSE);
		    }
		else
		    {
		    ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
		    if (LOWORD(lParam) > xMousePos)
			{
			if (LOWORD(ldat)==xLastPos)
			    {
			    CallWindowProc (fpOldEditProc, hWnd,
					    EM_SETSEL, 0, ldat-0x10000);
			    CallWindowProc (fpOldEditProc, hWnd,
					    EM_SETSEL, 0, ldat+0x10000);
			    }
			else
			    {
			    CallWindowProc (fpOldEditProc,hWnd,
					    EM_SETSEL, 0, SWAPLONG(ldat-1));
			    CallWindowProc (fpOldEditProc,hWnd,
					    EM_SETSEL, 0, SWAPLONG(ldat+1));
			    }
			}
		    else
			{
			if (LOWORD(ldat)==xLastPos)
			    CallWindowProc (fpOldEditProc,hWnd,
					    EM_SETSEL, 0, ldat-0x10000);
			else
			    CallWindowProc (fpOldEditProc,hWnd,
					    EM_SETSEL, 0, SWAPLONG(ldat-1));
			}
		    }
		}

	    // xMousePos = LOWORD(lParam);
	    return NULL;

	case	WM_LBUTTONDOWN:
	    bMouseDown=1;
	    xMousePos = LOWORD(lParam);
	    CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam);
	    ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
	    xLastPos = LOWORD(ldat);
	    if (IsBetweenHanzi(hWnd))
		{
		  if ( LOWORD ( ldat ) == HIWORD ( ldat ))
		    CallWindowProc (fpOldEditProc,hWnd,
				EM_SETSEL, 0, ldat-0x10001);
		   else
		    {
		      if ( IsStartBetweenHanzi ( hWnd ))
			CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, ldat-0x1 );
		       else
			CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, ldat-0x10000 );
		    }
		xLastPos--;
		}
	    return NULL;

	case	WM_LBUTTONDBLCLK:
	    CallWindowProc (fpOldEditProc,hWnd,
			    EM_SETSEL, 0,
			    GetWordPos (hWnd));
	    return NULL;

	case	WM_LBUTTONUP:
	    bMouseDown=0;
	    break;

	case	WM_KEYDOWN:
	    switch(wParam){
		case VK_SHIFT:
		    ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
		    if (LOWORD(ldat)==HIWORD(ldat))
		      xLastPos = LOWORD(ldat);
		    break;

		case VK_UP:
		    ldat = CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam);
		    if(IsBetweenHanzi(hWnd)) {
			ldat = CallWindowProc(fpOldEditProc,hWnd,WM_KEYDOWN,VK_LEFT,lParam);
			}
		    return ldat;

		case VK_DOWN:
		    ldat = CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam);
		    if(IsBetweenHanzi(hWnd)){
			ldat = CallWindowProc(fpOldEditProc,hWnd,WM_KEYDOWN,VK_LEFT, lParam);
		    }
		    return ldat;

		case VK_RIGHT:
		    if (!(GetKeyState (VK_SHIFT) & 0x8000))
			{
			CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			if(IsBetweenHanzi(hWnd))
			    CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			return NULL;
			}

		    ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
		    if (LOWORD(ldat) == HIWORD(ldat))
			xLastPos = LOWORD(ldat);

		    if (LOWORD(ldat) == xLastPos)
			{
			if (IsBeforeHanzi (hWnd,1))
			    CallWindowProc (fpOldEditProc,hWnd,
					    EM_SETSEL, 0, ldat+0x20000);
			else
			    CallWindowProc (fpOldEditProc,hWnd,
					    message,wParam,lParam);
			}
		    else if (HIWORD(ldat) == xLastPos)
			{
			if (IsBeforeHanzi (hWnd,-1))
			    CallWindowProc (fpOldEditProc,hWnd,
					    EM_SETSEL, 0, SWAPLONG(ldat+0x2));
			else
			    CallWindowProc (fpOldEditProc,hWnd,
					    message,wParam,lParam);
			}
		    else
			{
			CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			if(IsBetweenHanzi(hWnd))
			    CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			}
		    return NULL;

		case VK_LEFT:
		    if (!(GetKeyState (VK_SHIFT) & 0x8000))
			{
			CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			if(IsBetweenHanzi(hWnd))
			    CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			return NULL;
			}

		    ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
		    if (LOWORD(ldat) == HIWORD(ldat))
			xLastPos = LOWORD(ldat);

		    if (HIWORD(ldat) == xLastPos)
			{
			if (LOWORD(ldat))
			    {
			    if (IsAfterHanzi (hWnd,-1))
				CallWindowProc (fpOldEditProc,hWnd,
					    EM_SETSEL, 0, SWAPLONG(ldat-0x2));
			    else
				CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			    }
			}
		    else if (LOWORD(ldat) == xLastPos)
			{
			if (IsAfterHanzi(hWnd,1))
			    CallWindowProc (fpOldEditProc,hWnd,
					    EM_SETSEL, 0, ldat-0x20000);
			else
			    CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			}
		    else
			{
			CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			if(IsBetweenHanzi(hWnd))
			    CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			}
		    return NULL;


		case VK_DELETE:
		    if (!(GetKeyState(VK_SHIFT) & 0x8000))
			{
			ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
			if ( IsBeforeHanzi ( hWnd, 0 ))
			  {
			    CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, ldat+0x20000 );
			    ldat = 0;
			    CallWindowProc ( fpOldEditProc, hWnd, EM_REPLACESEL, 0, ( DWORD )( LPSTR ) &ldat );
			  }
			 else
			  CallWindowProc ( fpOldEditProc, hWnd, WM_KEYDOWN, VK_DELETE, lParam );
			return NULL;
			}
		    break;
		}
	    break;

#ifdef _WIN31
	// following is added by MA : 12/03/93
	case	WM_IME_REPORT:
	  switch ( wParam )
	    {
	      case IR_DBCSCHAR:
		return 0;
	      case IR_STRING:
		if ( bSetFlag )
		 {
		  LPSTR lpMem;
		  long	lStartPosition, lLastPosition;
		  RECT	UpdateArea;

		  if (( lpMem = GlobalLock ( LOWORD ( lParam ))) == NULL )
		    return NULL;
		  lStartPosition = CallWindowProc ( fpOldEditProc, hWnd, EM_GETSEL, 0, 0L );
		  while ( * lpMem )
		    CallWindowProc ( fpOldEditProc, hWnd, WM_CHAR, ( WORD )( unsigned char )* lpMem ++, 1L );
		  GetClientRect ( hWnd, & UpdateArea );
		  lLastPosition = CallWindowProc ( fpOldEditProc, hWnd, EM_GETSEL, 0, 0L );
		  CalculateLine ( fpOldEditProc, hWnd, lStartPosition, lLastPosition, & UpdateArea );
		  GlobalUnlock ( LOWORD ( lParam ));
		  InvalidateRect ( hWnd, & UpdateArea, FALSE );
		 }
		return bSetFlag;
	      default:
		return NULL;
	    }
#endif
	case	WM_CHAR:
	    switch(wParam)
		{
		case VK_BACK:
		    ldat = CallWindowProc (fpOldEditProc,hWnd,EM_GETSEL,0,0L);
		    if (GetWindowLong (hWnd, GWL_EXSTYLE) & ES_MULTILINE)
			{
			if (LOWORD(ldat) == HIWORD(ldat))
			    {
			    if (LOWORD(ldat))
				CallWindowProc (fpOldEditProc,hWnd,
						EM_SETSEL, 0,
						IsAfterHanzi (hWnd,-1) ? ldat-0x2
								    : ldat-0x1);
			    }
			ldat = 0;
			CallWindowProc (fpOldEditProc, hWnd,
					EM_REPLACESEL, 0,
					(long)(LPSTR)&ldat);
			}
		    else
			{
			if (LOWORD(ldat)==HIWORD(ldat) && IsAfterHanzi (hWnd,-1))
			    CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			CallWindowProc (fpOldEditProc,hWnd,message,wParam,lParam);
			}
		    return NULL;

		default:
		      {
			HANDLE hMem;
			LPSTR  lpBuf;

			hMem = GetProp ( hWnd, szNoEnter);
			if (( lpBuf = GlobalLock ( hMem )) != NULL )
			  {
			    if ( * lpBuf == 0 )
			      {
				if ( IsDBCSLeadByte((char) wParam ))
				  {
				    * ( WORD FAR * ) lpBuf = wParam;
				    * ( LONG FAR * ) ( lpBuf + 2 ) = lParam;
				    GlobalUnlock ( hMem );
				    return	NULL;
				  } // else do old
				 else
				   GlobalUnlock ( hMem );
			      }
			     else
			      {
//				LPSTR	lpMem;
				long	lStartPosition, lLastPosition;
				RECT	UpdateArea;

				lStartPosition = CallWindowProc ( fpOldEditProc, hWnd, EM_GETSEL, 0, 0L );
				GetClientRect ( hWnd, & UpdateArea );
				lLastPosition = CallWindowProc ( fpOldEditProc, hWnd, EM_GETSEL, 0, 0L );
				CalculateLine ( fpOldEditProc, hWnd, lStartPosition, lLastPosition, & UpdateArea );
				CallWindowProc ( fpOldEditProc, hWnd, WM_CHAR, * ( WORD FAR * ) lpBuf, * ( LONG FAR * ) ( lpBuf+2 ) );
				CallWindowProc ( fpOldEditProc, hWnd, WM_CHAR, wParam, lParam );
				InvalidateRect ( hWnd, & UpdateArea, FALSE );
				* lpBuf = 0;

				GlobalUnlock ( hMem );
				return	NULL;
			      }
			 }
		     }
		    break;
		}
	    break;
	}

    return (CallWindowProc(fpOldEditProc,hWnd,message,wParam,lParam));
}

void	CalculateLine ( FARPROC fpOldEditProc, HWND hWnd, long lStartPosition, long lLastPosition, RECT FAR * pUpdateArea )
{
  long	lWinHeight = pUpdateArea -> bottom - pUpdateArea -> top;
  long	lFirstLine = CallWindowProc ( fpOldEditProc, hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L );
  long	lStartPos = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEFROMCHAR, LOWORD ( lStartPosition ), 0L );
  long	lLineinWnd, lLineCount, ldat, i;
  POINT CaretPos;
  HDC	hDC;
  TEXTMETRIC	tm;

  // create repaint top limit
  if ( lStartPos >= lFirstLine )
    {
      CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, MAKELONG ( LOWORD ( lStartPosition ), LOWORD ( lStartPosition )));
      GetCaretPos ( & CaretPos );
      pUpdateArea -> top = CaretPos.y;
      CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, lLastPosition );
    }

  // get TEXTMETRICS
  hDC = GetDC ( hWnd );
  GetTextMetrics ( hDC, & tm );
  ReleaseDC ( hWnd, hDC );

  lLineinWnd = lWinHeight / ( tm.tmHeight + tm.tmExternalLeading );
  lLineCount = CallWindowProc ( fpOldEditProc, hWnd, EM_GETLINECOUNT, 0, 0L );

  for ( i = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEFROMCHAR, LOWORD( lStartPosition ), 0L );
	i < min ( lLineCount, lFirstLine+lLineinWnd )-1; i++ )
    if ( CheckLine ( fpOldEditProc, hWnd, i ) == TRUE ) break;

  // create repaint area bottom limit
  if ( i < min ( lLineCount, lFirstLine+lLineinWnd )-1 )
    {	// i+1 is the next line
      ldat = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEINDEX, LOWORD(i+1), 0L );
      CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, MAKELONG(LOWORD(ldat),LOWORD(ldat)) );
      GetCaretPos ( & CaretPos );
      CallWindowProc ( fpOldEditProc, hWnd, EM_SETSEL, 0, lLastPosition );
      pUpdateArea -> bottom = CaretPos.y;
    }	// else update all last area
}

int WINAPI WordBreakProc (lpString, iCurrent, iCount, wAction)
LPSTR lpString;
short iCurrent;
short iCount;
WORD  wAction;
{
    switch (wAction)
    {
    case WB_LEFT:
	return (AnsiPrev (lpString, lpString+iCurrent) - lpString);

    case WB_RIGHT:
	return (AnsiNext (lpString+iCurrent) - lpString);

    case WB_ISDELIMITER:
	return FALSE;
    }
    return NULL;
}

BOOL	CheckLine ( FARPROC fpOldEditProc, HWND hWnd, long nLineNum )
{
  int		nLineLength, nThisLineStartPos, nThatLineStartPos;

  nThisLineStartPos = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEINDEX, LOWORD ( nLineNum ), 0L );
  nLineLength = CallWindowProc ( fpOldEditProc, hWnd, EM_LINELENGTH, LOWORD (nThisLineStartPos ), 0L );
  nThatLineStartPos = CallWindowProc ( fpOldEditProc, hWnd, EM_LINEINDEX, LOWORD ( nLineNum ) + 1, 0L );
  if ( nThatLineStartPos == nLineLength + nThisLineStartPos + 2 )
    return TRUE;
   else
    return FALSE;
}

void EnumEditWindows (HWND hWnd, FARPROC fpProc)
{
    if (hWnd)
	{
	do {
	    GetClassName (hWnd, szClass, 7);
	    if (!lstrcmpi (szClass, szEdit))
		fpProc ((HWND)hWnd);
	    EnumEditWindows (GetWindow (hWnd, GW_CHILD), fpProc);
	    } while (hWnd = GetWindow (hWnd, GW_HWNDNEXT));
	}
}

void CALLBACK SetEditWnd (HWND hWnd)
{
    if (GetWindowLong (hWnd, GWL_WNDPROC) == (LONG)fpOldEditProc)
		{
		SetWindowLong (hWnd, GWL_WNDPROC, (long)(FARPROC)EditProc);
		SetProp (hWnd, szNoEnter, GlobalAlloc (GHND, 100));
		PostMessage (hWnd, EM_SETWORDBREAKPROC, NULL,
			     (LPARAM)(FARPROC)WordBreakProc);
		}
}

void CALLBACK ResetEditWnd (HWND hWnd)
{
    if (GetWindowLong (hWnd, GWL_WNDPROC) == (WORD)(FARPROC)EditProc)
	{
	SetWindowLong (hWnd, GWL_WNDPROC, (long)fpOldEditProc);
	GlobalFree (RemoveProp (hWnd, szNoEnter));
	PostMessage (hWnd, EM_SETWORDBREAKPROC, NULL,
		     (LPARAM)fpOldWordBreakProc);
	}
}

BOOL WINAPI EnableDBCSEditCtrl ( int b	)
{
    HWND    hWnd;
	static	BOOL bDBCSEditCtrl = FALSE;

    if (bCWinVer)
		return FALSE;

    hWnd    = CreateWindow (szEdit, szNewEditer, NULL,
						    0, 0, 0, 0,
						    NULL, NULL, hInst, NULL);

    if ( ! hWnd )
		return FALSE;

    if (b)
      	{
		if ( !bDBCSEditCtrl)
			{
			fpOldWordBreakProc = (FARPROC)SendMessage (hWnd, EM_GETWORDBREAKPROC,
													   NULL, NULL);
			fpOldEditProc = (FARPROC)SetClassLong (hWnd, GCL_WNDPROC,
											       (long)(FARPROC)EditProc);
			EnumEditWindows (GetWindow (GetActiveWindow (), GW_HWNDFIRST),
							 (FARPROC)SetEditWnd);
			bDBCSEditCtrl = TRUE;
			}
		if ( b == 1 )
			bSetFlag = FALSE;
		else
		 	bSetFlag = TRUE;
	    }
    else if (!b && bDBCSEditCtrl)
		{
		SetClassLong (hWnd, GCL_WNDPROC, (long)fpOldEditProc);
		EnumEditWindows (GetWindow (GetActiveWindow (), GW_HWNDFIRST),
						 (FARPROC)ResetEditWnd);
		bDBCSEditCtrl = FALSE;
		}

    DestroyWindow (hWnd);
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -