Trackbar可不可以製作成有數字顯示 |
尚未結案
|
Terry6666
一般會員 發表:32 回覆:19 積分:10 註冊:2002-12-20 發送簡訊給我 |
|
pwipwi
版主 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
Terry6666兄你好: 不曉得有沒有抓錯你的意思,初步寫了一個 class="code">
In Unit1.h
~~
class TForm1 : public TForm
{
__published: // IDE-managed Components
TTrackBar *TrackBar1;
TLabel *Label1;
void __fastcall TrackBar1Change(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
void __fastcall TrackBarWndProc(TMessage&); <---新增此行
TWndMethod OldTrackBarWndProc; <---新增此行
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
~~
In Unit.cpp ~~ TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { OldTrackBarWndProc = TrackBar1->WindowProc; TrackBar1->WindowProc = TrackBarWndProc; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { TrackBar1->Width = 150; TrackBar1->Min = 0; TrackBar1->Max = 10; TrackBar1->Position = 0; Form1->Color = clSilver; PostMessage(TrackBar1->Handle,WM_USER+123,0,0); } //--------------------------------------------------------------------------- void __fastcall TForm1::TrackBar1Change(TObject *Sender) { SendMessage(TrackBar1->Handle,WM_USER+123,TrackBar1->Position,0); } //--------------------------------------------------------------------------- void __fastcall TForm1::TrackBarWndProc(TMessage& Message) { OldTrackBarWndProc(Message); if (Message.Msg==WM_USER+123 || Message.Msg==WM_PAINT) { TrackBar1->Refresh(); int Pos; if (Message.Msg==WM_USER+123) Pos=Message.WParam; else Pos=TrackBar1->Position; HDC dc=GetDC(TrackBar1->Handle); SetBkColor(dc,clSilver); TextOut(dc,(TrackBar1->Width/(TrackBar1->Max+1))*Pos+5,TrackBar1->Height/2+2,IntToStr(Pos).c_str(),IntToStr(Pos).Length()); DeleteDC(dc); OldTrackBarWndProc(Message); } } //---------------------------------------------------------------------------image sample: 1.程式細節就不解釋了,因為有點小複雜! >! 發表人 - |
Terry6666
一般會員 發表:32 回覆:19 積分:10 註冊:2002-12-20 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
引言: 謝謝各位的回答 可能是我表達的不好,讓各位誤會了,其實我是想要下面圖形(左上角)的 這種型式,數字會隨著Trackbar的最大最小改變,可以將他做成一個元件, 因為要使用很多..... 我想請問一下m8815010,因為我很少看到人家用BCB 用到那麼深入(或許我看的還不夠),因為市面上的書籍很少提,有什麼地 方可以找到這方面的資料嗎?? 謝謝....Terry6666兄你好< >: 還是不太懂你的需求,大概抓一下< >! 你需要一個新的TTrackBar物件,這個物件可以顯示它的Min、Max及Median數值,並且在 每次做Min、Max屬性變動時,顯示的值也會自動跟著變! 我的作法: 1.如果上述需求差不多的話,我會使用本問題一開始兩位大師的回覆的方式,也就是直接 使用3個TLabel去顯示TTrackBar的Min、Max、Median值,而不會用我之前的解法,因為那 樣太細了! >*> class="code"> In Unit1.h ~~ class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; TButton *Button2; TButton *Button3; TButton *Button4; void __fastcall FormCreate(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall Button1Click(TObject *Sender); void __fastcall Button3Click(TObject *Sender); void __fastcall Button4Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //新TPanel物件宣告 class TMyPanel : public TPanel { __published: TTrackBar *TrackBar1; //1個TTrackBar TLabel *Lab1; //3個TLabel TLabel *Lab2; TLabel *Lab3; private: int TrackBar_Min; //TrackBar的Min值記錄 int TrackBar_Max; //TrackBar的Max值記錄 void __fastcall SetMinValue(int minvalue); //有設定TrackBar的Min值時會做的事件 void __fastcall SetMaxValue(int maxvalue); //有設定TrackBar的Max值時會做的事件 public: __fastcall TMyPanel(TComponent* Owner,int min,int max); //新TPanel物件的construct __property int Now_TrackBar_Min={read=TrackBar_Min,write=SetMinValue}; //設定TrackBar的Min值的替代變數 __property int Now_TrackBar_Max={read=TrackBar_Max,write=SetMaxValue}; //設定TrackBar的Max值的替代變數 }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; In Unit1.cpp ~~ TForm1 *Form1; TMyPanel *mypanel; //宣告一個新TPanel物件使用 //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- __fastcall TMyPanel::TMyPanel(TComponent* Owner,int min,int max) : TPanel(Owner) { TrackBar_Min=min; //Min值記錄 TrackBar_Max=max; //Max值記錄 //TrackBar物件相關設定 TrackBar1=new TTrackBar(this); TrackBar1->Parent=this; TrackBar1->Min=min; TrackBar1->Max=max; TrackBar1->Top=10; TrackBar1->Left=50; TrackBar1->Width=250; this->TrackBar1->Orientation=trVertical; this->TrackBar1->TickMarks=tmBoth; //TLabel相關設定 Lab1=new TLabel(this); Lab2=new TLabel(this); Lab3=new TLabel(this); Lab1->Parent=this; Lab2->Parent=this; Lab3->Parent=this; Lab1->Top=TrackBar1->Top+5; Lab1->Left=TrackBar1->Left-15; Lab1->Width=10; Lab1->Caption=TrackBar1->Min; Lab2->Top=(TrackBar1->Top+TrackBar1->Height)/2; Lab2->Left=TrackBar1->Left-15; Lab2->Width=10; Lab2->Caption=(TrackBar1->Max+TrackBar1->Min)/2; Lab3->Top=TrackBar1->Top+TrackBar1->Height-20; Lab3->Left=TrackBar1->Left-15; Lab3->Width=10; Lab3->Caption=TrackBar1->Max; } //--------------------------------------------------------------------------- void __fastcall TMyPanel::SetMinValue(int minvalue) { if (minvalue!=TrackBar_Min) { //如果Min值有變 TrackBar_Min=minvalue; //記錄 TrackBar1->Min=minvalue; //assign //變更顯示值 Lab1->Caption=TrackBar_Min; Lab2->Caption=(TrackBar_Min+TrackBar_Max)/2; } } //--------------------------------------------------------------------------- void __fastcall TMyPanel::SetMaxValue(int maxvalue) { if (maxvalue!=TrackBar_Max) { //如果Max值有變 TrackBar_Max=maxvalue; //記錄 TrackBar1->Max=maxvalue; //assign //變更顯示值 Lab3->Caption=TrackBar_Max; Lab2->Caption=(TrackBar_Min+TrackBar_Max)/2; } } //--------------------------------------------------------------------------- //真正需寫的程式碼 void __fastcall TForm1::FormCreate(TObject *Sender) { mypanel=new TMyPanel(this,1,10); //new新TPanel物件,並給定Min、Max值 //相關初始值給定 mypanel->Parent=this; //必給 mypanel->BevelOuter=bvNone; //這一行不寫的話可以看出整個Panel的外廓 mypanel->Top=1; //寫的話可以比較整個相對位置 mypanel->Left=1; mypanel->Width=150; mypanel->Height=300; } //--------------------------------------------------------------------------- //以下為測試區 //注意TrackBar之Min、Max值的替代設定法 //用mypanel->Now_TrackBar_Max=xxx 替代mypanel->TrackBar1->Max=xxx //用mypanel->Now_TrackBar_Min=xxx 替代mypanel->TrackBar1->Min=xxx //替代設定法是為了能偵測到Min、Max值的改變 //上述未必是最佳寫法,只是一時撰寫出來的^^! void __fastcall TForm1::Button1Click(TObject *Sender) { mypanel->Now_TrackBar_Max=25; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { mypanel->Now_TrackBar_Max=50; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { mypanel->Now_TrackBar_Min=5; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { mypanel->Now_TrackBar_Min=-10; } //---------------------------------------------------------------------------sample: 另外其實我寫的並不是深入,只是低階些罷了< >!因為有些東東已被 >!再配合仔細研讀相關的說明文件(如 >!> 小小淺見,煩請賜教< >! 呃....講到這口水沒了,好險這週放假! 發表人 - |
Terry6666
一般會員 發表:32 回覆:19 積分:10 註冊:2002-12-20 發送簡訊給我 |
|
bass15
高階會員 發表:24 回覆:171 積分:119 註冊:2003-10-27 發送簡訊給我 |
|
Terry6666
一般會員 發表:32 回覆:19 積分:10 註冊:2002-12-20 發送簡訊給我 |
|
Terry6666
一般會員 發表:32 回覆:19 積分:10 註冊:2002-12-20 發送簡訊給我 |
|
m8815010
版主 發表:99 回覆:372 積分:289 註冊:2003-11-13 發送簡訊給我 |
!
引言: 順便再問一下...,那如果我要 讓Pannel上的元件跟Pannel一起變大變小 那麼是不是要加上Repaint事件...謝謝 >>< face="Verdana, Arial, Helvetica"> Terry6666兄你好: 不太瞭解你說 >!嗯,也就是跟我的範例是寫成一個 >! 另外我範例的 class="code"> //TPanel物件的construct __fastcall TMyPanel::TMyPanel(TComponent* Owner,int min,int max,int tp,int lf,int wth,int hgt) : TPanel(Owner) { TrackBar_Min=min; //Min值記錄 TrackBar_Max=max; //Max值記錄 //新Panel物件自身初始值 this->Top=tp; this->Left=lf; this->Width=wth; this->Height=hgt; //TrackBar物件相關設定 TrackBar1=new TTrackBar(this); TrackBar1->Parent=this; TrackBar1->Min=min; TrackBar1->Max=max; TrackBar1->Top=1; TrackBar1->Width=hgt-2; TrackBar1->Height=wth/3*2; TrackBar1->Left=1; this->TrackBar1->Orientation=trVertical; this->TrackBar1->TickMarks=tmBoth; //TLabel相關設定 Lab1=new TLabel(this); Lab2=new TLabel(this); Lab3=new TLabel(this); Lab1->Parent=this; Lab2->Parent=this; Lab3->Parent=this; Lab1->Top=TrackBar1->Top 5; Lab1->Left=TrackBar1->Left TrackBar1->Width; Lab1->Width=10; Lab1->Caption=TrackBar1->Min; Lab2->Top=(TrackBar1->Top TrackBar1->Height)/2; Lab2->Left=TrackBar1->Left TrackBar1->Width; Lab2->Width=10; Lab2->Caption=(TrackBar1->Max TrackBar1->Min)/2; Lab3->Top=TrackBar1->Top TrackBar1->Height-20; Lab3->Left=TrackBar1->Left TrackBar1->Width; Lab3->Width=10; Lab3->Caption=TrackBar1->Max; } //真正要使用TPanel物件需要寫的程式碼 void __fastcall TForm1::FormCreate(TObject *Sender) { mypanel=new TMyPanel(this,1,10,150,100,60,200); //new新TPanel物件,並給定Min、Max值 mypanel->Parent=this; //必給 } 修改的部份就是讓TPanel上面的元件比較動態的跟著TPanel一起變大、變小,另外Unit1.h中construct的宣告不要忘了一起改掉! <> >! >! > 嗯,太概就這樣了! 發表人 - |
bass15
高階會員 發表:24 回覆:171 積分:119 註冊:2003-10-27 發送簡訊給我 |
|
Terry6666
一般會員 發表:32 回覆:19 積分:10 註冊:2002-12-20 發送簡訊給我 |
|
Terry6666
一般會員 發表:32 回覆:19 積分:10 註冊:2002-12-20 發送簡訊給我 |
可以再問一下....
//真正要使用TPanel物件需要寫的程式碼
void __fastcall TForm1::FormCreate(TObject *Sender)
{
mypanel=new TMyPanel(this,1,10,150,100,60,200); //new新TPanel物件,並給定Min、Max值 mypanel->Parent=this; //必給
}
上面這一段是測試時要用的嗎??
那我每次要產生一個新的TMyPanel時,就要寫這一段囉.....??
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |