2013-05-26 2 views
0

Я пытаюсь сделать приложение, чтобы показать некоторую информацию. Он создаст время выполнения Панелей и разместит на нем информацию, каждая панель будет плоской, как на картинке, также приложение будет использовать темы времени выполнения, поэтому я 'd не сможет изменить цвет панели bg при перемещении мыши, я попытался разместить информацию о TSpeedButton: v У этого есть замечательная функция подсветки, когда она плоская, в то время как приложение использует тему времени исполнения, но главная проблема заключается в том, что изображения и метки aren' т двигаться, когда я двигаться SpeedButton и мне нужно это много, они просто остаться там ..Выделите TPanel на перемещение мыши

Я пытался редактировать TCustomPanel.Paint, чтобы увидеть, если панель будет выглядеть подсвеченной кнопки, добавив код в конец:

PaintRect := ClientRect; 
Details := StyleServices.GetElementDetails(ttbButtonHot); 
StyleServices.DrawElement(Canvas.Handle, Details, PaintRect); 

, но без успеха ..

также довольно трудно связать пользовательский код OnClick событие во время выполнения, например:

ShowMessage('custom message on each panel'); 

у меня нет ни малейшего представления о том, как это сделать, надеюсь, кто-то даст мне совет или показать мне пример ..

BTV, панель будет создана таким образом:

var 
    P: TPanel; 
begin 
P := TPanel.Create(Self); 
P.Left := 20; 
P.Top := 100; 
P.Width := 60; 
P.Height := 20; 
P.Visible := True; 
P.Parent := Self; 
@P.OnClick := @Showmessageproc; // somehow this way.. 
end; 

App ПИК:

pic

Если я делаю так:

procedure TMyPanel.MouseMove(Shift: TShiftState; X, Y: Integer); 
var 
    mEvnt: TTrackMouseEvent; 
begin 
    inherited; 
    if not FMouseTracking then begin 
    mEvnt.cbSize := SizeOf(mEvnt); 
    mEvnt.dwFlags := TME_LEAVE; 
    mEvnt.hwndTrack := Handle; 
    TrackMouseEvent(mEvnt); 
    FMouseTracking := True; 
    showmessage('IN'); 
    end; 
end; 

procedure TMyPanel.WMMouseLeave(var Msg: TMessage); 
begin 
if Msg.Msg = WM_MOUSELEAVE then showmessage('OUT'); 
    Msg.Result := 0; 
    FMouseTracking := False; 
    if Assigned(FOnMouseLeave) then 
    FOnMouseLeave(Self); 
end; 

procedure G(Sender: TObject); 
begin 
showmessage('message'); 
end; 

procedure TMainFrm.Button1Click(Sender: TObject); 
var 
    P: TMyPanel; 
begin 
P := TMyPanel.Create(Self); 
P.Left := 20; 
I := I + 100; 
P.Top := I; 
P.Width := 200; 
P.Height := 80; 
P.Visible := True; 
P.Parent := Self; 
@P.OnClick := @g; 
end; 

при перемещении мыши на время выполнения создается панель, 2 MsgBox появляется, IN и OUT, "MouseMove" работает нормально, но "мышь оставить" плохо, также основной вопрос остается актуальным. проблема в том, что я не могу получить холст из созданной панели для рисования. в приведенном выше примере может быть достигнуто более простой способ:

@P.OnMouseLeave := @onmouseleaveproc; 
@P.OnMouseMove := @onmousemoveproc; 

но с Canvas, все гораздо сложнее, где-то я читал, что холст защищен в TCustomPanel.

Также есть еще один вопрос: возможно ли обрабатывать панель, называемую «OnMouseMove»? потому что, возможно, будет 30 из них (во время выполнения создается панелей)

Я пробовал так: (и он не работает)

