Форум: "Media";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
ВнизПомогите с 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 вся ветка
Форум: "Media";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.016 c