-
ToolBar的一个奇怪现象
发表于 2009年05月13日 没有评论ToolBar的一个奇怪现象
将CyberArticle Express工具栏修改成标准的Windows工具栏(使用CToolBarCtrl),结果发现一个奇怪的现象:
如果工具栏按钮包含下拉按钮BTNS_DROPDOWN,而且工具栏具有TBSTYLE_EX_DRAWDDARROWS和TBSTYLE_FLAT风格,则工具栏按钮在某些情况下,会变得很大(例如更改Theme,或者某些系统下面,锁定计算机,然后再恢复)。
经过检查,原来这是COMCTL32的一个问题:在MFC的CToolBar这个类里面,修复了这个问题,但是CToolBarCtrl没有修复这个问题。
下面是bartool.cpp里面的一段说明
// In comctl32 version 6.00 when using XP Look combined with TBSTYLE_EX_DRAWDDARROWS
// style minimal sizing policy was changed to be
// button.height >= image.height + 13
// button.width >= image.width + 16
// this force buttons to be bigger then usual
// To override this behavior we should remove TBSTYLE_EX_DRAWDDARROWS prior to sizing operations
//在CToolBarCtrl派生类里面,增加消息处理。下面的代码,是从bartool.cpp里面找到的。
ON_MESSAGE(WM_SETTINGCHANGE, OnPreserveZeroBorderHelper)ON_MESSAGE(WM_SETFONT, OnPreserveZeroBorderHelper)LRESULT CWizToolBarCtrlEx::OnPreserveZeroBorderHelper(WPARAM, LPARAM){int _afxComCtlVersion = _AfxGetComCtlVersion();//BOOL bModify = FALSE;ASSERT(_afxComCtlVersion != -1);DWORD dwStyle = 0;DWORD dwStyleEx = 0;if (_afxComCtlVersion >= VERSION_IE4){dwStyle = GetStyle();bModify = ModifyStyle(0, TBSTYLE_TRANSPARENT|TBSTYLE_FLAT);if ((_afxComCtlVersion >= VERSION_6) && ::IsWindow(m_hWnd)){dwStyleEx = SetExtendedStyle(GetExtendedStyle() &~ TBSTYLE_EX_DRAWDDARROWS);}}LRESULT lResult = Default();if (bModify){SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);}if (dwStyleEx & TBSTYLE_EX_DRAWDDARROWS){SetExtendedStyle(dwStyleEx);}return lResult;}处理后可以解决这个问题 -
Visual Studio 2008使用体验
发表于 2009年05月9日 没有评论Visual Studio 2008使用体验
为了是程序具有Vista界面,尤其是一些通用对话框,例如打开/保存文件对话框,安装Visual Stuido 2008进行升级(未安装VS2008Sp1)。
安装后,遇到以下问题
1:VS2008里面的ATL,少了一些文件,缺少的这些文件,被当成ATL Server作为开源软件发布了。下载ATL Server源代码可以解决。
2:VS2008不再使用/wp64参数,编译的时候。会出现很多警告。用VS2008打开所有的vcproj文件(作为XML文件打开),全部替换里面的Detect64BitPortabilityProblems=”true”为空,保存文件。
3:其他一些比较简单的兼容问题,例如某些类型重复定义,很容易解决。
4:编译工程的时候,出现了很多编译器错误问题。
下载
http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=11399
http://code.msdn.microsoft.com/KB946040/Release/ProjectReleases.aspx?ReleaseId=921
安装这两个补丁后,解决编译出错问题。
目前未发现其他问题。
-
CyberArticle 导入文件例子 (C#例子)
发表于 2009年04月11日 没有评论本文介绍了如何在C#里面,使用CyberArticle提供的COM组件,来导入HTML文件(或者其他类型的文件,例如text, pdf, jpg, bmp, png等等)
1、建立一个C#的Windows应用程序工程。
2、添加COM引用
在工程节点上面,点击右键,在菜单中选择 Add Reference,然后选择COM标签页,在列表中,选择CyberArticleBook 1.0 Type Library和CyberArticleImportHTML 1.0 Type Library。如下图。
然后单击OK按钮。这样在工程的References节点下面,将会包含CyberArticleBookLib和CyberArticleImportHTMLLib。

3、设计Form1
在Form1.cs里面,增加引用:
//引入CA COM 组件
using CyberArticleBookLib;
using CyberArticleImportHTMLLib;在Form1上面,添加两个按钮,分别是Batch Import和Add HTML。分别编写相应的单击事件代码。
Batch Import按钮单击事件代码:用来完成批量导入HTML文件
private void button1_Click(object sender, EventArgs e)
{
//创建CABookCollection对象
CABookCollection objBookCollection = new CABookCollection();
//添加一个本地书籍文件
int nBookIndex = objBookCollection.AddLocalBook(“e:test.xbook”);
//获得本地书籍的BookGUID
string strBookGUID = objBookCollection.get_GUID(nBookIndex);
//创建书籍对象
CABook objBook = new CABook();
//打开本地书籍
objBook.Open(strBookGUID);
//创建一个导入文件Collection对象
CAImportHTMLDataCollection objDataCollection = new CAImportHTMLDataCollection();
//添加需要导入的文件,标题,所在书籍文件夹(相对导入目录位置),HTML文件名,也可以是text,图片,pdf,rtf,等等
//CA会自动查找或者创建书籍里面的文件夹
objDataCollection.Add2(“My First Html File”, “”, “e:1.htm”);
objDataCollection.Add2(“My Second Html File”, “My Folder”, “e:2.htm”);
//如果需要同时设定文章的URL,可以用
objDataCollection.Add3(“My 3rd Html File”, “My Folder”, “e:3.htm”, “http://www.wizbrother.com/”);
//创建导入HTML对象
CAImportHTML objImport = new CAImportHTML();
//导入
objImport.Import(objBook.RootNode, objDataCollection);
//关闭书籍。因为C#对象在离开作用域的时候不会自动销毁(需要垃圾回收),所以最好手工关闭书籍(关闭数据库连接)
objBook.Close();
}要顺利执行这个代码,您应该在E盘根目录下面,准备一个Test.xbook, 1.htm, 2,htm, 3.htm这几个文件。
Add HTML按钮单击事件代码:用来直接创建一个文章
private void button2_Click(object sender, EventArgs e)
{
//创建CABookCollection对象
CABookCollection objBookCollection = new CABookCollection();
//添加一个本地书籍文件
int nBookIndex = objBookCollection.AddLocalBook(“e:test.xbook”);
//获得本地书籍的BookGUID
string strBookGUID = objBookCollection.get_GUID(nBookIndex);
//创建书籍对象
CABook objBook = new CABook();
//打开本地书籍
objBook.Open(strBookGUID);
//获得根节点
CANode objRoot = (CANode)objBook.RootNode;
//在根节点下面创建一个新的文件夹
CANode objNewFolder = (CANode)objBook.CreateFolder(objRoot, “My New Folder”);
//在新建的文件夹下面,创建一个新的文章
CANode objNewArticle = (CANode)objBook.CreateArticle(objNewFolder, “My New Article”);
//
StreamReader sr = new StreamReader(“e:1.htm”);
//获得html文字
string htmlText = sr.ReadToEnd();
//
sr.Close();
//创建profile Collection
CAProfileCollection objProfileCollection = new CAProfileCollection();
//获得默认profile
CAProfile objProfileDefault = (CAProfile)objProfileCollection.DefaultProfile;
//用html内容,初始化文章。文章资源位置,依赖于第二个参数:url。但是这个参数,不会保存到书籍中。
objNewArticle.InitArticle(htmlText, “e:1.htm”, objProfileDefault);
//如果需要设置文章的url,需要手工设置;
objNewArticle.URL = “http://www.wizbrother.com/”;
}4、测试代码
编写代码后,编译工程,然后执行。
点击Batch Import按钮,就可以一次将E:1.htm, E:2.htm, E:3.htm导入到书籍E:Test.xbook里面。
点击Add HTML,可以将e:1.htm文件,导入到E:Test.xbook里面。
您可以直接下载附件来进行编译测试(VS2005)。
5、说明
注意:Test.xbook, 1.htm, 2,htm, 3.htm这几个文件,您需要自己准备(或者使用附件中的文件),并且放在E:盘根目录下面。您也可以修改C#代码,使用其它位置的文件。
上面的例子代码,没有考虑异常。您在使用COM组件的时候,需要考虑异常情况。
所有的CyberArticle COM组件,请参考CyberArticle开发者手册(CyberArticle 主程序 -> 主菜单 -> 帮助 -> CyberArticle开发者手册)。
Attachments
-
CyberArticle 使用模板导出 增强功能
发表于 2009年03月31日 没有评论CyberArticle 5.23开始,增加了使用模板导出功能。但是这个功能比较简单,导出的时候,只能使用一个模板。对于导出大量的文章的时候,可能需要不同的模板,例如建立一个站点的时候,不同的文章,需要不同的模板。
使用附件的ExportNodes.dll,然后注册,就可以在CyberArticle里面增加两个新的菜单:
下载附件中的ExportNodes-Debug.zip,然后解压缩到CyberArticle安装目录PluginsNormal,然后覆盖ExportNodes.dll文件。执行CyberArticle安装目录下面的regfiles.bat文件。
如果在vista下面,而且开启了UAC功能,需要用管理员身份执行regfiles.bat文件。
Set Template for Exporting(设置导出模板)
针对一个文件夹,设置一个独立的模板用来导出文章。只有针对文件夹设置了模板参数,导出的时候,才会将这个文件夹下面的文章导出(利用设定的模板)。
另外需要设置导出的文件夹。这个设置也仅仅针对当前文件夹。
Create index file for folder:是否为当前文件夹创建一个索引页面。创建的索引页面,仍然应用设置的模板。索引内容,使用<ul><li>xxx</li><li>xxx</li></ul>方式生成。
注意:所有的设置,将会保存到书籍中。所有的设置,仅仅针对当前文件夹,不包含子文件夹。
Export Nodes using template (Using settings in book)(使用模板导出节点:使用书籍中的设置)
这个对话框的参数,和使用模板导出文章相同。导出的时候,使用书籍中的设置。如果某一个文件夹没有进行设置,则不进行导出。
应用
利用这个功能,可以针对书籍中的文件夹,分别进行设置。然后针对整个书籍进行导出。由于设置都保存在书籍中,所以作了修改后,可以直接针对整个书籍导出,不需要频繁更改模板等参数。
http://wizbrother.com 就是利用这个功能制作的。
Attachments
-
COM组件里面的对话框,使用Theme
发表于 2009年03月22日 没有评论使用VC2005开发COM组件,里面的对话框,正常情况下,可以使用Theme,但是在IE里面调用的时候,却无法正常显示Theme。
搜索了一些资料,发现理论上只要在stdafx.h里面最开始,增加下面的一行就可以了
#define ISOLATION_AWARE_ENABLED 1
但是我测试了很多次,发现不行,最终找到原因:
VC2005的MFC DLL,已经默认生成了manifest文件,但是内容不符合要求。
<?xml version=’1.0′ encoding=’UTF-8′ standalone=’yes’?>
<assembly xmlns=’urn:schemas-microsoft-com:asm.v1′ manifestVersion=’1.0′>
</assembly>没有指定comctrls版本。
因此,自己编写一个manifest,放在vcproject文件目录里面,内容如下:
<?xml version=’1.0′ encoding=’utf-8′ standalone=’yes’?>
<assembly xmlns=’urn:schemas-microsoft-com:asm.v1′ manifestVersion=’1.0′>
<dependency>
<dependentAssembly>
<assemblyIdentity type=”win32″ name=”Microsoft.Windows.Common-Controls” version=”6.0.0.0″ processorArchitecture=”X86″ publicKeyToken=”6595b64144ccf1df” language=”*” />
</dependentAssembly>
</dependency>
</assembly>然后在project属性里面,找到Manifest Tool->Input and Output,修改Additional Manifest Files,写上这个文件名,例如:./CyberArticleIE.ex.manifest (Debug/Release都要更改)。
重新编译工程,就可以正常显示Theme了。
程序设计 COM, MFC, Theme, Visual C++







最近评论