📄 9933.txt
字号:
---- 现在你已经能够在文件,数据库,内存中任意读写数据流了。试试
看吧!
****************************************************************
Delphi显示Windows图标
作者: 江立
---- 大量的图标显示是Windows中的一大特色,丰富多彩的图标不仅美化
了Windows的桌面,而且便于直观的操作,给用户带来了极大的方便。可
以说在某种程度上,图标的地位已经超过了文件名的作用。
---- 但是,当我们用可视化编程工具进行Windows编程时,却很少有方便
的方法来加载和显示图标。一般来说,在我们的应用程序中使用到图标资
源时都是我们自己亲自绘制出来的。因此,在我们编的程序中使用到的图
标是很有限的。我们知道Windows中有大量已知的系统图标,如文件夹的图
标、磁盘驱动器的图标等等。熟悉Windows编程的朋友也许知道这些图标在
Windows内部是有其特定的编号的,只要获取了这些编号就能够调用并显示
对应的图标了。通过比较,我选择了Delphi中的ListView组件来显示图标,
因为这种方法是最简单的。
---- 下面是一个例子,该程序在Delphi 4.0中编译通过。
---- 该演示程序可以显示各类Windows系统图标,包括文件图标、磁盘图
标、文件夹图标、用户特定可执行文件图标(如:Delphi的火炬图标等等)。
有趣的是,我们显示的这些图标没有一个需要我们自己亲自动手绘制。
---- 请先在Delphi环境下建立一个窗体Form1,并在Form1中添加一个按钮
Button1和一个列表框ListView1;然后请设置ListView1的属性ViewStyle
为vsIcon。
---- 源程序清单:
unit Unit1;
interface
uses
Windows, Messages, SysUtils,
Classes, Graphics, Controls,
Forms, Dialogs, ComCtrls,
StdCtrls, ShellAPI, ExtCtrls,
ImgList;
type
TForm1 = class(TForm)
ListView1: TListView;
Button1: TButton;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
Test='C:';
{ Test为测试数据,在本例中返回的是一个驱动器图标。读者
可以自行选择其他测试数据如:Test:='C:Autoexec.bat'
等等。}
var
Form1: TForm1;
ShFileInfo: TSHFILEINFO;
implementation
{$R *.DFM}
function GetFileIconIndex
(FileName:string):integer;
{ 获取图标的序号函数 }
var
Ext:String;
begin
Ext:=FileName;
Result:=ShGetFileInfo(Pchar
(Ext), 0, SHFileInfo,
SizeOf(SHFileInfo), SHGFI_LARGEICON or
SHGFI_SYSICONINDEX or SHGFI_TYPENAME);
Result:=SHFileInfo.iIcon;
{ 返回获取的图标序号 }
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with ListView1 do
begin
SmallImages:=TImageList.CreateSize(32,32);
SmallImages.ShareImages:=True;
SmallImages.Handle:=ShGetFileInfo('*.*',0,
SHFileInfo, SizeOf(SHFileInfo),
SHGFI_LARGEICON or
SHGFI_ICON or SHGFI_SYSICONINDEX);
LargeImages:=TImageList.CreateSize(32,32);
LargeImages.ShareImages:=True;
LargeImages.Handle:=ShGetFileInfo('*.*',0,
SHFileInfo, SizeOf(SHFileInfo),
SHGFI_LARGEICON or
SHGFI_ICON or SHGFI_SYSICONINDEX);
end;
{ 分配系统资源给ListView1组件以显示图标 }
end;
procedure TForm1.FormDestroy
(Sender: TObject);
begin
ListView1.SmallImages.Free;
ListView1.LargeImages.Free;
{ 释放ListView1占用的系统资源 }
end;
procedure TForm1.Button1Click
(Sender: TObject);
begin
ListView1.Items.Item[0].
ImageIndex:=GetFileIconIndex(Test);
{ 为ListView1中的第一个项目绘制图标 }
end;
end.
****************************************************************
如何在C++ Builder中显示透明位图
信息产业部电子第二十二研究所 牛有田
---- 我们知道,GIF类型的图像格式支持透明显示,而BMP类型的图像格式
不支持透明显示。在Microsoft照片编辑器中位图若以设置成透明色方式存
贮,则提示出错。然而,在功能强大的C++ Builder中,不但能显示透明位
图,而且可以说是一件轻易而举的事情。有了透明显示位图的技术,您就
能制作出象图像合成等奇妙的效果来。透明位图与透明GIF图像相比有一个
很大的优点,即:GIF图像格式最大支持256种颜色,位图却可以支持真彩
色。在C++ Builder中显示透明位图有好几种方法:
---- 1. 第一种方法是采用Timage组件。
---- 这种方法简单有效,并且当进行图像合成时,对背景图像的类型和格
式不作要求。在缺省情况下,以位图最左下角象素的颜色为透明色。
---- 下面,我们制作一幅飞机凌空飞过蓝天的简单动画。因为移动的飞机
是用透明位图显示的,所以看起来挺逼真的。在C++ Builder下激活菜单
“File/New Application”创建一个新工程,窗体单元以文件planemain.cpp
存盘,工程文件以plane.cpp存盘。? 在Form1窗体上新增一个TButton组件
Button1,新增一个TTimer组件Timer1,新增三个TImage组件Image1、Image2
和Image3,新增一个TLabel。
---- 在窗体上双击Image1,调入蓝天的位图BlueSky.bmp,设置其Transpartant
属性为false,即为不透明,作为背景;双击Image2,调入飞机的位图Plane.bmp,
设置其Transparent属性为true,即为透明,Autosize属性为true,把Image2
放在Image1上面。此时可以看出,飞机已经融入蓝天中。作为对比,双击
Image3,调入飞机的位图Plane.bmp,设置其Transparent属性为false,即为
不透明,Autosize属性为true。设置Label1的Caption属性为“源位图”。
设置Button1的Caption属性为“开始”。设置Timer1的Enabled属性为false,
Interval属性为100(决定飞机飞行的快慢,可调整)。
Timer1的OnTimer事件控制飞机的移动,代码如下:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Image2->Left=Image2->Left+1;
}
Button1的OnClick事件启动飞机,代码如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1->Enabled=true;
}
---- 2. 第二种方法是直接从文件中调入位图,然后画在屏幕上。这种方法
灵活,且占用内存少。我们继续上面的程序设计:
---- 在窗体上新增一个TButton组件Button2,设置其Caption属性为“显示
透明位图”。
---- Button2的OnClick事件显示透明的位图,代码如下:
void __fastcall TForm1::Button2Click(TObject *Sender)
//单击“显示透明位图”按钮时进入
{
Graphics::TBitmap *pBitmap=new Graphics::TBitmap();
try
{
pBitmap- >LoadFromFile("Plane.bmp"); //调入位图
pBitmap- >Transparent = true; //设置透明属性
pBitmap- >TransparentColor=
pBitmap- > Canvas- >Pixels[2][2];
//从位图上取得要设置成的透明颜色,也可以直接给出
Form1- >Canvas- >Draw(10,20,pBitmap); //AA
//在窗体上显示透明位图, 没有设置TransparentMode
//以位图[2][2]处的象素的颜色为透明色
pBitmap- >TransparentMode = tmAuto;
//设置透明模式, tmAuto: TransparentColor属性返回位
//图最左下角象素的颜色,作为透明色;
// tmFixed: TransparentColor属性返回位图上某一象素
//的颜色,作为透明色。
Form1- >Canvas- >Draw(10,100,pBitmap); //BB
//在窗体上显示透明位图, 与AA行有所不同
//以位图最左下角的象素的颜色为透明色
Image1- >Canvas- >Draw(30,20,pBitmap);
//在背景位图上显示透明位图
}
catch (...)
{
ShowMessage("不能调入或显示位图!");
//显示出错信息
}
delete pBitmap; //删除对象
}
---- 应用这种方法进行图像合成时,背景图像要求是位图,并且透明位图
和背景位图的颜色位数要尽量保持一致,这样,位图的颜色才不会改变。
我做了一个试验:飞机位图的颜色是24bits真彩色,①当背景位图BlueSky.bmp
(取自Win98下的Clouds.bmp)是256色时,显示不正确(这可能是C++ Builder
的一个BUG);②当背景位图是其它256色位图(如C++ Builder提供的factory.bmp
等),甚至于是16色位图时,却显示正确!但是飞机位图颜色要变为256色
或16色(颜色发生转换)。为了解决①中的错误,我们可在“画图”中先调
入Clouds.bmp位图,然后再以24bits颜色格式“另存为……”,以此新位图
为背景,显示的飞机正确且不改变颜色。
---- 另外,我们利用TImageList组件也可以显示透明图像,利用TCanvas类
的BrushCopy方法可以实现被拷贝图像的部分透明。
---- 以上程序在Win98和C++ Builder3下调试通过。
****************************************************************
PB中一个类Word打印对话框的实现
许昌市电力设计研究所 高灵超
----Powerbuilder数据窗口可用于生成各种复杂的报表,但如何让用户在
使用时控制打印份数、打印范围等信息呢?
----我们在开发我局MIS系统时,经过对我局报表打印需求的分析,提出了
如下的功能要求:
----1.必须能够控制象打印份数、打印(页码)范围等信息,这是基本的
要求。
----2.我们系统中装有多台打印机,必须能让用户根据自己需要选择使用
哪台打印机,必要时能对所选打印机进行配置。
----3.在设计时,对每一个报表需要什么样的纸张,要多大的边距合适,
都已确定,所以使用时不需要页面的设置。但由于不同的报表使用不同的
纸张,必须在使用时给出提示,以便用有机会换上合适的纸张(或换用合
适的打印机)。
----根据以上要求,我们设计了如下图所示的对话框。下面把设计过程以
及用到的技术介绍一下。
----首先使用窗口画板画出窗口,名字为w_printdlg,窗口类型为respons。
“打印机”组框中的“名称”文本控制的名字为st_printname,“设置”
按钮的名字为cb_printsetup。“页面范围”组框中的无线按钮组名字分别
为rb_pagearrangeall,、rb_pagearrangecurrent、rb_pagearrange,单行
编辑框名字为sle_pagearrange,其enable属性为false。“副本”组框中的
编辑域名字为em_copies。“打印”旁边的下拉列表框名字为ddlb_printwhat,
列表有三项,分别为所选页面、偶数页、奇数页。“纸张”组框中的下拉
列表框名字为ddlb_paper,列表内容为Poerbuiler定义的43种纸张类型,
分别用0-42的数字来表示。“纵向”无线按钮的名字为rb_portrait,“横
向”无线按钮的名字为rb_landscape。表示纵向和横向的图片框分别为
p_portrait和p_landscape。命令按钮“确定”和“取消”的名字分别为
cb_ok和cb_cancel。
----以上工作完成之后,就要着手编写程序。
----首先为窗口定义实例变量idw_toprint,类型为datawindow,用于保存
要打印的数据窗口。再定义一个窗口事件ue_initcontrols(也可以定义为
窗口函数),其程序内容如下:
// event ue_initcontrols( )
//设置窗口中各控件的初始值
st_printername.text = idw_toprint.object.
datawindow.printer //当前打印机名字
em_copies.text = "1" //默认打印份数为1
rb_pagearrangeall.checked = true //默认范围为全部页
sle_pagearrange.enabled = false //页面范围编辑框无效
ddlb_printwhat.SelectItem( 1 ) //默认为“所选页面”
//打印方向
integer li_temp
li_temp = integer( idw_toprint.object.
datawindow.print.orientation ) //取出设计时的方向
if li_temp = 1 then //横向
rb_landscape.checked = true //选中
p_landscape.visible = true //图片显示
p_portrait.visible = false
elseif li_temp = 2 then //纵向
rb_portrait.checked = true
p_portrait.visible = true
p_landscape.visible = false
end if
//纸张类型
li_temp = integer( idw_toprint.object.
datawindow.print.Paper.Size ) //设计时的纸张类型
ddlb_paper.SelectItem( li_temp + 1 ) //列表框中选中
然后,在窗口的open事件中编写如下脚本:
// open event
//要使用OpenWithParm( )打开,参数中包含要打印的数据窗口。
idw_toprint = message.powerobjectparm
//从参数中取出要打印的数据窗口
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -