?? fedit.cpp
字號:
Width=rect.right-rect.left;
Height=rect.bottom-rect.top;
if(m_BmpBack!=NULL)
DeleteObject(m_BmpBack);
m_BmpBack=CreateCompatibleBitmap(hdc,Width,Height);
SetScrollBar(hWnd);
ReleaseDC(hWnd,hdc);
}
void FEdit::OnKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
switch(LOWORD(wParam))
{
case VK_UP:
HideCaret(hWnd);
Str.EmptySel();
Str.MoveToPreviousLine();
AdjustCaretPos();
SetScrollBar(hWnd);
InvalidateRect(hWnd,NULL,false);
break;
case VK_DOWN:
HideCaret(hWnd);
Str.EmptySel();
Str.MoveToNextLine();
AdjustCaretPos();
SetScrollBar(hWnd);
InvalidateRect(hWnd,NULL,false);
break;
case VK_LEFT:
HideCaret(hWnd);
Str.EmptySel();
Str.MoveToPrevious();
AdjustCaretPos();
SetScrollBar(hWnd);
InvalidateRect(hWnd,NULL,false);
break;
case VK_RIGHT:
HideCaret(hWnd);
Str.EmptySel();
Str.MoveToNext();
AdjustCaretPos();
SetScrollBar(hWnd);
InvalidateRect(hWnd,NULL,false);
break;
case VK_HOME:
HideCaret(hWnd);
Str.EmptySel();
Str.MoveToStart();
AdjustCaretPos();
SetScrollBar(hWnd);
InvalidateRect(hWnd,NULL,false);
break;
case VK_END:
HideCaret(hWnd);
Str.EmptySel();
Str.MoveToEnd();
AdjustCaretPos();
SetScrollBar(hWnd);
InvalidateRect(hWnd,NULL,false);
break;
case VK_DELETE:
HideCaret(hWnd);
if(!Str.IsSelEmpty())
Str.DeleteSel();
else
Str.Delete();
AdjustCaretPos();
SetScrollBar(hWnd);
InvalidateRect(hWnd,NULL,false);
SaveFlag=false;
break;
case VK_PRIOR:
HideCaret(hWnd);
Str.EmptySel();
OnVScroll(SB_PAGEUP,0);
ShowCaret(hWnd);
break;
case VK_NEXT:
HideCaret(hWnd);
Str.EmptySel();
OnVScroll(SB_PAGEDOWN,0);
ShowCaret(hWnd);
break;
}
}
bool FEdit::PosInRect(int x,int y)
{
if(x>=5&&x<Width-cWidth&&
y>=5&&y<Height)
return true;
return false;
}
void FEdit::OnVScroll(WPARAM wParam,LPARAM lParam)
{
SCROLLINFO si;
int nMaxPos;
si.cbSize = sizeof (si);
si.fMask = SIF_ALL;
// Save the position for comparison later o
GetScrollInfo (m_hWnd, SB_VERT, &si);
nMaxPos=si.nMax-si.nPage+1;
switch(LOWORD(wParam))
{
case SB_LINEUP:
si.nPos -= 1;
Y+=cHeight;
break;
case SB_LINEDOWN:
si.nPos += 1;
Y-=cHeight;
break;
case SB_PAGEUP:
si.nPos-=si.nPage;
Y+=Height-5;
break;
case SB_PAGEDOWN:
si.nPos+=si.nPage;
Y-=Height-5;
break;
case SB_THUMBTRACK:
Y+=(si.nPos-si.nTrackPos)*cHeight;
si.nPos = si.nTrackPos;
break;
}
if(Y>5) Y=5;
if(si.nPos>nMaxPos)
{
Y+=(si.nPos-nMaxPos)*cHeight;
si.nPos=nMaxPos;
}
if(si.nPos<si.nMin) si.nPos=si.nMin;
si.fMask = SIF_POS;
SetScrollInfo(m_hWnd,SB_VERT,&si,true);
InvalidateRect(m_hWnd,NULL,false);
}
void FEdit::OnHScroll(WPARAM wParam,LPARAM lParam)
{
SCROLLINFO si;
int nMaxPos;
si.cbSize = sizeof (si);
si.fMask = SIF_ALL;
// Save the position for comparison later o
GetScrollInfo (m_hWnd, SB_HORZ, &si);
nMaxPos=si.nMax-si.nPage+1;
switch(LOWORD(wParam))
{
case SB_LINELEFT:
si.nPos -= 1;
X+=cWidth;
break;
case SB_LINERIGHT:
si.nPos += 1;
X-=cWidth;
break;
case SB_PAGELEFT:
si.nPos-=si.nPage;
X+=Width-cWidth;;
break;
case SB_PAGERIGHT:
si.nPos+=si.nPage;
X-=Width-cWidth;
break;
case SB_THUMBTRACK:
X+=(si.nPos-si.nTrackPos)*cWidth;
si.nPos = si.nTrackPos;
break;
}
if(X>5) X=5;
if(si.nPos>nMaxPos)
{
X+=(si.nPos-nMaxPos)*cWidth;
si.nPos=nMaxPos;
}
if(si.nPos<si.nMin) si.nPos=si.nMin;
si.fMask = SIF_POS;
SetScrollInfo(m_hWnd,SB_HORZ,&si,true);
InvalidateRect(m_hWnd,NULL,false);
}
void FEdit::OnLButtonDown(HWND hWnd)
{
HideCaret(hWnd);
SetCapture(hWnd);
LBDownFlag=true;
int CursorX,CursorY;
int Line,Column;
int TotalLine,LineWidth;
POINT p;
GetCursorPos(&p);
ScreenToClient(hWnd,&p);
CursorX=p.x+cWidth/2;
CursorY=p.y;
Line=(CursorY-Y)/cHeight+1;
Column=(CursorX-X)/cWidth+1;
TotalLine=Str.GetTotalLine();
if(Line>TotalLine) Line=TotalLine;
LineWidth=Str.GetLineWidth(Line);
if(Column>LineWidth) Column=LineWidth;
Str.MoveSelStart(Line,Column);
Str.MoveSelEnd(Line,Column);
Str.MoveToPos(Line,Column);
SetCaretPos(X+(Str.GetPos()-1)*cWidth,
Y+(Str.GetLine()-1)*cHeight);
ShowCaret(hWnd);
if(!Str.IsSelEmpty())
Str.EmptySel();
InvalidateRect(hWnd,NULL,false);
SetTimer(hWnd,1001,100,NULL);
SendMessage(GetParent(hWnd),WM_LCCHANGED,0l,0l);
SendMessage(hWnd,WM_LCCHANGED,0l,0l);
}
void FEdit::OnMouseMove(HWND hWnd)
{
HideCaret(hWnd);
int CursorX,CursorY;
int Line,Column;
int TotalLine,LineWidth;
POINT p;
GetCursorPos(&p);
ScreenToClient(hWnd,&p);
CursorX=p.x+cWidth/2;
CursorY=p.y;
Line=(CursorY-Y)/cHeight+1;
Column=(CursorX-X)/cWidth+1;
if(Line<1) Line=1;
if(Column<1) Column=1;
TotalLine=Str.GetTotalLine();
if(Line>TotalLine) Line=TotalLine;
LineWidth=Str.GetLineWidth(Line);
if(Column>LineWidth) Column=LineWidth;
Str.MoveSelEnd(Line,Column);
Str.MoveToPos(Line,Column);
if(X+(Str.GetPos()-1)*cWidth<5)
OnHScroll(SB_LINELEFT,0);
if(X+(Str.GetPos()-1)*cWidth>Width-cWidth)
OnHScroll(SB_LINERIGHT,0);
if(Y+(Str.GetLine()-1)*cHeight<5)
OnVScroll(SB_LINEUP,0);
if(Y+(Str.GetLine()-1)*cHeight>Height-cHeight)
OnVScroll(SB_LINEDOWN,0);
SetCaretPos(X+(Str.GetPos()-1)*cWidth,
Y+(Str.GetLine()-1)*cHeight);
ShowCaret(hWnd);
InvalidateRect(hWnd,NULL,false);
SendMessage(GetParent(hWnd),WM_LCCHANGED,0l,0l);
}
void FEdit::AdjustCaretPos()
{
while(X+(Str.GetPos()-1)*cWidth<5)
X+=cWidth;
while(X+(Str.GetPos()-1)*cWidth>=Width)
X-=cWidth;
while(Y+(Str.GetLine()-1)*cHeight<5)
Y+=cHeight;
while(Y+(Str.GetLine()-1)*cHeight>Height-cHeight)
Y-=cHeight;
SetCaretPos(X+(Str.GetPos()-1)*cWidth,
Y+(Str.GetLine()-1)*cHeight);
ShowCaret(m_hWnd);
}
bool FEdit::CopySel()
{
char *Sel;
Sel=Str.GetSelect();
int nlen = strlen(Sel);
if (nlen == 0)
return false;
// 將sztext中的內容復制到剪貼板
HGLOBAL hglbcopy;
LPTSTR lptstrcopy;
if (!OpenClipboard(m_hWnd))
return false;
hglbcopy = GlobalAlloc(GMEM_DDESHARE,
(nlen + 1) * sizeof(char));
if (hglbcopy == NULL)
{
CloseClipboard();
return false;
}
EmptyClipboard();
lptstrcopy = (LPTSTR)GlobalLock(hglbcopy);
memcpy(lptstrcopy, Sel, nlen);
lptstrcopy[nlen] = (TCHAR) 0; // null character
GlobalUnlock(lptstrcopy);
SetClipboardData(CF_TEXT, hglbcopy);
CloseClipboard();
return true;
}
bool FEdit::PasteChar()
{
HGLOBAL hglb;
LPTSTR lptstr;
if (!IsClipboardFormatAvailable(CF_TEXT))
return false;
if (!OpenClipboard(m_hWnd))
return false;
hglb = GetClipboardData(CF_TEXT);
if (hglb != NULL)
{
lptstr =(LPTSTR) GlobalLock(hglb);
if (lptstr != NULL)
{
Str.Insert(lptstr);
GlobalUnlock(hglb);
}
}
CloseClipboard();
SaveFlag=false;
HideCaret(m_hWnd);
AdjustCaretPos();
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
return true;
}
bool FEdit::Find(char* content,bool up,bool icmp)
{
int pos;
if(up)
{
if(Str.FindPrev(content,pos,icmp))
{
HideCaret(m_hWnd);
Str.MoveToPos(pos);
Str.MoveSelStart(pos);
Str.MoveSelEnd(pos+strlen(content));
AdjustCaretPos();
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
return true;
}
}
else
{
if(Str.FindNext(content,pos,icmp))
{
HideCaret(m_hWnd);
Str.MoveToPos(pos);
Str.MoveSelStart(pos);
Str.MoveSelEnd(pos+strlen(content));
AdjustCaretPos();
SetScrollBar(m_hWnd);
InvalidateRect(m_hWnd,NULL,false);
return true;
}
}
return false;
}
bool FEdit::Replace(char *src,char *dst,bool icmp)
{
if(!Str.Replace(src,dst,Str.GetCur(),icmp))
return false;
InvalidateRect(m_hWnd,NULL,false);
return true;
}
bool FEdit::ReplaceAll(char *src,char *dst,bool icmp)
{
if(!Str.ReplaceAll(src,dst,icmp))
return false;
InvalidateRect(m_hWnd,NULL,false);
return true;
}
void FEdit::SetBackGround()
{
if(hBackGround==NULL)
return;
RECT ClientRect;
BITMAP bi;
HDC hDC,hImageDC;
GetObject(hBackGround,sizeof(BITMAP),(LPVOID)&bi);
int i,j;
GetClientRect(m_hWnd,&ClientRect);
hDC=GetDC(m_hWnd);
hImageDC=CreateCompatibleDC(hDC);
SelectObject(hImageDC,hBackGround);
for(i=0;i<ClientRect.right;i+=bi.bmWidth)
for(j=0;j<ClientRect.bottom;j+=bi.bmHeight)
BitBlt(m_hdcBack,i,j,bi.bmWidth,bi.bmHeight,hImageDC,0,0,SRCCOPY);
DeleteObject(hImageDC);
DeleteObject(hDC);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -