建议你设一个属性
为handle,当你要放到mdi子窗口时,
让你的OcoolEdit.handle:=childform1.handle
取的时候用
GetWindowDC(FHandle);

解决方案 »

  1.   

    哦,早上看到过了,
    建议你把类作的独立力一点,里面不要引用实例窗口。
    1、如果你把类作的很独立的话,就不会存在这个问题
    2、    form1.Height-form1.ClientHeight
    3、mdi子窗口在创建时要根据主窗口来调整的,
    如果你想知道它的大小,
       childform1.width
       childform1.height
       childform1.top
       childform1.left
    这些决定了它的大小和位置,建议你把子窗口的windowstate设为wsMaximized
    这样显示就会是充满主窗口。
      

  2.   

    增加一个handle属性来记录当前操作对象的句柄。
      

  3.   

    不要用GetWindowDC,改用GetDC,这样就不会画到标题栏或边框上了。
      

  4.   

    可是handle属性怎么写呢?是不是这样?可是运行时报错!TOcoolEdit=class(TCustomControl)
      private
        ...
        FHandle:HWND;procedure TOcoolEdit.Paint;
    begin
      inherited;
      Canvas.Handle:=GetWindowDC(Handle);
      Canvas.Pen.Color:=Tcolor(RGB(Random(255),Random(255),Random(255)));
      Canvas.Rectangle(Left,Top,Width,Height);
    end;procedure TMdiForm.FormCreate(Sender: TObject);
    begin
      OcoolEdit:=TOcoolEdit.Create(self);
      OcoolEdit.Parent:=Self;
      CcoolEdit.FHandle:=MdiForm.Handle;
      OcoolEdit.Paint;
    end;
      

  5.   

    1. CustomControl 本身为有句柄的WINDOWS标准窗口, 本身已有Left, Top,Width, Height 等属性,继承时没必要把它们覆盖掉.
    2. Delphi 已经专门为CustomControl建立了Canvas属性,直接用就行了
    3.Parent负责子空件的显示, Owner负责删除, 设置完这两个属性直接Show就可以了
    4.procedure TOcoolEdit.Paint;
      begin
      //  inherited;  {没必要}
        Canvas.Rectangle(Left,Top,Width,Height);
      end;
      

  6.   

    1. CustomControl 本身为有句柄的WINDOWS标准窗口, 本身已有Left, Top,Width, Height 等属性,继承时没必要把它们覆盖掉.
    2. Delphi 已经专门为CustomControl建立了Canvas属性,直接用就行了
    3.Parent负责子空件的显示, Owner负责删除, 设置完这两个属性直接Show就可以了
    4.procedure TOcoolEdit.Paint;
      begin
      //  inherited;  {没必要}
        Canvas.Rectangle(0,0,Width,Height);
      end;
      

  7.   

    使用Application.MainForm.ActiveMDIChild可以得到当前激活的MDI子窗体,不过可能是nil,要加上判断。
      

  8.   

    netlib(河外孤星) :您的分数加在这里!
    http://www.csdn.net/expert/topic/794/794251.xml?temp=.7038538