Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
Virgo ©   (2004-12-29 09:18) [0]

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

Есть две формы: 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;

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


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

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


 
Virgo ©   (2004-12-29 09:28) [2]

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


 
Kair ©   (2004-12-29 09:50) [3]

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


 
Virgo ©   (2004-12-29 10:27) [4]

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

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

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


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

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


 
msguns ©   (2004-12-29 11:41) [6]

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



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

Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.035 c
9-1096003204
Rem
2004-09-24 09:20
2005.01.16
Перпендикуляр


1-1104758879
SeriousSam
2005-01-03 16:27
2005.01.16
Мигание кнопки программы в панели задач.


14-1104049679
Fin
2004-12-26 11:27
2005.01.16
Расчет платежа за электроэнергию.


4-1101492834
VDevel
2004-11-26 21:13
2005.01.16
Адрес DNS


4-1101201473
-SeM-
2004-11-23 12:17
2005.01.16
Хендл KERNEL32





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский