http://www.chinastu.com/study/html/soft/soft-htm/soft-program/program-luntan/program-2-luntan-010710-03.htm 發信人: ljpxyz (CBC), 信區: C++Builder 標 題: BCB中實現多個圖形的重繪 當在表單上繪了多個圖形時,怎樣重繪他們呢? 這也許是BBS上出現最多的問題了,現在我終於找到瞭解決的方法,喜歡Dephi 的朋友可以參考電子工業出版社出版的<>,因?我就 是參考它才再BCB上實現的。其中對它實現的方法進行了轉換,以使其更符合 C 的編程特性 下面這個程式的功能就是實現多個圖形的重繪,當用滑鼠左鍵點擊表單時,會 在表單上用當前?色繪製一個填充的圓,圓的中心?滑鼠點擊點,半徑由用戶 輸入。使用自定義的類TShapeData存儲當前所繪圖形的所有屬性,使用TList 類存儲繪圖操作。 //頭文件ShapeType.h,定義存儲繪圖屬性類 #ifndef ShapeTypeH #define ShapeTypeH //定義一個類,用以存儲繪圖屬性 class TShapeData { int X,Y,Radius; TColor PenColor,BrushColor; public: int GetX(){return X;} int GetY(){return Y;} int GetRadius(){return Radius;} TColor GetPenColor(){return PenColor;} TColor GetBrushColor(){return BrushColor;} void SetX(int x){X=x;} void SetY(int y){Y=y;} void SetRadius(int radius){Radius=radius;} void SetPenColor(TColor penColor){PenColor=penColor;} void SetBrushColor(TColor brushColor){BrushColor=brushColor;} }; #endif //頭文件Test1.h #ifndef Test1H #define Test1H #include #include #include #include <Forms.hpp> #include #include #include "ShapeType.h" class TForm1 : public TForm { __published: // IDE-managed Components TMainMenu *MainMenu1; TMenuItem *File; TMenuItem *FileExit; TMenuItem *Option; TMenuItem *OptionDraw; TMenuItem *OptionColor; TColorDialog *ColorDialog1; void __fastcall FileExitClick(TObject *Sender); void __fastcall OptionColorClick(TObject *Sender); void __fastcall OptionDrawClick(TObject *Sender); void __fastcall FormCreate(TObject *Sender); void __fastcall FormDestroy(TObject *Sender); void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall FormPaint(TObject *Sender); private: // User declarations int Radius; //在TForm類頭文件中添加一個TList物件 TList *ShapesList; public: // User declarations __fastcall TForm1(TComponent* Owner); }; extern PACKAGE TForm1 *Form1; #endif //實現文件Test1.cpp #include #pragma hdrstop #include "Test1.h" #include "DrawForm.h" #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } void __fastcall TForm1::FileExitClick(TObject *Sender) { Application->Terminate(); } void __fastcall TForm1::OptionColorClick(TObject *Sender) { //調用公用?色對話方塊設置繪圖?色 if(ColorDialog1->Execute()) { Canvas->Pen->Color=ColorDialog1->Color; Canvas->Brush->Color=ColorDialog1->Color; } } void __fastcall TForm1::OptionDrawClick(TObject *Sender) { //自定義的一個對話方塊,用於互動式輸入圓半徑 FormDraw=new TFormDraw(this); FormDraw->Edit1->Text=Radius; if(FormDraw->ShowModal()==mrOk) { Radius=FormDraw->Edit1->Text.ToIntDef(12); Invalidate(); } } void __fastcall TForm1::FormCreate(TObject *Sender) { //初始化 Radius=12; ShapesList=new TList; } void __fastcall TForm1::FormDestroy(TObject *Sender) { //釋放記憶體 delete ShapesList; if(ShapesList->Count>0) { ShapesList->Clear(); Refresh(); } } void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { //每個滑鼠左鍵事件將繪圖屬性存入自定義類TShapeData後,再壓入TList TShapeData *shape; oldPenColor=Canvas->Pen->Color; oldBrushColor=Canvas->Brush->Color; //重畫TList表中的所有圖形 for(i=0;i<=ShapesList->Count-1;i ) { curShape=(TShapeData*)ShapesList->Items[i]; Canvas->Pen->Color=curShape->GetPenColor(); Canvas->Brush->Color=curShape->GetBrushColor(); x=curShape->GetX(); y=curShape->GetY(); radius=curShape->GetRadius(); Canvas->Ellipse(x-radius,y-radius,x radius,y radius); } //恢復當前繪圖屬性 Canvas->Pen->Color=oldPenColor; Canvas->Brush->Color=oldBrushColor; } 說明:這個程式只用於重繪一種
圖形(圓形)的多個實例,怎樣重繪多種圖形 (例如直線、矩形等等)呢?我想可以?每種圖形定義一個類,並讓這所有的 類都從一個類派生,具體的實現可以參考這種情況在VC中的實現。 問題:現在,我向大家提一個問題,即如何實現圖形的按向量保存?即如何 實現圖形的存檔處理?知道的朋友請貼一個例子上來,這裏先行謝過。 喜歡Dephi的朋友請參考<>那裏面大概有解決的辦法, 但我的Pascal 學的實在太臭,沒能看懂,還請明白的朋友們將它轉化?C 語言。 -- --
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好
Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind