RichEdit的反白問題 |
尚未結案
|
AJCooer
初階會員 ![]() ![]() 發表:48 回覆:52 積分:25 註冊:2004-02-12 發送簡訊給我 |
|
m8815010
版主 ![]() ![]() ![]() ![]() ![]() 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
AJCooer你好:
窄看你的題目是要在RichEdit上做出像run程式有bug後出現的那種一條反白,我覺得RichEdit上的反白大部份都是搞selstart、sellength這些東東吧
in Unit.h class TForm1 : public TForm { __published: // IDE-managed Components TEdit *Edit1; TEdit *Edit2; TButton *Button1; TRichEdit *RichEdit1; void __fastcall Button1Click(TObject *Sender); void __fastcall RichEdit1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall RichEdit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift); void __fastcall FormCreate(TObject *Sender); private: // User declarations TWndMethod OrgRichEditWndProc; void __fastcall RichEditWndProc(TMessage&); public: // User declarations __fastcall TForm1(TComponent* Owner); int __fastcall CheckIfWrong(); };in Unit.cpp TForm1 *Form1; bool FindwWrong=false; int i=1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OrgRichEditWndProc=RichEdit1->WindowProc; RichEdit1->WindowProc=RichEditWndProc; } //--------------------------------------------------------------------------- void __fastcall TForm1::RichEditWndProc(TMessage& Message) { OrgRichEditWndProc(Message); if (Message.Msg==WM_PAINT) { Form1->Caption="共重繪了:"+IntToStr(i)+" 次"; i++; } if (Message.Msg==WM_PAINT && FindwWrong) { int WrongLine=Form1->CheckIfWrong(); if (WrongLine==-1) return; int FstVsblLine=SendMessage(RichEdit1->Handle,EM_GETFIRSTVISIBLELINE,0,0); int ActualScrnPos=WrongLine-FstVsblLine; if ((ActualScrnPos>=10) || (FstVsblLine>WrongLine)) return; RECT* rect=new RECT; rect->left=0; rect->top=25*(ActualScrnPos); rect->right=RichEdit1->Width; rect->bottom=25*(ActualScrnPos+1); Edit1->Text=RichEdit1->Lines->Strings[WrongLine]; DrawCaption(Edit1->Handle,GetDC(RichEdit1->Handle),rect,DC_TEXT | DC_ACTIVE); DeleteObject(rect); return; } } //--------------------------------------------------------------------------- int __fastcall TForm1::CheckIfWrong() { for (int Cnt=0;Cnt<=RichEdit1->Lines->Count-1;Cnt++) { int Leng=RichEdit1->Lines->Strings[Cnt].Length(); if (RichEdit1->Lines->Strings[Cnt]!="" && RichEdit1->Lines->Strings[Cnt].SubString(Leng,1)!=";") { return Cnt; } } return -1; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int WrongLine=Form1->CheckIfWrong(); if (WrongLine==-1) return; Edit2->Text="[C++ Error] Unit1.cpp("+IntToStr(WrongLine)+"): E2379 Statement missing ;"; int FstVsblLine=SendMessage(RichEdit1->Handle,EM_GETFIRSTVISIBLELINE,0,0); int ActualScrnPos=WrongLine-FstVsblLine; TPoint NowPos; NowPos.x=0; NowPos.y=WrongLine; if (ActualScrnPos>=10) SendMessage(RichEdit1->Handle,EM_LINESCROLL,0,WrongLine-(FstVsblLine+9)+5); if (FstVsblLine>WrongLine) SendMessage(RichEdit1->Handle,EM_LINESCROLL,0,WrongLine-FstVsblLine-5); RichEdit1->CaretPos=NowPos; FindwWrong=true; RichEdit1->Repaint(); RichEdit1->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TForm1::RichEdit1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { FindwWrong=false; RichEdit1->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TForm1::RichEdit1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { FindwWrong=false; RichEdit1->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { RichEdit1->Font->Size=14; RichEdit1->Top=0; RichEdit1->Left=0; RichEdit1->Width=500; RichEdit1->Height=250; Edit1->Visible=false; } //--------------------------------------------------------------------------- |
AJCooer
初階會員 ![]() ![]() 發表:48 回覆:52 積分:25 註冊:2004-02-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |