Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дочернее окно закрывает полностью MDI приложение 
V
    Опции темы
Javaca
  Дата 27.4.2011, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 17.3.2011

Репутация: нет
Всего: нет



Уважаемые программисты! 
С грехом пополам пытался сделать MDI приложение с родительским и дочерним окном и вот что получилось. Все работает и визуально похоже на MDI. Проблема заключается в том, что когда закрываешь дочернее окно, закрываются оба окна. В WM_CLOSE прописывал DestroyWindow(wnd), результатов не принесло. В чем дело не пойму.

Помогите пожалуйста сделать корректное закрытие дочернего окна. 

Пример кода:

Код

program api3;

uses
  Windows, Messages;

var
 window: TWndClassEx;
 Mwindow: HWND;
 Mmsg: TMsg;
 ClientCreateStruct: TClientCreateStruct;  
 
// Процедура обработки сообщений
function WindowProc(wnd: HWND; msg: integer;  wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
begin
 case msg of
    WM_CLOSE:
     begin
       MessageBox(0, 'Попытка закрыть дочернее окно', 'Сообщение', MB_OK); //DestroyWindow(wnd);
     end;
    WM_DESTROY:
     begin
        PostQuitMessage(0);
        Result:=0;
        Exit;
     end;
     else
        Result:=DefWindowProc(wnd,msg,wparam,lparam);
 end;
end; 
 
function MDIChild(AParent: HWND; AInst: HMODULE): HWND; stdcall;
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:=COLOR_BTNFACE + 1; //цвет окна
 window.lpszMenuName :=nil;
 window.lpszClassName:='Child_Window';
 RegisterClassEx (window);
 
  Result:= CreateWindowEx(WS_EX_APPWINDOW, 'Child_Window', 'Дочернее окно', 
            WS_SYSMENU or WS_CAPTION or WS_CHILD or WS_CLIPCHILDREN or WS_VISIBLE, 
            50, 50, 
            300, 300, 
            AParent, 0, AInst, nil); 
        
end;    

    
begin
 // Создание основного окна
 Mwindow:=CreateWindowEx(0,'MDICLIENT','Родительское окно',
 WS_OVERLAPPEDWINDOW or WS_VISIBLE,
 CW_USEDEFAULT,SW_SHOWMAXIMIZED,800,600,0,0,1,@ClientCreateStruct);

 //Создание дочернего окна 
 MDIChild(Mwindow, HInstance); 
 
 // Цикл обработки сообщений
 while GetMessage(Mmsg,0,0,0) do
  begin
      TranslateMessage(Mmsg);
      DispatchMessage(Mmsg);
  end;
end.

PM MAIL   Вверх
Frees
Дата 28.4.2011, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: нет
Всего: 54



а почему все на голом API? 
боязнь VCL, или ... .

Добавлено через 1 минуту и 42 секунды
если религия позволить использовать VCL то File - New - Other - MDI Application и увидите пример MDI приложения.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Frees
Дата 28.4.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: нет
Всего: 54



Код

    WM_DESTROY:
     begin
//        PostQuitMessage(0);



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Javaca
Дата 28.4.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 17.3.2011

Репутация: нет
Всего: нет



Цитата(Frees @ 28.4.2011,  12:53)
а почему все на голом API? 
боязнь VCL, или ... .

Добавлено @ 12:54
если религия позволить использовать VCL то File - New - Other - MDI Application и увидите пример MDI приложения.


Да с VCL проблем нет, в два клика мышки MDI делаются. Мне нужно сделать на голом API.   smile  

Спасибо большое, у меня ума не хватило закомментирировать PostQuitMessage(0);  Одна голова хорошо, а две еще лучше. 

Теперь после закомментирования висит процесс.

Это сообщение отредактировал(а) Javaca - 28.4.2011, 14:55
PM MAIL   Вверх
Frees
Дата 28.4.2011, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: нет
Всего: 54



Цитата(Javaca @  28.4.2011,  17:47 Найти цитируемый пост)
Теперь после закомментирования висит процесс.

может тут ответ найдешь
http://forum.interwizard.ru/showthread.php?t=241&page=1



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Javaca
Дата 21.5.2011, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 17.3.2011

Репутация: нет
Всего: нет



Цитата(Frees @  28.4.2011,  14:57 Найти цитируемый пост)
может тут ответ найдешь


Вопрос решил по простому, работает как часы.  smile 

Код

program api4;

uses
  Windows, Messages;

var
 winc: TWndClass;
 hClientWindow: HWND;
 Mmsg: TMsg;

function FrameProc(wnd: HWND; msg: integer;  wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
var
  ccs: TClientCreateStruct;
begin
 case msg of
    WM_DESTROY:
      begin
        PostQuitMessage(0);
        Result:=0;
        Exit;
      end;
    WM_CREATE:
      begin
        ccs.hWindowMenu := 0;
        ccs.idFirstChild := 0;
        
        hClientWindow := CreateWindow('MDICLIENT', nil, WS_CHILD or WS_CLIPCHILDREN or
          WS_VISIBLE, 0, 0, 0, 0, wnd, $CAC, HInstance, @ccs);
        
        // Создание дочернего окна        
        CreateMDIWindow('MDICHILD' , 'Дочернее окно' , 0,
             (GetSystemMetrics(SM_CXSCREEN) - 400) div 2, (GetSystemMetrics(SM_CYSCREEN) - 200) div 2 ,
             400 , 200 ,
             hClientWindow , HInstance , 0
             );    
             
      end;    
 end;
 Result:=DefFrameProc(wnd , hClientWindow , msg , wparam , lparam);
end; 

    
begin
    winc.style            :=CS_HREDRAW or CS_VREDRAW;
    winc.lpfnWndProc    :=@FrameProc;
    winc.cbClsExtra     :=0;
    winc.cbWndExtra     :=0;
    winc.hInstance      :=HInstance;
    winc.hIcon          :=LoadIcon (0,IDI_APPLICATION);
    winc.hCursor        :=LoadCursor (0,IDC_ARROW);
    winc.hbrBackground  :=COLOR_APPWORKSPACE+1; //цвет основного окна
    winc.lpszMenuName   :=nil;
    winc.lpszClassName    := 'FRAMEWINDOW';
      if RegisterClass(winc) = 0 then Exit;

    winc.lpfnWndProc    := @DefMDIChildProc;
    winc.hbrBackground  :=COLOR_BTNFACE + 1; //цвет дочернего окна
    winc.lpszClassName    := 'MDICHILD';
      if RegisterClass(winc) = 0 then Exit;

    // Создание основного окна
    CreateWindow('FRAMEWINDOW' , 'Основное окно' ,
            WS_OVERLAPPEDWINDOW or WS_VISIBLE ,
            CW_USEDEFAULT , SW_SHOWMAXIMIZED ,
            800 , 600 ,
            0 , 0 , hInstance , nil); 
 

 // Цикл обработки сообщений
 while GetMessage(Mmsg,0,0,0) do
  begin
      TranslateMessage(Mmsg);
      DispatchMessage(Mmsg);
  end;
end.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1014 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.