Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.09.2010, 13:15
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию Создание дочерней формы за пределом родительской на win api

Проблема в том что при нажатие кнопки дочернее окно создаётся внутри родительского, а как сделать что бы оно могло выводится за приделы родительского окна? Код у меня такой
Код:
program WinApiWindows;

uses Windows, Messages;

const HBTN = 1; HLABEL = 2;

var
  window:  TWndClassex;
  Form, Button, Label1, ChildForm:   hwnd; //переменные для хендлов созданных объектов
  mmsg:  msg; // переменная для обработки сообщений

function windowproc(wnd: hwnd; msg: integer; wparam: wparam; lparam: lparam):lresult;stdcall;
begin
  case msg of
  wm_destroy:
    begin
      postquitmessage(0);
      result := 0;
      exit;
    end;
  WM_COMMAND:
    begin
    case LoWord( wParam ) of
      HBTN:
              begin
              ChildForm:=createwindowex(0, 'child_window','child wnd', WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS, 30,30,150,130,Form,0,hinstance,nil); // возможно запоминать ChildForm'ы в массив, а то при следующем нажатии кнопки предыдущий хендл "потеряетса"...
              SetParent(ChildForm, Form);
              ShowWindow(ChildForm, SW_SHOW);
              end;
    end;
    end;
  else
    result := defwindowproc(wnd,msg,wparam,lparam);
  end;
end;

function childwindowproc(wnd: hwnd; msg: integer; wparam: wparam; lparam: lparam):lresult;stdcall; // второй обработчик (для дочерних окон)
begin
result := defwindowproc(wnd,msg,wparam,lparam);
end;

procedure CreateWinApiForm;
begin
  //заполняем структуру нового класса окна
  window.cbsize := sizeof (window);
  window.style := cs_hredraw or cs_vredraw;
  window.lpfnwndproc := @windowproc; // указываем классу на адресс функции обработывающей сообщения
  window.cbclsextra := 0;
  window.cbwndextra := 0;
  window.hinstance := hinstance;
  window.hicon := loadicon(0,idi_application);
  window.hcursor := loadcursor(0,idc_arrow);
  window.hbrbackground:=1;
  window.lpszmenuname := nil;
  window.lpszclassname := 'main_window';
  registerclassex(window);// регистрируем в системе новый класс окна
  // создаем окно
  Form:= createwindowex(0,'main_window','Hello World from WinApi', WS_OVERLAPPEDWINDOW,300,300,350,130,0,0,hinstance,nil);
  label1:=CreateWindow('static','Ты уже посмотрел на размер?',WS_POPUP or WS_CHILD or BS_CENTER or SS_CENTER,6,25,330,40,Form,HLABEL,hInstance,nil);
  Button:=CreateWindow('button','Кликать сюда',WS_VISIBLE or WS_CHILD or WS_CLIPSIBLINGS,6,73,110,25,Form,HBTN,hInstance,nil);
  // показываем окно
  ShowWindow(Form,SW_SHOW);
end;

procedure RegChildClass; // зарегистрируем класс для дочерних окон
begin
  //заполняем структуру нового класса окна
  window.cbsize := sizeof (window);
  window.style := cs_hredraw or cs_vredraw;
  window.lpfnwndproc := @childwindowproc; // указываем классу на адресс функции обработывающей сообщения
  window.cbclsextra := 0;
  window.cbwndextra := 0;
  window.hinstance := hinstance;
  window.hicon := loadicon(0,idi_application);
  window.hcursor := loadcursor(0,idc_arrow);
  window.hbrbackground:=2;
  window.lpszmenuname := nil;
  window.lpszclassname := 'child_window';
  registerclassex(window);// регистрируем в системе новый класс окна
end;

begin
  CreateWinApiForm;
  RegChildClass;
  while getmessage(mmsg,0,0,0) do
  begin
    translatemessage(mmsg); // переводит сообщения виртуальных клавиш в символьные сообщения
    dispatchmessage(mmsg); // функция сообщения оконному обработчику событий, у нас это WindowProc
  end;
end.

Последний раз редактировалось bulldog, 26.09.2010 в 13:17.
Ответить с цитированием
  #2  
Старый 26.09.2010, 13:29
bulldog bulldog вне форума
Начинающий
 
Регистрация: 10.05.2010
Сообщения: 160
Репутация: 14
По умолчанию

Вопрос снят, просто нада было избавится от SetParent(ChildForm, Form);
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:52.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025