一个关于TrackBar使用的问题!求教!

Amonda 2003-10-17 11:09:33
在播放声音程序中,使用TrackBar显示播放进度,我想用TrackBar实现快进功能,即拖动时能控制播放,可是TrackBar的Event事件我一个个的试过了,在拖动时除了Onchange()都没被触发,而Onchange是只要TrackBar的位置变了就都会触发的,也就是说在不拖动的时候他显示播放进度时也会触发,那么也没发判断是否拖动!大家明白我得意思了么?请问谁做过这方面的项目?给点解决办法!多谢!!
...全文
225 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pp616 2003-10-17
  • 打赏
  • 举报
回复
因为TrackBar没有MouseDown 和 MouseUp 事件
所以自己载一下TrackBar的Wndproc
然后处理WM_LBUTTONDOWN 和 WM_LBUTTONUP 这两个消息。
这样就很好处理了。
佣工7001 2003-10-17
  • 打赏
  • 举报
回复
我作过,
在mousedown事件中设标志
mouseup事件中取消标志
在onchange事件中,有标志,认为是拖动的->重新定位
pp616 2003-10-17
  • 打赏
  • 举报
回复
在一个以有的控件基础上添加新的事件

首先看你需要的事件bcb自己有没有对应的事件类型。
如果没有需要自己来定义。
如:
typedef void __fastcall (__closure *事件类型名)(/*参数表*/);
例如
typedef void __fastcall (__closure *MyEvent)(int A,int B,int C,int D);

然后在新的类中添加事件句柄
如:
MyEvent FMyEvent;

再把事件发布出来
__published:
__property MyEvent OnMyEvent={read=FMyEvent,write=FMyEvent};

然后在适当的地方出发新的事件。
如响应什么消息。或是达到别的什么条件。
如:在收到WM_ACTIVATE消息的时候触发。
....
case WM_ACTIVATE:
if(FMyEvent) //如果有事件句柄
FMyEvent(参数);
break;
....
Amonda 2003-10-17
  • 打赏
  • 举报
回复
请问楼上,怎样在一个已有的控件基础上给他添加新的事件响应函数?
dajianshi(拔剑四顾心茫然) 老兄,你是用什么写的播放程序?
pp616 2003-10-17
  • 打赏
  • 举报
回复
你没有必要去理会OnChange.下面这个控件可以搞定你的问题。
这是一个简单的控件。只是在TTrackBar的基础上加了MouseDown和MouseUp两个事件。

.H
//---------------------------------------------------------------------------
#ifndef MyTrackBarH
#define MyTrackBarH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TMyTrackBar : public TTrackBar
{
private:
TMouseEvent FOnMouseDown;
TMouseEvent FOnMouseUp;

protected:
virtual void __fastcall DoMouseDown( TMouseButton Button,
Classes::TShiftState Shift, int X, int Y);

virtual void __fastcall DoMouseUp( TMouseButton Button,
Classes::TShiftState Shift, int X, int Y);

void __fastcall WndProc(TMessage &Message); //重载窗口过程

public:
__fastcall TMyTrackBar(TComponent* Owner);
__published:
__property TMouseEvent myOnMouseDown={read=FOnMouseDown,write=FOnMouseDown};
__property TMouseEvent myOnMouseUp={read=FOnMouseUp,write=FOnMouseUp};
};
//---------------------------------------------------------------------------
#endif

.cpp
#include <vcl.h>
#pragma hdrstop

#include "MyTrackBar.h"
#pragma package(smart_init)

static inline void ValidCtrCheck(TMyTrackBar *)
{
new TMyTrackBar(NULL);
}
void __fastcall TMyTrackBar::DoMouseDown( TMouseButton Button,
Classes::TShiftState Shift, int X, int Y)
{
if (FOnMouseDown) FOnMouseDown(this,Button,Shift,X,Y);
}
void __fastcall TMyTrackBar::DoMouseUp( TMouseButton Button,
Classes::TShiftState Shift, int X, int Y)
{
if (FOnMouseUp) FOnMouseUp(this,Button,Shift,X,Y);
}
//=========
void __fastcall TMyTrackBar::WndProc(TMessage &Message)
{ TTrackBar::WndProc(Message);
if (Message.Msg == WM_LBUTTONDOWN)
{ int xPos = Message.LParamLo;
int yPos = Message.LParamHi;
TShiftState Shift ;//=(TShiftState) Message.WParam;
TMouseButton Button;
DoMouseDown( Button , Shift,xPos,yPos);
}

if (Message.Msg == WM_LBUTTONUP)
{ int xPos = Message.LParamLo;
int yPos = Message.LParamHi;
TShiftState Shift ;//=(TShiftState) Message.WParam;
TMouseButton Button;
DoMouseUp( Button , Shift,xPos,yPos);
}
}
//---------------------------------------------------------------------------
__fastcall TMyTrackBar::TMyTrackBar(TComponent* Owner)
: TTrackBar(Owner)
{
}
//---------------------------------------------------------------------------
namespace Mytrackbar
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TMyTrackBar)};
RegisterComponents("AddBlank", classes, 0);
}
}

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