Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.162 c
5-1141114827
Creative
2006-02-28 11:20
2006.10.15
ссылка на объект в строке StringGrid`а


15-1158757874
Cyrax
2006-09-20 17:11
2006.10.15
Языковая панель в Windows XP


1-1157332401
Viacheslav
2006-09-04 05:13
2006.10.15
Чтобы сообщения клавы получала только форма?


2-1159378202
berezne
2006-09-27 21:30
2006.10.15
Запуск БД без принтера


1-1157526893
Term
2006-09-06 11:14
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский