谁来解释这段程序(150分)

  • 主题发起人 主题发起人 pi
  • 开始时间 开始时间
P

pi

Unregistered / Unconfirmed
GUEST, unregistred user!
以下这段程序是有关opengl编程的:
protected
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
procedure WMQueryNewPalette(var Msg: TWMQueryNewPalette); message WM_QUERYNEWPALETTE;
procedure WMPaletteChanged(var Msg: TWMPaletteChanged);
message WM_PALETTECHANGED;
procedure TMainForm.WMPaint(var Msg: TWMPaint);
var
pStruct: TPaintStruct; //TPaintStruct是什么类啊
begin
BeginPaint(Handle, pStruct);//beginpaint 是什么呀
UpdateShape;//procedure updateshape为一段图形输出程序
EndPaint(Handle, pStruct);
end;
procedure TMainForm.WMQueryNewPalette(var Msg: TWMQueryNewPalette);
begin
if (Palette <> 0) then begin //palette:Tpalette;
Msg.Result := RealizePalette(DC); //DC:HDC;
//realizepalette是什么东东,怎么没有声明啊?
if (Msg.Result <> GDI_ERROR) then
InvalidateRect(Handle, nil, False);
//invalidaterect 也没有声明。
end;
end;
procedure TMainForm.WMPaletteChanged(var Msg: TWMPaletteChanged);
begin
if ((Palette <> 0) and (THandle(TMessage(Msg).wParam) <> Handle)) then begin
if (RealizePalette(DC) <> GDI_ERROR) then
UpdateColors(DC); //updatecolors未声明
Msg.Result := 0;
end;
end;

这段程序疑问太多(但编译运行都能通过),主要是:
1.怎么有这么多没见过的类和过程呢?(TWMPaint,TWMQueryNewPalette,
TWMPaletteChanged,TPaintStruct,Tpalette,BeginPaint,InvalidateRect,RealizePalette,UpdateColors)后面的程序又出现了,clientheight,clientwidth(未声明),是不是delphi的保留字?
2。handle 是不是opengl的保留字?
3。opengl中HWND(窗口句柄),HDC(设备句柄),HGLRC(opengl绘图
设备句柄)的含义。
那位大虾能帮俺解释一下,感激不尽!
 
没什么,这些并非只有OpenGL才有,都是一些Windows基本的绘图方式。
此段程序是使用Win 32API,并非Delphi提供的。
Winodows低层绘图就是这样要和DC,Palette,消息之类大交道。
那些你说未声明的函数都是Win 32api函数,在Windows单元声明,
在win32 api帮助文件可查到.
 
你还是先看看有关OPENGL方面的书,
然后看看有关VC方面的书,
然后你可以看到这些问题都很简单的拉
 
当然是use了某些单元,不可能没有声明。
 
具体解释:
BeginPaint(),
EndPaint(),
RealizePalette(),
InvalidateRect(),
UpdateColors().
以上都是Win32 API最基本的绘图函数和OpenGL无关。
在 Uses Windows.声明
TWMPaint,TWMQueryNewPalette,
TWMPaletteChanged,TPaintStruct,Tpalette
是程序里面定义的,封装Windows的绘图消息和绘图的调色版结构等。

 
Windows是通过消息传递实现多任务的,当一个窗口需要重画的时候就会接受到一个
WM_PAINT的消息. 对应于每个PAINT消息,用户程序应该作相应的画图处理. 我们通
常的程序不需要改变Delphi窗体控件的画图相应过程,因为控件已经做了这些工作.
如果是有特殊的画图要求的话,我们必须重新写相应的画图消息处理程序. 这就是:
procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
同理:
procedure WMQueryNewPalette(var Msg: TWMQueryNewPalette); message WM_QUERYNEWPALETTE;
procedure WMPaletteChanged(var Msg: TWMPaletteChanged);
message WM_PALETTECHANGED;
绘制窗体的时候需要通过,TPaintStruct数据结构调用Windows的API函数.
绘制窗口的时候需要遵循一定的顺序:
BeginPaint(Handle, pStruct);//通知系统开始画图
... 具体画图动作
...
EndPaint(Handle, pStruct);//告诉系统画图程序完成
其他的一些都是画图相关的API调用.比如改变调色板,等等...

只能说明一个基本概念,希望你能够找译本参口书看看吧!!!
 
在这个程序里handle是MainForm的句丙
 
多人接受答案了。
 
后退
顶部