음...
님이 말씀하신대로 MouseUp에서만 체크하는 코딩을 하시면 될듯 한데요...
모든 Window(Window Handle이 있는 Form및 Control)는 마우스 동작에 대해
WM_LBUTTONDOWN , WM_LBUTTONUP , WM_MOUSEMOVE 등의 메세지가 발생합니다.
위 메세지를 잡아서 VCL에서는 TControl에서 OnMouseDown , OnMouseMove , OnMouseUp 이라는 이벤트로 만들어 뒀구요..
TControl의 자식중에 하나인 TTrackbar 또한 관련 이벤트가 있습니다.
그런데 TTrackbar 컨트롤에는 Mouse 관련 이벤트가 Object-Inspector에서 안보이는데..
그 이유는 조상이 가지고 있는 프로퍼티중에 필요없다 싶은것을 감추어버렸기 때문입니다.
다음과 같이 TTrackBar 클래스를 상속받아
교체식으로 새로운 클래스를 정의하여 원하시는 기능을 구현해보세요
class TTrackBar: public Comctrls::TTrackBar
{
TNotifyEvent FOnChanged;
int iPos;
public:
__fastcall TTrackBar(TComponent *Owner)
: Comctrls::TTrackBar(Owner)
{
this->OnMouseDown=TrackBarMouseDown;
this->OnMouseUp=TrackBarMouseUp;
}
void __fastcall TrackBarMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
iPos=this->Position;
}
void __fastcall TrackBarMouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if(iPos!=this->Position)
{
if(FOnChanged)FOnChanged(this);
}
}
public:
__property TNotifyEvent OnChanged={read=FOnChanged,write=FOnChanged};
};
#define TTrackBar ::TTrackBar
class TForm1 : public TForm
{
__published: // IDE-managed Components
TTrackBar *TrackBar1;
void __fastcall FormCreate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall TForm1::TrackBarChanged(TObject *Sender);
};
Form클래스 앞에 #define으로 class를 재정의 합니다.
그리고 Form의 cpp에 다음과 같이 코딩해보세요
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TrackBar1->OnChanged=TrackBarChanged;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBarChanged(TObject *Sender)
{
ShowMessage("TrackBar Changed End");
}
위와같이 하시면 Trackbar를 움직여서 Position이 변경되고 Mouse를 Up할때
TrackBarChanged 함수가 호출될것입니다.
교체식에 관하여는
팁 게시판데 김태선님이 여러가지 올려놓은것이 있습니다.
참고하시구요
그럼..
궁금이 님이 쓰신 글 :
: 제목 그대로 입니다
: 볼륨을 조절하는 프로그램을 짜는 중인데요..
: OnChange 만 있어서
: 마우스로 볼륨을 조절하면 조절할때마다 이벤트가 발생되네요
: 마우스로 조절하다가 마우스를 Up할때만 이벤트 하는 방법 없나요??
: ㅜㅜ