我使用画布把一个BMP的图形画到一个PANEL上,如果通过按钮点击来完成一点问题都没有,但如果是在创建这个窗体的时候就完成的话,就不行了。或者是在程序失去焦点,然后再得到焦点的话,会有同样的问题?

解决方案 »

  1.   

    在OPNAINT中不行。下面的程序的代码,帮忙看看:
    窗体设置:object Form1: TForm1
      Left = 176
      Top = 169
      Width = 334
      Height = 197
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object Bevel1: TBevel
        Left = 16
        Top = 24
        Width = 172
        Height = 133
        Shape = bsFrame
      end
      object Panel1: TPanel
        Left = 21
        Top = 30
        Width = 160
        Height = 121
        BevelOuter = bvNone
        Color = clBackground
        TabOrder = 0
      end
      object TPanel
        Left = 192
        Top = 24
        Width = 113
        Height = 103
        BevelOuter = bvLowered
        TabOrder = 1
        object RBCenter: TRadioButton
          Tag = 4
          Left = 14
          Top = 10
          Width = 79
          Height = 17
          Caption = '居中(&E)'
          TabOrder = 0
          OnClick = RBCenterClick
        end
        object RBExpand: TRadioButton
          Tag = 3
          Left = 14
          Top = 32
          Width = 79
          Height = 17
          Caption = '扩展(&X)'
          TabOrder = 1
          OnClick = RBCenterClick
        end
        object RBTile: TRadioButton
          Tag = 2
          Left = 14
          Top = 55
          Width = 79
          Height = 17
          Caption = '平铺(&I)'
          Checked = True
          TabOrder = 2
          TabStop = True
          OnClick = RBCenterClick
        end
        object RBNoBMP: TRadioButton
          Tag = 1
          Left = 14
          Top = 76
          Width = 79
          Height = 17
          Caption = '无图(&N)'
          TabOrder = 3
          OnClick = RBCenterClick
        end
      end
      object BtnSelectBMP: TButton
        Left = 192
        Top = 131
        Width = 113
        Height = 25
        Caption = '背景图(&P)...'
        TabOrder = 2
        OnClick = BtnSelectBMPClick
      end
      object opd1: TOpenDialog
        Filter = 'BMP图片|*.BMP'
        Left = 65
        Top = 164
      end
    end单元文件:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Bevel1: TBevel;
        RBCenter: TRadioButton;
        RBExpand: TRadioButton;
        RBTile: TRadioButton;
    RBNoBMP: TRadioButton;
    BtnSelectBMP: TButton;
        opd1: TOpenDialog;
    procedure FormCreate(Sender: TObject);
        procedure RBCenterClick(Sender: TObject);
        procedure BtnSelectBMPClick(Sender: TObject);
    private
    Fmode:integer;
    FName:string;
    procedure SetBGPreview(BGMode:integer;FName:string;Pl:TPanel); { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begin
    Fname:='1.bmp';
    FMode:=2;
    Setbgpreview(fmode,fname,panel1);end;procedure TForm1.SetBGPreview(BGMode:integer;FName:string;Pl:TPanel);
    var BMP:TBitMap;
    Col,Row:integer;
    DR,SR:TRect;
    NumCols,NumRows:integer;
    Canvas:TCanvas;
    OldColor:TColor; Procedure NoImageProc;
    begin
    Canvas.Brush.Color:=OldColor;
    FloodFill(Canvas.Handle,0,0,OldColor);
    end;begin
    BMP:=TBitMap.Create;
    BMP.LoadFromFile(FName); Canvas:=TCanvas.Create;
    Canvas.Handle:=GetDC(PL.Handle); OldColor:=PL.Color; case BGMode of
    1:
    begin
    NoImageProc;
    end;
    2:
    begin
    SR:=Rect(0,0,BMP.Width,BMP.Height);
    DR:=pl.ClientRect;
    NumRows:=DR.Bottom div SR.Bottom;
    NumCols:=DR.Right div SR.Right;
    // Canvas.Brush.Bitmap:=BMP;
    // Canvas.FillRect(DR);
    for Row:=0 to NumRows+1 do
    for Col:=0 to NumCols+1 do
    BitBlt(Canvas.Handle,Col*BMP.Width,Row*BMP.Height,BMP.Width,BMP.Height,BMP.Canvas.Handle,0,0,SrcCopy);
    end;
    3:
    begin
    StretchBlt(Canvas.Handle,0,0,PL.Width,PL.Height,BMP.Canvas.Handle,0,0,BMP.Width,BMP.Height,SrcCopy);
    end;
    4:
    begin
    NoImageProc;
    BitBlt(Canvas.Handle,(PL.Width-BMP.Width) DIV 2,(PL.Height-BMP.Height) DIV 2,BMP.Width,BMP.Height,BMP.Canvas.Handle,0,0,SrcCopy);
    end;
    end;{end of case} bmp.Free;
    canvas.Free;
    end;procedure TForm1.RBCenterClick(Sender: TObject);
    begin
    fmode:=(sender as TRadiobutton).Tag;
    Setbgpreview(fmode,fname,panel1);
    end;procedure TForm1.BtnSelectBMPClick(Sender: TObject);
    begin
    if opd1.Execute then
    begin
    fname:=opd1.FileName;
    setbgpreview(fmode,fname,panel1);
    end;
    end;end.
      

  2.   

    是要写在form。onpaint事件中,楼主好象没有写这个事件啊!
      

  3.   

    或者继承TPanel,并响应消息WM_PAINT
      

  4.   

    boynicky:我试过在ONPAINT中加过,但还是一样的情况.
    ahjoe:是对TPanel响应WM_PAINT消息吗?我是新手,可以给段代码吗?
      

  5.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;type
      TForm1 = class(TForm)
        procedure fw(var msg:Tmessage);message wm_paint;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.fw(var msg: Tmessage);
    begin
    canvas.TextOut(0,0,'abc');
    end;end.
      

  6.   

    用这种方法我也试过了,与加在窗体的ONPAINT中是一样的结果——都没有能阻止TPANEL的重绘
      

  7.   

    用MakeObjectInstance、SetWindowsLong指定一个新的窗口过程,在新的窗口过程中绘制,不过最后程序退出时要FreeInstance释放。
      

  8.   

    重画消息是直接发到TPanel里,而不是Form里,用一个窗口过程替换调原来的TPanel里的过程就行了,试一下下面的,我是在Panel上画画。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
          Old: TWndMethod;
        procedure Ff(var Message: TMessage) ;    { Public declarations }
      end;var
      Form1: TForm1;implementationvar
      FCanvas: TCanvas;
      Bmp: TBitMap;
    {$R *.dfm}procedure TForm1.Ff(var Message: TMessage);
    begin
      Old(Message);
       if Message.Msg = Wm_Paint then
           FCanvas.Draw(0,0,BMp);end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Bmp := TBitMap.Create;
      Bmp.LoadFromFile('D:\Documents and Settings\Administrator\My Documents\My Pictures\δÃüÃû.bmp');
      FCanvas := TCanvas.Create;
      FCanvas.Handle := GetDc(Panel1.Handle);
      FCanvas.Draw(0,0,BMp);
      Old := Panel1.WindowProc  ;
       Panel1.WindowProc := ff;
    end;end.
      

  9.   

    ccbb1314:你可以帮我看一看程序的代码错在那里吗?
    http://expert.csdn.net/Expert/topic/1859/1859582.xml?temp=.5681879xleep:我回去试试你的方法。
      

  10.   

    谢谢xleep,预览的问题已经解决了,现在还其它的两个,只有人答了,立即就可以发分了!