按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
BUTTON ID_FILE_PRINT
BUTTON ID_APP_ABOUT
END
LoadToolBar 函数一举取代了前一版的LoadBitmap + SetButtons 两个动作。
LoadToolBar 知道如何把BITMAP 资源和TOOLBAR 资源搭配起来,完成工具栏的
设定。当然啦,如果你不是使用VC++资源工具来编辑工具栏,BITMAP 资源和
TOOLBAR 资源就可能格数不符,那是不被允许的。TOOLBAR 资源中的各ID 值就
441
…………………………………………………………Page 504……………………………………………………………
第篇 湷觥 FC 程式設計
是菜单项目的子集合,因为所谓工具栏就是把比较常用的菜单项目集合起来以按钮
方式提供给使用者。
m_wndStatusBar。Create(this) 表示要产生一个隶属于this 对象(也就是目前这个
对象,也就是主窗口)的状态列。
m_wndStatusBar。SetIndicators(;。。。) 的第一个参数是个数组;第二个参数是数组
元素个数。所谓Indicator 是状态列最右侧的「指示窗口」,用来表示大写键、
数字键等的On/Off 状态。AFXRES。H 中定义有七种indicators :
#define ID_INDICATOR_EXT 0xE700 // extended selection indicator
#define ID_INDICATOR_CAPS 0xE701 // cap lock indicator
#define ID_INDICATOR_NUM 0xE702 // num lock indicator
#define ID_INDICATOR_SCRL 0xE703 // scroll lock indicator
#define ID_INDICATOR_OVR 0xE704 // overtype mode indicator
#define ID_INDICATOR_REC 0xE705 // record mode indicator
#define ID_INDICATOR_KANA 0xE706 // kana lock indicator
本例使用其中三种:
static UINT indicators '' =
static UINT indicators '' =
{{
ID_SEPARATOR; // status line indicator
ID_SEPARATOR; // status line indicator
ID_INDICATOR_CAPS;
ID_INDICATOR_CAPS;
ID_INDICATOR_NUM;
ID_INDICATOR_NUM;
ID_INDICATOR_SCRL;
ID_INDICATOR_SCRL;
};
};
鼠标拖放(Drag and Drop)
MFC 程序很容易拥有Drag and Drop 功能。意思是,你可以从Shell (例如Windows 95
的文件总管)中以鼠标拉动一个文件,拖到你的程序中,你的程序因而打开此文件并读
其内容,将内容放到一个Document Frame 窗口中。甚至,使用者在Shell 中以鼠标对
某个文件文件(你的应用程序的文件文件)快按两下,也能激活你这个程序,并自动完成开
档,读档,显示等动作。
442
…………………………………………………………Page 505……………………………………………………………
第7章 簡單而完整:MFC 骨幹程式
在SDK 程序中要做到Drag and Drop ,并不算太难,这里简单提一下它的原理以及作
法。当使用者从Shell 中拖放一个文件到程序A,Shell 就配置一块全域内存,填入被
拖曳的文件名称(包含路径),然后发出WM_DROPFILES 传到程序A的消息队列。程
式A取得此消息后,应该把内存的内容取出,再想办法开档读档。
并不是张三和李四都可以收到WM_DROPFILES ,只有具备WS_EX_ACCEPTFILES 风格
的窗口才能收到此一消息。欲让窗口具备此一风格,必须使用CreateWindowEx (而不
是传统的CreateWindow),并指定第一个参数为WS_EX_ACCEPTFILES 。
剩下的事情就简单了:想办法把内存中的文件名和其它信息取出(内存handle 放在
WM_DROPFILES 消息的wParam 中)。这件事情有DragQueryFile 和DragQueryPoint
两个API 函数可以帮助我们完成。
SDK 的方法真的不难,但是MFC 程序更简单:
BOOL CScribbleApp::InitInstance()
{
。。。
// Enable drag/drop open
m_pMainWnd…》DragAcceptFiles();
// Enable DDE Execute open
EnableShellOpen();
RegisterShellFileTypes(TRUE);
。。。
}
这三个函数的用途如下:
CWnd::DragAcceptFile(BOOL bAccept=TRUE); 参数TRUE 表示你的主窗口以
及每一个子窗口(文件窗口)都愿意接受来自Shell 的拖放文件。CFrameWnd 内
有一个OnDropFiles 成员函数,负责对WM_DROPFIELS 消息做出反应,它
会通知application 对象的OnOpenDocument (此函数将在第8章介绍),并夹
带被拖放的文件的名称。
443
…………………………………………………………Page 506……………………………………………………………
第篇 湷觥 FC 程式設計
CWinApp::EnableShellOpen(); 当使用者在Shell 中对着本程序的文件文件快按
两下时,本程序能够打开文件并读内容。如果当时本程序已执行,Framework
不会再执行起程序的另一副本,而只是以DDE (Dynamic Data Exchange ,动态
资料交换)通知程序把文件(文件)读进来。DDE 处理例程内建在CDocManager
之中(第8章会谈到这个类别)。也由于DDE 的能力,你才能够很方便地把
文件图标拖放到打印机图标上,将文件打印出来。
通常此函数后面跟随着RegisterShellFileTypes 。
CWinApp::RegisterShellFileTypes(); 此函数将向Shell 注册本程序的文件型
态。有了这样的注册动作,使用者在Shell 的双击动作才有着力点。这个函数
搜寻Document Template 串行中的每一种文件类型,然后把它加到系统所维护
的registry (登录数据库)中。
在传统的Windows 程序中,对Registry 的注册动作不外乎两种作法,一是准
备一个。reg 档,由使用者利用Windows 提供的一个小工具regedit。exe ,将。reg
合并到系统的Registry 中。第二种方法是利用::RegCreateKey 、::RegSetValue