CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  VCL组件使用和开发

为什么新的类的构造函数里不能用Canvas ?我要把这个类做一个控件

楼主yunan(余南)2003-12-01 21:49:55 在 C++ Builder / VCL组件使用和开发 提问

unit.h  
   
  class   TForm1   :   public   TForm  
  {  
  __published: //   IDE-managed   Components  
                  void   __fastcall   FormCreate(TObject   *Sender);  
  private: //   User   declarations  
  public: //   User   declarations  
                  __fastcall   TForm1(TComponent*   Owner);  
  };  
   
  class   TMyCtl   :   public   TCustomControl  
  {  
  __published:  
   
  public:  
      TButton   *bu;  
      __property   Canvas;  
      __fastcall   virtual   TMyCtl(TComponent*   AOwner);  
   
  };  
   
   
   
   
   
   
   
   
  unit1.cpp  
  __fastcall   TMyCtl::TMyCtl(TComponent*   AOwner)  
                  :TCustomControl(AOwner)  
   
  {Width=100;  
  Height=100;  
  bu   =new   TButton(this);  
  bu->Width   =20;  
  bu->Height=20;  
  bu->Top=80;  
  bu->Left=80;  
  bu->Parent=this;  
  Canvas->MoveTo   (10,10);  
  Canvas->LineTo   (100,100);  
   
  }  
   
  //---------------------------------------------------------------------------  
   
  void   __fastcall   TForm1::FormCreate(TObject   *Sender)  
  {  
  TMyCtl   *a=new   TMyCtl(NULL);  
  a->Parent=this;  
   
   
  }  
   
   
  为什么说control   ""   has   no   parent   window.  
  我这个控件是要做成独立的控件的,所以必须在构造函数里面画线  
  问题点数:0、回复次数:6Top

1 楼pp616(坏蛋)回复于 2003-12-01 22:31:59 得分 0

bu   =new   TButton(this);  
  bu->Width   =20;  
  bu->Height=20;  
  bu->Top=80;  
  bu->Left=80;  
  bu->Parent=this;  
  Canvas->MoveTo   (10,10);  
  Canvas->LineTo   (100,100);  
  把这些代码放在CreateWnd中。  
  Top

2 楼yunan(余南)回复于 2003-12-01 22:45:08 得分 0

CreateWnd是个什么啊?怎么放啊Top

3 楼pp616(坏蛋)回复于 2003-12-01 23:43:49 得分 0

CreateWnd是TWinControl中的一个虚函数  
  在类中这么声明  
  //.h中  
  virtual   void   __fastcall   CreateWnd(void);  
  //.cpp中  
  void   __fastcall   TMyCtl::CreateWnd(void)  
  {  
          TCustomControl::CreateWnd();  
          //等父类的CreateWnd返回控件就有的合法的窗口句柄了。其实CreateWnd调用的Api   CreateWindowEx函数  
          //然后加如自己的代码  
          .....  
  }  
   
  我看了你上面的代码应该错在bu->Parent=this;  
  因为构造的时候还没有合法的窗口句柄,所以会出现“control   ""   has   no   parent   window”  
  将bu->Parent=this;放到CreateWnd中应该就不会出这问题了。TCanvas类代码我没去看过不知道是否需要窗口句柄来得到DC,我想应该需要吧。所以把  
  Canvas->MoveTo   (10,10);  
  Canvas->LineTo   (100,100);  
  也放到CreateWnd里吧。  
  Top

4 楼yunan(余南)回复于 2003-12-03 15:48:03 得分 0

问题是出在   Canvas->MoveTo   这里,把画线的两句话去掉就没错了。bu->   是没出错。。  
  我按照你的改了。错误是不出了,但是线还是没划出来,而画线的两句话是执行了的。Top

5 楼TangSe(void_onering)回复于 2003-12-03 16:19:52 得分 0

__fastcall   TMyCtl::TMyCtl(TComponent*   AOwner)  
                  :TCustomControl(AOwner)  
   
  {Width=100;  
  Height=100;  
  bu   =new   TButton(this);  
  bu->Width   =20;  
  bu->Height=20;  
  bu->Top=80;  
  bu->Left=80;  
  bu->Parent=this;  
  Canvas->MoveTo   (10,10);  
  Canvas->LineTo   (100,100);  
   
  }  
   
  //---------------------------------------------------------------------------  
   
  void   __fastcall   TForm1::FormCreate(TObject   *Sender)  
  {  
  TMyCtl   *a=new   TMyCtl(NULL);  
  a->Parent=this;  
   
   
  }  
   
   
  应该这样吧。如果你传NULL的话,你的控件是没有parent   window的,那么button的parent是你的控件,他们可能都没有消息循环,canvas   画的东东应该不会显示出来。不过我没看vcl标准控件的源代码,不知道如果传NULL的话,他是否用AllocateHwnd建立一个消息循环。  
   
  TMyCtl   *a-new   TMyCtl(this);  
  Top

6 楼yunan(余南)回复于 2003-12-04 11:07:00 得分 0

没用啊。还是这样的   啊Top

相关问题

  • 构造函数
  • 构造函数
  • 构造函数??
  • 构造函数
  • 函数构造
  • @@@@@@ 构造函数 @@@@@
  • WebService构造函数
  • Canvas类的子类中的pain()方法与构造函数 的问题?
  • 构造函数和析构函数
  • 构造函数是内联函数吗?

关键词

  • 控件
  • 函数
  • 代码
  • top
  • null
  • tmyctl
  • bu
  • createwnd
  • canvas
  • fastcall

得分解答快速导航

  • 帖主:yunan

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo