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

Вниз

SetWindowRgn   Найти похожие ветки 

 
Dib@zol ©   (2007-08-31 15:12) [0]

Почему сабж не работает с дочерними окнами проги и как заставить его с ними таки работать (сиречь задавать нужный регион)? В СДК ничего не сказано про это, гуглился - тоже ничего не надыбал... Как быть?


 
Сергей М. ©   (2007-08-31 15:14) [1]


> Почему сабж не работает с дочерними окнами


Обязана работать.


 
Dib@zol ©   (2007-08-31 15:18) [2]

Неа. Создаю я напр лабел класса STATIC на окне родителе - нихрена! Прямоугольник несмотря на задание региона! Убираю при создании флаг ВС_ЧАЙЛД и всё пашет! Только метка уже не на родительском окне... плохо.


 
Сергей М. ©   (2007-08-31 15:22) [3]

А что говорит рез-т вызова ф-ции ?


 
Dib@zol ©   (2007-08-31 15:41) [4]

Ага. Вернула результат 1. Это означает некую ошибку. Какую только? ГетЛастЕррор после выполнения вернул 0!


 
Сергей М. ©   (2007-08-31 15:46) [5]

Return Values

If the function succeeds, the return value is nonzero

Т.е. ф-ция успешно отработала, так что не парь уже мозги насчет "не работает")


 
Dib@zol ©   (2007-08-31 15:52) [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 16:04) [7]

А зачем ты создаешь доч.окно в оконной ф-ции род.окна ?
Создавай его после отработки ф-ции создания род.окна.


 
Dib@zol ©   (2007-08-31 16:32) [8]

Хм. А как ты себе это представляешь?
Я вынес в отдельную процедуру всё содержимое WM_CREATE, и проставил единственным параметром имя родительского окна. Я эту процедуру млн пытался использовать везде! WM_ACTIVATE, WM_TIMER, WM_PAINT (c флагом единственного выполнения ессно) - ничего не помогло! Вынул даже из самой оконной процедуры! Поставил вызов этой процедуры после UpdateWindow - ноль реакции! Лабел как был квадратным, так и остался.

Люди! Если кто из вас встречался с такой проблемой - пожалуйста скажите как её решить.


 
clickmaker ©   (2007-08-31 16:37) [9]

L:=CreateWindowEx(0, "STATIC", "Elliptic Label", WS_VISIBLE or
      WS_CHILD or WS_CLIPSIBLINGS, 10, 10, 100, 100, hWnd, 0, HInstance, nil);


 
Сергей М. ©   (2007-08-31 16:38) [10]


> как ты себе это представляешь?


Оч просто:

hParent := CreateWindowEx(..);
hChild := CreateWindowEx(..hParent ..);
...
SetWindowRgn(hChild);


 
Dib@zol ©   (2007-08-31 16:46) [11]

> [10] Сергей М. ©   (31.08.07 16:38)

Делал так уже. Не помогло.

> [9] clickmaker ©   (31.08.07 16:37)

ДААААА!!!! УРРЯЯЯЯЯ!!! Заработало! Гранреспект.



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

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

Наверх




Память: 0.49 MB
Время: 0.03 c
2-1188821144
-=Le][=-
2007-09-03 16:05
2007.09.30
Как выравнять текст по левому краю


2-1189065859
Gydvin
2007-09-06 12:04
2007.09.30
Снова о wmf


2-1188969414
alshtam
2007-09-05 09:16
2007.09.30
печать


15-1188795881
Palladin
2007-09-03 09:04
2007.09.30
Монстроидальный Unit


2-1188675339
WebSQLNeederr
2007-09-01 23:35
2007.09.30
inttostr(i/100) а КАК?