📄 mweditctl.cpp
字号:
int t=1;
for(t;t<curCaret.GeneralLine;t++)
count+=curGeneral.ColumnCount[t];
curCaret.GeneralBufPos=count;
}
else//SubStr不是回车
{
int n=SubStr.GetLength();
if((SubStr[0+0]<128)&&(SubStr[0+0]>20))//是一个字符
{//替换并处理蒙文
// MessageBox(SubStr);
// curCaretCopy=curCaret;
// m_bufferStrCopy=m_bufferStr.Left(m_bufferStr.GetLength());
m_bufferStr.Delete(curCaret.GeneralBufPos,1);
m_bufferStr.Insert(curCaret.GeneralBufPos,SubStr);
change=true;
}
else//
{//插入
// curCaretCopy=curCaret;
// m_bufferStrCopy=m_bufferStr.Left(m_bufferStr.GetLength());
m_bufferStr.Insert(curCaret.GeneralBufPos,SubStr);
}
CString rightstr=m_bufferStr.Right(m_bufferStr.GetLength()-curCaret.GeneralBufPos);
bool all=Judge2(curCaret);
storeCaret=GetCharPositFromCount;
if(all)
{
COLORREF col=dc.GetBkColor();
POINT p1,p2;
p1.x=storeCaret.CaretPos.x;
p1.y=storeCaret.CaretPos.y;
p2.x=m_right;
p2.y=m_bottom;
BackColor(p1,p2,col);
for(int i=storeCaret.GeneralLine;i<100;i++)
{
curGeneral.ColumnCount[i]=0;
curGeneral.ColumnPosit[i]=0;
}
int Fir2=0;
for(i=1;i<storeCaret.GeneralLine;i++)
Fir2+=curGeneral.ColumnCount[i];
CString str2=m_bufferStr.Mid(Fir2,storeCaret.CharCount);
curGeneral.ColumnCount[storeCaret.GeneralLine]=storeCaret.CharCount;
curGeneral.ColumnPosit[storeCaret.GeneralLine]=GetStrWid(str2);
SubRePaint(storeCaret,storeStr);
}//if all
else
{
COLORREF col=dc.GetBkColor();
POINT p1,p2;
p1.x=storeCaret.CaretPos.x;
p1.y=storeCaret.CaretPos.y;
p2.x=(allLine-1)*m_fontHeight;
p2.y=m_bottom;
BackColor(p1,p2,col);
for(int i=storeCaret.GeneralLine;i<allLine;i++)
{
curGeneral.ColumnCount[i]=0;
curGeneral.ColumnPosit[i]=0;
}
int Fir2=0;
for(i=1;i<storeCaret.GeneralLine;i++)
Fir2+=curGeneral.ColumnCount[i];
CString str2=m_bufferStr.Mid(Fir2,storeCaret.CharCount);
curGeneral.ColumnCount[storeCaret.GeneralLine]=storeCaret.CharCount;
curGeneral.ColumnPosit[storeCaret.GeneralLine]=GetStrWid(str2);
int Fir3=0;
for(i=(allLine+1);i<100;i++)
Fir3+=curGeneral.ColumnCount[i];
CString storeStr2=storeStr.Left(storeStr.GetLength()-Fir3);
SubRePaint(storeCaret,storeStr2);
}//部分刷新]
if(!change)
curCaret.GeneralBufPos+=SubStr.GetLength();
else
curCaret.GeneralBufPos+=SubStr.GetLength();
GetCharPosFromCount(curCaret.GeneralBufPos);
curCaret=GetCharPositFromCount;
if(curCaret.GeneralLine<SFLisGL)//||)
{
SFLisGL=curCaret.GeneralLine;
Move(SFLisGL);
curCaret.CaretPos.x=0;
curCaret.SCreenLine=1;
}
else
{
if(curCaret.GeneralLine>(SFLisGL+maxscreenline-1))
{
SFLisGL=curCaret.GeneralLine-maxscreenline+1;
Move(SFLisGL);
curCaret.CaretPos.x=(maxscreenline-1)*m_fontHeight;
curCaret.SCreenLine=maxscreenline;
}
else
{
if(SFLisGL>1)
{
Move(SFLisGL);
curCaret.SCreenLine=curCaret.GeneralLine-SFLisGL+1;
curCaret.CaretPos.x=(curCaret.SCreenLine-1)*m_fontHeight;
}
}
}
}
}//该县
}//非现场
SubStr.Empty();
}//非空
else
{
curCaret.CaretPos.x=curCaret.CaretPos.y=0;
curCaret.GeneralBufPos=0;
curCaret.CharCount=0;
curCaret.GeneralLine=1;
curCaret.SCreenLine=1;
for(int i=0;i<100;i++)
{
curGeneral.ColumnCount[i]=curGeneral.ColumnPosit[i]=0;
}
CRect BrushWin;
BrushWin.left=m_left;
BrushWin.right=m_right;
BrushWin.top=m_top;
BrushWin.bottom=m_bottom;
dc.FillRect(BrushWin, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
if(!m_bufferStr.IsEmpty())
SubRePaint(curCaret,m_bufferStr);
GetCharPosFromCount(cc);
curCaret=GetCharPositFromCount;
}
CreateSolidCaret(m_fontHeight-2,1);
SetCaretPos(curCaret.CaretPos);
ShowCaret();
}//不刷
//}
int maxline=0;
while(curGeneral.ColumnCount[maxline+1])
maxline++;
ShowScrollBar(SB_HORZ,TRUE);
if(maxline<=maxscreenline)
{
if(SFLisGL>1)
{
SFLisGL=1;
Move(SFLisGL);
GetCharPosFromCount(curCaret.GeneralBufPos);
curCaret=GetCharPositFromCount;
SetCaretPos(curCaret.CaretPos);
ShowCaret();
}
EnableScrollBar(SB_HORZ,ESB_DISABLE_BOTH);
}
else
{
EnableScrollBar(SB_HORZ,ESB_ENABLE_BOTH);
int minpos=0;
int maxpos=maxline-maxscreenline;
SetScrollRange(SB_HORZ,minpos,maxpos);
int curpos=SFLisGL;
if(SFLisGL==1)
curpos=0;
SetScrollPos(SB_HORZ,curpos);
}
// MessageBox(m_bufferStr,m_bufferStrCopy);
//
}
void CMWEditCtrl::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// transmis.Str.Empty();
COleControl::OnRButtonDown(nFlags, point);
}
void CMWEditCtrl::OnTopChanged()
{
// TODO: Add notification handler code
SetModifiedFlag();
}
void CMWEditCtrl::OnBottomChanged()
{
// TODO: Add notification handler code
SetModifiedFlag();
}
void CMWEditCtrl::OnLeftChanged()
{
// TODO: Add notification handler code
SetModifiedFlag();
}
void CMWEditCtrl::OnRightChanged()
{
// TODO: Add notification handler code
SetModifiedFlag();
}
void CMWEditCtrl::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
{
COleControl::OnWindowPosChanged(lpwndpos);
m_top=0;
m_bottom=lpwndpos->cy;
m_left=0;
m_right=lpwndpos->cx;
WindowChangFlag=1;
maxscreenline=(m_right-m_left-6)/m_fontHeight;
Invalidate();
// TODO: Add your message handler code here
}
void CMWEditCtrl::TestInt(int t,CString s)
{
char nnn[10];
CString nnnn;
itoa(t,nnn,10);
nnnn=(CString)nnn;
MessageBox(s,nnnn);
}
void CMWEditCtrl::BackColor(POINT p1,POINT p2,COLORREF col)
{
CClientDC dc(this);
//CPaintDC dc(this);
dc.SetBkMode(TRANSPARENT);
CRect BrushWin;
CBrush m_Brush;
LOGBRUSH SH;
SH.lbStyle=BS_SOLID;//BS_HOLLOW;
SH.lbColor=0x00ff0000;
SH.lbHatch=HS_VERTICAL;
m_Brush.CreateSolidBrush(col);
CBrush * pOldBrush=dc.SelectObject(&m_Brush);
if(p1.x>p2.x)//保持p2较p1大
{
POINT p3=p1;
p1=p2;
p2=p3;
}
int maxline=0;
while(curGeneral.ColumnCount[maxline+1])
maxline++;
if((p2.x/m_fontHeight+SFLisGL)>maxline)
p2.x=maxline*m_fontHeight-1;
if(p2.x>p1.x)
{
BrushWin.left=p1.x; // 覆盖光标以下
BrushWin.right=p1.x+m_fontHeight;//一列的部分
BrushWin.top=p1.y; //
BrushWin.bottom=curGeneral.ColumnPosit[p1.x/m_fontHeight+SFLisGL]+3;//
dc.FillRect(BrushWin, &m_Brush);
long wide=p1.x;
while(wide+m_fontHeight<p2.x)
{
wide+=m_fontHeight;
BrushWin.left=wide; // 覆盖光标以下
BrushWin.right=wide+m_fontHeight;//一列的部分
BrushWin.top=0; //
BrushWin.bottom=curGeneral.ColumnPosit[wide/m_fontHeight+SFLisGL]+3;
// FillRectangle(&BrushWin);
dc.FillRect(BrushWin, &m_Brush);//CBrush::FromHandle((HBRUSH)GetStockObject(Brush)));
}//FILLED WITH CURRENT LINE
BrushWin.left=p2.x; // 覆盖光标以下
BrushWin.right=p2.x+m_fontHeight;//一列的部分
BrushWin.top=0; //
BrushWin.bottom=p2.y;//
dc.FillRect(BrushWin, &m_Brush);
}
else
{
BrushWin.left=p1.x;//覆盖当前列以后的部分
BrushWin.right=p1.x+m_fontHeight; //
BrushWin.top=p1.y; //
BrushWin.bottom=p2.y;//
dc.FillRect(BrushWin, &m_Brush);
}//FILLED POSTLINE
dc.SelectObject(pOldBrush);
}
void CMWEditCtrl::ChangeBackColor(CMWEditCtrl::Caret c1,CMWEditCtrl::Caret c2,COLORREF col)
{
HideCaret();
Caret tempcaret;
BackColor(c1.CaretPos,c2.CaretPos,col);
long f=JudgeEdit(c1);//为得到向前回述后的光标
long bl;
//CString me=m_bufferStr.Left(c2.GeneralBufPos-1,1);
if((m_bufferStr[c2.GeneralBufPos-1]>=0x1800)&&(m_bufferStr[c2.GeneralBufPos-1]<=0x1900))
bl=BackwardM(c2.GeneralBufPos)+c2.GeneralBufPos;
else
bl=Backward(c2.GeneralBufPos)+c2.GeneralBufPos;
CString brushstr=m_bufferStr.Left(bl);
brushstr=brushstr.Right(bl-GetCharPositFromCount.GeneralBufPos);
tempcaret=GetCharPositFromCount;
tempcaret.SCreenLine=tempcaret.GeneralLine-SFLisGL+1;
tempcaret.CaretPos.x=(tempcaret.SCreenLine-1)*m_fontHeight;
SubRePaintb(tempcaret,brushstr);
//MessageBox(brushstr);
}
void CMWEditCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
curCaretCopy=curCaret;
m_bufferStrCopy=m_bufferStr.Left(m_bufferStr.GetLength());
HideCaret();
CClientDC dc(this);
int maxline=0;
while(curGeneral.ColumnCount[maxline+1])
maxline++;
if((point.x/m_fontHeight+SFLisGL)>maxline)
point.x=maxline*m_fontHeight-1;
if(blockflag)
{
//MessageBox(transmis.Str);
COLORREF col=dc.GetBkColor();
ChangeBackColor(transmis.FirstCaret,transmis.LastCaret,col);
transmis.Str.Empty();
blockflag=0;
}
// m_bufferStrCopy=m_bufferStr.Left(m_bufferStr.GetLength());
// curCaretCopy=curCaret;
if(!m_bufferStr.IsEmpty())
{
int i=1;
while(curGeneral.ColumnCount[i]>0)
{
i++;
}
MaxLine=i-1;
curCaret.SCreenLine=point.x/m_fontHeight+1;
curCaret.GeneralLine=curCaret.SCreenLine +SFLisGL-1;
curCaret.CaretPos.x=(curCaret.SCreenLine-1)*m_fontHeight;
long First=0;
for(int t=1;t<curCaret.GeneralLine;t++)
First+=curGeneral.ColumnCount[t];
CString Linestr=m_bufferStr.Mid(First,curGeneral.ColumnCount[curCaret.GeneralLine]);
//int nSub;
CString Getchars;
long wid=GetStrWid(Linestr);
int len=Linestr.GetLength();
if(wid<point.y)
{
curCaret.CaretPos.y=curGeneral.ColumnPosit[curCaret.GeneralLine];
CString Try=Linestr.Right(1);
CString s=Enter.Left(1);
if(!Try.Compare(s))
{
curCaret.CharCount=len-1;//本列除去回车留下的部分
}
else
curCaret.CharCount=len;
curCaret.GeneralBufPos=First+curCaret.CharCount;
}
else
{
while(wid>point.y)
{
len-=1;
Linestr=Linestr.Left(len);
wid=GetStrWid(Linestr);
}
curCaret.CaretPos.y=wid;
curCaret.CharCount=len;
curCaret.GeneralBufPos=First+len;
}
}
if(!firstflag)
{
firstcurCaret=curCaret;
firstflag=1;
}
CreateSolidCaret(m_fontHeight-2,1);
SetCaretPos(curCaret.CaretPos);
ShowCaret();
COleControl::OnLButtonDown(nFlags, point);
}
void CMWEditCtrl::mystrout(CMWEditCtrl::Caret caret,int column)
{
}
void CMWEditCtrl::SubRePaint(CMWEditCtrl::Caret caret,CString str)
{ //负责重画
CClientDC dc(this);
//CPaintDC dc(this);
// dc.SetBkColor(0x00ffffff);
dc.SetBkMode(TRANSPARENT);
Font(2700,_T("Times New Roman"));
CFont* pOldFont=dc.SelectObject(&MyFont);
long count=str.GetLength();//的重画串长
CString space=' ';//取试串
int spacewid=dc.GetTextExtent(space,1).cx;//空格宽
CString Try;
int nSub=1;//判断英:汉
// int charwid;//一个字符宽
long wordwid=0; //字宽
int wordlen=0;//一个字所占字符数
CString word;//一个字
CString ch;
long charwid=0;
while(count>0)
{
Try=str.Left(1);
if(((Try[0]<128)&&(Try[0]>20))||((Try[0]>=0x1800)&&(Try[0]<=0x1900)))//英文或字符
{
// MessageBox(_T("mengwen"));
ch=str.Left(1);
if((ch[0]!=32)&&((ch[0]<128)&&(ch[0]>20)))//是字母
{
if((!word.IsEmpty())&&(word[0]>=0x1800))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -