RichEdit的反白問題 |
尚未結案
|
AJCooer
初階會員 發表:48 回覆:52 積分:25 註冊:2004-02-12 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
AJCooer你好:
窄看你的題目是要在RichEdit上做出像run程式有bug後出現的那種一條反白,我覺得RichEdit上的反白大部份都是搞selstart、sellength這些東東吧!但是有點不足,比如說下圖" src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=14074684&CC=314776">
所以覺得上述方式不好的話,可能就要自已用"繪"的了,我覺得啦< >!
也就是說自已劃一條長方形線上去就好啦,只是很多細節就應運而生了。 提供一個普普普的方法(<>注意事項必看< >>):
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; } //---------------------------------------------------------------------------注意事項: (程式特性) 1. 程式模疑complier找出沒有";"做結尾的行列(第一次出現處),將之反白 2. 反白的行列會自動跳至RichEdit可見的地方 3. 此反白在RichEdit接受keyin、mouseclick事件等會自動消失(debug應有特性) 4. 反白在scroll、視窗zoom in、zoom out,maxmize、minmize時不消失(debug所應有特性) (不足處) 1. 字形大小、長方型的大小…目前要take care 2. 反白的顏色不能選擇,反白處的字形變小沒有調回 3. RichEdit做scroll時只有▲和▼能讓反白顯示正常,拖拽條(含mouse滾輪)則異常(如圖)。 (原因:重繪次數過多,見Form1->Caption可知,需再調整) 不足處一者因為我沒時間,二者那些已經是很 >! 發表人 - |
AJCooer
初階會員 發表:48 回覆:52 積分:25 註冊:2004-02-12 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |