子窗口主菜单包括FileFunctionDirectory三个菜单项 分别用于完成文件的基本管理功能其它管理功能和目录管理功能
由于对话框界面设计很简单这里不再进行赘述 读者可直接参考后面将给出的对话框界面图(图)进行设计
子窗口的创建布置和关闭
子窗口的创建布置由父窗口的Windows菜单控制其菜单项如下
● New Windows : 创建新的子窗口
● Tile : 平铺
● Cascade : 层叠
● ArrangeIcon : 排列图标
● Minimized All : 极小化所有子窗口
子窗口的创建只需要简单调用窗体的Create方法
FileMan := TFMFormCreate(Application)
子窗口的标准排列方式直接调用MDI窗口的标准方法TileCascade和ArrangeIcons
极小化所有子窗口的实现利用MDI窗口的两个属性MDIChildCount和MDIChildren:
for i := to MDICount do
MDIChildren[i]Windowstate := wsMinimized;
子窗口关闭时释放内存空间为此在子窗口TFMForm的OnClose事件中令
Action := OnFree;
为了保持和Windows的File Manager的一致性我们也禁止关闭最后一个子窗口这需要在子窗口的OnCloseQuery事件处理过程中实现
If FileManagerMDIChildCount <= then
CanClose := False;
CanClose是OnCloseQuery事件过程返回的一个参数用于判定窗口是否可以关闭
由于这一过程归子窗口所有因而MDIChildCount前必须加上其对象名FileManager
但不幸的是这样一来我们的程序无法终止了!原来MDI窗口关闭前首先关闭其所有的子窗口如果子窗口不能关闭MDI窗口也不能关闭
为此我们需要判断发出关闭消息的是子窗口的系统菜单还是菜单的Exit项
定义一个全局变量
var
ExitClick: Boolean;
在子窗口的ExitClick事件处理过程中
ExitClick := True;
FileManagerExitClick(Sender)
子窗口关闭前可以利用这一全局变量检测是否应关闭
If (FileManagerMDIChildCount <= ) and (Not ExitClick) then
CanClose := False;
文件控件的联系
在本例中我们使用了一组新的控件TabSetDirectoryOutlineFileListBox用于显示和选择驱动器目录和文件与()中所用方法相比使用这一组控件需要少量的代码支持
TabSet与DirectoryOutline的联系在TabSet的Click事件处理过程中建立
With DriveTabSet do
DirectoryOutlineDrive := Tabs[TabIndex][];
DirectoryOutline与FileListBox的联系在DirectoryOutline的Change事件处理过程中建立
FileListDirectory := DirectoryOutlineDirectory;
FileListUpdate;
DriveTabSet的自画风格显示
Dephi为一些控件提供了自画风格的显示如ListBoxComboBoxTabSet等 在缺省情况下这些控件自动显示文本而在自画风格下拥有控件的窗体在运行时间内自己画出控件的每一项目
自画风格显示通常的应用是为项目除文本外再添加图形显示能以自画风格显示的控件有一个共同特点都拥有一个TStrings类型的项目链由于TStrings类的特点(参第三章)它们都可以加入一个和对应文本相联系的对象 而这正是自画风格显示的关键
通常情况下产生一个自画风格需要三个步骤
设置自画风格
向字符串链表添加图形对象
画出自画项目
设置自画风格
控件属性Style 用于设置自画风格对于DriveTabSet我们把Style 属性设置为tsOwnerDraw
对于ListBoxComboBox等控件的设置与TabSet略有差异读者可参阅联机帮助文档
向字符串链表添加图形对象
在应用程序中添加图片部件
在本程序中我们设置了三个图片部件NetWorkFloppyFixed并分别与三个位图文件NetWorkbmpFloppybmpFixedbmp相关联
把图片添加到字符串链表中
根据字符串链表的性质我们可以把对象与已存在的字符串建立联系也可以同时添加字符串和对象这里我们采用后一种方法
在子窗口的OnCreate事件处理过程中我们利用一个循环依次检测从a到z的驱动器是否存在以及驱动器的类型这利用了Windwos API函数GetDrivetype 如果驱动器不存在则返回否则返回驱动器的类型(DRIVE_REMOVABLEDRIVE_FIXEDDRIVE_REMOTE)根据驱动器类型我们可以判断与文本(驱动器名)同时添加到Tabs中的不同图形对象在添加过程中DriveTabSet的TabIndex被设置为当前驱动器
程序清单如下
procedure TFMFormFormCreate(Sender: TObject)
var
Drive AddedIndex: Integer;
DriveLetter: Char;
begin
for Drive := to do
begin
DriveLetter := Chr(Drive + ord(a))
case GetDrivetype(Drive) of
DRIVE_REMOVABLE:
AddedIndex := DriveTabSetTabsAddObject(DriveLetter FloppyPictureGraphic)
DRIVE_FIXED:
AddedIndex := DriveTabSetTabsAddObject(DriveLetter FixedPictureGraphic)
DRIVE_REMOTE:
AddedIndex := DriveTabSetTabsAddObject(DriveLetter NetworkPictureGraphic)
end;
if UpCase(DriveLetter) = UpCase(FileListDrive) then
DriveTabSetTAbIndex := AddedIndex;
end;
end;
画出自画项目
当把一个控件的风格设置为自画时Windows不再负责往屏幕上画出控件的项目而是为每个可见项目产生自画事件应用程序可以通过处理自画事件画出控件的项目
确定自画项目的大小
对于TabSet而言这在OnMeasureTab事件处理过程中完成我们需要把DriveTabSet每个标签的宽度增大到足以同时放下文本和位图
procedure TFMFormDriveTabSetMeasureTab(Sender: TObject; Index: Integer;
var TabWidth: Integer)
var
BitmapWidth: Integer;
begin
BitmapWidth := TBitmap(DriveTabSetTabsObjects[Index])Width;
Inc(TabWidth + BitmapWidth)
end;
由于TStrings的Objects属性中存放的对象都是TObject类型并没有Width属性因而需要再把它转化为TBitmap类型的对象
BitmapWidth := TBitmap(DriveTabSetTabsObjects[Index])Width;
返回目录DELPHI基础教程
编辑推荐
Java程序设计培训视频教程
JEE高级框架实战培训视频教程
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLEG数据库开发优化指南
Java程序性能优化让你的Java程序更快更稳定
C嵌入式编程设计模式
Android游戏开发实践指南
[] [] [] []