关于画布与panel的问题? 我使用画布把一个BMP的图形画到一个PANEL上,如果通过按钮点击来完成一点问题都没有,但如果是在创建这个窗体的时候就完成的话,就不行了。或者是在程序失去焦点,然后再得到焦点的话,会有同样的问题? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在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 endend单元文件: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. 是要写在form。onpaint事件中,楼主好象没有写这个事件啊! 或者继承TPanel,并响应消息WM_PAINT boynicky:我试过在ONPAINT中加过,但还是一样的情况.ahjoe:是对TPanel响应WM_PAINT消息吗?我是新手,可以给段代码吗? 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);begincanvas.TextOut(0,0,'abc');end;end. 用这种方法我也试过了,与加在窗体的ONPAINT中是一样的结果——都没有能阻止TPANEL的重绘 用MakeObjectInstance、SetWindowsLong指定一个新的窗口过程,在新的窗口过程中绘制,不过最后程序退出时要FreeInstance释放。 重画消息是直接发到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. ccbb1314:你可以帮我看一看程序的代码错在那里吗?http://expert.csdn.net/Expert/topic/1859/1859582.xml?temp=.5681879xleep:我回去试试你的方法。 谢谢xleep,预览的问题已经解决了,现在还其它的两个,只有人答了,立即就可以发分了! 画刷重叠显示 WebBrowser失去焦点 delphi中的record怎么动态分配内存? 刚写完多人语音聊天的功能,感觉不错,大家看看哦 for i:=1 to (length(varpassword)/4 - 1) do错在哪 急! 请问在FastReport 中打印两个query对组成的主从报表! 回答者有分 请教高手:delphi中窗体更新的机理? 散分! 用哪个软件制作安装程序比较好 谁知道是窗体最大化的消息是什么? 如何取得网卡号???? 如何在Dbgrid中显示备注型字段内容?
窗体设置: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.
ahjoe:是对TPanel响应WM_PAINT消息吗?我是新手,可以给段代码吗?
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.
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.
http://expert.csdn.net/Expert/topic/1859/1859582.xml?temp=.5681879xleep:我回去试试你的方法。