와 정말 감사합니다.
방법1은 제가 짠 코드와는 좀 달르고 제가 원한 답이 방법2라서 방법2로 해서 문제가 풀렸습니다.
타이머에서 짜준것에 대한게 좀 알쏭달쏭 했는데, 해보니까 이해가 되더군요.
매번 감사합니다.
장성호 님이 쓰신 글 :
: TrackBar의 OnChange 이벥트 핸들러에서
:
: Timer에서 TrackBar Position 변경한것이랑
: 사용자가 마우스로 클릭해서 TrackBar Position변경한것이랑 구분해서
: 사용자가 마우스 클릭으로 TrackBar Position 변경할때만 어떤 동작을 하게 하고 싶다는것이죠?
:
: Timer 코드는 어떻게 된어있는지 모르겠지만
: 간단히 다음과 같은 방법으로 가능합니다.
:
: 방법1. Timer 이벤트 핸들러에서 TrackBar.Position을 수정하기 전후에
: TrackBar의 OnChange 이벤트 핸들러를 뺐다가 넣어줍니다.
:
:
: void __fastcall TForm1::TrackBar1Change(TObject *Sender)
: {
: m_pMP->put_CurrentPosition(TrackBar1->Position);
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::Timer1Timer(TObject *Sender)
: {
: TrackBar1->OnChange=NULL;
: TrackBar1->Position++;
: TrackBar1->OnChange=TrackBar1Change;
: }
: //---------------------------------------------------------------------------
:
:
:
: 방법2. 그냥 bool형 변수 하나두고 변수값을
: Timer 이벤트 핸들러에서 변수값을 true , false로 변경하구요
: TrackBar의 OnChange이벤트 핸들러에서는 변수값을 보고 처리합니다.
:
:
: bool bMouseChange=true;
: void __fastcall TForm1::TrackBar1Change(TObject *Sender)
: {
: if (bMouseChange)
: m_pMP->put_CurrentPosition(TrackBar1->Position);
: }
: //---------------------------------------------------------------------------
:
: void __fastcall TForm1::Timer1Timer(TObject *Sender)
: {
: bMouseChange=false;
: TrackBar1->Position++;
: bMouseChange=true;
: }
: //---------------------------------------------------------------------------
:
:
:
: 님께서 원하는 답변이길 기대합니다.
:
: [추신]
: TTrackBar 컨트롤 말고 상당히 많은 컨트롤이 (아니 대부분의 컨트롤에서)
: 사용자가 마우스로 어떻게 클릭하거나 제어할때만 이벤트가 발생하는것이 아니라
: 코딩에서 값을 변경해도 이벤트가 발생합니다.
: (아닌것도 있음)
:
: VCL로(Delphi나 C빌더) 어플리케이션 만들때 유의해야할점 중에 하나입니다.
:
: 코딩으로 컨트롤의 값을 변경할때 이벤트가 발생하지 않게 하려면
: 대게 위 2가지 방법이 쓰인다고 할수 있겠습니다.
:
:
: 그럼..
:
: 김재범 님이 쓰신 글 :
: : 영상 플레이어를 만드려고 하는데요
: :
: : 타이머에서 영상의 포지션 값을 trackbar에 넣습니다.
: :
: : trackbar에서 change가 되면 포지션을 영상의 현재 시간에 넣습니다.
: :
: : 일반 영상 플레이어를 연상하면 이해가 쉬우실 거라 생각해서 넘어갈께요.
: :
: : 문제는 타이머에서 트랙바의 포지션을 지정해 주니 트랙바에서는 체인지가 일어나고,
: :
: : 체인지가 일어나서 현재 위치를 영상에 넣고.
: :
: : 이렇게 서로 호출하다보니까 영상이 1초 재생되었다 되돌아갔다가 다시 재생되었다가 뭐 이런식으로 됩니다.
: :
: : 제가 하고 싶은건 트랙바 체인지 이벤트에서 마우스로 트랙바의 포지션을 움직였을때만 트랙바의 체인지를 호출하고 싶습니다.
: :
: : 대충 만들어보면..
: : void __fastcall TForm1::TrackBar1Change(TObject *Sender)
: : {
: : if(WM_LBUTTONDOWN) // <-- 여기를 수정...
: : m_pMP->put_CurrentPosition(TrackBar1->Position);
: : }
: : 이런식으로 하려고 하는데 어떻게 해야 할지..
: : 죄송한데 실력이 안되어서 설명을 해주셔도 그 설명을 다시 찾아봐야 하는 불상사가 일어나는데..
: :
: : 코드로 좀 짜주시면 안 될까요?