combobbox 中添加图形 |
尚未結案
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
大大好:
我希望combobox显示时,默认显示一种图片填充样式,而不是要点击下拉框之后才显示各个图片,而且在我单击这个combobox时,弹出一个窗体。现在就是不知道如何实现默认显示一种图片填充样式,添加完之后,总是显示的是空地,需要点击之后才能选择。。 我已经把combobox的style设为csOwnerDrawFixed类型,在OnDrawitem中写了绘制画布的代码,请问如何将图形直接就显示在combobox中,而不是需要单击后再绘制。 < class="code">
procedure TForm1.FormCreate(Sender: TObject);
var
pic: TBitmap;
begin
pic := TBitmap.Create;
pic.LoadFromFile('.\image\02.bmp');
patterncombobox.Items.AddObject('02', pic); patterncombobox.Canvas.Brush.Bitmap :=pic; patterncombobox.Canvas.Rectangle(patterncombobox.ClientRect.Left,patterncombobox.ClientRect.Bottom,
patterncombobox.ClientRect.Right,patterncombobox.ClientRect.Top);
patterncombobox.Canvas.Brush.Bitmap := nil;
patterncombobox.ItemIndex:=0; 希望一显示的时候就已经画好
end; procedure TForm1. PatternComboBoxDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
pic: TBitmap;
begin
//在combobox的画布上显示
pic := TBitmap.Create;
pic.LoadFromFile('.\image\fill02.bmp');
patterncombobox.Canvas.Brush.Bitmap := pic;
patterncombobox.Canvas.Rectangle(patterncombobox.ClientRect);
patterncombobox.Canvas.Brush.Bitmap := nil;
end; 發表人 -
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
須先指定 TComboBox 的 ItemIndex 值為何, 例: PatternCombobox.ItemIndex := 0;
另外, 注意紅色部份.
procedure TForm1. PatternComboBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var pic: TBitmap; begin //在combobox的画布上显示 pic := TBitmap.Create; pic.LoadFromFile('.\image\fill02.bmp'); patterncombobox.Canvas.Brush.Bitmap := pic; patterncombobox.Canvas.Rectangle(Rect); patterncombobox.Canvas.Brush.Bitmap := nil; pic.Free; end;最後, 要記得手動把 pic Free 掉 -- 西瓜生食能解渴生津、利尿、降血壓,有「天生白虎湯」之稱。 發表人 - hagar 於 2004/07/11 21:17:19 |
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
还是不行也。。
我是希望combobox显示的时候,就在起画布中填充好样式,单击combobox,显示
另一个窗体选择样式,进行填充。
现在的问题是,只有点击的时候,位图才会填充进combobbox的画布,一点击其它地方,就变为空白
代码已经改为
procedure TForm1.FormCreate(Sender: TObject); var pic: TBitmap; begin pic := TBitmap.Create; pic.LoadFromFile('.\image\fill02.bmp'); //图像与combobox绑定 patterncombobox.Items.AddObject(‘02’, pic); patterncombobox.ItemIndex:=0; end; procedure TForm1.PatternComboBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var pic: TBitmap; begin //显示图形 pic := TBitmap(patterncombobox.items.objects[Index]); patterncombobox.Canvas.Brush.Bitmap :=pic; patterncombobox.Canvas.Rectangle(rect); yfpatterncombobox.Canvas.Brush.Bitmap := nil; end; procedure TForm1.PatternComboBoxClick(Sender: TObject); var ShowingPoint: TPoint; begin //显示窗体2 Form2.Left := PatternCombobox.ClientOrigin.X; // 让Form2在当前光标处显示 Form2.Top := PatternCombobox.ClientOrigin.Y PatternCombobox.ClientHeight; Form2.Show end; |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
我这边总是要点击才显示出图像,并且只有在下拉条目中点击图像条目(样式巨丑)才能显示>> 我把源码添上来 < class="code">
//窗体创建的时候,combobox获得位图对象
procedure TForm1.FormCreate(Sender: TObject);
var
pic: TBitmap;
begin
pic := TBitmap.Create;
pic.LoadFromFile('.\image\fill02.bmp');
yfpatterncombobox.Items.AddObject(‘02’, pic);
yfpatterncombobox.ItemIndex := 0;
end; //在combobbox中绘制图像
procedure TForm1.YFPatternComboBoxDrawItem(Control: TWinControl;
Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
pic: TBitmap;
begin
//在combox中绘制样式
//1、把对应的位图显示为bmp文件
//在combobox的画布上显示
pic := TBitmap(yfpatterncombobox.items.objects[Index]);
yfpatterncombobox.Canvas.Brush.Bitmap := pic;
yfpatterncombobox.Canvas.Rectangle(rect);
yfpatterncombobox.Canvas.Brush.Bitmap := nil;
end; //点击combobox后,在combobox下显示弹出窗体
procedure TForm1.YFPatternComboBoxClick(Sender: TObject);
begin
Form2.Left := YFPatternCombobox.ClientOrigin.X; /
Form2.Top := YFPatternCombobox.ClientOrigin.Y YFPatternCombobox.ClientHeight;
Form2.Show
end; 图像显示的好难受< >< >
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
全部过程如图:
0:程序启动后
1:点击combobox,出现条目选择条目(巨丑露)< >< >
< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=16611236&CC=371504"> 2:显示窗体form2
3:点击其它地方
全部的测试程序码了,是一样的
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DB, ADODB, OleCtrls, MapXLib_TLB, ExtCtrls, ColorGrd; type TForm1 = class(TForm) YFPatternComboBox: TComboBox; ADOConnection1: TADOConnection; YFStyleDataSet: TADODataSet; comboshowstylebtn: TButton; PaintBox1: TPaintBox; YFStyleDataSetID: TBCDField; YFStyleDataSetMAINMAPNAME: TStringField; YFStyleDataSetOBJNAME: TStringField; YFStyleDataSetOBJSTATE: TStringField; YFStyleDataSetREGIONBORDERSTYLE: TStringField; YFStyleDataSetREGIONBORDERCOLOR: TStringField; YFStyleDataSetREGIONBORDERWIDTH: TStringField; YFStyleDataSetREGIONBORDERWIDTHUNIT: TStringField; YFStyleDataSetREGIONPATTERN: TStringField; YFStyleDataSetREGIONCOLOR: TStringField; YFStyleDataSetREGIONBACKCOLOR: TStringField; YFStyleDataSetREGIONTRANSPARENT: TStringField; YFStyleDataSetOBJBMP: TBlobField; Button2: TButton; procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure YFPatternComboBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure YFPatternComboBoxClick(Sender: TObject); private { Private declarations } public YFStyle: CMapXStyle; end; var Form1: TForm1; implementation uses RegionPatternPgUnit; {$R *.dfm} //窗体创建的时候,combobox获得位图对象 procedure TForm1.FormCreate(Sender: TObject); var pic: TBitmap; begin //获得样式对象 //YFStyle := Costyle.Create; // YFStyle.RegionColor := YFStyleDataset.fieldbyname('REGIONCOLOR').AsInteger; // YFStyle.RegionPattern := YFStyleDataset.fieldbyname('REGIONPATTERN').AsInteger; pic := TBitmap.Create; pic.LoadFromFile('.\image\fill02.bmp'); yfpatterncombobox.Items.AddObject(YFStyleDataset.fieldbyname('REGIONPATTERN').AsString, pic); yfpatterncombobox.ItemIndex := 0; end; //在combobbox中绘制图像 procedure TForm1.YFPatternComboBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var yfstr: string; StyleRect: CMapXRectangle; pic: TBitmap; begin //在combox中绘制样式 //1、把对应的位图显示为bmp文件 //在combobox的画布上显示 pic := TBitmap(yfpatterncombobox.items.objects[Index]); yfpatterncombobox.Canvas.Brush.Bitmap := pic; // yfpatterncombobox.Canvas.Rectangle(rect); yfpatterncombobox.Canvas.Brush.Bitmap := nil; end; procedure TForm1.YFPatternComboBoxClick(Sender: TObject); begin //点击combobox后,在combobox下显示弹出窗体 Form2.Left := YFPatternCombobox.ClientOrigin.X; // 让Form2在当前光标处显示 Form2.Top := YFPatternCombobox.ClientOrigin.Y + YFPatternCombobox.ClientHeight; Form2.Show end; procedure TForm1.Button2Click(Sender: TObject); var yfstr: string; StyleRect: CMapXRectangle; begin //控制样式的绘制 StyleRect := CoRectangle.Create; StyleRect.Set_(0, 0, paintbox1.Height, paintbox1.Width); YFStyle.DrawRegionSample(paintbox1.Canvas.Handle, stylerect); end; end. |
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
以下是小弟這邊 Form1 的 Source, Form1 上只放一個 ComboBox1
但奇怪的是小弟這邊一 run 起來後
ComboBox1 上是會顯示圖而不會空白
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) ComboBox1: TComboBox; procedure FormCreate(Sender: TObject); procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure ComboBox1Click(Sender: TObject); public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); var pic: TBitmap; begin pic := TBitmap.Create; pic.LoadFromFile('c:\delete.bmp'); Combobox1.Items.AddObject('02', pic); ComboBox1.ItemIndex := 0; end; procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); var pic: TBitmap; begin pic := TBitmap(ComboBox1.items.objects[Index]); ComboBox1.Canvas.Brush.Bitmap := pic; ComboBox1.Canvas.Rectangle(rect); ComboBox1.Canvas.Brush.Bitmap := nil; end; procedure TForm1.ComboBox1Click(Sender: TObject); begin Form2.Left := ComboBox1.ClientOrigin.X; Form2.Top := ComboBox1.ClientOrigin.Y ComboBox1.ClientHeight; Form2.Show; end; end.-- 西瓜生食能解渴生津、利尿、降血壓,有「天生白虎湯」之稱。 發表人 - hagar 於 2004/07/12 16:08:54 |
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
还是没有成功,按hagar大大的写法也没有成功,总是有一点缺憾。 查资料,倒是用BrushCopy方法可以实现始终在combobox中显示位图,但是
我遇到无法把自己的位图正常显示在里面,始终是一个默认的填充色。只有点击时候,才能在左上角的地方显示一个很小位图(我得是8*8) 代码改成如下,可以显示一个默认的颜色,但是无法正常填充自己的位图。
< class="code">
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
ADOConnection1: TADOConnection;
YFStyleDataset: TADODataSet;
procedure FormCreate(Sender: TObject);
procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
private
FItems: TStrings;
public
property MyItems: TStrings read FItems write FItems;
end; var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject);
var
bmpstream: TADOBlobStream;
pic: TBitmap;
begin
YFStyleDataset.Close;
YFStyleDataset.Open;
bmpstream := TADOBlobStream.Create(TBlobField(YFStyleDataset.FieldByName('OBJBMP')), bmread);
pic := TBitmap.Create;
pic.LoadFromStream(bmpstream);
bmpstream.Free; MyItems := TStringlist.Create;
MyItems.AddObject('01', Pic); ComboBox1.Items.Assign(MyItems);
ComboBox1.DropDownCount := 1;
ComboBox1.ItemIndex := 0;
end; procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Pic: TBitmap;
begin
{ pic := TBitmap(ComboBox1.items.objects[Index]);
ComboBox1.Canvas.Brush.Bitmap := pic;
ComboBox1.Canvas.Rectangle(rect);
ComboBox1.Canvas.Brush.Bitmap := nil;} with TComboBox(Control).Canvas do
begin
FillRect(Rect);
Pic:=TBitmap(MyItems.Objects[Index]);
if Pic<>nil then
begin
BrushCopy(Rect,Pic,rect,clRed);
end;
end;end;
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |