精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>WINDOWS界面设计>>bcb菜鸟问题?

主题:bcb菜鸟问题?
发信人: skyice()
整理人: supermario(1999-11-09 09:33:24), 站内信件
我想在listbox中为每个列表项添加位图,采用如下方法:
1.将listbox的style属性设为lbOnwerDrawvarible
2.unit.h文件内容:
//--------------------------------------------------------------------
-------
#ifndef UnitH
#define UnitH
//--------------------------------------------------------------------
-------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//--------------------------------------------------------------------
-------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TListBox *ListBox1;
    void __fastcall ListBox1DrawItem(TWinControl *Control, int Index,

          TRect &Rect, TOwnerDrawState State);
    void __fastcall ListBox1MeasureItem(TWinControl *Control, int Inde
x,
          int &Height);
    void __fastcall FormCreate(TObject *Sender);
private:        // User declarations
        Graphics::TBitmap* Bitmap[4];
public:         // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//--------------------------------------------------------------------
-------
extern PACKAGE TForm1 *Form1;
//--------------------------------------------------------------------
-------
#endif

3.unit.cpp 文件内容如下:

//--------------------------------------------------------------------
-------
#include <vcl.h>
#pragma hdrstop

#include "Unit.h"
//--------------------------------------------------------------------
-------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------
-------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//--------------------------------------------------------------------
-------

void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Ind
ex,
      TRect &Rect, TOwnerDrawState State)
{
    Graphics::TBitmap * pBitmap;
    int Offset=2;

    TCanvas * pCanvas=((TListBox *)Control)->Canvas;
    pCanvas->FillRect(Rect);
    pBitmap=(Graphics::TBitmap *)
    ((TListBox *)Control)->Items->Objects[Index];
    if(pBitmap)
    {
    pCanvas->BrushCopy(Bounds(Rect.Left+Offset,Rect.Top,
    pBitmap->Width,pBitmap->Height),pBitmap,
    Bounds(0,0,pBitmap->Width,pBitmap->Height),clRed);
    Offset+=6;
    }
    pCanvas->TextOut(Rect.Left+Offset,Rect.Top+10,
    ((TListBox *)Control)->Items->Strings[Index]);
    
}
//--------------------------------------------------------------------
-------

void __fastcall TForm1::ListBox1MeasureItem(TWinControl *Control,
      int Index, int &Height)
{
    Graphics::TBitmap * pBitmap;
    pBitmap->LoadFromResourceName(
    (unsigned int)HInstance,
    "Bitmap"+IntToStr(Index+1));
    if(pBitmap)
        Height=pBitmap->Height;
    else
        Height=13;
    
}
//--------------------------------------------------------------------
-------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    int i;
    for(i=0;i<=4;i++)
{
Bitmap[i]=new Graphics::TBitmap;
Bitmap[i]->LoadFromResourceName(
        (unsigned int)HInstance,
        "Bitmap"+IntToStr(i+1));
    ListBox1->Items->AddObject("pic"+IntToStr(i+1),
    Bitmap[i]);
    }

}
//--------------------------------------------------------------------
-------
4.在工程中插入资源文件unit.res,内容为Bitmap1-Bitmap5
但是显示出来的listbox并没有位图,关闭的时候就会出错,将位图加入到 
project.res中也不行。不知道是否我插入位图的方法有错,还是别的原因
请各位大虾帮忙,谢了!

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.99.83.185]
发信人: skeeter (小妖), 信区: CLanguage
标  题: Re: bcb菜鸟问题?
发信站: 网易虚拟社区 (Wed Nov  3 18:53:37 1999), 站内信件
//copy from a_hao's homepage
Drawing icons or bitmaps in a ComboBox or ListBox

In this example, we'll utilize the diversity of an ImageList to help u
s draw graphics in a ListBox. This code applies to ComboBoxes as well.
 The Combo/ListBox must be set to OwnerDrawn (fixed or variable). 

(1) Drop a TListBox on your Form, and set it to OwnerDrawn (Fixed or V
ariable). Also drop a TImageList on your form, and add your ListItem i
cons or bitmaps

(2) Declare an array of int(s) called MyIconMapper and set it's size t
o however many items are in your ListBox... 

//in header file 
private: int MyIconMapper[1000]; 

(3) Initialize the icon mapper, and handle the OnDrawItem event... 

// MyIconMapper will define what icons in the 
// ImageList correspond to what items in the ListBox. 
// Define the mapping in your constructor... 
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) 

 MyIconMapper[0] = 1;
 //ImageList image index 1 for ListBox item 0
 MyIconMapper[1] = 0;
 //ImageList image index 0 for ListBox item 1
 MyIconMapper[2] = 1;
 //ImageList image index 1 for ListBox item 2
 // and so on... 

//--------------------------------------------------------------------
------- 
// Add the following to the ListBox's OnDrawItem event handler... 
void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Ind
ex, TRect &Rect, TOwnerDrawState State)

 //Eliminate artifacts ListBox1->Canvas->FillRect(Rect);
 if (State.Contains(odSelected))
 { 
  ListBox1->Canvas->Font->Color = clWhite;
  ListBox1->Canvas->Brush->Color = clNavy;
 } 
 //Draw your Icon ImageList1->Draw(ListBox1->Canvas, Rect.Left, Rect.
Top, MyIconMapper[Index]);
 int offset = ImageList1->Width + 2;
 ListBox1->Canvas->TextOut(Rect.Left + offset, Rect.Top, ListBox1->It
ems->Strings[Index]); 


--
每次当你想着谁 就披散了头发任风吹 
沉默脸上留着泪 连哭了都没感觉 
我想知道他是谁 可是话到嘴边却后悔 
在这温柔的长夜 何必让你流泪 

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.98.120.226]
发信人: mrcloud (阿豪), 信区: CLanguage
标  题: Re: bcb菜鸟问题?
发信站: 网易虚拟社区 (Wed Nov  3 20:35:46 1999), 站内信件
刚刚试了一下.
ListBox1MeasureItem事件里要改一下:
    Graphics::TBitmap *pBitmap=new Graphics::TBitmap;
    ......
    delete pBitmap;
还有一个地方,我看了很长时间:
  private: // User declarations 
        Graphics::TBitmap* Bitmap[4]; <--Bitmap1~5,怎么只有4啊?
然后就pass了.
--
阿豪 [email protected]
最好的BCB学习网站 C++Builder开发网络(http://a_hao.163.net)
C++Builder 论坛(http://cppbahao.abc.yesite.com)

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.57.159]
发信人: skeeter (小妖), 信区: CLanguage
标  题: Re: bcb菜鸟问题?
发信站: 网易虚拟社区 (Thu Nov  4 09:50:31 1999), 站内信件
问一哈:
    你是怎莫把位图加入资源文件的???用IMAGELIST???
    我编译乐还是通不过????
    我再想想.......

--
每次当你想着谁 就披散了头发任风吹 
沉默脸上留着泪 连哭了都没感觉 
我想知道他是谁 可是话到嘴边却后悔 
在这温柔的长夜 何必让你流泪 

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.98.120.226]
发信人: mrcloud (阿豪), 信区: CLanguage
标  题: Re: bcb菜鸟问题?
发信站: 网易虚拟社区 (Thu Nov  4 10:51:05 1999), 站内信件
用Tools->ImageEditor
new一个res文件
再new五个bmp
保存为unit1.res
再在project viewer 里加入此资源文件即可。

--
阿豪 [email protected]
最好的BCB学习网站 C++Builder开发网络(http://a_hao.163.net)
C++Builder 论坛(http://cppbahao.abc.yesite.com)

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.17.228]

[关闭][返回]