我建了一个
Form1: Tfrom;在其FormPaint事件中写如下代码,但运行根本无显示''Hello, Windows'的字样.
为什么?procedure TForm3.FormPaint(Sender: TObject);
var
hPaintDC, hClientDC: HDC;
ps: TPaintStruct;
hGrayPen, hFillPen, hPrevPen: HPEN;
begin hPaintDC := BeginPaint(Handle, ps);
TextOut(hPaintDC, 1, 1, 'Hello, Windows!', 15); EndPaint(Handle, ps);
end;
Form1: Tfrom;在其FormPaint事件中写如下代码,但运行根本无显示''Hello, Windows'的字样.
为什么?procedure TForm3.FormPaint(Sender: TObject);
var
hPaintDC, hClientDC: HDC;
ps: TPaintStruct;
hGrayPen, hFillPen, hPrevPen: HPEN;
begin hPaintDC := BeginPaint(Handle, ps);
TextOut(hPaintDC, 1, 1, 'Hello, Windows!', 15); EndPaint(Handle, ps);
end;
解决方案 »
- delphi让程序总显示在托盘里
- 请教下Windows7下,使用Delphi2007 ADO报错找不到UDL配置文件
- 已经装载dll了,如果读取其中的字符串资源呢?
- 如何通过flash播放从摄像头取来的数据??急
- delphi那些默认图标在哪里
- 请教:关于TClientSocket的SendBuf函数
- 请问怎样列出每个邮件的标题(subject),谢谢先。Delphi7 POP3
- 各位大虾,请帮帮忙!!
- 在DLL中调用模式窗体时参数传递的问题。
- 谁能帮帮我-win2000下开发,win98下出现问题。
- 用TClientDataSet控件为什么不能按照查询语句显示的顺序显示数据
- 急,这个语句怎么写
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var ps: TPaintStruct;
hPaintDC: HDC;
begin
if Msg.message=WM_PAINT then
begin
hPaintDC := BeginPaint(Handle, ps);
TextOut(hPaintDC, 1, 1, 'Hello, Windows!', 15);
EndPaint(Handle, ps);
end;
end;如果要在Form的OnPaint事件里,可以:procedure TForm1.FormPaint(Sender: TObject);
begin
TextOut(GetDC(Handle), 1, 1, 'Hello, Windows!', 15);
end;
搜索到一段,参考一下:在Window上主要有三种方法得到Client Area的一个HDC句柄。
1.在WM_PAINT消息中调用 BeginPaint()方法,BeginPaint方法返回一个当前无效区域的HDC句柄,并把该无效区域设置为有效区域。所谓无效区域就是需要应用程序重新绘制的区域,反之则为有效区域。BeginPaint被调用时同时返回了一个PAINTSTRUCT结构,其中给出了本次重绘的Clip Rectangle,所有在这个rectangle之外的绘制操作都不会显示。值得注意的是Petzold在砖头里面反复强调在WM_PAINT消息处理函数中BeginPaint方法需要和EndPaint方法配对使用,还有BeginPaint中返回的HDC不能缓存起来使用。
2.调用GetDC(hwnd)/ReleaseDC()来获取释放对应Client Rectangle的HDC句柄, 这个句柄没有什么预定义的Clip rectangle, 整个Client Rectangle都可以绘制。但是GetDC()得到的句柄也同样不能缓存起来,也就是说GetDC和ReleaseDC函数要在一个消息处理函数中配对出现。
一个类似的API是GetWindowDC(),它用于获取整个Window的DC,(client area + non-client area)
和GetDC一样必须在一次WndProc执行中释放掉,不能缓存。3.调用CreateDC方法还没看到,以后再写。
已经非常明白,
但有个问题,为什么FORM运行后不会立即显示出来,要我放大一下FORM窗体,字才显示出来.
Self.Invalidate;
或发个信息让窗体重画一次。。
var Handled: Boolean);
var ps: TPaintStruct;
hPaintDC: HDC;
begin
if Msg.message=WM_PAINT then
begin
hPaintDC := BeginPaint(Handle, ps);
TextOut(hPaintDC, 1, 1, 'Hello, Windows!', 15);
EndPaint(Handle, ps);
end;
end;
因为我设置了
DoubleBuffered := True;
不过,不明白,这有关系吗?
如果我用DoubleBuffered := True;那如何不用"最大化Form窗体"就要以显示,我试过Invalidate不管用.这次感谢.