自己绘制Panel

Javpp 2005-09-19 11:12:07
我按照如下方法自己绘制Panel,
TCanvas *tmp = new TControlCanvas ();
((TControlCanvas *)tmp)->Control = Panel1;
tmp->Brush->Color = clBlack;
tmp->LineTo (100, 100);
delete tmp;
tmp = NULL;
绘制效果没问题,但是在CB环境中打开CodeGuard选项后,如下信息:
Error 00030. 0x130C10 (Thread 0x0F28):
Method called on illegally casted object: Attempt to access 104 byte(s) at
0x00E60544. The 'this' pointer points to heap block 0x00E60544 which is only
100 bytes long.
Call Tree:
0x00401F16(=DTExe.exe:0x01:000F16) e:\winxp\program files\borland\cbuilder6\include\vcl\Controls.hpp#1340
0x00401CC3(=DTExe.exe:0x01:000CC3) G:\Cpp\DuctType\Source\Exe\MainFrm\MainFrm.cpp#42
0x00450790(=DTExe.exe:0x01:04F790)
0x004016B5(=DTExe.exe:0x01:0006B5) G:\Cpp\DuctType\Source\Exe\DTExe.cpp#14
0x0048911B(=DTExe.exe:0x01:08811B)

The memory block (0x00E60544) [size: 100 bytes] was allocated with SysGetMem
Call Tree:
0x004267DF(=DTExe.exe:0x01:0257DF)
0x00401CC3(=DTExe.exe:0x01:000CC3) G:\Cpp\DuctType\Source\Exe\MainFrm\MainFrm.cpp#42
0x00450790(=DTExe.exe:0x01:04F790)
0x004016B5(=DTExe.exe:0x01:0006B5) G:\Cpp\DuctType\Source\Exe\DTExe.cpp#14
0x0048911B(=DTExe.exe:0x01:08811B)

------------------------------------------
Functions called:
fflush (4 times)
delete (11 times)
free (7 times)
new (11 times)
SysReallocMem (54 times)
SysFreeMem (2419 times)
SysGetMem (2420 times)
lstrlenA (1 times)
lstrcpynA (4 times)
calloc (1 times)
strlen (65 times)
realloc (1 times)
strdup (1 times)
malloc (4 times)
memcpy (2 times)
Resource types used:
object (11 allocs, 11 max)
memory block (2427 allocs, 933 max)
Modules used:
00400000 09/17/2005 21:34:06 G:\Cpp\DuctType\Source\Bin\DTExe.exe
00FF0000 10/07/2002 12:00:00 C:\WINDOWS\System32\msctfime.ime
0CD00000 01/31/2000 05:00:00 C:\PROGRA~1\Borland\CBUILD~1\Bin\CG32.DLL
41000000 01/24/2000 05:01:00 C:\PROGRA~1\Borland\Delphi5\Bin\borlndmm.dll
5ADC0000 10/07/2002 12:00:00 C:\WINDOWS\System32\uxtheme.dll
62C20000 10/07/2002 12:00:00 C:\WINDOWS\System32\LPK.DLL
72F10000 10/07/2002 12:00:00 C:\WINDOWS\System32\USP10.dll
74680000 10/07/2002 12:00:00 C:\WINDOWS\System32\MSCTF.dll
76300000 10/07/2002 12:00:00 C:\WINDOWS\System32\IMM32.DLL
770F0000 10/07/2002 12:00:00 C:\WINDOWS\system32\OLEAUT32.DLL
77310000 10/07/2002 12:00:00 C:\WINDOWS\system32\COMCTL32.DLL
77BD0000 10/07/2002 12:00:00 C:\WINDOWS\system32\VERSION.DLL
77BE0000 10/07/2002 12:00:00 C:\WINDOWS\system32\MSVCRT.DLL
77C40000 10/07/2002 12:00:00 C:\WINDOWS\system32\GDI32.dll
77D10000 11/22/2002 12:30:24 C:\WINDOWS\system32\USER32.DLL
77DA0000 10/07/2002 12:00:00 C:\WINDOWS\system32\ADVAPI32.dll
77E40000 10/07/2002 12:00:00 C:\WINDOWS\system32\kernel32.dll
77F50000 05/01/2003 16:57:50 C:\WINDOWS\System32\ntdll.dll
78000000 08/26/2003 04:23:48 C:\WINDOWS\system32\RPCRT4.dll
7CAB0000 08/26/2003 04:23:48 C:\WINDOWS\system32\OLE32.DLL
==========================================



