Робота з opengl - введення, delphisite

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; ;

Схожі статті