如何创建一个基于金山卫士界面库的工程

源自:

http://blog.csdn.net/chenyujing1234/article/details/7399014#

 

为了让更多的朋友能够让自己的程序使用上金山卫士的界面库,现将创建界面库的过程用文字说明,希望可以帮助到各位。如果觉得过程麻烦,也可以直接下载创建后的完整代码。


 

基本要求:安装WTL,下载地址:http://wtl.sourceforge.net/。下载解压后,到解压目录的AppWiz子目录下运行setup80.js(对应VS2005)即可安装完毕。

      这是补充:要告诉VS2005编译器WTL下的头文件的位置。

     工具->选项->VC++目录 在包含中加入  D:\WTL80_7161_Final\include

第一步、复制卫士界面库必要的文件

在VS2005中,单击菜单“文件”->“新建”->“项目”,在新建对话框中选择项目类型为“WTL”,模版只有一个“ATL/WTLApplication Wizard”,选中它并在下方的编辑框中输入项目名和项目位置,这里假设创建后的目录为H:\MyProject\test。单击“确定”,在出现的向导中选择“下一步”,选择“DialogBased”,并单击“Finish”按钮。

图片1.png

下载  (98.64 KB)
2011-9-30 17:27


 


H:\MyProject\test\test下创建publish文件夹,然后到http://code.ijinshan.com下载金山卫士源代码,将其解压到某个目录,打开其子目录pcmanager\src\publish,将其下的bkresbkwintinyxmlwtlhelper复制到H:\MyProject\test\test\publish下。

图片2.png

下载  (111.41 KB)
2011-9-30 17:29


 


第二步、添加包含目录

VS2005“解决方案资源管理器”中,右键点击test项目(注意是项目而不是解决方案),选择属性。

图片3.png

下载  (25.54KB)
2011-9-3017:31



在出现的“test属性页”对话框中,选择左边的“配置属性”->C/C++->“常规”项,在右边的“附加包含目录”中输入publish,点击“确定”保存设置。

图片4.png

下载  (109.83KB)
2011-9-3017:38



 

第三步、将BkresTinyXML加入项目中

在“解决方案资源管理器”中,右键点击“ResourceFiles”,选择“添加”->“现有项”,定位到publish\bkres目录下,将bkres.rc添加进项目。

图片5.png

下载  (19.21KB)
2011-9-3017:39



然后再在test项目上点击右键,选择“添加”->“新建筛选器”,创建名为publish的筛选器,再在publish下创建TinyXML筛选器(创建筛选器只是为了分类方便,这一步可以略过,文件添加到任何一个筛选器中)。接下来用和以上相同的添加现有项的方法将publish\tinyxml下的所有文件添加到TinyXML筛选器下。

图片6.png

下载  (27.18KB)
2011-9-3017:39



 

第四步、去除TinyXML预编译头设置

展开publish\TinyXML筛选器,右键点击一个cpp文件,选择属性。

图片7.png

下载  (21.34KB)
2011-9-3017:40



点击左边的“配置属性”->“C/C++->“预编译头”,将右边的“创建/使用预编译头”选项设置为“不使用预编译头”,点击“确定”。

图片8.png

下载  (75.72KB)
2011-9-3017:40



TinyXML筛选器下所有cpp文件都执行这一步。


第五步,添加必要的代码

主要是替换默认生成的WTL基本对话框的代码,转而使用调用卫士界面库的代码,并且加入卫士界面库必需的定义XML相关文件和图片资源。此处为了方便起见,将代码打包,各位可以直接从附件中下载,将文件替换掉原先创建项目时自动生成的代码,然后将新增的bkwinres.h以及bkwinres.rc2添加到项目中即可。

这里可以看到_tMain函数中的 

[cpp]   viewplain copy
  1. CMainDlg dlgMain;  
  2.  dlgMain.DoModal();  


而构建CMainDlg的方法是:

[cpp]   viewplain copy
  1. class CMainDlg  public CBkDialogImpl<CMainDlg>  
  2.                 public CWHRoundRectFrameHelper<CMainDlg>  
  3.  
  4. public 
  5.     CMainDlg():CBkDialogImpl<CMainDlg>(IDR_BK_MAIN_DIALOG)  
  6.      
  7.      
  8.   
  9.     BK_NOTIFY_MAP(IDC_RICHVIEW_WIN)  
  10.         BK_NOTIFY_ID_COMMAND(IDC_BTN_CLOSE, OnBtnClose)  
  11.         BK_NOTIFY_ID_COMMAND(IDC_BTN_MIN, OnMinBtnClick)  
  12.     BK_NOTIFY_MAP_END()  
  13.   
  14.     BEGIN_MSG_MAP(CMainDlg)  
  15.         MSG_BK_NOTIFY(IDC_RICHVIEW_WIN)  
  16.         CHAIN_MSG_MAP(CBkDialogImpl<CMainDlg>)  
  17.         CHAIN_MSG_MAP(CWHRoundRectFrameHelper<CMainDlg>)  
  18.         MSG_WM_SYSCOMMAND(OnCommand)  
  19.         MSG_WM_INITDIALOG(OnInitDialog)  
  20.     END_MSG_MAP()  
  21.   
  22. protected 
  23.     LRESULT OnCommand(UINT wParam, CPoint point);  
  24.     BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam);  
  25.     void OnBtnClose();  
  26.     void OnMinBtnClick();  
  27. };  


