诸位高手好, 前几天我在一个贴子中看到可以用SetBkMode将TDBGrid的背景设为透明再配上背景图画, 可以使表格更加美观.这确实很诱人, 我试着自己作, 可是运行后却没有任何反映. 以下是代码:showmessage(inttostr(SetBkMode(DBGrid1.Handle, TRANSPARENT)));
函数调用总是返回0 (不成功)Delphi的Help中关于SetBkMode的说明如下:int SetBkMode(
    HDC hdc,   // handle of device context
    int iBkMode   // flag specifying background mode
   ); Parametershdc
Identifies the device context. iBkMode
Specifies the background mode. This parameter can be either of the following values: OPAQUE:
  Background is filled with the current background color before the text, hatched brush, or pen is drawn.TRANSPARENT:
  Background remains untouched.不知我应该做何修改. 我估计是DBGrid1.Handle部分出的问题, 函数要求的是HDC类型, 而DBGrid1.Handle返回的是HWND类型, 类型不匹配.我很早就有这个疑问: WindowsAPI中像HDC, HWND这样的句柄都有哪些, 它们都有什么区别, 相互之间又应该如何转化? Delphi中用THandle把它们都包括进去了, 可使用起来还是显得不太兼容呀, 例如本例. 请高手能借这个问题展开, 讲讲API中的句柄... 谢谢了! 发言就有分! 分不够再补!

解决方案 »

  1.   

    应该这样
    showmessage(inttostr(SetBkMode(DBGrid1.Canvas.Handle, TRANSPARENT)));
      

  2.   

    HDC类型是设备的画布的Handle,而不是控件的
    如GetDC(0)得到的就是屏幕的画布的Handle
      

  3.   

    我也没试了,根据自己的理解应该是
    showmessage(inttostr(SetBkMode(getdc(DBGrid1.Handle), TRANSPARENT)));
      

  4.   

    哦, 谢谢了. 那能再深入讲讲API中Handle的各个类型及区别吗?to yzdiyu(敌宇) : 当然给分, 发言没解决问题, 当帮我顶, 也要给分的.
      

  5.   

    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
        Field: TField; State: TGridDrawState);
      var
        Text: string;
        Rct: TRect;
      begin
        Text := Field.AsString;
        Rct:= Rect;
      
        BitBlt(DBGrid1.Canvas.handle,
               Rct.left,
               Rct.top,
               Rct.right - Rct.left,
               Rct.bottom - Rct.top,
               Image1.Canvas.Handle,
               Rct.left + DBGrid1.Left + Panel1.Left,
               Rct.Top + DBGrid1.Top + Panel1.Top,
               SRCCOPY);
      
        SetBkModE(DBGrid1.Canvas.Handle, TRANSPARENT);
        DBGrid1.Canvas.Font.Style := [fsBold];
        DrawtextEx(DBGrid1.Canvas.Handle,
                   PChar(Text),
                   Length(Text),
                   Rct,
                   DT_WORDBREAK,
                   nil);
      
      end;