type 
    TMyPanel = class(TPanel) 
    public 
    constructor Create(AOwner: TComponent); override; 
    private 
    // FMouseTracking: Boolean; 
    // FOnMouseLeave: TNotifyEvent; 
    procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER; 
    procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE; 
    protected 
    // procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; 
    published 
    // property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; 
    end; 

    constructor TMyPanel.Create(AOwner: TComponent); 
    begin 
     ControlStyle := ControlStyle - [csParentBackground] + [csOpaque]; 
     inherited; 
    end; 


    procedure TMyPanel.CMMouseEnter(var msg: TMessage); 
    begin 
     inherited; 
     Color := clBlue; 
     { Do Whatever } 
    end; 

    procedure TMyPanel.CMMouseLeave(var msg: TMessage); 
    begin 
     inherited; 
     Color := clRed; 
     { Do Whatever } 
    end; 

Просто, цвет не изменяется. (изменение цвета с темами OFF)

+1

Великобритания не является гражданством. Вы имеете в виду «британский». –

+0

Да, я был в спешке. Кстати, английский не мой родной язык. – user2200585

+0

У вас все хорошо с вашим английским. :) – lurker

ответ

1

Это в основном explained here для Delphi 6, но такая же концепция я думаю. Вы хотите определить пользовательский обработчик сообщений Windows для своей панели. Это даст вам базовую возможность ввода/выключения мыши. Затем вы можете играть с настройкой свойств TPanel, чтобы найти что-то по своему вкусу. Например, чтобы высмеять кнопку скорости, вы можете просто установить цвет фона и соответственно изменить границу рамки. Если это не подходит, вы можете напрямую написать Canvas Canvas (нарисовать поведение, которое вы хотите увидеть) на входе/выходе мыши, чтобы получить визуальное поведение, которое вам нужно.

+0

Могу ли я выделить панель как SpeedButton? – user2200585

+1

Вы можете справиться с этим, как и в зависимости от того, какой пользовательский код вы хотите написать. После захвата события мыши вы можете играть со стандартными методами Delphi для настройки свойств TPanel. Если они не совпадают с тем, что вы хотите, вы можете сделать собственный чертеж на панели TPanel Canvas, чтобы делать то, что вам нравится. – lurker

+0

(y) спасибо человеку! :) – user2200585

0

Я создал новый компонент в Delphi и установил его. Новый компонент TColorPanel появился на новой вкладке MyComponents в среде IDE. Затем я использовал это, чтобы поместить TColorPanel в новое приложение, и оно правильно отреагировало на события ввода/выключения мыши, изменив цвет по желанию.Я не уверен, как вы сделали панели вашего приложения как TMyPanel вместо стандартного TPanel. Это именно то, как я попробовал. Я использовал ваш последний код обработки сообщений как есть.

unit ColorPanel; 

interface 

uses 
    WinTypes, WinProcs, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
    ExtCtrls; 

type 
    TColorPanel = class(TPanel) 
    public 
    constructor Create(AOwner: TComponent); override; 
    private 
    procedure CMMouseEnter(var msg: TMessage); message CM_MOUSEENTER; 
    procedure CMMouseLeave(var msg: TMessage); message CM_MOUSELEAVE; 
    protected 
    // procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; 
    published 
    // property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('MyComponents', [TColorPanel]); 
end; 

constructor TColorPanel.Create(AOwner: TComponent); 
begin 
    ControlStyle := ControlStyle - [csParentBackground] + [csOpaque]; 
    inherited; 
end; 

procedure TColorPanel.CMMouseEnter(var msg: TMessage); 
begin 
    inherited; 
    Color := clBlue; 
    { Do Whatever } 
end; 

procedure TColorPanel.CMMouseLeave(var msg: TMessage); 
begin 
    inherited; 
    Color := clRed; 
    { Do Whatever } 
end; 

end. 

Я не знаю, почему твоя не работает, кроме как определить, как вы объявили панели своего приложения, чтобы быть TMyPanel.

+0

Включите темы времени исполнения в D XE2 :) – user2200585

Смежные вопросы