CBkDialogImpl CWHRoundRectFrameHelper是金山开源软件中自定义的类,我们在看它们的实现.

[cpp]   viewplain copy
  1. template <class T>  
  2. class CWHRoundRectFrameHelper  
  3.  
  4. protected 
  5.   
  6.     SIZE m_sizeWnd;  
  7.   
  8.     void OnSize(UINT nType, CSize size)  
  9.      
  10.         *pT static_cast<T*>(this);  
  11.   
  12.         if (nType == SIZE_MINIMIZED)  
  13.             return 
  14.   
  15.         if (size == m_sizeWnd)  
  16.             return 
  17.   
  18.         CRect rcWindow, rcClient;  
  19.         CRgn rgnWindow, rgnMinus, rgnAdd;  
  20.   
  21.         pT->GetWindowRect(rcWindow);  
  22.         pT->GetClientRect(rcClient);  
  23.         pT->ClientToScreen(rcClient);  
  24.   
  25.         rcClient.OffsetRect(- rcWindow.TopLeft());  
  26.   
  27.         rgnWindow.CreateRectRgn(rcClient.left, rcClient.top 2, rcClient.right, rcClient.bottom 2);  
  28.         rgnAdd.CreateRectRgn(rcClient.left 2, rcClient.top, rcClient.right 2, rcClient.top 1);  
  29.         rgnWindow.CombineRgn(rgnAdd, RGN_OR);  
  30.         rgnAdd.OffsetRgn(0, rcClient.Height() 1);  
  31.         rgnWindow.CombineRgn(rgnAdd, RGN_OR);  
  32.         rgnAdd.SetRectRgn(rcClient.left 1, rcClient.top 1, rcClient.right 1, rcClient.top 2);  
  33.         rgnWindow.CombineRgn(rgnAdd, RGN_OR);  
  34.         rgnAdd.OffsetRgn(0, rcClient.Height() 3);  
  35.         rgnWindow.CombineRgn(rgnAdd, RGN_OR);  
  36. //         rgnAdd.OffsetRgn(0, rcClient.Height());  
  37. //         rgnWindow.CombineRgn(rgnAdd, RGN_OR);  
  38.   
  39. //         rgnMinus.CreateRectRgn(rcClient.left, rcClient.top, rcClient.left 2, rcClient.top 1);  
  40. //         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  
  41. //         rgnMinus.OffsetRgn(rcClient.Width() 2, 0);  
  42. //         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  
  43. //         rgnMinus.OffsetRgn(0, rcClient.Height() 1);  
  44. //         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  
  45. //         rgnMinus.OffsetRgn(3 rcClient.Width(), 0);  
  46. //         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  
  47. //   
  48. //         rgnMinus.SetRectRgn(rcClient.left, rcClient.top, rcClient.left 1, rcClient.top 2);  
  49. //         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  
  50. //         rgnMinus.OffsetRgn(rcClient.Width() 1, 0);  
  51. //         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  
  52. //         rgnMinus.OffsetRgn(0, rcClient.Height() 2);  
  53. //         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  
  54. //         rgnMinus.OffsetRgn(1 rcClient.Width(), 0);  
  55. //         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);  
  56.   
  57.         pT->SetWindowRgn(rgnWindow);  
  58.   
  59.         m_sizeWnd size;  
  60.      
  61.   
  62. public 
  63.   
  64.     BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULTlResult, DWORD dwMsgMapID 0)  
  65.      
  66.         BOOL bHandled TRUE;  
  67.   
  68.         switch(dwMsgMapID)  
  69.          
  70.         case 0:  
  71.             if (uMsg == WM_SIZE)  
  72.              
  73.                 OnSize((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));  
  74.                 lResult 0;  
  75.              
  76.             break 
  77.          
  78.         return FALSE;  
  79.      
  80. };  


 


  在参考了文章《初步分析整理了xml文件与类之间的关联。分享给大家。》后

http://bbs.code.ijinshan.com/thread-1584-1-1.html

得到下图,希望对大家有帮助:

 


 


Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值