至此,一个OpenGL程序的框架就大致成型。但还有问题要解决。
第一,要防止Windows擦除背景而影响速度。在Form中加入成员函数
private
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
procedure TGLWindow.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
Message.Result := 1;
end;
第二,为了更保险些。再增加以下成员函数。
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure TGLWindow.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
begin
Style := Style or WS_CLIPCHILDREN or WS_CLIPSIBLINGS;
WindowClass.Style := CS_VREDRAW or CS_HREDRAW or CS_OWNDC;
end;
end;
好,现在就可以忘掉这些麻烦的东西了,写你的精彩3D显示吧:)
还得唠叨几句,在一个线程里不要创建多个RC,这样会严重影响性能。有些个人的OpenGL窗口控件演示有在一个Form上放多个控件,其实并非好主义。应该用一个OpenGL窗口显示多个视图。另外,不要跨线程访问OpenGL函数。
还有Windows自动安装显卡驱动时不会安装OpenGL的硬件加速,一定要自己安装显卡厂商的驱动!
另外,副赠全屏显示的函数:)
function FullScreen(win: TWinControl; width, height, bitdepth: integer): boolean;
var displaymode: DEVMODE;
begin
FillChar(displaymode, sizeof(displaymode), 0);
with displaymode do
begin
dmSize := sizeof(displaymode);
dmPelsWidth := width;
dmPelsHeight := height;
dmBitsPerPel := bitdepth;
dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
end;
if ChangeDisplaySettings(displaymode, CDS_FULLSCREEN) = DISP_CHANGE_SUCCESSFUL
then begin
ShowWindow(win.Handle, WS_MAXIMIZE);
result := true;
end
else result := false;
end;
procedure RestoreDisplay(win: TWinControl);
begin
ChangeDisplaySettings(PDEVMODE(0)^, 0);
ShowWindow(win.Handle, SW_RESTORE);
end;
上一页 [1] [2]
责任编辑:小草