Текущий архив: 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