Автор: XCV81
Дата сообщения: 07.08.2012 15:22
написал небольшую прогу без vcl использую winapi, при запуске открывается окошко в нем 2 объекта: RichEdit и кнопка, в RichEdit выводится некоторая информация, а кнопка просто ее обновляет, все хорошо, но... окошко получается определенного размера в котором и размещены эти объекты, но при попытке изменить размер окна программы - размер формы меняется, а вот размер объектов и их положение остаются неизменными... как сделать чтобы при изменении размера окна программы менялись и размер/положение остальных объектов?
Главную форму и объекты на ней создаю так:
[more]
// Заполняем структуру TWndClassEx
with Wc do
begin
style := CS_HREDRAW or CS_VREDRAW;
cbSize := Sizeof( Wc );
lpfnWndProc := @WindowProc; //указатель на оконную процедуру
cbClsExtra := 0; //Выделенная память, используемая программой по своему усмотрению.
cbWndExtra := 0; //Выделенная память, используемая программой по своему усмотрению.
hInstance := hInstance; //описатель экземпляра приложения
hbrBackground := COLOR_BTNFACE+1; //цвет фона формы.
lpszClassName := WndClass; //имя класса создаваемого объекта
end;
// Регистрируем класс в системе
RegisterClassEx( Wc );
//Создаём окно
Wnd := CreateWindowEx ( 1, WndClass, WndCaption, WS_SYSMENU or WS_MINIMIZEBOX or WS_SIZEBOX or WS_MAXIMIZEBOX, (GetSystemMetrics(0) - (GetSystemMetrics(0) Div 2)) div 2, (GetSystemMetrics(1) - (GetSystemMetrics(1) Div 2)) div 2, GetSystemMetrics(0) Div 2, GetSystemMetrics(1) Div 2, 0, 0, hInstance, nil);
SendMessage(Wnd, WM_SETICON, 1, LoadIcon(HInstance, 'MAINICON')); //иконка приложения
// Показываем окно программы
ShowWindow( Wnd, SW_SHOWNORMAL );
// Создаём элементы окна
GetWindowREct(Wnd,R);
Buttons := CreateWindowEx( WS_EX_STATICEDGE, 'Button', PAnsiChar('Обновить'), BS_DEFPUSHBUTTON or WS_VISIBLE or WS_CHILD, 10, R.Bottom-R.Top-60, R.Right-R.Left-30, 25, Wnd, 101, hInstance, nil );
hRichDll := LoadLibrary('Riched20.dll');
RichEdit1 := CreateWindowEx (WS_EX_STATICEDGE,'RichEdit20W','',WS_VISIBLE or WS_VSCROLL or WS_HSCROLL or WS_CHILD or ES_AUTOVSCROLL or ES_WANTRETURN or ES_MULTILINE, 10, 10, R.Right-R.Left-30, R.Bottom-R.Top-80,Wnd,0,Hinstance,nil);
[/more]
для перерисовки объектов после изменения размера главной формы добавил в обработчик сообщений:
[more]
WM_SIZE:
begin
GetWindowREct(Wnd,R);
InvalidateRect(Wnd, nil, TRUE);
InvalidateRect(RichEdit1, nil, TRUE);
InvalidateRect(Buttons, nil, TRUE);
UpdateWindow(Wnd) ;
UpdateWindow(Buttons) ;
UpdateWindow(RichEdit1) ;
end;
[/more]
по идее все объекты должны перерисоваться причем дважды, однако ни размер, ни их положение не меняется. Попробовал туда же добавить команду удаления кнопки и заново ее создать:
[more]
WM_SIZE:
begin
GetWindowREct(Wnd,R);
InvalidateRect(Wnd, nil, TRUE);
InvalidateRect(RichEdit1, nil, TRUE);
UpdateWindow(Wnd) ;
UpdateWindow(RichEdit1) ;
DestroyWindow(Buttons);
Buttons := CreateWindowEx( WS_EX_STATICEDGE, 'Button', PAnsiChar('Обновить'), BS_DEFPUSHBUTTON or WS_VISIBLE or WS_CHILD, 10, R.Bottom-R.Top-60, R.Right-R.Left-30, 25, Wnd, 101, hInstance, nil );
end;
[/more]
получилось вообще забавно, после изменения размеров кнопки создается новая кнопка с "правильными" размером и положением, но дополнительно появляется и кнопка которая была изначально, тоесть получается 2 кнопки с одной и той же функцией, но разных размеров и в разных местах (откуда вообще берется 2-я кнопка), к слову если из последнего кода выбросить команду по созданию кнопки - то после изменения размеров окна кнопка просто пропадает (в принципе так и должно быть) - следовательно 1 команда Buttons := CreateWindowEx( WS_EX_STATICEDGE, 'Button', PAnsiChar('Обновить'), BS_DEFPUSHBUTTON or WS_VISIBLE or WS_CHILD, 10, R.Bottom-R.Top-60, R.Right-R.Left-30, 25, Wnd, 101, hInstance, nil ); создает 2 каким-то образом кнопки - "правильную" и "не правильную"...
Подскажите пожалуйста как правильно заставить изменяться объекты при изменении формы.
Заранее благодарен.