|
Вопрос # 6 581/ вопрос решён / |
|
Здравствуйте, эксперты!
Почему OpenGL не делает скрин-шот в файл? Хочется получить зеленый фон, а получается белый.
Приложение: Переключить в обычный режим- {{code}}
- unit Unit4lif;
- {
-
-
-
-
- }
- interface
-
- uses opengl,
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, ExtCtrls;
-
- type
- TForm1 = class(TForm)
- procedure FormCreate(Sender: TObject);
- procedure FormResize(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure FormPaint(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- DC: hdc;
- GC: HGLRC;
-
-
- implementation
-
- {$R *.DFM}
-
-
- {=======================================================================
-
- procedure SetDCPixelFormat;
- var
- nPixelFormat: Integer;
- pfd: TPixelFormatDescriptor;
- begin
- FillChar(pfd, SizeOf(pfd), 0);
- With pfd do begin
- dwFlags := PFD_DRAW_TO_WINDOW or
- PFD_SUPPORT_OPENGL or
- PFD_DOUBLEBUFFER;
- cDepthBits:= 32;
- end;
- nPixelFormat := ChoosePixelFormat(DC, @pfd);
- SetPixelFormat(DC, nPixelFormat, @pfd);
- end;
-
-
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- DC := GetDC(Handle);
- SetDCPixelFormat;
- GC := wglCreateContext(DC);
- wglMakeCurrent(DC, GC);
- glClearColor (0.0, 0.5, 0.0, 1.0);
- end;
-
-
-
- procedure TForm1.FormResize(Sender: TObject);
- begin
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity;
- gluPerspective(41, ClientWidth / ClientHeight, 1.0, 20.0);
- glViewport(0, 0, ClientWidth, ClientHeight);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity;
- end;
-
-
-
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- wglMakeCurrent(0, 0);
- wglDeleteContext(GC);
- ReleaseDC(Handle, DC);
- DeleteDC(DC);
- end;
-
-
-
- procedure TForm1.FormPaint(Sender: TObject);
- var bu: tbitmap;
- begin
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
- glFinish;
- SwapBuffers(DC);
- bu:=tbitmap.create;
- bu.Width:=form1.clientwidth;
- bu.height:=form1.clientheight;
- bitblt(bu.handle,0,0,bu.width,bu.height,dc,0,0,srccopy);
- with bu.canvas do
- begin
- brush.color:=clyellow;
- pen.color:=clyellow;
- ellipse(30,30,100,100);
- end;
-
- bu.SaveToFile('!!!4.bmp');
- bu.free;
- end;
- end.
-
- {{/code}}
 |
Вопрос задал: Drinkenz (статус: 1-ый класс)
Вопрос отправлен: 28 апреля 2015, 23:20
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 9 мая 2015, 21:17; участников в обсуждении: 2.
|
DNK (статус: Студент), 4 мая 2015, 07:59 [#1]:
Может попробовать скринить не из события отрисовки, а по таймеру например. И помню у меня тоже были проблемы получить скрин с помощью bitblt даже для обычной формы со стандартными компонентами.
"Digital Networked Knight"
|
|
Drinkenz (статус: 1-ый класс), 8 мая 2015, 09:15 [#2]:
Решение найдено. Делаю BitBlt всего рабочего стола, а потом вырезаю нужный прямоугольник.
|
8 мая 2015, 09:17: Статус вопроса изменён на решённый (изменил автор вопроса — Drinkenz)
|
DNK (статус: Студент), 9 мая 2015, 21:17 [#3]:
Похвально!
"Digital Networked Knight"
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|