線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1092
推到 Plurk!
推到 Facebook!

combobbox 中添加图形

尚未結案
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-11 19:19:22 IP:218.70.xxx.xxx 未訂閱
大大好: 我希望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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-11 21:15:56 IP:202.39.xxx.xxx 未訂閱
須先指定 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-11 21:20:47 IP:222.183.xxx.xxx 未訂閱
多谢hagar大大, 但是我在formcreate的时候,已经 patterncombobox.ItemIndex:=0; 希望一显示的时候就已经画好
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-11 21:28:36 IP:202.39.xxx.xxx 未訂閱
那小弟改過後的可行嗎? 另外, 您可以注意到 OnDrawItem 事件中有個 Index 參數 來判定要繪哪個 Item -- 西瓜生食能解渴生津、利尿、降血壓,有「天生白虎湯」之稱。
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-11 21:52:04 IP:222.183.xxx.xxx 未訂閱
多谢hangar大大,可以绘制出来。 我现在往combobox中就添加一个图形对象,鼠标点击时下拉菜单可以显示, 但是一在其它地方(combobox区域以外)点击,图形就没有了,那怎么办,我想让它一直显示的?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-11 22:00:08 IP:202.39.xxx.xxx 未訂閱
您在 FormCreate 事件中那幾行要做啥? 如果沒用的話, 留下 ItemIndex 那行就好了 小弟這邊試是沒您所描述的問題 -- 西瓜生食能解渴生津、利尿、降血壓,有「天生白虎湯」之稱。
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-11 22:16:27 IP:222.183.xxx.xxx 未訂閱
还是不行也。。 我是希望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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-07-12 08:05:49 IP:202.39.xxx.xxx 未訂閱
您的 PatternComboBox 的 Item 共有幾個? 看您程式中只在 FormCreate 時 Add 了一個 '02' 與一個 Object 因此, 在 OnDrawItem 時只有 '02' 這個 Item 才會繪出它這 Index 所指向的 Object 如果有其它 Item 的話, 就繪不出來, 也就是空白了. -- 西瓜生食能解渴生津、利尿、降血壓,有「天生白虎湯」之稱。
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-07-12 10:45:33 IP:222.183.xxx.xxx 未訂閱
您的 PatternComboBox 的 Item 共有幾個?      我在Patterncombobox的Item中只有一个,也只希望显示一个条目。而且要在combbobox中始终显示出图像。   我是想用combobox显示一个图像,点击时候,显示另一个窗体可供选择新的图像样式。利用combobobx就是想要产生一种欺骗效果。 我想是不是用combobox控件不是很正确?         發表人 - zzmbeyond01 於 2004/07/12 11:09:26
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-07-12 11:38:03 IP:202.39.xxx.xxx 未訂閱
很奇怪,小弟這邊試沒這個問題 程式一 run 起來,在 ComboBox 內就顯示 fill02.bmp 的圖 而後不管點選 ComboBox1, 或 Form1 的其它地方 ComboBox 還是顯示 fill02.bmp 的圖,不會變成空白 還是有什麼地方沒檢查到? 比方說,將 ComboBox1.ItemIndex 設為 -1 了? -- 西瓜生食能解渴生津、利尿、降血壓,有「天生白虎湯」之稱。
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-07-12 11:53:22 IP:222.183.xxx.xxx 未訂閱
我这边总是要点击才显示出图像,并且只有在下拉条目中点击图像条目(样式巨丑)才能显示>> 我把源码添上来 < 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-07-12 12:00:36 IP:202.39.xxx.xxx 未訂閱
引言: 我这边总是要点击才显示出图像,并且只有在下拉条目中点击图像条目(样式巨丑)才能显示>< face="Verdana, Arial, Helvetica"> 1.小弟這邊不需要點擊就可顯出圖像, 這點跟您不同 2.小弟這邊一樣要點擊其它 Item 才可觸發 ComboBox 的 OnClick 事件, 這點跟您相同 3.小弟用 D5 4.您整個 form1 只有這些程式碼嗎? -- 西瓜生食能解渴生津、利尿、降血壓,有「天生白虎湯」之稱。
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-07-12 12:59:47 IP:222.183.xxx.xxx 未訂閱
全部过程如图: 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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-07-12 16:01:35 IP:202.39.xxx.xxx 未訂閱
以下是小弟這邊 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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-07-12 21:53:49 IP:222.183.xxx.xxx 未訂閱
还是没有成功,按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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-07-13 15:17:11 IP:222.183.xxx.xxx 未訂閱
多谢hagar大大费心
系統時間:2024-05-16 16:18:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!