MDI окно на чистом WinApi

Nikeagrad
Дата: 25.04.2011 19:45:40
Уважаемые программисты!
Прошу Вас показать работающий Delphi пример MDI окон на чистом WinApi без VCL или помогите пожалуйста исправить мой пример. Хоть тресни, но не хочет у меня создаваться окно "Child_Window". :-(

Program Api2;

uses
  Windows, Messages;
  
var
 window,window2: TWndClassEx;
 Mwindow: HWND;
 Mmsg: TMsg;
 
function MDIWndProc(Wnd: HWND; uMsg: UINT; lP: LPARAM; wP: WPARAM): LRESULT; stdcall;
begin
  case uMsg of
    WM_CREATE: ;
  else
    Result := DefMDIChildProc(Wnd, uMsg, wP, lP);
  end;
end;

function GetMDIWnd(AParent: HWND; AInst: HMODULE): HWND; stdcall;
begin
   window2.Style := CS_HREDRAW or CS_VREDRAW; //стиль класса главного окна
   window2.hIcon := LoadIcon(Mwindow, IDC_ARROW); //иконка программы
   window2.lpfnWndProc := @MDIWndProc; //назначение обработчика сообщений
   window2.hInstance := HInstance;
   window2.hbrBackground := COLOR_BTNFACE + 1; //цвет окна
   window2.lpszClassName:='Child_Window'; //класс окна
   window2.hCursor := LoadCursor(0, IDC_ARROW); //активный курсор

  if RegisterClassEx(window2) = 0 then MessageBox(AParent, 'Класс Child не зарегистрирован', 'Сообщение', MB_OK);
  
  Mwindow := CreateWindowEx(0, 'Child_Window', 'Child', 
            WS_SYSMENU or WS_CAPTION or WS_CHILD or WS_CLIPCHILDREN or WS_VISIBLE, 
			50, 50, 
			300, 300, 
			0, 0, Mwindow, nil);  
			
	ShowWindow(Mwindow, SW_SHOW);		
 
end;  
 
// Процедура обработки сообщений
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;
   else
    Result:=DefWindowProc(wnd,msg,wparam,lparam);
 end;
end;

// Регистрация созданого класса
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_APPWORKSPACE + 1; //цвет окна
 window.lpszMenuName :=nil;
 window.lpszClassName:='Main_Window';
 RegisterClassEx (window);
 
 // Создание основного окна
 Mwindow:=CreateWindowEx(0,'Main_Window','First_WinAPI_Program',WS_OVERLAPPEDWINDOW or WS_VISIBLE,
CW_USEDEFAULT,SW_SHOWMAXIMIZED,800,600,0,0,Hinstance,nil);

 GetMDIWnd(Mwindow, HInstance);
 
 // Цикл обработки сообщений
 while GetMessage(Mmsg,0,0,0) do
  begin
   TranslateMessage(Mmsg);
   DispatchMessage(Mmsg);
  end;
end.
schi
Дата: 26.04.2011 14:37:01
Nikeagrad,

RTFS: Forms.pas, procedure TCustomForm.CreateWnd; там все написано. Обратить внимание на слово ClientCreateStruct
для MDIChild окон родительским служит не overlapped-окно, а специальное окно класса MDICLIENT. Его надо создать до создания первого дочернего окна