Показать сообщение отдельно
  #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.
Ответить с цитированием