![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SetWindowRgn
Dib@zol © (2007-08-31 15:12:00)Почему сабж не работает с дочерними окнами проги и как заставить его с ними таки работать (сиречь задавать нужный регион)? В СДК ничего не сказано про это, гуглился - тоже ничего не надыбал... Как быть?
Dib@zol (2007-08-31 16:46:00) [1]> [10] Сергей М. © (31.08.07 16:38)
Делал так уже. Не помогло.
> [9] clickmaker © (31.08.07 16:37)
ДААААА!!!! УРРЯЯЯЯЯ!!! Заработало! Гранреспект.
Сергей М. (2007-08-31 16:38:00) [2]
> как ты себе это представляешь?
Оч просто:
hParent := CreateWindowEx(..);
hChild := CreateWindowEx(..hParent ..);
...
SetWindowRgn(hChild);
clickmaker (2007-08-31 16:37:00) [3]L:=CreateWindowEx(0, 'STATIC', 'Elliptic Label', WS_VISIBLE or
WS_CHILD or WS_CLIPSIBLINGS, 10, 10, 100, 100, hWnd, 0, HInstance, nil);
Dib@zol (2007-08-31 16:32:00) [4]Хм. А как ты себе это представляешь?
Я вынес в отдельную процедуру всё содержимое WM_CREATE, и проставил единственным параметром имя родительского окна. Я эту процедуру млн пытался использовать везде! WM_ACTIVATE, WM_TIMER, WM_PAINT (c флагом единственного выполнения ессно) - ничего не помогло! Вынул даже из самой оконной процедуры! Поставил вызов этой процедуры после UpdateWindow - ноль реакции! Лабел как был квадратным, так и остался.
Люди! Если кто из вас встречался с такой проблемой - пожалуйста скажите как её решить.
Сергей М. (2007-08-31 16:04:00) [5]А зачем ты создаешь доч.окно в оконной ф-ции род.окна ?
Создавай его послеотработки ф-ции создания род.окна.
Dib@zol (2007-08-31 15:52:00) [6]Не веришь? Пожалста. Вот пример:
program Test;
{$Warnings off}
{$Hints off}
uses
Windows, Messages;
const
WW = 300;
WH = 170;
CN = 'TEST_WND';
WN = 'Test';
var
M : MSG;
R : HRGN;
W, L : HWND;
WC : WNDCLASS;
WXPos, WYPos : Word;
function WindowProc(hWnd: HWND; Msg, WParam, LParam: LongInt): LongInt; stdcall;
begin
Result:=0;
case Msg of
WM_CREATE:
begin
L:=CreateWindowEx(0, 'STATIC', '', WS_VISIBLE or
WS_CHILD, 10, 10, 100, 100, hWnd, 0, HInstance, nil);
R:=CreateEllipticRgn(0, 0, 100, 100);
SetWindowRgn(L, R, true);
end;
WM_CLOSE:
begin
DestroyWindow(L);
DeleteObject(R);
DestroyWindow(hWnd);
end;
WM_DESTROY: PostQuitMessage(0);
else Result:=DefWindowProc(hWnd, Msg, WParam, LParam);
end;
end;
begin
WXPos:=round((GetSystemMetrics(SM_CXSCREEN)-WW)/2);
WYPos:=round((GetSystemMetrics(SM_CYSCREEN)-WH)/2);
With WC do begin
Style := CS_HREDRAW or CS_VREDRAW;
lpfnWndProc := @WindowProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := sysInit.HInstance;
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := CreateSolidBrush(0);
lpszClassName := CN;
end;
RegisterClass(WC);
W := CreateWindowEx(0, CN, WN, WS_VISIBLE or WS_SYSMENU,
WXPos, WYPos, WW, WH, 0, 0, HInstance, nil);
ShowWindow(W, SW_SHOWNORMAL);
UpdateWindow(W);
while GetMessage(M, 0, 0, 0) do begin
TranslateMessage(M);
DispatchMessage(M);
end;
Halt(M.wParam);
end.
Сергей М. (2007-08-31 15:46:00) [7]Return Values
If the function succeeds, the return value is nonzero
Т.е. ф-ция успешно отработала, так что не парь уже мозги насчет "не работает")
Dib@zol (2007-08-31 15:41:00) [8]Ага. Вернула результат 1. Это означает некую ошибку. Какую только? ГетЛастЕррор после выполнения вернул 0!
Сергей М. (2007-08-31 15:22:00) [9]А что говорит рез-т вызова ф-ции ?
Dib@zol (2007-08-31 15:18:00) [10]Неа. Создаю я напр лабел класса STATIC на окне родителе - нихрена! Прямоугольник несмотря на задание региона! Убираю при создании флаг ВС_ЧАЙЛД и всё пашет! Только метка уже не на родительском окне... плохо.
Сергей М. (2007-08-31 15:14:00) [11]
> Почему сабж не работает с дочерними окнами
Обязана работать.