Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MDIClient и дочерние окна [D7, WinXP]


watashi ©   (2006-05-19 14:43:00) 

Проблема в том что дочерние окна не появляются на главном окне, хотя хендлер они получают, у них есть координаты и размеры. Может кто-нибудь знает что не так делаю? Вот код...


program Project1;
uses  Windows, Messages, SysUtils;

{$APPTYPE GUI}
{$R program.res}

var  hMainWnd  : HWND;
    hMDIClientWnd : HWND;
    msgMessage  : TMSG;
    Inst: Cardinal;

const sMainWndClass  = 'vxMainWndClass';
     sChildWndClass = 'vxChildWndClass';

procedure ShowMessage(Str : PCHAR);
begin
MessageBox(0,Str,'Message',MB_OK);
end;

// main windowprocedure
function MainWndProc(Window: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall;
var
 AMsg : TMessage;
 CCS  : TClientCreateStruct;
 hChild: HWND;
 Rect: TRect;
 inf:TWindowInfo
begin
AMsg.Msg    := AMessage;
AMsg.WParam := WParam;
AMsg.LParam := LParam;
AMsg.Result := 0;
case AMessage of
 WM_CREATE: begin // creating MDICLIENT
             CCS.hWindowMenu:=GetSubMenu(GetMenu(Window),1);
             CCS.idFirstChild:=2000;
             hMDIClientWnd:=CreateWindow('MDICLIENT',nil,WS_CHILD{ or WS_CLIPCHILDREN or WS_VSCROLL or WS_HSCROLL or WS_VISIBLE},0,0,0,0,Window,0,Inst,@ccs);
             if hMDIClientWnd=0 then
              begin
               MessageBox(0,'#4. "MDI Client" initialization error!','Error',MB_OK);
              end else
              begin
               ShowWindow(hMDIClientWnd, SW_NORMAL);
              end;
            end;
 WM_COMMAND: case LoWord(wParam) of
              1: begin // Creating MDIChild on menu command
                  hChild:=CreateMDIWindow(sChildWndClass,'Child Window',1,10,10,1000,600,hMDIClientWnd,Inst,0);
                  if hChild=0 then
                   begin
                    MessageBox(0,'#5. "Child window" initialization error!','Error',MB_OK);
                   end else
                   begin
                    ShowWindow(hChild, SW_NORMAL);
                   end;
                  GetWindowInfo(hChild,inf);
                  inf.dwExStyle
                  SetWindowText(Window,PChar(IntToStr(Rect.Left)+':'+IntToStr(Rect.Top)));
                 end;
              else Result:=DefFrameProc(Window, hMDIClientWnd, AMessage, wParam, lParam);
             end;
 WM_DESTROY: PostQuitMessage(0);
else
 Result:=DefWindowProc(Window, AMessage, WParam, LParam);
 Exit;
end;
Result := AMsg.Result;
end;

// child windowprocedure
function ChildWndProc(ChildWnd: HWnd; AMessage, WParam, LParam: Longint): Longint; stdcall;
var
 AMsg : TMessage;
 hdcHDC : HDC;
 PaintStruct : TPaintStruct;
 Rect : TRect;
 Col: TColorRef;
begin
AMsg.Msg    := AMessage;
AMsg.WParam := WParam;
AMsg.LParam := LParam;
AMsg.Result := 0;
case AMessage of
 WM_PAINT: begin
            hdcHDC := BeginPaint(ChildWnd,PaintStruct);
            GetClientRect(ChildWnd,Rect);
            EndPaint(ChildWnd,PaintStruct);
           end;
else
 Result:=DefMDIChildProc(ChildWnd, AMessage, WParam, LParam);
 Exit;
end;
Result := AMsg.Result;
end;

// Main window class registering
function MainWndReg(hInst: Cardinal):Boolean;
var MainWndClass: TWndClass;
begin
Result:=True;
with MainWndClass do
 begin
  style         := CS_HREDRAW or CS_VREDRAW;
  lpfnWndProc   := @MainWndProc;
  cbClsExtra    := 0;
  cbWndExtra    := 0;
  hInstance     := hInst;
  hIcon         := LoadIcon(0,IDI_WINLOGO);
  hCursor       := LoadCursor(0,IDC_ARROW);
  hbrBackground := HBRUSH(GetStockObject(GRAY_BRUSH));
  lpszMenuName  := nil;
  lpszClassName := sMainWndClass;
 end;
if RegisterClass(MainWndClass)=0 then Result:=False;
end;

// child window class registering
function ChildWndReg(hInst: Cardinal):Boolean;
var ChildWndClass: TWndClass;
begin
Result:=True;
with ChildWndClass do
 begin
  lpfnWndProc   := @ChildWndProc;
  hInstance     := hInst;
  hCursor       := LoadCursor(0,IDC_ARROW);
  hbrBackground := HBRUSH(GetStockObject(WHITE_BRUSH));
  lpszClassName := sChildWndClass;
 end;
if RegisterClass(ChildWndClass)=0 then Result:=False;
end;

// main window creation & menu load
function InitInstance(hInst:Cardinal):Boolean;
begin
Result:=True;
hMainWnd:=CreateWindow(sMainWndClass,'OS Lab 7',WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,0,0,hInstance,nil);
if hMainWnd=0 then
 begin
  Result:=False;
  Exit;
 end;
ShowWindow(hMainWnd, CmdShow);
UpdateWindow(hMainWnd);
SetMenu(hMainWnd,LoadMenu(hInstance,'MYMENU'));
end;

begin
if not MainWndReg(hInstance) then
 begin
  MessageBox(0,'#1. "MainWndClass" not registred due some error!','Error',MB_OK);
  Exit;
 end;

if not ChildWndReg(hInstance) then
 begin
  MessageBox(0,'#2. "ChildWndClass" not registred due some error!','Error',MB_OK);
  Exit;
 end;

if not InitInstance(hInstance) then
 begin
  MessageBox(0,'#3. "MainWnd" initialization error!','Error',MB_OK);
  Exit;
 end;

Inst:=hInstance;

while GetMessage(msgMessage,0,0,0)  do
 begin
  TranslateMessage(msgMessage);
  DispatchMessage(msgMessage);
 end;

Halt(msgMessage.wParam);
end.


EDWARDMM   (2006-05-31 20:05:00) [1]

Ошибка  вышла!
при создании MDICLIENT нужно указать размеры, в отой области и будет отображатся MDI окна, и с параметрами WS_CHILD or WS_CLIPCHILDREN;


MaxDAG   (2006-05-31 16:14:00) [2]

Создай hMDIClientWnd, как и hMainWnd, потом выполни SetParent( hMDIClientWnd, hMainWnd);
Дочерняя встроится на территорию hMainWnd.


EDWARDMM   (2006-05-31 13:32:00) [3]

При создании клиента Добавить в dwStyle хатябы WS_THICKFRAME и WS_CAPTION
Можно задать размеры.
hMDIClientWnd:=CreateWindow('MDICLIENT',nil, WS_MINIMIZEBOX or WS_MAXIMIZEBOX or WS_SYSMENU or WS_CHILDWINDOW or WS_CAPTION  or WS_THICKFRAME,0,0,0,0,Window,0,Inst,@ccs);


Наверх

Титульная страница Поиск, карта сайта Написать письмо