为什么新的类的构造函数里不能用Canvas ?我要把这个类做一个控件
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




