Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.18;
Скачать: CL | DM;

Вниз

WMNCHITTEST и HTCAPTION   Найти похожие ветки 

 
DevilDevil ©   (2007-08-27 18:09) [0]

:)
была проблема с прорисовкой содержимого панели:
http://delphimaster.net/view/1-1186402346/

всё помогло, но...
теперь панели не приходят мышиные события (в частности MouseDown и MouseUp). Подозреваю, что и MouseMove Не приходит.

В общем, очень нужно решить проблему. Помогите, пожалуйста.


 
DimaBr ©   (2007-08-28 08:36) [1]

Подозреваю что виноват Inherited, событие от мыши дальше не обрабатывается


 
DevilDevil ©   (2007-08-28 10:11) [2]

> DimaBr ©   (28.08.07 08:36) [1]

помоему, проблема в логике.

у моего "окна" есть заголовок, перемещение окна производится вручную, при помощи OnMouseDown, OnMouseMove, OnMouseUp и SetBounds. + в мышиных событиях производится ещё несколько полезных действий.

Если M.Result := HTCAPTION, то блокируются мышиные события.

Может есть другой способ перерисовки окон снизу ?

Заранее благодарен.


 
DimaBr ©   (2007-08-28 10:22) [3]

Действительно. проблема в логике.
Каждое окно (TWinControl) обладает некиими зонами (зона заголовка, зоны бордюра, зона системного меню, тело окна..... и т.д.).
Перехватим событие WM_NCHITTEST мы обманываем систему, указывая что мышь находится в зоне ЗАГОЛОВКА ОКНА. Тогда нажав левую кнопку мыши можно таскать окно, при этом никакие  OnMouseDown, OnMouseMove, OnMouseUp,SetBounds не нужны.

Данный метод никоим образом не влияет на прорисовку окна.


 
DevilDevil ©   (2007-08-28 10:36) [4]

эээ...

в том то и дело, что если указывать HTCAPTION, то окна под моим прорисовываются корректно.

Тогда возвращаемся к сабжу того топика.
Как можно решить иначе?


 
DimaBr ©   (2007-08-28 11:17) [5]

Не видя ни строчки вашего кода я не вижу и проблеммы. У меня все окна перерисовываются корректно.


 
DevilDevil ©   (2007-08-28 12:02) [6]

хмм... попробовал повторить в новом прокте - пока не получается...

так изложу суть.
есть так называемые окна. на основе TCustomControl. на панели похожи. Их можно за заголовок таскать.

иерархия каждого "окна": Panel->Frame->Все остальные компоненты.

На одном из таких окон множество различных панелей, эдитов, etc.
Так вот если над этим окном поперемещать другое окно, то все компоненты такого окна оень плохо (читай редко)  перерисовываются. Вот я и спрашиваю, как корректнее решить такую проблему.


 
DimaBr ©   (2007-08-28 12:41) [7]

А если попробывать убрать фрэйм, и просто накидать контролов ???
type
TPanel = class(ExtCtrls.TPanel)
  procedure WMNCHITTEST(var M: TWMNCHITTEST); message WM_NCHITTEST;
  procedure paint;override;
end;
 TForm3 = class(TForm)

   Panel1: TPanel;
   Panel2: TPanel;
   Edit1: TEdit;
   Button2: TButton;
   CheckBox2: TCheckBox;
   Label1: TLabel;
   Panel3: TPanel;
   Label2: TLabel;
   Edit2: TEdit;
   Button3: TButton;
   CheckBox3: TCheckBox;

 private
   { Private declarations }
 public
 end;

var
 Form3: TForm3;

implementation

procedure TPanel.paint;
begin
 inherited;
 Canvas.Brush.Color := clBtnFace;
 Canvas.FillRect(ClientRect);
 Canvas.Brush.Color := clBlue;
 Canvas.FillRect(Rect(0,0,Width,20));
end;

procedure TPanel.WMNCHITTEST(var M: TWMNCHITTEST);
var R: TRect;
  P: TPoint;
begin
if not (csDesigning in ComponentState) then begin
  R := ClientRect;
  R.Bottom := R.Top + 20;
  P := ScreenToClient(Point(M.XPos, M.YPos));
  if PtInRect(R,P)
    then M.Result := HTCAPTION
    else inherited;
end
else inherited
end;


Накидал на панель кучу контролов, и скопировал её - получилось две одинаковые панели. Таскаются и перерисовываются нормально.


 
Юрий Зотов ©   (2007-08-28 13:55) [8]

> DevilDevil ©   (28.08.07 12:02) [6]

А ради чего такие изврашения? Не проще ли использовать стандартные панели инструментов?


 
DevilDevil ©   (2007-08-28 14:40) [9]

> Юрий Зотов ©   (28.08.07 13:55) [8]

что есть и как в моём случае использовать "стандартные панели инструментов" ?


 
Юрий Зотов ©   (2007-08-28 15:35) [10]

> DevilDevil ©   (28.08.07 14:40) [9]

Плавающие панели инструментов.


 
DevilDevil ©   (2007-08-28 16:17) [11]

> Юрий Зотов ©   (28.08.07 15:35) [10]

ты про панель на тулбаре ?
- это не то.

Проблему решил. Если кому пригодится, мой отчёт:

- если TWMNCHITTEST.Result = HTCAPTION, то автоматически происходит очень интересна чтука - окно (компонент) "автоматически" перемещается, дополнительного ничего реализовывать не надо

- в качестве минуса - не приходят мышиные события
- по идее должны приходить неклинтские мышиные сообщения
- WM_NCLBUTTONDOWN приходит, MouseMove наверное тоже... а вот WM_NCLBUTTONUP мне по какой то причине перехватить не удалось - само сообщение не приходит. Хотя, возможно, у меня слишком кривые руки
- проблема решается ОЧЕНЬ ПРОСТО, в Paint-е моего окна, вызываю Refresh у фрейма.

Вот и всё.

Всем участникам большое спасибо!


 
Юрий Зотов ©   (2007-08-28 20:17) [12]

> DevilDevil ©   (28.08.07 16:17) [11]

> если TWMNCHITTEST.Result = HTCAPTION, то автоматически происходит
> очень интересна чтука - окно (компонент) "автоматически" перемещается,
> дополнительного ничего реализовывать не надо

И об этой "очень интересной чтуке" было сказано в [3].
:о)


 
DevilDevil ©   (2007-08-29 10:54) [13]

> Юрий Зотов ©   (28.08.07 20:17) [12]

повторение - мать



Страницы: 1 вся ветка

Текущий архив: 2007.11.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
15-1192710762
Сатир
2007-10-18 16:32
2007.11.18
Загрузка модулей, которые содержать компоненты DevExpress


2-1192578159
qaswet
2007-10-17 03:42
2007.11.18
Фильтр по подстроке


15-1192517395
Layner
2007-10-16 10:49
2007.11.18
Люди, как скажете, стоит ли брать GLScene


15-1192210120
ICQshnik
2007-10-12 21:28
2007.11.18
Как обезопасить свой ICQ?..


15-1192643166
infront
2007-10-17 21:46
2007.11.18
составитель формул