Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

WMNCHITTEST и HTCAPTION


DevilDevil ©   (2007-08-27 18:09:00) 

:)
была проблема с прорисовкой содержимого панели:
http://www.delphimaster.ru/cgi-bin/forum.pl?n=0&id=1186402346

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

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


DevilDevil   (2007-08-29 10:54:00) [1]

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

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


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

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

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

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


DevilDevil   (2007-08-28 16:17:00) [3]

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

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

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

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

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

Вот и всё.

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


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

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

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


DevilDevil   (2007-08-28 14:40:00) [5]

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

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


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

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

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


DimaBr   (2007-08-28 12:41:00) [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;


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


DevilDevil   (2007-08-28 12:02:00) [8]

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

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

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

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


DimaBr   (2007-08-28 11:17:00) [9]

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


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

эээ...

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

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


DimaBr   (2007-08-28 10:22:00) [11]

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

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


DevilDevil   (2007-08-28 10:11:00) [12]

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

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

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

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

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

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


DimaBr   (2007-08-28 08:36:00) [13]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо