bcb 如何让TScrolvirtualbox没有声音有输入焦点

如何在TScrollBox上的某个固定位置画图?
[问题点数:100分,结帖人thinboyxp]
如何在TScrollBox上的某个固定位置画图?
[问题点数:100分,结帖人thinboyxp]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2008年5月 C++ Builder大版内专家分月排行榜第二2008年1月 C++ Builder大版内专家分月排行榜第二
2008年4月 C++ Builder大版内专家分月排行榜第三
2010年2月 C++ Builder大版内专家分月排行榜第二2009年3月 C++ Builder大版内专家分月排行榜第二2009年2月 C++ Builder大版内专家分月排行榜第二
2007年12月 C++ Builder大版内专家分月排行榜第三
2010年7月 C++ Builder大版内专家分月排行榜第三2008年5月 C++ Builder大版内专家分月排行榜第三2007年10月 C++ Builder大版内专家分月排行榜第三
2010年7月 C++ Builder大版内专家分月排行榜第三2008年5月 C++ Builder大版内专家分月排行榜第三2007年10月 C++ Builder大版内专家分月排行榜第三
2010年7月 C++ Builder大版内专家分月排行榜第三2008年5月 C++ Builder大版内专家分月排行榜第三2007年10月 C++ Builder大版内专家分月排行榜第三
2010年7月 C++ Builder大版内专家分月排行榜第三2008年5月 C++ Builder大版内专家分月排行榜第三2007年10月 C++ Builder大版内专家分月排行榜第三
<<<<<<>>>>>> Stashed changes
本帖子已过去太久远了,不再提供回复功能。BCB入门_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢Stack Overflow is a question and answer site for professional and enthusiast programmers. It&#39;s 100% free.
I created a Custom scrollbox derives from TScrollbox that works the same except that it will scrolls when dragging in the client area aside from its scrollbars.
My problem now is i cannot Drag To Scroll when mouse is on a button or panel inside my CustomScrollbox.
the MouseDown, MouseUp, MouseMove override will not trigger because it hovers into different controls.
How can I keep tracking the MouseDown, MouseUp, MouseMove and prevent Button/Panels events from firing(inside my CustomScrollbox) when i start dragging?
here's the video of my
1,55812166
So you want to adjust the mouse down behaviour of all childs, in such way that when a dragging operation is being initiated, the mouse events of the clicked child should be ignored. But when no drag is performed, then it would be required to fire the child's mouse events as usual.
Not a bad question actually. Since most of the default control interaction is tight to the release of the mouse button (e.g. OnClick is handled in WM_LBUTTONUP), this still should be possible in an intuitive manner.
I tried the code below, and it feels quite nice indeed. It involves:
handling WM_PARENTNOTIFY to catch when a child control is clicked on,
bypassing Child.OnMouseMove and Child.OnMouseUp,
transfer control to the scrollbox when the move exceeds Mouse.DragThreshold,
resetting focus to the previous focussed control before the drag,
canceling all changes made to the child's mouse events after the drag.
unit Unit2;
Windows, Messages, Classes, Controls, Forms, StdCtrls, ExtC
TScrollBox = class(Forms.TScrollBox)
FChild: TC
FDragging: B
FPrevActiveControl: TWinC
FPrevScrollPos: TP
FPrevTick: C
FOldChildOnMouseMove: TMouseMoveE
FOldChildOnMouseUp: TMouseE
FSpeedX: S
FSpeedY: S
FStartPos: TP
FTracker: TT
function ActiveControl: TWinC
procedure ChildMouseMove(Sender: TO Shift: TShiftS X,
Y: Integer);
procedure ChildMouseUp(Sender: TO Button: TMouseB
Shift: TShiftS X, Y: Integer);
function GetScrollPos: TP
procedure SetScrollPos(const Value: TPoint);
procedure Track(Sender: TObject);
procedure WMParentNotify(var Message: TWMParentNotify);
message WM_PARENTNOTIFY;
procedure MouseDown(Button: TMouseB Shift: TShiftS X,
Y: Integer);
procedure MouseMove(Shift: TShiftS X, Y: Integer);
procedure MouseUp(Button: TMouseB Shift: TShiftS X,
Y: Integer);
constructor Create(AOwner: TComponent);
property ScrollPos: TPoint read GetScrollPos write SetScrollP
TForm2 = class(TForm)
ScrollBox1: TScrollB
implementation
{$R *.dfm}
{ TScrollBox }
TControlAccess = class(TControl);
function TScrollBox.ActiveControl: TWinC
Control: TWinC
Result := Screen.ActiveC
Control := R
while (Control && nil) do
if Control = Self then
Control := Control.P
procedure TScrollBox.ChildMouseMove(Sender: TO Shift: TShiftS X,
Y: Integer);
if (Abs(FChild.Left + X - FStartPos.X) & Mouse.DragThreshold) or
(Abs(FChild.Top + Y - FStartPos.Y) & Mouse.DragThreshold) then
MouseCapture := T
TControlAccess(FChild).OnMouseMove := FOldChildOnMouseM
TControlAccess(FChild).OnMouseUp := FOldChildOnMouseUp;
MouseDown(mbLeft, Shift, FChild.Left + X, FChild.Top + Y);
if FPrevActiveControl && nil then
FPrevActiveControl.SetF
if Assigned(FOldChildOnMouseMove) then
FOldChildOnMouseMove(Sender, Shift, X, Y);
procedure TScrollBox.ChildMouseUp(Sender: TO Button: TMouseB
Shift: TShiftS X, Y: Integer);
if FChild && nil then
if Assigned(FOldChildOnMouseUp) then
FOldChildOnMouseUp(Sender, Button, Shift, X, Y);
TControlAccess(FChild).OnMouseMove := FOldChildOnMouseM
TControlAccess(FChild).OnMouseUp := FOldChildOnMouseUp;
constructor TScrollBox.Create(AOwner: TComponent);
inherited Create(AOwner);
FTracker := TTimer.Create(Self);
FTracker.Enabled := F
FTracker.Interval := 15;
FTracker.OnTimer := T
function TScrollBox.GetScrollPos: TP
Result := Point(HorzScrollBar.Position, VertScrollBar.Position);
procedure TScrollBox.MouseDown(Button: TMouseB Shift: TShiftS X,
Y: Integer);
FDragging := T
FPrevTick := GetTickC
FPrevScrollPos := ScrollP
FTracker.Enabled := T
FStartPos := Point(ScrollPos.X + X, ScrollPos.Y + Y);
Screen.Cursor := crHandP
inherited MouseDown(Button, Shift, X, Y);
procedure TScrollBox.MouseMove(Shift: TShiftS X, Y: Integer);
if FDragging then
ScrollPos := Point(FStartPos.X - X, FStartPos.Y - Y);
inherited MouseMove(Shift, X, Y);
procedure TScrollBox.MouseUp(Button: TMouseB Shift: TShiftS X,
Y: Integer);
FDragging := F
Screen.Cursor := crD
inherited MouseUp(Button, Shift, X, Y);
procedure TScrollBox.SetScrollPos(const Value: TPoint);
HorzScrollBar.Position := Value.X;
VertScrollBar.Position := Value.Y;
procedure TScrollBox.Track(Sender: TObject);
Delay := GetTickCount - FPrevT
if FDragging then
if Delay = 0 then
Delay := 1;
FSpeedX := (ScrollPos.X - FPrevScrollPos.X) / D
FSpeedY := (ScrollPos.Y - FPrevScrollPos.Y) / D
if (Abs(FSpeedX) & 0.005) and (Abs(FSpeedY) & 0.005) then
FTracker.Enabled := False
ScrollPos := Point(FPrevScrollPos.X + Round(Delay * FSpeedX),
FPrevScrollPos.Y + Round(Delay * FSpeedY));
FSpeedX := 0.83 * FSpeedX;
FSpeedY := 0.83 * FSpeedY;
FPrevScrollPos := ScrollP
FPrevTick := GetTickC
procedure TScrollBox.WMParentNotify(var Message: TWMParentNotify);
if Message.Event = WM_LBUTTONDOWN then
FChild := ControlAtPos(Point(Message.XPos, Message.YPos), False, True);
if FChild && nil then
FPrevActiveControl := ActiveC
FOldChildOnMouseMove := TControlAccess(FChild).OnMouseM
TControlAccess(FChild).OnMouseMove := ChildMouseM
FOldChildOnMouseUp := TControlAccess(FChild).OnMouseUp;
TControlAccess(FChild).OnMouseUp := ChildMouseUp;
Note: When no drag is initiated (mouse movement & Mouse.DragThreshold), all mouse and click events of the clicked child remain intact. Otherwise only Child.OnMouseDown will fire!
For testing purposes,
is incorporated in the code above.
With thanks to @TLama for suggesting to use WM_PARENTNOTIFY.
29.5k451115
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Stack Exchange
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you&#39;re looking for?
Browse other questions tagged
Stack Overflow works best with JavaScript enabled如何用bcb实现将选中的彩色jpg图片转成灰阶并在TImage中将灰阶图片显示出来。
[问题点数:80分,结帖人Louise_lxh]
如何用bcb实现将选中的彩色jpg图片转成灰阶并在TImage中将灰阶图片显示出来。
[问题点数:80分,结帖人Louise_lxh]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2008年5月 C++ Builder大版内专家分月排行榜第二2008年1月 C++ Builder大版内专家分月排行榜第二
2008年4月 C++ Builder大版内专家分月排行榜第三
2013年5月 C++ Builder大版内专家分月排行榜第三2012年7月 C++ Builder大版内专家分月排行榜第三2012年5月 C++ Builder大版内专家分月排行榜第三2011年5月 C++ Builder大版内专家分月排行榜第三2011年3月 C++ Builder大版内专家分月排行榜第三2010年12月 C++ Builder大版内专家分月排行榜第三2010年10月 C++ Builder大版内专家分月排行榜第三2010年1月 C++ Builder大版内专家分月排行榜第三2009年9月 C++ Builder大版内专家分月排行榜第三2009年7月 C++ Builder大版内专家分月排行榜第三2009年6月 C++ Builder大版内专家分月排行榜第三2009年5月 C++ Builder大版内专家分月排行榜第三2006年3月 C++ Builder大版内专家分月排行榜第三2005年9月 C++ Builder大版内专家分月排行榜第三
<<<<<<>>>>>> Stashed changes
本帖子已过去太久远了,不再提供回复功能。bcb怎么控制打开新页面的焦点_百度知道
bcb怎么控制打开新页面的焦点
我有更好的答案
可以用JS来实现,点一次后让按钮变成灰色 我们在有些网站提交数据的时候会看到,当点击提交后,提交畅功扳嘉殖黄帮萎爆联按钮变灰色不可用,这样可有效防止重复提交,本代码就是实现这样一个功能。从代码就可以看出
其他类似问题
为您推荐:
bcb的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 jodebox有什么用 的文章

 

随机推荐