Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2010, 22:44   #1
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию Создание дочернего окна на Win Api

Решил написать на winapi т.к. vlc сильно кушает систему. сделал окно, кнопку, а как на создать дочернее окно ума не приложу, да и гугл молчит. Код у меня такой
Код:
program WinApiWindows;

uses
  Windows,
  Messages;

const
  HBTN = 1;
  HLABEL = 2;
var
  window:  TWndClassex;
  Form, Button, Label1:   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: MessageBox(Form,'Вы нажали на кнопку','Загаловок',0);
    end;
    end;
  else
    result := defwindowproc(wnd,msg,wparam,lparam);
  end;
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_VISIBLE or WS_CHILD or BS_TEXT,6,25,330,40,Form,HLABEL,hInstance,nil);
  Button:=CreateWindow('button','Кликать сюда',WS_VISIBLE or WS_CHILD,6,73,110,25,Form,HBTN,hInstance,nil);
  // показываем окно
  ShowWindow(Form,SW_SHOW);
end;

begin
  CreateWinApiForm;
  while getmessage(mmsg,0,0,0) do
  begin
    translatemessage(mmsg); // переводит сообщения виртуальных клавиш в символьные сообщения
    dispatchmessage(mmsg); // функция сообщения оконному обработчику событий, у нас это WindowProc
  end;
end.
bulldog5293 вне форума Ответить с цитированием
Старый 25.09.2010, 22:58   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

SetParent?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 25.09.2010, 23:13   #3
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

DomiNick у меня проблема не в том что я незнаю какой параметр или свойство использовать, а в том что я не могу понять как оно создаётся в плане кода, т.к. в сети я смог наткнуться только на то как одно окно создавать.
Сории, я понял наконец, прост нада было в var объявить 2 форму и в CreateWinApiForm её прописать, вопрос снят, спс

Последний раз редактировалось bulldog5293; 25.09.2010 в 23:15.
bulldog5293 вне форума Ответить с цитированием
Старый 25.09.2010, 23:24   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Сделайте второй класс для дочерних окон... ChildWindows например назовите...
И наверное для них потребуется отдельная ChildWindowsProc...
После создания дочерней делать ей SetParent(Form2, Form);
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 26.09.2010, 00:02   #5
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Ещё раз спс, попробую
bulldog5293 вне форума Ответить с цитированием
Старый 26.09.2010, 00:42   #6
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

Народ сории и модераторы не ругайти, но всё таки так и не могу понять как при нажатии кнопки создавать дочернее окно. На совет
Цитата:
Сделайте второй класс для дочерних окон... ChildWindows например назовите...
И наверное для них потребуется отдельная ChildWindowsProc...
После создания дочерней делать ей SetParent(Form2, Form);
В гугле не чего не нашёл
bulldog5293 вне форума Ответить с цитированием
Старый 26.09.2010, 02:12   #7
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Второй TWndClassex наверное можно и не объявлять, если первый больше не потребуется то его же и используем...

Код:
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
              MessageBox(Form,'Вы создали дочернюю форму!','ура-ура-ура-ура',0);
              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_VISIBLE or WS_CHILD or BS_CENTER or SS_CENTER or WS_CLIPSIBLINGS,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.
2 часа ночи, возможно пишу бред спросонья, но вроде запускаетса... %)
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание окна средствами API!! LovePower Общие вопросы C/C++ 2 07.03.2010 21:29
WM_KYEDOWN у дочернего окна. MSga Win Api 9 02.01.2010 18:09
API определение дочернего окна senia Win Api 6 25.12.2009 01:23
Изменение данных дочернего окна damned20 Win Api 1 11.08.2009 13:04
Разбиение дочернего окна на колонки... HunterMan Win Api 3 03.04.2008 23:19