Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

MDIClient и дочерние окна   Найти похожие ветки 

 
watashi ©   (2006-05-19 14:43) [0]

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


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 13:32) [1]

При создании клиента Добавить в 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);


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

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


 
EDWARDMM ©   (2006-05-31 20:05) [3]

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



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.058 c
15-1158757271
DelphiLexx
2006-09-20 17:01
2006.10.15
Структура будущей проги


15-1158834648
kroner
2006-09-21 14:30
2006.10.15
Работа с большими числами


6-1148129528
Замок
2006-05-20 16:52
2006.10.15
Никто не подскажет, как сделать arp spoofing средствами delphi ?


15-1159032226
vidiv
2006-09-23 21:23
2006.10.15
Подскажите, как максимально просто сделать звонок (на дверь)...


2-1159532700
zac
2006-09-29 16:25
2006.10.15
Зарисовка сегмента круга





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский