创建TCanvas绘图只显示黑白色的问题(300分,不够可以再加)(300分)

  • 主题发起人 主题发起人 Alucard
  • 开始时间 开始时间
A

Alucard

Unregistered / Unconfirmed
GUEST, unregistred user!
程序中我新建了一个Canvas,然后创建HDC赋给Canvas.Handle,然后调用Canvas的方法来绘图。

绘图完成后用CopyRect方法将结果拷贝到界面上,结果是黑白的。
如果我直接在界面的Canvas上画,或者创建一个TBitmap然后在这个Bitmap中画就没问题。

我查了半天资料貌似是GDI调色板的问题,弄得我晕死了,难道还要自己创建调色板然后一个颜色一个颜色的赋值吗?

还有一个问题,如果我要绘制的画布所在的窗体第一次绘制时不是最大化,那当该窗体最大化时,虽然绘制代码是根据画布大小控制的(画布控件的Align属性为Client),但是还是不能完全显示,请问怎么解决?

这两个问题各占一半分数。

CSDN(100分): http://topic.csdn.net/u/20080507/15/4401c17d-1331-4665-93f7-6cd10bab0b9e.html
 
第一个问题,估计是你程序写的不对,跟虾米调色板关系不大。
要画图,仅仅创建一个设备环境 HDC 是没用的,还必须创建一个内存位图,这样画的东西才能保存下来。程序如下:
var
hdcScr, hdcMem: HDC;
bmpMem, bmpOld: HBITMAP;
cnv: TCanvas;
begin
hdcScr := GetDC(0);
bmpMem := CreateCompatibleBitmap(hdcScr, 200, 200);
ReleaseDC(0, hdcScr);
hdcMem := CreateCompatibleDC(0);
bmpOld := SelectObject(hdcMem, bmpMem);

cnv := TCanvas.Create;
cnv.Handle := hdcMem;
cnv.Brush.Color := clYellow;
cnv.Pen.Color := clRed;
cnv.FillRect(Rect(0, 0, 200, 200));
cnv.Ellipse(0, 0, 200, 200);
Self.Canvas.CopyRect(Rect(100, 100, 300, 300), cnv, Rect(0, 0, 200, 200));
cnv.Free;

SelectObject(hdcMem, bmpOld);
DeleteDC(hdcMem);
DeleteObject(bmpMem);
end;
第二个问题,不知道你所说的虾米“画布”是不是指 Image 控件,如果是,把 Stretch 属性改成 True 就行了。
第三个问题,能用就结帖给分,不能用说一声,好吧。
 
太感谢了,放心好了,我一般不拖欠分数,试一下没问题就给分....[:D]
 
非常感谢,问题解决,另外能不能帮我解释一下这个原理?我对GDI不是很了解。
可以的话我再开个帖子,再送上300分
敬待答复。
 
后退
顶部