Windows API调用系统对话框word资料15页Word格式.docx
《Windows API调用系统对话框word资料15页Word格式.docx》由会员分享,可在线阅读,更多相关《Windows API调用系统对话框word资料15页Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
如果学生的脑海里有了众多的鲜活生动的材料,写起文章来还用乱翻参考书吗?
外壳对话框
观察内容的选择,我本着先静后动,由近及远的原则,有目的、有计划的先安排与幼儿生活接近的,能理解的观察内容。
随机观察也是不可少的,是相当有趣的,如蜻蜓、蚯蚓、毛毛虫等,孩子一边观察,一边提问,兴趣很浓。
我提供的观察对象,注意形象逼真,色彩鲜明,大小适中,引导幼儿多角度多层面地进行观察,保证每个幼儿看得到,看得清。
看得清才能说得正确。
在观察过程中指导。
我注意帮助幼儿学习正确的观察方法,即按顺序观察和抓住事物的不同特征重点观察,观察与说话相结合,在观察中积累词汇,理解词汇,如一次我抓住时机,引导幼儿观察雷雨,雷雨前天空急剧变化,乌云密布,我问幼儿乌云是什么样子的,有的孩子说:
乌云像大海的波浪。
有的孩子说“乌云跑得飞快。
”我加以肯定说“这是乌云滚滚。
”当幼儿看到闪电时,我告诉他“这叫电光闪闪。
”接着幼儿听到雷声惊叫起来,我抓住时机说:
“这就是雷声隆隆。
”一会儿下起了大雨,我问:
“雨下得怎样?
”幼儿说大极了,我就舀一盆水往下一倒,作比较观察,让幼儿掌握“倾盆大雨”这个词。
雨后,我又带幼儿观察晴朗的天空,朗诵自编的一首儿歌:
“蓝天高,白云飘,鸟儿飞,树儿摇,太阳公公咪咪笑。
”这样抓住特征见景生情,幼儿不仅印象深刻,对雷雨前后气象变化的词语学得快,记得牢,而且会应用。
我还在观察的基础上,引导幼儿联想,让他们与以往学的词语、生活经验联系起来,在发展想象力中发展语言。
如啄木鸟的嘴是长长的,尖尖的,硬硬的,像医生用的手术刀―样,给大树开刀治病。
通过联想,幼儿能够生动形象地描述观察对象。
外壳对话框的秘密
常见的Windows的通用对话框被封装在Comdlg32.dll,这给我们的编程提供了很大的便利。
但它还不够完整,我们在系统里经常能看到大量的可重复使用的对话框,但在Windows的文档里你却找不到它们的调用方法。
而如果我们自己去做这样的界面是非常费时费力的而且也是没有必要的,因为这些对话框实际上很容易得到。
这里我要介绍一些已经众所周知或不为认知的对话框,它们可以应用在我们的程序中使程序显得非常友好和专业。
浏览文件夹对话框
图2.23
大多数Delphi程序员都知道如何使用VCL的TOpenDialog控件来让用户浏览将要打开的文件。
然而有时你可能只想让用户选择文件夹而不是特定的文件,windows已经提供了一个这样的对话框如图2.23所示。
我们可以通过公开的函数SHBrowseForFolder来调用(这个函数定义在ShlObj单元),函数定义如下:
functionSHBrowseForFolder(varBrowseInfo:
TBrowseInfo):
PItemIDList;
stdcall;
这个函数只有一个参数,但这个参数是一个比较复杂的记录类型
TBrowseInfo=packedrecordhwndOwner:
HWND;
pidlRoot:
pszDisplayName:
PChar;
lpszTitle:
ulFlags:
UINT;
lpfn:
TFNBFFCallBack;
lParam:
LPARAM;
iImage:
Integer;
end;
hwndOwner数据成员包含对话框的父窗体的窗口句柄,可以把它设成0。
PIdlRoot数据成员指向一个PIDL的指针对应于对话框初始化时的根目录。
指定了PIdlRoot后,就只有根目录及它的子目录会出现在对话框中。
可以设定它为nil,这时缺省的根目录是桌面,pszDisplayName数据成员指向一个缓冲区可以用来储存被用户选中的文件名,缓冲区的大小至少为MAX_PATH这个常数那么大,否则遇到特别长的文件名会溢出。
lpszTitle数据对象指向一个以null结尾的字符串,字符串作为对话框的标题来显示。
注意标题不要太长,否则显示时会被截断。
ulFlags标志数据对象用来限制在对话框中显示的文件夹类型。
可以设定它为0或下列值的组合:
//在对话框中会包含一个状态区,回调函数可以通过向对话框发送消息来设定状态
BIF_STATUSTEXT
//只允许选择标准文件系统,若选了非标准的文件夹如打印机,确认按钮会变灰
BIF_RETURNONLYFSDIRS=[message]01;
//不选择网络文件夹
BIF_DONTGOBELOWDOMAIN=[message]02;
//给状态条留出空白
BIF_STATUSTEXT=[message]04;
//只选择文件系统的上级目录
BIF_RETURNFSANCESTORS=[message]08;
//只选择计算机
BIF_BROWSEFORCOMPUTER=00;
//只选择打印机
BIF_BROWSEFORPRINTER=00;
//包括文件也可以选
BIF_BROWSEINCLUDEFILES=00;
注意:
如果你想对话框显示lpszTitle里的用户定制的状态条信息,必须包括BIF_STATUSTEXT标识。
Lpfn数据对象是一个回调函数类型的指针,函数类型如下:
TFNBFFCallBack=function(DialogHandle:
MessageID:
PIDL:
Data:
LPARAM):
这是一个回调函数,可以用来在同用户交互时控制和更新对话框的显示。
如果你不想控制对话框,可以把它设成nil,lParam数据对象允许你在回调函数中以参数lpfn形式返回一个指针(通常我们用它来返回对象),当然也可以把它设成为0。
IImage数据成员不需要设置,因为它是用来接收系统中同文件夹相关的图标列表索引的,我们这里设它为0。
SHBrowseForFolder函数返回一个唯一的指向被选择的文件夹的PIDL。
如果文件夹是一个传统的文件对象的话,可以用函数SHGetPathFromIDList把PIDL转换为真实的目录。
同时,作为调用者,必须负责释放被返回的itemidentifierlist,使用IMallocCOM接口来释放。
不要用FreeMem或其他方法来释放PIDL,这是因为外壳的内存管理是独立的,只能用IMalloc来释放。
现在我们已经可以显示对话框了,那让我们更深入一步看看如何能够控制对用户动作的反应,这就要用到了回调函数TFNBFFCallBack。
注意回调函数的意思就是,你只是实现了它,系统就知道什么时候去调用它,就好比一个守株待兔的例子。
DialogHandle参数代表对话框窗口句柄。
通常可以用这个句柄给对话框发消息,MessageID参数并不是一个TMessage结构的记录,它是对话框通过回调函数发给用户消息的,它可以是下面两个值:
BFFM_INITIALIZED=1;
//对话框将要显示
BFFM_SELCHANGED=2;
//用户选中了某项
PIDL参数包含其他的额外信息。
如果MessageID是BFFM_INITIALIZED,PIDL将等于nil。
如果MessageID是BFFM_SELCHANGED,PIDL的值将是一个PIDL对应于用户选择的文件夹。
Data参数包含用户付给TbrowseInfo记录中的Lparam数据成员的值,通常可以传递一个对象指针。
下面是一个简单的回调函数的例子:
functionBrowseForFolderCallback(DialogHandle:
begin
//响应对话框的通知消息
case(MessageID)ofBFFM_INITIALIZED:
DialogInitialized(DialogHandle,Data);
BFFM_SELCHANGED:
HandleNewSelection(DialogHandle,PIDL,Data);
Result:
=0;
//总返回0.
在回调函数里,可以根据用户的输入发送三个用户的消息给对话框,下面是消息ID:
//改变对话框的状态信息
BFFM_SETSTATUSTEXT=WM_USER+100;
//控制确定按钮失效与否
BFFM_ENABLEOK=WM_USER+101;
//改变选择的文件夹
BFFM_SETSELECTION=WM_USER+102;
通常,这些消息发送给对话框使之根据用户的选择更新显示,当然你也可以发送其他的消息给对话框,比如可以发送WM_SETTEXT消息来改变对话框的标题。
下面是一个发送消息的例子(见表2.11):
PostMessage(DialogHandle,BFFM_SETSELECTION,True,LPARAM(PChar(NewPath)));
表2.11MessageIDWParamLParamBFFM_SETSTATUSTEXT没有使用一个指向新的状态信息的PcharBFFM_ENABLEOK没有使用True使得确认按钮有效,False无效
BFFM_SETSELECTION如果Lparam是路径则为True,若Lparam是PIDL则为False指向被选择的文件路径或PIDL的Pchar
另外要提到的是,Delphi也提供了对这个函数的封装,那就是SelectDirectory函数。
关于对话框
通常我们都要在自己的程序里加上一个关于对话框来显示一些版本信息等等,Windows为我们提供了一个标准的对话框如图2.24所示,可以在一定范围内对它定制,不过它只适合显示简单的标识和文本(我觉得用处极小)。
我们可以通过函数ShellAbout来调用它(声明在ShellAPI单元里),函数定义如下:
functionShellAbout(Owner:
ApplicationName:
OtherText:
IconHandle:
HICON):
Owner参数标识了拥有对话框的父窗体句柄,通常设为0,表明没有父窗体。
ApplicationName参数包含对话框的标题,字符串中可以包含"
#"
字符,它能起到分割符的作用。
这种情况下,函数会把分割符前的字符串作为标题栏,分割符后的部分作为"
Microsoft"
字符串后的第一行。
OtherText参数包含了打算显示在Microsoft版本和版权信息后的字符串。
IconHandle参数标识了打算显示在对话框上的图标标识,如果设为