⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9933.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:

---- 现在你已经能够在文件,数据库,内存中任意读写数据流了。试试
看吧! 
 
****************************************************************

                     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 + -