PropertySheet外壳扩展AppWizard
本文旨在简化属性表外壳扩展的实现。它紧接我的第一篇文章 处理上下文菜单壳扩展和灵感 由Michael Dunn最优秀的系列教程 关于编写shell扩展。我强烈建议你们通读一下,以便更好地理解 下面。 这一次,我们将处理一个实现属性表外壳扩展的解决方案。我们会重复使用材料 在我的前一篇文章中找到,并添加了几行代码。所有这些都打包在一个整洁的PropertySheet外壳扩展中 AppWizard。 安装并运行向导 属性表外壳扩展向导包含在一个自包含的propsheetapp中。awx文件 需要复制到您的模板文件夹中。模板文件夹可以在主Microsoft Visual中找到 Studio安装文件夹,位于\通用\MSDev98\模板文件夹下。 使用File|New菜单项激活向导,该菜单项会触发一个New Projects对话框。 选择属性表外壳扩展项将出现以下向导对话框。这一步可以让 指定shell扩展要注册的文件类型,以及它的c++类名 将由向导生成。 巫师给了你什么? 该向导将生成一个与ATL/COM应用向导创建的项目类似的Visual Studio项目。 主要区别在于,项目已经包含了实现属性表骨架的类 外壳扩展。 回想一下Michael Dunn的教程,属性表外壳扩展是一个应该实现的COM对象 IShellExtInit和IShellPropSheetExt接口。向导生成的类 已经以头文件atlshellexh的形式提供了支持这些实现所需的所有内容 它与我上一篇文章中使用的相同,只是经过了更新,而且增加了几行代码 输出IShellPropSheetExt接口的实现。 向导生成的代码使用了ATL的WTL扩展。这些真的很方便 没有明显的理由不使用它们。这些扩展简化了对属性页本身和对话框的编程 控制。向导已经生成了初始的属性页类。它已经知道如何对WM_INITDIALOG作出反应 和PSM_APPLY消息。 让我们从一个示例开始 让我们尝试编写一个类似于本教程中描述的shell扩展。这可不那么容易 时间,因为属性表有点复杂,你必须自己做大部分工作。然而, 向导已经生成了实际创建和显示属性页的所有工作。 从上面的屏幕快照中可以注意到,我们选择将shell扩展挂钩到. txt文件,就像Michael的一样。 还要注意,在我们的示例中实现扩展的类名为CShellExt。 如果查看CShellExt中AddPages()方法的实现,就会发现 看到这些线: 隐藏,复制Code
STDMETHODIMP CShellExt::AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
{
CSamplePropPage* m_pPage; m_pPage = new CSamplePropPage;
m_pPage->SetTitle(_T("Sample"));
m_pPage->SetFile(m_files[0]); HPROPSHEETPAGE hPage = m_pPage->Create();
if (!lpfnAddPage(hPage, lParam)) delete m_pPage;
return S_OK;
}
这段由向导生成的代码实际上创建了一个属性页的实例,并为它分配了一个假标题 根据您的项目名称。它还将第一个选定文件的名称传递给属性表,并调用 shell的回调函数,执行向属性表添加页面的操作。请注意这个属性 page类名是基于您的项目名合成的,在我们的例子中,项目是Sample,因此 CSamplePropPage类。 如果我们需要添加更多的页面,就像Michael在他的例子中所做的那样,那就是放置它们的地方。我不会做 我举个例子。只需对m_files数组和进行迭代就足够了 为每个属性页创建其他实例。 令人惊讶的是,属性页的WTL实现没有提供在其中设置小图标的方法 属性页选项卡。所以我们需要自己添加它。此外,我们希望文件名显示 也在选项卡中。需要作出的改变概述如下: 隐藏,复制Code
<FONT COLOR="red">#include </FONT><FONT COLOR="red">"shlwapi.h"</FONT>
...
STDMETHODIMP CShellExt::AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
{
CSamplePropPage* m_pPage;
m_pPage = new CSamplePropPage; <FONT COLOR="red">// Add a small icon (assuming a resource identifier IDI_ICON)</FONT><FONT
COLOR="red">
m_pPage->m_psp.pszIcon = MAKEINTRESOURCE(IDI_ICON);
m_pPage->m_psp.dwFlags |= PSP_USEICONID;</FONT> <FONT COLOR="red">// Use the file name as the title</FONT><FONT COLOR="red">
TCHAR szFile[_MAX_FNAME];
lstrcpy(szFile, m_files[</FONT><FONT COLOR="red">0</FONT><FONT COLOR="red">]);
::PathStripPath(szFile);</FONT> m_pPage->SetTitle(<FONT COLOR="red">szFile</FONT>);
m_pPage->SetFile(m_files[0]); HPROPSHEETPAGE hPage = m_pPage->Create();
if (!lpfnAddPage(hPage, lParam)) delete m_pPage;
return S_OK;
}
一定要添加shlwapi。将库设置为项目设置中的库列表。 现在我们已经建立并运行了属性表的基础知识,我们需要添加更多有趣的特性 CSamplePropPage类。我们将在对话框模板中添加五个日期和时间选择器控件 order用来显示各种日期和时间,以及额外的静态控件来显示完整的文件路径。 为了简化我们的工作,我们将使用SetCombinedDatetime()和GetCombinedDateTime() 帮助函数,分别从两个日期和时间选择器中设置和获取日期和时间部分 控制。这些函数的代码改编自Michael的项目: 隐藏,收缩,复制Code
void GetCombinedDateTime ( HWND hwnd, UINT idcDatePicker, UINT idcTimePicker,
FILETIME* pFiletime )
{
SYSTEMTIME st = {0}, stDate = {0}, stTime = {0};
FILETIME ftLocal; CDateTimePickerCtrl dtControl;
dtControl.Attach(::GetDlgItem(hwnd, idcDatePicker));
dtControl.GetSystemTime(&stDate); if (idcTimePicker != 0) {
dtControl.Attach(::GetDlgItem(hwnd, idcTimePicker));
dtControl.GetSystemTime(&stTime);
} st.wMonth = stDate.wMonth;
st.wDay = stDate.wDay;
st.wYear = stDate.wYear;
st.wHour = stTime.wHour;
st.wMinute = stTime.wMinute;
st.wSecond = stTime.wSecond; ::SystemTimeToFileTime (&st, &ftLocal);
::LocalFileTimeToFileTime (&ftLocal, pFiletime); dtControl.Detach();
}
隐藏,复制Code
void SetCombinedDateTime ( HWND hwnd, UINT idcDatePicker, UINT idcTimePicker,
const FILETIME* pFiletime )
{
SYSTEMTIME st;
FILETIME ftLocal; ::FileTimeToLocalFileTime (pFiletime, &ftLocal);
::FileTimeToSystemTime (&ftLocal, &st); CDateTimePickerCtrl dtControl;
dtControl.Attach(::GetDlgItem(hwnd, idcDatePicker));
dtControl.SetSystemTime(GDT_VALID, &st); if (idcTimePicker != 0) {
dtControl.Attach(::GetDlgItem(hwnd, idcTimePicker));
dtControl.SetSystemTime(GDT_VALID, &st);
} dtControl.Detach();
}
更新这些控件的代码是相当标准的WTL控件编程n OnInitDialog () 函数。这个函数是由向导生成的,所以这里是你需要添加的行: 隐藏,收缩,复制Code
LRESULT CSamplePropPage::OnInitDialog(HWND /*hWnd*/, LPARAM /*lParam*/)
{
// Display the full path
CStatic sPath;
sPath.Attach(::GetDlgItem(m_hWnd, IDC_FILE));
sPath.SetWindowText(m_file);
sPath.Detach(); // Get the file dates and times FILETIME creationTime;
FILETIME accessTime;
FILETIME modificationTime; HANDLE hFile; hFile = ::CreateFile(m_file, GENERIC_READ,
FILE_SHARE_READ, 0,
OPEN_EXISTING, 0, 0);
ATLASSERT(hFile != INVALID_HANDLE_VALUE); ::GetFileTime(hFile, &creationTime, &accessTime, &modificationTime);
::CloseHandle(hFile); // Display the creation/modification/access date and time SetCombinedDateTime(m_hWnd, IDC_CREATIONDATE, IDC_CREATIONTIME, &creationTime);
SetCombinedDateTime(m_hWnd, IDC_MODIFICATIONDATE, IDC_MODIFICATIONTIME, &modificationTime);
SetCombinedDateTime(m_hWnd, IDC_ACCESSDATE, 0, &accessTime); return 0L;
}
要启用Apply按钮,我们需要捕获日期和时间选择器控件发送的通知。 它们向属性表发送一个DTN_DATETIMECHANGE通知。我们只需要添加一个宏 我们的消息映射和类中相应的消息处理程序来完成任务。注意,因为我们是 在使用WTL时,我使用了_EX版本的消息映射宏来执行消息破解,但是你没有 如果您愿意,可以随时使用ATL提供的一个。 隐藏,复制Code
class CSamplePropPage : public CPropertyPageImpl<CSamplePropPage>
{
...
LRESULT OnDateTimeChanged(LPNMHDR lpnmhdr);
...
// Message map
public:
BEGIN_MSG_MAP_EX(CSamplePropPage)
CHAIN_MSG_MAP(CPropertyPageImpll<CSamplePropPage>)
MSG_WM_INITDIALOG(OnInitDialog)
<FONT COLOR="red">NOTIFY_RANGE_CODE_HANDLER_EX(IDC_CREATIONDATE, IDC_ACCESSDATE, DTN_DATETIMECHANGE, OnDateTimeChanged)</FONT>
END_MSG_MAP()
};
我假设日期和时间选择器控件的资源标识符是顺序的,因此我可以 使用范围处理程序将所有这些控件的通知路由到一个消息处理程序。实现 OnDateTimeChanged()函数很简单。只要启用Apply按钮… 隐藏,复制Code
LRESULT CSamplePropPage::OnDateTimeChanged(LPNMHDR /*lpnmhdr*/)
{
SetModified(TRUE);
return 0L;
}
点击Apply按钮将触发向导生成的OnApply()函数。 这是一个被覆盖的函数,每当用户点击OK或Apply按钮时就会调用它。我们需要申请 返回到文件的日期和时间修改。 隐藏,复制Code
BOOL CSamplePropPage::OnApply(void)
{
FILETIME creationTime;
FILETIME accessTime;
FILETIME modificationTime; // Get the new creation/modification/access date and time GetCombinedDateTime(m_hWnd, IDC_CREATIONDATE, IDC_CREATIONTIME, &creationTime);
GetCombinedDateTime(m_hWnd, IDC_MODIFICATIONDATE, IDC_MODIFICATIONTIME, &modificationTime);
GetCombinedDateTime(m_hWnd, IDC_ACCESSDATE, 0, &accessTime); // Set the file dates and times
HANDLE hFile; hFile = ::CreateFile(m_file, GENERIC_WRITE,
0, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
ATLASSERT(hFile != INVALID_HANDLE_VALUE); ::SetFileTime(hFile, &creationTime, &accessTime, &modificationTime);
::CloseHandle(hFile); return TRUE;
}
就是这样!这个项目现在完成了。 结论 如您所见,实现上下文菜单扩展现在更快更容易了。此外,你可以重复使用 在您自己的项目中提供了atlshellexh文件。这个文件,atlshellexh实现的 IShellExtInit接口在某种程度上也与实现上下文菜单Shell直接相关 我在上一篇文章中概述的扩展。 我希望这篇文章足够清楚。如果你有什么问题,请告诉我。 本文转载于:http://www.diyabc.com/frontweb/news30106.html
PropertySheet外壳扩展AppWizard的更多相关文章
- [翻译].NET Shell Extensions - Shell Context Menus---.net 外壳扩展-右键菜单
我自己的前言说明: 本文原作者为 Dave Kerr,原文链接为.NET Shell Extensions - Shell Context Menus:,我是在为了完成最新需求的时候查询资料的时 ...
- Delphi编写Shell扩展
用delphi创建一个外壳扩展(Shell Extension)程序的基本步骤如下: (1) 创建一个 ActiveX Library 工程,命名为“CloudUpload“(2) 创建一个新的自动化 ...
- windows的各种扩展名详解
Windows系统文件按照不同的格式和用途分很多种类,为便于管理和识别,在对文件命名时,是以扩展名加以区分的,即文件名格式为: 主文件名.扩展名.这样就可以根据文件的扩展名,判定文件的种类,从而知道其 ...
- 如何往IE工具条添加按钮(转载)
如何往IE工具条添加按钮 问题提出:金山词霸.网络蚂蚁等软件安装后会向IE的工具条添加自己的按钮.按下按钮后还会作出相应的动作,这种功能是如何实现的呢?读完本文,您也可以将自己应用程序的按钮添加到IE ...
- [No000098]SVN学习笔记5-分支,合并,属性,补丁,锁,分支图
行结束符和空白选项 在项目的生命周期中,有时可能会将行结束符由 CRLF 改为 LF,或者修改一段代码的缩进.不幸的是这样将会使大量的代码行被标记为已修改,尽管代码本身并没有被修改.这里列出的选项将会 ...
- 如何使用BHO定制你的Internet Explorer浏览器
原文出处:Browser Helper Objects: The Browser the Way You Want It一.简介 有时,你可能需要一个定制版本的浏览器.在这种情况下,你可以自由地把一些 ...
- atitit。wondows 右键菜单的管理与位置存储
atitit.wondows 右键菜单的管理与位置存储 原理 .这样的功能称为Windows外壳扩展(Shell Extensions) 1 常用右键菜单 atiContentMenu1 通用tool ...
- Delphi 的知识体系
第一部分 快速开发的基础 第1章 Delphi 5下的Windows编程 1 1.1 Delphi产品家族 1 1.2 Delphi是什么 3 1.2.1 可视化开 ...
- delphi公共函数 UMyPubFuncFroc--版权所有 (C) 2008 勇者工作室
{*******************************************************} { } { Delphi公用函数单元 } { } { 版权所有 (C) 2008 勇 ...
随机推荐
- Unity3d流光效果
Material中纹理的属性都有Tiling和Offset,可以利用Offset做uv动画,从而完成各种有趣的动画,比如流光效果! 流过效果即通常一条高光光在物体上划过,模拟高光移动照射物体的效果,之 ...
- CA定义以及功能说明
当您访问以HTTPS开头的网站时,即表示正在使用CA.CA是Internet的重要组成部分.如果不存在CA,那么将无法安全在线购物以及使用网银在线业务等.什么是CA?CA具体是做什么的,又是如何确保您 ...
- Pets(匈牙利算法)
Are you interested in pets? There is a very famous pets shop in the center of the ACM city. There ar ...
- 解决Maven下载速度缓慢问题
解决Maven下载速度缓慢问题 第一步:找到自己安装maven的路径,选择setting.xml D:\apache-maven-3.2.2\conf\settings.xml 第二步:打开setti ...
- oracle之三 自动任务调度
Oracle 自动任务调度 13.1 Oracle任务调度概述 在Oracle中任务调度指某一(组)执行程序在特定的时间被周期性的执行.Oracle把任务调度称为job(作业). Advanced S ...
- pytest文档4-Allure报告清除上一次数据
前言 大家在执行过几次Allure之后就会发现,Allure的报告会把历史的执行结果都展示出来,但实际工作中我们可能只关心本次的结果,解决的话就需要修改一下执行命令了. 问题: 例如图中显示的第一条其 ...
- [HDOJ1232]畅通工程(并查集)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1232 题目描述 Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表, ...
- Windows下安装Nginx及负载均衡
1.下载Windows版本的Nginx http://nginx.org/en/download.html 2.解压Nginx包,配置conf文件下的nginx.conf文件 3.配置说明: #use ...
- Webservice报错客户端发现响应内容类型为“application/json;charset=UTF-8”,但应为“text/xml”。
控制台对接Webservice正常,同样的方法在Web项目上报错: 客户端发现响应内容类型为“application/json;charset=UTF-8”,但应为“text/xml”.请求失败,错误 ...
- 学习 | css3实现进度条加载
进度条加载是页面加载时的一种交互效果,这样做的目的是提高用户体验. 进度条的的实现分为3大部分:1.页面布局,2.进度条动效,3.何时进度条增加. 文件目录 加载文件顺序 <link rel=& ...