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

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

WinAPI [D7]


Virgo ©   (2004-12-29 09:18:00) 

Подскажите, пожалуйста,  как правильно реализовать

Есть две формы: fmMain и fmChild
TfmChild = class(TForm)
все остальные формы в проекте наследуются от fmChild

На fmChild реализую некоторые вещи, одинаковые для всех наследуемых от нее,
в частности,  при создании дочерней необходимо на главной динамически создать кнопки
аналогичные системным

Таким образом на fmChild
я рисую на главной форме нужные кнопки с помощью функции
DrawFrameControl(WDc,RMax,DFC_CAPTION, DFCS_CAPTIONMAX);
Создаю четыре собственных сообщения, обработчики сообщений

wm_BtnClkMin = wm_User + 111;
wm_BtnClkMax = wm_User + 112;
wm_BtnClkClose = wm_User + 113;
wm_BtnClkRestore = wm_User + 114;

private
   procedure wmBtnClkMin(var msg: TMessage); message wm_BtnClkMin;
   procedure wmBtnClkMax(var msg: TMessage); message wm_BtnClkMax;
   procedure wmBtnClkClose(var msg: TMessage); message wm_BtnClkClose;
   procedure wmBtnClkRestore(var msg: TMessage); message wm_BtnClkRestore;

 public
   procedure DrawBtnMin;
   procedure DrawBtnMax;
   procedure DrawBtnClose;
   procedure DrawBtnRestore;

Ниже  пример для одной кнопки, для других аналогично
procedure TfmChild.DrawBtnMin;
var
 WDc: HDc;
 Cx,Cy: Integer;
 Row, Col : Integer;
 XFrame, Yframe: Integer;
begin
 WDc := GetWindowDc(fmMain.Handle);
 Cx := GetSystemMetrics(SM_CXSize);
 Cy := GetSystemMetrics(SM_CYSize);
 xFrame := GetSystemMetrics(SM_CXFrame);
 yFrame := GetSystemMetrics(SM_CYFrame);
 RMin := Bounds(fmMain.Width - 3*Cx - 2, yFrame + Cy + 2, Cx - 2, Cy - 4);
 if Press then
   DrawFrameControl(WDc,RMin,DFC_CAPTION, DFCS_CAPTIONMIN or DFCS_PUSHED)
 else
   DrawFrameControl(WDc,RMin,DFC_CAPTION, DFCS_CAPTIONMIN);
 ReleaseDc(fmMain.Handle,WDC);

 fmMain.wmncLButtonUp(wm_NclButtonUp):= wmncLButtonUp(wm_NclButtonUp);
end;

procedure TfmChild.wmBtnClkMin(var msg: TMessage);
begin
ShowWindow(self.WindowHandle,SW_MINIMIZE);
end;

procedure TfmChild.wmncLButtonUp(var msg: TWMncLBUTTONUP);
var
 pt: TPoint;
begin
inherited;

pt := Point(msg.XCursor - Left,msg.YCursor - top);
if PtInRect(RMin,pt) then
begin
 Press := False;
 DrawBtnMin;
 PostMessage(Handle, wm_BtnClkMin, 0,0);
end;
if PtInRect(RMax,pt) then
begin
 Press := False;
  DrawBtnMax;
  PostMessage(Handle, wm_BtnClkMax, 0,0);
end;
if PtInRect(RClose,pt) then
begin
 Press := False;
 DrawBtnClose;
 PostMessage(Handle, wm_BtnClkClose, 0,0);
end;
end;

-------------------------------
Вопрос - как мне на главной форме правильно обработать сообщения
(нажатие на эти кнопки)


msguns   (2004-12-29 11:41:00) [1]

Определи адресат как активную "дочь", ентой форме и посылай из главной нужное сообщение.


Семен Сорокин   (2004-12-29 10:55:00) [2]

хм, а не подойдет, как вариант:
создавать допустим на панели эти кнопки (именно объекты) в конструкторе TfmChild, там же прописывать св-ва и обработчики (или обработчики, если надо, вытащить в главную форму), а Parent'ом назначить главную форму?


Virgo   (2004-12-29 10:27:00) [3]

я так и делаю:)
проблема не в этом
не знаю как обработать сообщения
как узнать Handle формы, с которой нарисована кнопочка
повторюсь, что форм одновременно может быть открыто несколько
а сообщение надо обработать на главной..

procedure TfmMain.wmncLButtonUp(var msg: TWMncLBUTTONUP);
var
 pt: TPoint;
begin
inherited;

SendMessage(Handle, wm_BtnClkMin,0,0);
end;


Kair   (2004-12-29 09:50:00) [4]

Может обрабатывать момент нажатия мышкой по форме и смотреть не совпали ли координаты нажатия с расположеним кнопки?


Virgo   (2004-12-29 09:28:00) [5]

DrawFrameControl по сути просто рисует кнопочку, а не создает оконный элемент:(


tradakad   (2004-12-29 09:26:00) [6]

WM_COMMAND где в качестве параметра выступают хендлы кнопок если я правильно понял суть вопроса


Наверх

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