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

📄 fedit.cpp

📁 jedit 一个小型java编译器的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************\
*
*  文件名:    FEdit.cpp
*  目的:	  FEdit类的实现文件,关于函数用法,请参见FWindow.h
*  使用说明:  FEdit类是对FString的Windows实现,F的用意是指Free
*			  即任何人都可以修改它为己所用。
*			  在保持此程序完整性的情况下,你可以任意传播它。你也可以修改它
*			  来为你服务,如果你要将此程序用于商业目的,请告知我。
*
*  CopyLeft	 2003  张元一
*
*  CopyLeft 是自由软件基金会(FSF)推荐使用的自由软件的标志
*
\******************************************************************************/
#include<windows.h>
#include<tchar.h>
#include<commctrl.h>
#include"fedit.h"

bool FEdit::IsClassRegistered=false;
HMENU FEdit::hMenu=NULL;
COLORREF FEdit::hTextColor=RGB(0,0,0);
COLORREF FEdit::hBgColor=RGB(255,255,255);
HBITMAP FEdit::hBackGround=NULL;
char FEdit::BGFile[256]="";

LRESULT FEdit::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	POINT point;
	
	switch( uMsg )
	{
		case WM_CREATE:
			InitEdit(hWnd);
			return 0;
		case WM_SIZE:
			OnSize(hWnd);
			return 0;
		case WM_LBUTTONDBLCLK:
			Str.SelectWord();
			InvalidateRect(m_hWnd,NULL,false);
			return 0;
		case WM_LBUTTONDOWN:
			OnLButtonDown(hWnd);
			SendMessage(GetParent(hWnd),WM_LCCHANGED,0l,0l);
			SendMessage(hWnd,WM_LCCHANGED,0l,0l);
			return 0;
		case WM_RBUTTONDOWN:
			if(IsSelEmpty())
			{
				OnLButtonDown(hWnd);
				SendMessage(GetParent(hWnd),WM_LCCHANGED,0l,0l);
				SendMessage(hWnd,WM_LCCHANGED,0l,0l);
				LBDownFlag=false;
			}
			point.x = LOWORD (lParam) ;
			point.y = HIWORD (lParam) ;
			ClientToScreen (hWnd, &point) ;
          
			TrackPopupMenu (GetSubMenu(hMenu,0), TPM_RIGHTBUTTON, point.x, point.y, 
                         0, hWnd, NULL) ;
			return(0);
		case WM_LBUTTONUP:
			ReleaseCapture();
			LBDownFlag=false;
			return 0;
		case WM_LCCHANGED:
			OnLCChanged();
			return 0;
		case WM_TIMER:
			if(LBDownFlag)
			{
				OnMouseMove(hWnd);
				SendMessage(hWnd,WM_LCCHANGED,0l,0l);
			}
			return 0;
		case WM_SETFOCUS:
			CreateCaret(hWnd,NULL,1,cHeight);
			SetCaretPos(X+(Str.GetPos()-1)*cWidth,
				Y+(Str.GetLine()-1)*cHeight);
			ShowCaret(hWnd);
			SendMessage(GetParent(hWnd),WM_LCCHANGED,0l,0l);
			SendMessage(hWnd,WM_LCCHANGED,0l,0l);
			return 0;
		case WM_KEYDOWN:
			OnKeyDown(hWnd,wParam,lParam);
			SendMessage(GetParent(hWnd),WM_LCCHANGED,0l,0l);
			SendMessage(hWnd,WM_LCCHANGED,0l,0l);
			return 0;
		case WM_CHAR:
			HideCaret(hWnd);
			OnChar(wParam,lParam);
			SetCaretPos(X+(Str.GetPos()-1)*cWidth,
				Y+(Str.GetLine()-1)*cHeight);
			ShowCaret(hWnd);
			SendMessage(GetParent(hWnd),WM_LCCHANGED,0l,0l);
			SendMessage(hWnd,WM_LCCHANGED,0l,0l);
			SaveFlag=false;
			return 0;
		case WM_PAINT:
			{
			HideCaret(hWnd);
			SetCaretPos(X+(Str.GetPos()-1)*cWidth,
				Y+(Str.GetLine()-1)*cHeight);
            PAINTSTRUCT ps; 
                
            BeginPaint(hWnd, &ps);
            OnDraw(ps.hdc);
            EndPaint(hWnd, &ps);
			ShowCaret(hWnd);
			}
			return 0;
		case WM_COMMAND:
			switch(LOWORD(wParam))
			{
			case IDM_UNDO:
				Undo();
				break;
			case IDM_REDO:
				Redo();
				break;
			case IDM_CUT:
				SendMessage(hWnd,WM_COMMAND,IDM_COPY,0L);
				SendMessage(hWnd,WM_COMMAND,IDM_DELETE,0L);
				SendMessage(GetParent(hWnd),WM_LCCHANGED,0,0);
				SendMessage(hWnd,WM_LCCHANGED,0,0);
				break;
			case IDM_COPY:
				CopySel();
				break;
			case IDM_PASTE:
				DeleteSel();
				PasteChar();
				SendMessage(GetParent(hWnd),WM_LCCHANGED,0,0);
				SendMessage(hWnd,WM_LCCHANGED,0,0);
				break;
			case IDM_DELETE:
				DeleteSel();
				SendMessage(hWnd,WM_LCCHANGED,0,0);
				SendMessage(GetParent(hWnd),WM_LCCHANGED,0,0);
				break;
			case IDM_TIMEDATE:
				InsertTimeDate();
				break;
			case IDM_SELECTALL:
				SelectAll();
				break;
			}
			return 0;
		case WM_HSCROLL:
			OnHScroll(wParam,lParam);
			return 0;
		case WM_VSCROLL:
			OnVScroll(wParam,lParam);
			return 0;
		case WM_PALETTEISCHANGING: // should not happen
			MessageBox(NULL, _T("Hello"), _T("Hi"), MB_OK);
			return 0;
		case WM_DESTROY:
			return 0;
	}

   return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


