procedure TForm2. Button1Click # 40; Sender: TObject # 41; ;
H: = FindWindow # 40; 'TForm1'. 'Form1' # 41; ;
if H <> 0 then
ShowMessage # 40; 'Є Form1!' # 41;
ShowMessage # 40; 'Ні Form1!' # 41;
procedure TForm2. FormMouseMove # 40; Sender: TObject;
Shift: TShiftState; X, Y: Integer # 41; ;
Caption: = 'x =' + IntToStr # 40; X # 41; + ', Y =' + IntToStr # 40; Y # 41; ;
У заголовок форми виводяться координати покажчика миші.
Запустіть два примірника програми і зверніть увагу, що вікно, яке має фокус ( "неактивне"), теж реагує на переміщення покажчика по його поверхні.
Маючи посилання на вікно, додаток може виробляти з ним будь-які дії, шляхом надсилання йому повідомлень.
Змінимо код обробки клацання кнопки:
procedure TForm2. Button1Click # 40; Sender: TObject # 41; ;
H: = FindWindow # 40; 'TForm1'. 'Form1' # 41; ;
if H <> 0 then
SendMessage # 40; H, WM_CLOSE, 0. 0 # 41; ;
Якщо є вікно класу 'TForm1' з заголовком 'Form1', наше додаток посилає йому повідомлення WM_CLOSE - намагається закрити вікно.
Точно також, якщо необхідно намалювати що-небудь на поверхні чужого вікна, необхідно отримати посилання на це вікно.
Для початку спробуємо малювати на поверхні рідного вікна.
Додайте ще одну кнопку, обробку клацання якої приведіть до виду:
procedure TForm2. Button2Click # 40; Sender: TObject # 41; ;
dc: = GetDC # 40; Handle # 41; ;
Rectangle # 40; dc, 10. 10. 110. 110 # 41; ;
ReleaseDC # 40; Handle, dc # 41; ;
Відкрийте програму. При натисканні на доданій кнопці на поверхні вікна малюється квадрат. Для малювання використовуємо низькорівневі функції Windows.
Спробуємо малювати на поверхні чужого вікна, для чого змінимо щойно написаний код:
procedure TForm2. Button2Click # 40; Sender: TObject # 41; ;
Window: = FindWindow # 40; 'TForm1'. 'Form1' # 41; ;
if Window <> 0 then
dc: = GetDC # 40; Window # 41; ;
Rectangle # 40; dc, 10. 10. 110. 110 # 41; ;
ReleaseDC # 40; Handle, dc # 41; ;
А обробник події OnCreate форми починається з наступних рядків:
DC: = GetDC # 40; Handle # 41; ;
hrc: = wglCreateContext # 40; DC # 41; ;
wglMakeCurrent # 40; DC, hrc # 41; ;
Тобто ми отримуємо контекст відтворення Windows, задаємо бажаний формат пікселів, створюємо контекст відтворення OpenGL і робимо його поточним, щоб викликані функції OpenGL могли працювати з цим вікном.
З приводу формату пікселів ми поговоримо докладніше трохи пізніше, а зараз я хотів би звернути увагу на два моменти.
По-перше, величину типу HDC ми отримуємо при створенні вікна, в обробнику події OnCreate, або, іншими словами, в обробнику повідомлення WM_CREATE. Це є звичайним і традиційному для Windows-програм.
Деякі програмісти зробили мені зауваження, що отримання контексту відтворення при створенні вікна є дещо некоректним для Windows 9X і більш правильним було б отримання контексту в обробнику подій OnShow або OnPaint. Можливо, це так і є, і в деяких ситуаціях може позначитися на коректності роботи програми. Ви повинні враховувати це при написанні відповідальних додатків.
По-друге, контекст відтворення Windows і контекст відтворення OpenGL зазвичай звільняються додатком. Тобто, команди виведення OpenGL зазвичай обрамляются такими рядками:
dc: = BeginPaint # 40; Window, ps # 41; ;
wglMakeCurrent # 40; DC, hrc # 41; ;
wglMakeCurrent # 40; 0. 0 # 41; ;
EndPaint # 40; Window, ps # 41; ;
ReleaseDC # 40; Window, dc # 41; ;