全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:910
推到 Plurk!
推到 Facebook!

Combobox中自绘制的怎么全是同样的图像?

尚未結案
zzmbeyond01
中階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-14 20:49:04 IP:222.183.xxx.xxx 未訂閱
大大好:    小兄不明白,在Combobox的Ondrawitem中绘制的怎么全是同样的图像? 小兄的思路是这样的 1\从文件夹中加载位图,依次存入stringlist中 2\赋给combobox.items 3、在Ondrawitem中绘出位图
 
procedure TForm1.FormCreate(Sender: TObject);
var
  i, lincnt: integer;
  LineStyleObj: CMapXStyle;
  pic: TBitmap;
begin  
  LineStyleObj := CoStyle.Create;       Pic := TBitmap.Create;
  LineStyleList := TStringlist.Create;
  with LineStyleList do
  begin
    for i := 0 to lincnt - 1 do
    begin
   pic.LoadFromFile('.\Line'   inttostr(i)   '.bmp');
        LineStyleList.AddObject(inttostr(i), pic);
   end;
  end;
  LineStyleComboBox.Items := LineStyleList;
  LineStyleComboBox.DropDownCount := 3;
  LineStyleComboBox.ItemIndex := 0;
end;    procedure TForm1.LineStyleComboBoxDrawItem(Control: TWinControl; Index: Integer;//请问大大,index是不是依据.DropDownCount自动变化来进行绘制的?我用了一个showmessage(inttostr(index)),一直在不停的循环 
  Rect: TRect; State: TOwnerDrawState);
var
  Pic: TBitmap;
begin
  with TComboBox(Control).Canvas do
  begin
    FillRect(Rect);
    Pic := TBitmap(LineStyleComboBox.Items.Objects[index]);
    Brush.Bitmap := pic;
    Rectangle(rect);
    Brush.Bitmap := nil;
  end;
end;
發表人 - zzmbeyond01 於 2004/07/14 21:48:03
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-15 01:10:22 IP:203.204.xxx.xxx 未訂閱
zzmbeyond01 你好
  修改一下程式如下:    procedure TForm1.FormCreate(Sender: TObject);
var
  i, lincnt: integer;
  LineStyleObj: CMapXStyle;
  pic: TBitmap;
begin  
  LineStyleObj := CoStyle.Create;       LineStyleList := TStringlist.Create;
  with LineStyleList do
  begin
    for i := 0 to lincnt - 1 do  // lincnt = ?? 好奇怪
    begin
      Pic := TBitmap.Create;  // 要個別建立
      pic.LoadFromFile('.\Line'   inttostr(i)   '.bmp');
      LineStyleList.AddObject(inttostr(i), pic);
   end;
  end;
  LineStyleComboBox.Items := LineStyleList;
  LineStyleComboBox.DropDownCount := 3;
  LineStyleComboBox.ItemIndex := 0;
end;    
_______________________________________ 深藍的魚,祝您好運..........連.連
zzmbeyond01
中階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-15 10:14:48 IP:222.183.xxx.xxx 未訂閱
多谢chance36大大! 但是小兄想多问一下,就是  
 
在循环中,创建一个pic(位图对象)加载一个位图,但是我释放free掉后就会冲突,不释放的话,我想会很占用资源,请问该怎么解决?
     for i := 0 to linecnt - 1 do
  begin
//依据线型样式号i,设置样式
//将样式以位图形式保存在image文件夹
//通过bmp对象,将位图和id加载到字符串列表中 
      pic := TBitmap.Create;
      pic.LoadFromFile('.\image\Line'   inttostr(i)   '.bmp');
      LineStyleList.AddObject(inttostr(i), pic);
      pic.Free在这里释放,在ondrawitem中又会冲突< >< >
    end;
不懂的时候,多向高手请教,多学、多问、多思考
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-15 12:43:05 IP:203.204.xxx.xxx 未訂閱
引言: 在循环中,创建一个pic(位图对象)加载一个位图,但是我释放free掉后就会冲突,不释放的话,我想会很占用资源,请问该怎么解决?
zzmbeyond01 你好 這是一個互相矛盾的問題,想要使用pic,但又不希望它佔記憶體空間,這.... 除非使用時間換取空間的策略,或資源共享的方式:(完全不佔空間是不可能的) 時間換取空間:位圖放在硬碟,Listl 只記錄檔名,當要畫出的時候再從硬碟載入,輸出後隨即釋放。 資源共享:將數個位圖拼成一張大的位圖,每個ListItem只記錄其矩形座標,一毎大的Pic比對多個小的Pic省資源,像一些游戲也是採用這方式,時門與空間兼得。 _______________________________________ 深藍的魚,祝您好運..........連.連
zzmbeyond01
中階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-07-15 12:58:37 IP:222.183.xxx.xxx 未訂閱
引言: 將數個位圖拼成一張大的位圖
是怎么回事?使用imagelist实现吗 我用很多位图样式,是通过把一个位图一个image来实现的,画的。。 發表人 - zzmbeyond01 於 2004/07/15 13:04:21
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-07-15 13:20:45 IP:203.204.xxx.xxx 未訂閱
就是一張很大的位圖,畫些小格 (0,0,100,100)    :這一區就是第一張小圖 (101,0,200,100)  :這一區就是第二張小圖 (201,0,300,100)  :這一區就是第三張小圖 .... (0,101,101,200)  :這一區就是第N張小圖        _______________________________________ 深藍的魚,祝您好運..........連.連
zzmbeyond01
中階會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-07-15 13:35:08 IP:222.183.xxx.xxx 未訂閱
大大是通过类似 image1.Canvas.Rectangle();的方法来截取各个方块吧    不懂的时候,多向高手请教,多学、多问、多思考    
系統時間:2024-05-16 18:31:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!