也就是在非图形控件上面能像在图形控件上用Canvas吗?如果不能那应该如何画?

解决方案 »

  1.   

    自己写控件啊,重载WMPaint事件,好像是这个,记不清了
      

  2.   

    继承TEdit控件
    在里面声明个TCanvas变量试试
      

  3.   

    楼上的方法估计行不通。你的Canvas和Edit怎么关联啊?应该通过GetDC(Handle)获取句柄,然后再创建MemDC,然后在MemDC上画完后,再BitBlt到Edit的DC上,建议看看VC或者Windows编程(C的)的书,好久没弄,也不太清楚了。
      

  4.   

    自己写一个控件,从TCustomedit继承
    重载wndproc
    procedure WndProc(var Msg: TMessage); override;procedure TMyedit.WndProc(var Msg: TMessage);
    var dc:HDC ;
        rc:TRect;
    begin
        case Msg.msg of
            WM_Paint: begin 
                inherited;//也可以不继承 
                GetWindowRect(Handle, rc );
                OffsetRect( rc, -rc.left, -rc.top );
                DC := GetWindowDC( Handle );
                //有dc,有rc了,想怎么画就怎么画把            
            end;   
        else   inherited;
        end;
    end;
      

  5.   

    我想用canvas 可是不行呀。
      

  6.   

    有2种办法,一种就象[dododo(心奕) ( ) 信誉:99 ]说那样继承来做,还有一种就是嫁接,用api getwindowlong函数取得窗口消息处理函数的地址保存起来,然后再用自己的过程替换掉函数用setwindowlong,在你的消息处理过程里再调用一次原始保存的消息处理函数(一定要调用)否则控件不响应任何消息,并判断如果是Wm_paint消息则你再划一个圆.至于2个api函数的用法,delphi带的windows32sdk里写的很详细了