Форум: "Основная";
Текущий архив: 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.039 c