网上下了一个代码教程,是将TStringGrid中添加了checkbox等,但是这些checkbox是绘出来的,不是将Tcheckbox 添加到TStringGrid中 :TfrmMain = class(TForm)
  gridOwnerDraw: TStringGrid;在 
  procedure TfrmMain.gridOwnerDrawDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);中,使用了这样的语句:
  ...   
  DrawFrameControl( gridOwnerDraw.canvas.handle, btnRect, DFC_BUTTON, btnState);
  ...其中 DFC_BUTTON 是Windows.pas 下的function DrawEdge(hdc: HDC; var qrc: TRect; edge: UINT; grfFlags: UINT): BOOL; stdcall;
const
  ... 
  DFC_SCROLL = 3;
  {$EXTERNALSYM DFC_BUTTON}
  DFC_BUTTON = 4;
  {$EXTERNALSYM DFC_POPUPMENU}
  DFC_POPUPMENU = 5;
  ...问题:
   我添加了个Image1, Pictrue指定为自己作图后美化的checkbox ,我想用Image1来替代DFC_BUTTON,于是就改成了Cardinal(Image1),可绘出来是一个灰色的框,而不是我要的框。后来我查了一下,DFC_BUTTON 本身就是整数,我用1-5都可以绘出来各种系统指定的图形。用大于6的数也是灰色框。
    请问,我这种做法对吗?能用自己的Image来代替DFC_BUTTON,这种方法可行吗?   不胜感激!!!注:
 {$EXTERNALSYM DrawFrameControl}
function DrawFrameControl(DC: HDC; const Rect: TRect; uType, uState: UINT): BOOL; stdcall; 位于Windows.pas

解决方案 »

  1.   

    gridOwnerDraw.canvas.Draw(Rect.Left, Rect.Top, Image1.Picture.Bitmap);
      

  2.   

    不能这样使用,只能使用系统定义那个几个,你要使用图片的话,可以把图片的话,可以先tbitmap把图装进内存,在画出来
      

  3.   

    tagRECT   r   =   Rect   ; 
    if   (Column-> Field-> FieldName   ==   "abc ") 
      { 
              DBGrid1-> Canvas-> FillRect(Rect); 
              if   (Column-> Field-> AsBoolean) 
                DrawFrameControl(DBGrid1-> Canvas-> Handle,   &r, 
                DFC_BUTTON,   DFCS_BUTTONCHECK+DFCS_CHECKED); 
              else 
              DrawFrameControl(DBGrid1-> Canvas-> Handle,   &r, 
                DFC_BUTTON,   DFCS_BUTTONCHECK); 
      }
      

  4.   

    http://61.132.74.87/libran/CheckDBGrid.rar