LRESULT CALLBACK FEdit::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	FEdit * pWindow;
        
	if ( uMsg==WM_NCCREATE )
	{   
		assert( ! IsBadReadPtr((void *) lParam, sizeof(CREATESTRUCT)) );
		MDICREATESTRUCT * pMDIC = (MDICREATESTRUCT *) ((LPCREATESTRUCT) lParam)->lpCreateParams;

		pWindow = (FEdit *) (pMDIC->lParam);

		assert( ! IsBadReadPtr(pWindow, sizeof(FEdit)) );
		SetWindowLong(hWnd, GWL_USERDATA, (LONG) pWindow);
	}
	else
		pWindow=(FEdit *)GetWindowLong(hWnd, GWL_USERDATA);

	if ( pWindow )
		return pWindow->WndProc(hWnd, uMsg, wParam, lParam);
	else
		return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

bool FEdit::CreateEx(HINSTANCE hInst,HWND hParent,int x,int y,
					 int width,int height)
{
	if(!RegisterClassEx(hInst))
		return false;

	xPos=x;
	yPos=y;
	Width=width;
	Height=height;

	MDICREATESTRUCT mdic;
	memset(& mdic, 0, sizeof(mdic));
	mdic.lParam = (LPARAM) this;

	m_hWnd=CreateWindowEx(WS_EX_CLIENTEDGE,
		"FEdit",NULL,
		WS_CHILD|WS_BORDER|WS_VSCROLL|WS_HSCROLL,
		x,y,width,height,
		hParent,
		NULL,
		hInst,
		&mdic);
	if(m_hWnd==NULL)
		return false;
	return true;
}

bool FEdit::RegisterClassEx(HINSTANCE hInst)
{
	if(IsClassRegistered)
		return true;

	hMenu = LoadMenu (hInst, MAKEINTRESOURCE(IDM_POPUP));
	SetMenu();
	InitCommonControls();

	WNDCLASSEX wc;
	memset(&wc, 0, sizeof(wc));
	wc.cbSize=sizeof(WNDCLASSEX);
	wc.cbClsExtra=0;
	wc.cbWndExtra=0;
	wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.hCursor=LoadCursor(NULL,IDC_IBEAM);
	wc.hIcon=NULL;
	wc.hInstance=hInst;
	wc.lpfnWndProc=WindowProc;
	wc.lpszClassName="FEdit";
	wc.lpszMenuName=NULL;
	wc.style=CS_DBLCLKS;
	wc.hIconSm=NULL;
	
	if(!::RegisterClassEx(&wc))
		return false;
	IsClassRegistered=true;
	return true;
}
void FEdit::SetScrollBar(HWND hWnd)
{
	int nMax,nPage,nPos;
	nMax=Str.GetTotalLine();
	nPage=(Height-5)/cHeight;
	nPos=(5-Y)/cHeight+1;
	if(nMax<nPage+(5-Y)/cHeight)
	{
		nMax=nPage+(5-Y)/cHeight;
	}
	if(nPos<1) nPos=1;
	if(nMax<=nPage) EnableScrollBar(hWnd,SB_VERT,ESB_DISABLE_BOTH);
    else
	{
		EnableScrollBar(hWnd,SB_VERT,ESB_ENABLE_BOTH);

		SCROLLINFO si;
		si.cbSize=sizeof(SCROLLINFO);
		si.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
		si.nMax=nMax;
		si.nMin=1;
		si.nPage=nPage;
		si.nPos=nPos;

		SetScrollInfo(hWnd,SB_VERT,&si,true);
	}
	nPage=(Width-5)/cWidth;
	nMax=Str.GetMaxLineWidth()-1;
	nPos=(5-X)/cWidth+1;
	if(nMax<nPage+(5-X)/cWidth)
	{
		nMax=nPage+(5-X)/cWidth;
	}
	if(nPos<1) nPos=1;
	if(nMax<=nPage) EnableScrollBar(hWnd,SB_HORZ,ESB_DISABLE_BOTH);
    else
	{
		EnableScrollBar(hWnd,SB_HORZ,ESB_ENABLE_BOTH);

		SCROLLINFO si;
		si.cbSize=sizeof(SCROLLINFO);
		si.fMask=SIF_PAGE|SIF_RANGE|SIF_POS;
		si.nMax=nMax;
		si.nMin=1;
		si.nPage=nPage;
		si.nPos=nPos;

		SetScrollInfo(hWnd,SB_HORZ,&si,true);
	}
}

