Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
ВнизComponent Найти похожие ветки
← →
San1 (2008-03-11 18:22) [0]Уважаемые Мастера, подскажите.
Как научить компонент потомок от класса TGraphicControl не обрабатывать события мыши, а предоставлять это своему родителю?
← →
{RASkov} © (2008-03-11 18:25) [1]> [0] San1 (11.03.08 18:22)
Ты лучше задачу свою опиши...
← →
San1 (2008-03-11 18:38) [2]Наследовал компонент от класса TGraphicControl (поле игры морской бой).
Хотелось бы сделать поле игры большим, т. е. больше экрана, следовательно нужны полосы прокрутки и прокручивать колесиком мыши.
Т. о., я сделал новый компонент, наследник TScrollBox, и в его перекрытом конструкторе помещаю туда свой компонент.
Но теперь помещенный в ScrollBox компонент, мешает ему самому обрабатывать события мыши.
← →
DiamondShark © (2008-03-11 19:31) [3]
> Но теперь помещенный в ScrollBox компонент, мешает ему самому
> обрабатывать события мыши.
А ему-то зачем события мыши?
← →
{RASkov} © (2008-03-11 19:31) [4]> [2] San1 (11.03.08 18:38)
> Но теперь помещенный в ScrollBox компонент, мешает ему самому
> обрабатывать события мыши.
Все равно мало, что понятно.... :(
А тебе какие события нужно, прокрутку "колесом мыши" или "клики", что?
Если клики то просто обрабатывай их у своего внутреннего компонента, если прокрутку "колесом" то нужно чтоб твой MyScrollBox имел фокус.
Например, если у тебя на нем(Скролбокс) нет ни одного винконтрола, то он не получит фокус и прокрутка работать не будет...
Фокус установить можно так: MyScrollBox.SetFocus;
← →
San1 (2008-03-11 20:08) [5]В моем случае я хотел сделать перемещение поля игры в скролбоксе с помощью зажатой средней клавишой мышки (и перемещением мыши в зажатом состоянии средней клавиши мыши, т.е., какбы перетаскивать под собой игровое поле).
Не знаю как это реализовать наиболее грамотно.
Может быть перекрывать MouseMove и в этой процедуре, если зажата ср. клав. мыши прокручивать скролы у родителя...
Нужен совет как лучше можно это сделать и как это сделать вообще.
Может есть какие-то примеры, но я их пока не нашел.
← →
{RASkov} © (2008-03-11 21:11) [6]> [5] San1 (11.03.08 20:08)
Вот глянь, от очередного безделия накидал тебе примерчик. Это не конечный результат, но в качестве примера.unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TMyPole = class(TGraphicControl)
private
FOnPaint: TNotifyEvent;
protected
procedure Paint; override;
property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
end;
TMyGamePole = class (TScrollBox)
private
FPole: TMyPole;
OldX, OldY: Integer;
procedure SetHeightPole(const Value: Integer);
procedure SetWidthPole(const Value: Integer);
function GetHeightPole: Integer;
function GetWidthPole: Integer;
procedure MouseDownInPole(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure MouseMoveInPole(Sender: TObject; Shift: TShiftState; X, Y: Integer);
protected
procedure PaintPole(Sender: TObject); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property WidthPole: Integer read GetWidthPole write SetWidthPole;
property HeightPole: Integer read GetHeightPole write SetHeightPole;
end;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyPole }
procedure TMyPole.Paint;
begin
inherited;
if Assigned(FOnPaint) then FOnPaint(Self);
end;
{ TMyGamePole }
constructor TMyGamePole.Create(AOwner: TComponent);
begin
inherited;
FPole:=TMyPole.Create(self);
WidthPole:=1000;
HeightPole:=1000;
FPole.Parent:=Self;
FPole.OnMouseDown:=MouseDownInPole;
FPole.OnMouseMove:=MouseMoveInPole;
FPole.OnPaint:=PaintPole;
Width:=200;
Height:=200;
end;
destructor TMyGamePole.Destroy;
begin
FPole.Free;
inherited;
end;
procedure TMyGamePole.SetHeightPole(const Value: Integer);
begin
if Value<>FPole.Height then FPole.Height:=Value;
end;
procedure TMyGamePole.SetWidthPole(const Value: Integer);
begin
if Value<>FPole.Width then FPole.Width:=Value;
end;
function TMyGamePole.GetHeightPole: Integer;
begin
Result:=FPole.Height;
end;
function TMyGamePole.GetWidthPole: Integer;
begin
Result:=FPole.Width;
end;
procedure TMyGamePole.MouseDownInPole(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button<>mbMiddle then Exit;
OldX:=X; OldY:=Y;
end;
procedure TMyGamePole.MouseMoveInPole(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if not (ssMiddle in Shift) then Exit;
HorzScrollBar.Position:=HorzScrollBar.Position+(OldX-X); OldX:=X;
VertScrollBar.Position:=VertScrollBar.Position+(OldY-Y); OldY:=Y;
end;
procedure TMyGamePole.PaintPole(Sender: TObject);
var X, Y: Integer; R: TRect;
begin
R:=FPole.ClientRect;
InflateRect(R, -4, -4);
FPole.Canvas.Rectangle(R);
for X:=1 to WidthPole-1 do
for Y:=1 to HeightPole-1 do
if (X mod 8 = 0) and (Y mod 8 = 0) then FPole.Canvas.Pixels[X,Y]:=clRed;
end;
//------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
with TMyGamePole.Create(Self) do begin
Parent:=Self;
end;
end;
end.
← →
San1 (2008-03-11 23:04) [7]Классный пример!
То что мне нужно.
Если не секрет, как избавиться от мерцания. Даже DoubleBuffered:=true не помогает.
← →
Amoeba © (2008-03-12 00:57) [8]
> с помощью зажатой средней клавишой мышки
А как быть юзеру, если мышь не экзотическая, а обычная, т.е. без средней клавиши?
← →
San1 (2008-03-12 20:02) [9]Подскажите пожалуйста какже всетаки в таких случаях грамотно избавляются от мерцания компонента при его периресовке.
DoubleBuffered
и
ControlStyle := ControlStyle + [csOpaque]
не помогают...
← →
San1 (2008-03-12 20:04) [10]помещение изображения в временный TPicture и copyrect в канву помпонента, тоже не помогло
← →
VirEx © (2008-03-12 20:22) [11]как-то перекрыть erasebackground...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.04.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c