Advertisement

【控件功能】我来做练习-第27课-Drawing and text in opengl, use mouse to draw lines

阅读量:

文章目录

    • Drawing and text in opengl, use mouse to draw lines
    • 核心源码

Drawing and text in opengl, use mouse to draw lines

提示:画线并显示坐标

在这里插入图片描述

核心源码

function GenerateRaster(name: PChar; size: integer): void; var Font: HFONT; begin var base := glGenLists(96); Font := InitializeFont(-size, [other parameters], ANSI_CHARSET) ... ; SelectObject(glDC, Font); wglUseFontBitmaps(glDC) end

procedure DeleteRasters;
begin
glDeleteLists(base, 96);
end;

function PrintText(text: Ansistring);
开始
如果text等于空字符串,则退出函数;
Push当前的列表属性到堆栈中;
设置基地址为base减去32;
调用长度为text的单元格列表基址GL_UNSIGNED_BYTE和PAnsichar(text);
将当前列表属性弹出堆栈;
退出函数;

form event handling for the close event of form TForm1. begin remove any cached raster data. make the current window handle the canvas as the primary window. release the associated OpenGL rendering context. end.

procedure TForm1.FormCreate(Sender: TObject);
var
pfd: TPixelFormatDescriptor;
FormatIndex: integer;
begin
fillchar(pfd, SizeOf(pfd), 0);
with pfd do
begin
nSize := SizeOf(pfd);
nVersion := 1;
dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
iPixelType := PFD_TYPE_RGBA;
cColorBits := 24;
cDepthBits := 32;
iLayerType := PFD_MAIN_PLANE;
end; { with }
glDC := getDC(Handle);
FormatIndex := ChoosePixelFormat(glDC, @pfd);
SetPixelFormat(glDC, FormatIndex, @pfd);
GLContext := wglCreateContext(glDC);
wglMakeCurrent(glDC, GLContext);
OkToDraw := false;
MakeRasters(‘Arial’, 12);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glShadeModel(GL_FLAT);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: integer); begin if Button = mbLeft then begin 将Cursor设为crDefault; 将OkToDraw的取反赋值给OkToDraw; 记录起始位置到startX和startY; end; end;

该事件处理程序为FormMouseMove,在TForm1窗体上实现绘图功能。
当OkToDraw状态有效时:
执行DrawSelf()操作以绘制基础图形;
设置全局清屏颜色为黑色并绘制起始点;
设置全局清屏颜色为红色并绘制当前坐标点;
在指定位置打印输出坐标信息:[X] = %s, [Y] = %s" % (InttoStr(X), InttoStr(Y));
交换双缓冲区以显示最新图形内容。

procedure TForm1.FormPaint(Sender: TObject);
begin
glClearColor(1, 1, 1, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
if not OkToDraw then
Swapbuffers(glDC);
end;

FormResize事件在TForm1中被处理。
begin
设置视口范围为从(ClientWidth×ClientHeight)到(ClientWidth×ClientHeight)。
切换矩阵为投影矩阵并应用单位矩阵。
将正交投影矩阵设置为从左下角(ClientWidth×ClientHeight)到右上角。
切换模型视图矩阵回单位矩阵。
end;

全部评论 (0)

还没有任何评论哟~