void FEdit::OnDraw(HDC hdc)
{
	RECT rect;
	rect.left=rect.top=0;
	rect.right=Width;
	rect.bottom=Height;
	SelectObject(m_hdcBack,m_BmpBack);
	SelectObject(m_hdcBack,hf);
	FillRect(m_hdcBack,&rect,CreateSolidBrush(hBgColor));
	SetBackGround();
	SetBkMode(m_hdcBack,TRANSPARENT);

	int TotalLine;
	int i,j;
	char c[2];
	bool SelFlag=false;
	TotalLine=Str.GetTotalLine();
	SetBkColor(m_hdcBack,hBgColor);
	SetTextColor(m_hdcBack,hTextColor);
	for(i=1;i<=TotalLine;i++)
	{
		if(Y+i*cHeight<5||Y+i*cHeight>Height)
			continue;
		for(j=1;j<Str.GetLineWidth(i);j++)
		{
			c[0]=Str.GetChar(i,j);
			if(X+j*cWidth<5||X+j*cWidth>Width)
			{
				if(c[0]>=-95&&c[0]<=-2)
					j++;
				continue;
			}
			if(c[0]==0x0d) continue;
			if(c[0]==0x09) c[0]=0x20;
			if(c[0]==0x0a) continue;
			if(Str.IsInSelection(i,j))
			{
				if(!SelFlag)
				{
					SelFlag=true;
					SetBkMode(m_hdcBack,OPAQUE);
					SetBkColor(m_hdcBack,hTextColor);
					SetTextColor(m_hdcBack,hBgColor);
				}
			}
			else
			{
				if(SelFlag)
				{
					SelFlag=false;
					SetBkMode(m_hdcBack,TRANSPARENT);
					SetBkColor(m_hdcBack,hBgColor);
					SetTextColor(m_hdcBack,hTextColor);
				}
			}
			if(c[0]>=-95&&c[0]<=-2)
			{
				c[1]=Str.GetChar(i,++j);
				if(PosInRect(X+(j-2)*cWidth,Y+(i-1)*cHeight))
					TextOut(m_hdcBack,X+(j-2)*cWidth,Y+(i-1)*cHeight,c,2);
			}
			else
				if(PosInRect(X+(j-1)*cWidth,Y+(i-1)*cHeight))
					TextOut(m_hdcBack,X+(j-1)*cWidth,Y+(i-1)*cHeight,c,1);
		}
	}
	BitBlt(hdc,0,0,Width,Height,m_hdcBack,0,0,SRCCOPY);
}
void FEdit::OnChar(WPARAM wParam,LPARAM lParam)
{
	switch(wParam)
	{
	case 0x1b:
		return;
	case 0x0d:
		Str.DeleteSel();
		Str.Insert(0x0a);
		break;
	case 0x09:
		Str.DeleteSel();
		if((Str.GetPos()-1)%4!=0)
			while((Str.GetPos()-1)%4!=0)
				Str.Insert(0x20);
		else
			for(int i=0;i<4;i++)
				Str.Insert(0x20);
		break;
	case 0x08:
		if(!Str.IsSelEmpty())
			Str.DeleteSel();
		else
			Str.DeletePrev();
		break;
	default:
		Str.DeleteSel();
		Str.Insert((char)wParam);
	}
	AdjustCaretPos();
	SetScrollBar(m_hWnd);
	InvalidateRect(m_hWnd,NULL,false);
}
void FEdit::InitEdit(HWND hWnd)
{
	HDC hdc;
	hdc=GetDC(hWnd);
	m_hdcBack=CreateCompatibleDC(hdc);
	m_BmpBack=NULL;
	ReleaseDC(hWnd,hdc);
}
void FEdit::OnSize(HWND hWnd)
{
	RECT rect;
	HDC hdc;
	hdc=GetDC(hWnd);
	GetClientRect(hWnd,&rect);

⌨️ 快捷键说明

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