存档

‘程序设计’ 分类的存档

ToolBar的一个奇怪现象

2009年5月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 C++, 程序设计 标签:

Visual Studio 2008使用体验

2009年5月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

安装这两个补丁后,解决编译出错问题。

目前未发现其他问题。

分类: Visual C++, 程序设计 标签:

CyberArticle 导入文件例子 (C#例子)

2009年4月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开发者手册)。

 

分类: CyberArticle, 程序设计 标签:

CyberArticle 使用模板导出 增强功能

2009年3月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

 

分类: CyberArticle, 程序设计 标签:

COM组件里面的对话框,使用Theme

2009年3月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了。

分类: 程序设计 标签: , , ,