用如下方法就没有!!!
TCanvas *tmp = new TCanvas ();
tmp->Handle = GetDC (Panel1->Handle);
tmp->Brush->Color = clBlack;
tmp->LineTo (100, 100);
ReleaseDC(Panel1->Handle, tmp->Handle);
delete tmp;
tmp = NULL;

但画的时候总是把我指定的颜色画成黑线,我用了4次LINETO画了一个框,总是有3条线的颜色是黑色的,有时候又不是

不解...
...全文
258 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenyongjie 2005-09-22
  • 打赏
  • 举报
回复
用API试试:
TextOut(Panel1->Handle,10,10,"这样看看");
Javpp 2005-09-21
  • 打赏
  • 举报
回复
constantine(飘遥的安吉儿)
不好意思,是我写错了,我已经把颜色改为别的了。
但还是画成黑色的

是因为我每次重画的时候都重新生成一个tmp,然后再delete掉,

后来我在窗体生成时候new一个tmp,然后在退出的时候delete掉,就好了,呵呵
constantine 2005-09-21
  • 打赏
  • 举报
回复
用如下方法就没有!!!
TCanvas *tmp = new TCanvas ();
tmp->Handle = GetDC (Panel1->Handle);
tmp->Brush->Color = clBlack;
tmp->LineTo (100, 100);
ReleaseDC(Panel1->Handle, tmp->Handle);
delete tmp;
tmp = NULL;

但画的时候总是把我指定的颜色画成黑线,我用了4次LINETO画了一个框,总是有3条线的颜色是黑色的,有时候又不是
===========
默认不就是黑色的吗,你如果要改变颜色
就tmp->Pen->Color=clRed; 不就行了吗
Javpp 2005-09-21
  • 打赏
  • 举报
回复
ccrun(老妖)(www.ccrun.com) ( ) 信誉:127
如果有时间,你可不可以编译一下,我已经试过那样了
setdefault 2005-09-21
  • 打赏
  • 举报
回复
是奇怪。
帮助里面说:
Do not call TControlCanvas directly in an application. The controls that use a TControlCanvas object create it from their own constructors.
jemyzhang 2005-09-20
  • 打赏
  • 举报
回复
上面的是内存访问越界了,可能是不正常的类型转化
ccrun.com 2005-09-20
  • 打赏
  • 举报
回复
1. 应该使用TControlCanvas
2. 把这个TControlCanvas声明在TForm的类中。
setdefault 2005-09-20
  • 打赏
  • 举报
回复
TCanvas *tmp = new TControlCanvas ();
//是根据TControlCanvas分配的内存,因为TControlCanvas从TCanvas继承,一般占用空间较TCanvas多。
((TControlCanvas *)tmp)->Control = Panel1;
tmp->Brush->Color = clBlack;
tmp->LineTo (100, 100);
delete tmp;//根据TCanvas释放内存,那就很可能有对象的内存空间没有释放掉了。
Javpp 2005-09-20
  • 打赏
  • 举报
回复
cczlp(不惑)
不知道你有没有试过你的代码,这样也会有内存泄露的。

=======================================================================
setdefault(山转水也转),按照你的说法,将tmp声明为TControlCanvas *tmp;就应该没有问题了,但问题还是有的,一样的内存泄露。

cczlp 2005-09-20
  • 打赏
  • 举报
回复
TControlCanvas *tmp = new TControlCanvas ();

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