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

Вниз

Помогите с opengl   Найти похожие ветки 

 
Raph   (2003-10-16 12:22) [0]

Что нужно добавить чтоб какртинка не мерцала при движении курсора над формой?
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL;

type
TfrmGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

private
hrc: HGLRC;
DC: HDC;
{позиция курсора}
xpos : GLfloat;
ypos : GLfloat;
procedure SetDCPixelFormat;
protected

end;

var
frmGL: TfrmGL;

implementation

{$R *.DFM}

{=======================================================================
Перерисовка окна}
procedure TfrmGL.FormPaint(Sender: TObject);
var
i : 1..40;

ps : TPaintStruct;
begin
BeginPaint(Handle, ps);
glViewPort (0, 0, ClientWidth, ClientHeight);
glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета
glClear(GL_DEPTH_BUFFER_BIT);
glClearColor(0.1,0.2,0.4,0.3);
For i := 1 to 40 do begin
glColor3f (random, random, random);
glPointSize (random (10));
glBegin (GL_POINTS);
glVertex2f (xpos + 0.2 * random * sin (random (360)),
ypos + 0.2 * random * cos (random (360)));
glEnd;
end;
SwapBuffers(dc); // содержимое буфера - на экран
EndPaint(Handle, ps);
end;

{=======================================================================
Формат пикселя}
procedure TfrmGL.SetDCPixelFormat; //(hdc : HDC);
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
with pfd do begin
nSize := sizeof(pfd); // Size of this structure
nVersion := 1; // Version number
dwFlags := PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER; // Flags
iPixelType:= PFD_TYPE_RGBA; // RGBA pixel values
cColorBits:= 24; // 24-bit color
cDepthBits:= 32; // 32-bit depth buffer
iLayerType:= PFD_MAIN_PLANE; // Layer type
end;

nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);

end;

{=======================================================================
Создание формы}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
Randomize;
DC := GetDC(Handle);
SetDCPixelFormat;
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
end;

{=======================================================================
Конец работы приложения}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0); wglDeleteContext(hrc);
end;

{=======================================================================
Обрабока движения курсора}
procedure TfrmGL.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
xpos := 2 * X / ClientWidth - 1;
ypos := 2 * (ClientHeight - Y) / ClientHeight - 1;
Refresh; // перерисовка окна при каждом движении курсора
end;

end.


 
BOA_KAA ©   (2003-10-16 14:49) [1]

Вместо Refresh использовать InvalidateRect(handle, nil, False) (кажется, в таком порядке)

PS.
> glVertex2f (xpos + 0.2 * random * sin (random (360)),
> ypos + 0.2 * random * cos (random (360)));

Функции sin и cos - это для радиан, а не для градусов, советую исправить, а то просто некорректно выглядит


 
miek ©   (2003-10-16 16:56) [2]

1) Убрать BeginPaint/EndPaint
2) Запретить системе перерисовывать бэкграунд (обрабатывать самому WM_OnEraseBkgnd)


 
Raph   (2003-10-16 22:04) [3]

Спасибо, все теперь нормально!!



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

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

Наверх




Память: 0.47 MB
Время: 0.02 c
3-53407
Karlson
2004-01-26 15:16
2004.02.17
скролинг в DbGrid


3-53363
Andriy Tysh
2004-01-28 11:11
2004.02.17
stack overloor in DBGridEh.Notification при создании формы


4-53809
kvit
2003-12-12 23:51
2004.02.17
Как записать/читать физический сектор на диске под Win98/NT/2000


3-53426
}|{yk
2004-01-26 11:25
2004.02.17
В какой системной таблице находятся названия таблиц?


8-53653
kin_soft
2003-10-15 08:34
2004.02.17
Рисование на рабочем столе