嘿嘿,这些简单的问题让大家见笑了。
提出这件事的原意是,前些天CAKK不是提出想做一个带CHECK盒的TREEVIEW
吗?我就想就些问题做一个,顺便学习一下做控件的技巧。没想到问题多多。
:)
由CAKK的问题以及大家对此问题的作答,我拟出两个方案:
<font color="red">1、用CANVAS。</font>
用TREEVIEW的CANVAS直接进行TEXTOUT和DRAW,将原来的NODE向后面移
一定距离,而这个位置就留给CHECKBOX。用此方法可以让原来的STATEIMAGES
能继续使用,也就是说,加上这个BOX,一个NODE可以同时有三个图标。尽
管这没有必要。但它需要知道NODE的位置才能DRAW和TEXTOUT;
<font color="red">2、用已有的STATEIMAGES。</font>
我想,屏蔽了原来的这个选项,直接在控件内部建一个IMAGELIST,
并让它原来的STATEIMAGES指向它,然后用CheckState属性直接得到它的图标。
由此,必须建立一个内部的ImageList,而且为了使用这个有内容(图标),还
必须弄上几个小图,如TQZ所说的放在资源文件中(这一点来说是正确的,接
受答案了)。
可是又发现了新问题,安装了控件之后运行程序竟然发现有“找不到
TCustomImageList类”!真是头痛。我有个直觉,应该是在<font color="red">
FCheckImageList := TCustomImageList.Create(AOwner);</font>
这一句出乱子,而且后面的参数好象也用得不大好。
第一次学做控件,不了解控件的很多方面,知识还浅薄的很,请大侠们原谅,
并给予指教。下面是控件的源码,致命错误是一定有的,请指正。
<font color="gray">只写了丁点儿就发生这样的事,真让我心灰意冷。</font>
另求教,<font color="red">如果屏蔽了原来的stateimages属性呢?</font>
unit CheckTreeView;
interface
uses
Messages, Windows, MultiMon, Classes, Sysutils, Graphics,
CommCtrl, Controls, ComCtrls, ImgList;
type
TCheckTreeView = class(TTreeView)
private
FCheckState : Byte;
FChecked : Boolean;
FCheckImageList : TCustomImageList;
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent);
OverRide;
procedure CreateWnd;
OverRide;
destructor Destroy;
override;
procedure SetChecked(Index: Integer;
State : Byte);
procedure SetCheckState(Index: Integer;
State : Byte);
function GetChecked(Index: Integer) : Byte;
function GetCheckState(Index: Integer) : Byte;
{ Public declarations }
published
property StateImages Read FCheckImageList;
property Checked : Boolean read FChecked Write FChecked Default False;
property CheckState : Byte read FCheckState Write FCheckState Default 1;
{ Published declarations }
end;
procedure Register;
implementation
<font color="blue">{$R CheckTreeView.res}</font>
procedure Register;
begin
RegisterComponents('Standard', [TCheckTreeView]);
end;
constructor TCheckTreeView.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FCheckImageList := TCustomImageList.Create(AOwner);
end;
procedure TCheckTreeView.CreateWnd;
Var
FBMP : TBitmap;
begin
inherited CreateWnd;
With FCheckImageListdo
begin
FBMP := TBitmap.Create;
FBMP.Handle := LoadBitmap(hInstance, PChar('UnCheck.bmp'));
// 这三个图都已放在资源文件中了。
FCheckImageList.Add(FBMP, FBMP);
// state = 0, no use always
FCheckImageList.Add(FBMP, FBMP);
// state = 1, UnCheck
FBMP.Handle := LoadBitmap(hInstance, PChar('Checked.bmp'));
FCheckImageList.add(FBMP, FBMP);
// state = 2, Checked
FBMP.Handle := LoadBitmap(hInstance, PChar('GrayCheck.bmp'));
FCheckImageList.Add(FBMP, FBMP);
// state = 3, Graycheck
end;
FBMP.Free;
end;
destructor TCheckTreeView.Destroy;
begin
FCheckImageList.Free;
inherited;
end;
procedure TCheckTreeView.SetChecked(Index: Integer;
State : Byte);
begin
//
end;
procedure TCheckTreeView.SetCheckState(Index: Integer;
State : Byte);
begin
//
end;
function TCheckTreeView.GetChecked(Index: Integer) : Byte;
begin
//
end;
function TCheckTreeView.GetCheckState(Index: Integer) : Byte;
begin
//
end;
end.
--------------------------------------------------------------
TO VC:
如何将文件变成流数据呢?
又如何将流放在TMemoryStream中呢?
给出源码至少给分1/3。