?? fedit.cpp
字號:
/******************************************************************************\
*
* 文件名: 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 + -