﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-菜鸟快飞</title><link>http://www.cppblog.com/vcmatlab/</link><description>图像处理</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:07:16 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:07:16 GMT</pubDate><ttl>60</ttl><item><title> 【转帖】BCGControlBar使用心得--如何捕获Workspace bar类上的树控件的消息 </title><link>http://www.cppblog.com/vcmatlab/archive/2009/07/15/90107.html</link><dc:creator>ferrero</dc:creator><author>ferrero</author><pubDate>Wed, 15 Jul 2009 01:28:00 GMT</pubDate><guid>http://www.cppblog.com/vcmatlab/archive/2009/07/15/90107.html</guid><wfw:comment>http://www.cppblog.com/vcmatlab/comments/90107.html</wfw:comment><comments>http://www.cppblog.com/vcmatlab/archive/2009/07/15/90107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vcmatlab/comments/commentRss/90107.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vcmatlab/services/trackbacks/90107.html</trackback:ping><description><![CDATA[<p>原帖地址：http://blog.csdn.net/rsjrj/archive/2009/02/12/3884480.aspx<br></p>
<p>我想在MainFrame中捕获Workspace
bar类上的树控件的通知消息 TVN_SELCHANGED,但是奇怪的是不能工作，而在非BCG的工程中确实可以的。<br>
代码如下：</p>
<pre> **********************************************************************<br><br>      // WorkspaceBar.cpp : implementation of the CWorkspaceBar class<br><br>      //<br><br>      <br><br>      BEGIN_MESSAGE_MAP(CWorkspaceBar, CBCGSizingControlBar)<br><br>      //{{AFX_MSG_MAP(CWorkspaceBar)<br><br>      ON_WM_CREATE()<br><br>      ON_WM_SIZE()<br><br>      ON_NOTIFY(TVN_SELCHANGED, 1, OnSelectTree)<br><br>      //}}AFX_MSG_MAP<br><br>      END_MESSAGE_MAP()<br><br>      <br><br>      int CWorkspaceBar::OnCreate(LPCREATESTRUCT lpCreateStruct) <br><br>      {<br><br>      ....<br><br>      // Create tabs window:<br><br>      if (!m_wndTabs.Create (CBCGTabWnd::STYLE_3D, rectDummy, this, 1))<br><br>      {<br><br>      TRACE0("Failed to create workspace tab window<br>");<br><br>      return -1; // fail to create<br><br>      }<br><br>      <br><br>      m_wndTabs.SetImageList (IDB_WORKSPACE, 16, RGB (255, 0, 255));<br><br>      <br><br>      // Create tree windows.<br><br>      // TODO: create your own tab windows here:<br><br>      const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES<br><br>      | <br><br>      <br><br>      TVS_LINESATROOT | TVS_HASBUTTONS;<br><br>      <br><br>      if (!m_wndTree1.Create (dwViewStyle, rectDummy, &amp;m_wndTabs, 2) ||<br><br>      !m_wndTree2.Create (dwViewStyle, rectDummy, &amp;m_wndTabs, 3))<br><br>      {<br><br>      TRACE0("Failed to create workspace view<br>");<br><br>      return -1; // fail to create<br><br>      }<br><br>      ...<br><br>      }<br><br>      <br><br>      void CWorkspaceBar::OnSelectTree(NMHDR* pNMHDR, LRESULT* pResult) <br><br>      {<br><br>      NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;<br><br>      *pResult = 0;<br><br>      }<br><br>      <br><br>      **********************************************************************<br><br>      // WorkspaceBar.h : interface of the CWorkspaceBar class<br><br>      //<br><br>      // Generated message map functions<br><br>      protected:<br><br>      //{{AFX_MSG(CWorkspaceBar)<br><br>      afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);<br><br>      afx_msg void OnSize(UINT nType, int cx, int cy);<br><br>      afx_msg void OnSelectTree(NMHDR* pNMHDR, LRESULT* pResult);<br><br>      //}}AFX_MSG<br><br>      DECLARE_MESSAGE_MAP()<br><br>      };<br></pre>
<p>
<br>
在BCG的网站上我看到了一个解决方法，就是你从CTreeCtrl 继承一个你自己的Tree Control类，在新类中处理消息。<br>
<br>
我不想这样实现。于是我去查找问题的根源，我发现BCG的CBCGTabWnd类截获了OnＮotify消息，导致mainframe捕获不到。<br>
解决方法如下：<br>
1、从CBCGTabWnd 继承一个自己的类。<br>
2、在类中实现OnNotify虚函数。</p>
<pre>BOOL CMyTabCtrl::OnNotify (WPARAM wParam, LPARAM lParam, LRESULT* pResult){ <br>      ASSERT_VALID (this); <br><br>      BOOL bRes = CBCGTabWnd::OnNotify (wParam, lParam, pResult); <br><br>      NMHDR* pNMHDR = (NMHDR*)lParam; ASSERT (pNMHDR != NULL);<br><br>      if (pNMHDR-&gt;code == TTN_SHOW &amp;&amp; !m_bFlat) { m_ToolTip.SetWindowPos (&amp;wndTop, <br>      -1, -1, -1, -1, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSIZE); }<br><br>      if (pNMHDR-&gt;code == HDN_ITEMCHANGED) { SynchronizeScrollBar ();<br><br>      }<br><br>      if (wParam &gt; 0) {<br><br>      CWnd* pChild = GetDlgItem(wParam);<br><br>      if (pChild)<br><br>      {<br><br>      if (IsChild(pChild))<br><br>      {<br><br>      GetOwner()-&gt;SendMessage(WM_NOTIFY,wParam,lParam);<br><br>      }<br><br>      }<br><br>      }<br><br>      return bRes;<br><br>      }<br></pre>
<p>
3、在CWorkspaceBar类的OnCreate方法中确定你把CBCGTabWnd类改成你自己的类。<br>
4、在CWorkspaceBar类中，实现你想捕获的通知消息。</p>
<pre>ON_NOTIFY(NM_DBLCLK,ID_LIST,OnListDblClk)...void <br>      CWorkspaceBar::OnListDblClk(NMHDR* pNMHDR, LRESULT* pResult) { ... *pResult <br>      = 0;}</pre><img src ="http://www.cppblog.com/vcmatlab/aggbug/90107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vcmatlab/" target="_blank">ferrero</a> 2009-07-15 09:28 <a href="http://www.cppblog.com/vcmatlab/archive/2009/07/15/90107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转帖】BCGControlBar 的使用方法</title><link>http://www.cppblog.com/vcmatlab/archive/2009/07/15/90104.html</link><dc:creator>ferrero</dc:creator><author>ferrero</author><pubDate>Wed, 15 Jul 2009 01:26:00 GMT</pubDate><guid>http://www.cppblog.com/vcmatlab/archive/2009/07/15/90104.html</guid><wfw:comment>http://www.cppblog.com/vcmatlab/comments/90104.html</wfw:comment><comments>http://www.cppblog.com/vcmatlab/archive/2009/07/15/90104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vcmatlab/comments/commentRss/90104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vcmatlab/services/trackbacks/90104.html</trackback:ping><description><![CDATA[<p style="font-size: 10pt; font-family: Verdana;">BCGControlBar 的使用方法</p>
<p style="font-size: 10pt; font-family: Verdana;">原帖地址：http://blog.csdn.net/rsjrj/archive/2009/02/12/3884490.aspx<br> </p>
<p style="font-size: 10pt; font-family: Verdana;">安装 BCGControlBar 库到你的计算机： </p>
<p style="font-size: 10pt; font-family: Verdana;">解压缩 BCGControlBar.zip （比如，到 c:\bcg 目录中） <br>把 c:\bcg\bin 增加到你的 path 环境变量中， <br>运
行 Visual C++ 并且打开 Tools | Options 对话框，切换到Directories 页并且把
c:\bcg\bcgcontrolbar 加入到 include 目录 中，把 c:\bcg\bin 加入 library 和
executable 目录中； <br>打开Bcgcontrolbar 和/或 BcgcontrolbarStatic 项目（路径是 c:\bcg\bcgcontrolbar） 并且选择需要的选项； <br>如果要安装 BCGControlBar 应用程序向导，只需要打开BCGBAppWizard 项目并编译链接。你将在项目列表中看到一个新的条目。 <br>你必须编译链接所有的 BCGControlBar 库的 DLL 文件；</p>
<p style="font-size: 10pt; font-family: Verdana;">打开 BCGControlBar 项目并编译链接。下面是一个你将得到的 DLLs 和 库文件列表：</p>
<p style="font-size: 10pt; font-family: Verdana;">BCGCB***D.dll, BCGCB***D.lib DLL debug version <br>BCGCB***.dll, BCGCB***.lib DLL release version <br>BCGCB***UD.dll, BCGCB***UD.lib DLL debug version, UNICODE <br>BCGCB***U.dll, BCGCB***U.lib DLL release version UNICODE <br>BCGCB***StaticD.lib static library debug version <br>BCGCB***StaticDS.lib static library debug version, MFC shared DLL* <br>BCGCB***Static.lib static library release version <br>BCGCB***StaticS.lib static library release version, MFC shared DLL* <br>BCGCB***StaticUD.lib static library debug version, UNICODE <br>BCGCB***StaticUDS.lib static library debug version, UNICODE, MFC shared DLL* <br>BCGCB***U.lib static library release version, UNICODE <br>BCGCB***US.lib static library release version, UNICODE, MFC shared DLL* </p>
<p style="font-size: 10pt; font-family: Verdana;">*** 表示版本号。比如，如果你使用的库版本为 5.00 发行版， DLL 的相应的发行版本为 BCGCB500.dll<br>* static library version with MFC shared DLL 适用于 4.7 或更高版本。</p>
<p style="font-size: 10pt; font-family: Verdana;">所有这些文件将定位在你的 \Bin 目录中。 记得要把这些目录加入你的系统目录中（把其中的dll全部拷贝到system32下）。</p>
<p style="font-size: 10pt; font-family: Verdana;"><br>请按如下内容改变你的源代码：</p>
<p style="font-size: 10pt; font-family: Verdana;">添加 BCGControlBar 路径到 INCLUDE 路径 <br>确定你在你的应用程序中调用 了 AfxOleInit() InitInstance() <br>添加下列语句到 stdafx.h 文件： <br>#include "BCGCBProInc.h" </p>
<p style="font-size: 10pt; font-family: Verdana;">添加 CBCGWorkspace-派生到你的应用程序类： <br>class CMyApp : public CWinApp,<br>public CBCGWorkspace </p>
<p style="font-size: 10pt; font-family: Verdana;">首先，你必须定义在注册表中存放你自定义数据的位置和你 需要什么样的自定义（鼠标、键盘、上下文菜单），为了做这些工作，在CMyApp::InitInstance 中设置注册表入口并初始化自定义管理器： <br>SetRegistryBase (_T("Settings"));</p>
<p style="font-size: 10pt; font-family: Verdana;">// 初始化自定义管理器：<br>InitMouseManager();<br>InitContextMenuManager();<br>InitKeyboardManager(); </p>
<p style="font-size: 10pt; font-family: Verdana;">如果你已经决定使用鼠标或上下文菜单的自定义功能，你必 须在鼠标自定义管理器中附加一个视图，或初始化上下文菜单。重载CBCGWorkspace::PreLoadState 行为： <br>class CMyApp ....<br>{<br>...<br>virtual void PreLoadState();<br>...<br>};</p>
<p style="font-size: 10pt; font-family: Verdana;">void CMyApp::PreLoadState()<br>{<br>// 把鼠 标事件连接到特定 的视图 :<br>GetMouseManager()-&gt;AddView (iIdTestView, _T("Test view"), IDR_VIEW);</p>
<p style="font-size: 10pt; font-family: Verdana;">// 初始化上下文菜单：<br>GetContextMenuManager()-&gt;AddMenu (_T("Test menu"), idMenu); <br>} </p>
<p style="font-size: 10pt; font-family: Verdana;">同时在 mainfrm.h 和 mainfrm.cpp 文件中 把 CMDIFrameWnd 变成 CBCGMDIFrameWnd ，（在 SDI 应用程序的情况下， 把 CFrameWnd 变成 CBCGPFrameWnd） <br>把 CMDIChildWnd 变成 CBCGMDIChildWnd <br>把 CToolbar 变成 CBCGPToolBar 并且添加一个内嵌菜单栏对象到你的 CMainFrame 类中： <br>CBCGPMenuBar m_wndMenuBar; // 新的菜单栏<br>CBCGPToolBar m_wndToolBar; // 应用程序工具栏 </p>
<p style="font-size: 10pt; font-family: Verdana;">在 CMainFrame::OnCreate() 行为中添加如下的行，以便使能菜单栏功能： <br>// 创建菜单栏（替换标准菜单）：<br>if (!m_wndMenuBar.Create (this))<br>{<br>TRACE0("Failed to create menubar\n");<br>return -1; //创建失败<br>} <br>m_wndMenuBar.SetBarStyle (m_wndMenuBar.GetBarStyle() |<br>CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);</p>
<p style="font-size: 10pt; font-family: Verdana;"><br>为了使能菜单栏停靠，你应当添加如下代码： <br>m_wndMenuBar.EnableDocking (CBRS_ALIGN_ANY);<br>DockControlBar (&amp;m_wndMenuBar); </p>
<p style="font-size: 10pt; font-family: Verdana;">重要之处： 你可以在应用程序中使用任何数目的CBCGToolBar 工具栏。所有的工具栏图像将被合并到一个位图文件中。 无论如何，仅仅有一个CBCGMenuBar 对象被使用。</p>
<p style="font-size: 10pt; font-family: Verdana;"><br>为了使能 工具栏/菜单 的自定义，请作出如下改变：</p>
<p style="font-size: 10pt; font-family: Verdana;">添加 工具栏/菜单 自定义命令（比如，View | Customize...） <br>实现 OnViewCustomize 行为。代码看起来如下： <br>void CMainFrame::OnViewCustomize() <br>{<br>// 创建一个自定义工具栏对话框：<br>CBCGToolbarCustomize* pDlgCust = new CBCGToolbarCustomize (this, <br>TRUE /* Automatic menus scaning */); <br>// 添加预定义工具栏：<br>pDlgCust-&gt;AddToolBar ("Main", IDR_MAINFRAME);<br>....</p>
<p style="font-size: 10pt; font-family: Verdana;">// 添加用户自定义命令：<br>pDlgCust-&gt;AddButton ("User", CBCGToolbarButton (ID_USER_TOOL1, 1, "User Tool 1", TRUE));<br>pDlgCust-&gt;AddButton ("User", CBCGToolbarButton (ID_USER_TOOL2, 2, "User Tool 2", TRUE));<br>pDlgCust-&gt;AddButton ("User", CBCGToolbarButton (ID_USER_TOOL3, 3, "User Tool 3", TRUE));<br>....</p>
<p style="font-size: 10pt; font-family: Verdana;">pDlgCust-&gt;SetUserCategory ("User");</p>
<p style="font-size: 10pt; font-family: Verdana;">// 使能用户自定义工具栏的 Create/Delete ：<br>pDlgCust-&gt;EnableUserDefinedToolbars ();</p>
<p style="font-size: 10pt; font-family: Verdana;">pDlgCust-&gt;Create ();<br>}</p>
<p style="font-size: 10pt; font-family: Verdana;"><br>为了使能 Microsoft?Office 2000 菜单：</p>
<p style="font-size: 10pt; font-family: Verdana;">定义你自己的基本命令集合（通常在CMainFrame::OnCreate()中）： <br>CList lstBasicCoomads;</p>
<p style="font-size: 10pt; font-family: Verdana;">lstBasicCoomads.AddTail (ID_FILE_NEW);<br>lstBasicCoomads.AddTail (ID_FILE_OPEN);<br>lstBasicCoomads.AddTail (ID_FILE_SAVE);</p>
<p style="font-size: 10pt; font-family: Verdana;">......<br>lstBasicCoomads.AddTail (ID_APP_ABOUT);</p>
<p style="font-size: 10pt; font-family: Verdana;">CBCGToolBar::SetBasicCommands (lstBasicCoomads);</p>
<p style="font-size: 10pt; font-family: Verdana;"><br>这些命令将显示在下拉菜单中： <br>为了使能菜单阴影：</p>
<p style="font-size: 10pt; font-family: Verdana;">CBCGMenuBar::EnableMenuShadows (BOOL bEnable = TRUE) </p>
<p style="font-size: 10pt; font-family: Verdana;">注意 如果你查看的内容可能动态改变就不要在弹出式菜单中使用菜单 阴影（比如，视图显示动画、HTML页）在这种情况下，菜单阴影 会记忆以前的视图图像。</p>
<p style="font-size: 10pt; font-family: Verdana;">为了在运行时改变菜单字体：</p>
<p style="font-size: 10pt; font-family: Verdana;">CBCGMenuBar::SetMenuFont (LPLOGFONT lpLogFont, BOOL bHorz = TRUE); </p>
<p style="font-size: 10pt; font-family: Verdana;">为了使能&#8220;页面&#8221;（自定义）按钮，只需要调用：</p>
<p style="font-size: 10pt; font-family: Verdana;">m_wndToolBar.EnableCustomizeButton (TRUE, id_of_customize_command,<br>_T("Customize...")); </p>
<p style="font-size: 10pt; font-family: Verdana;">为了使能图像覆盖下的文字：</p>
<p style="font-size: 10pt; font-family: Verdana;">m_wndToolBar.EnableTextLabels (BOOL bEnable = TRUE); </p>
<p style="font-size: 10pt; font-family: Verdana;">为了使能用户自定义工具：</p>
<p style="font-size: 10pt; font-family: Verdana;">添加一个新的菜单条目：ID_TOOLS_ENTRY。该条目将 自动被实际存在的工具列表取代。 <br>添加如下的条目到 STRING 资源：</p>
<p style="font-size: 10pt; font-family: Verdana;">ID_TOOL1 "Activates user-defined tool\nUser Tool" <br>ID_TOOL2 "Activates user-defined tool\nUser Tool"<br>.... <br>ID_TOOLx "Activates user-defined tool\nUser Tool"</p>
<p style="font-size: 10pt; font-family: Verdana;">在应用程序的InitInstance() 中调用：<br>EnableUserTools (ID_TOOLS_ENTRY, ID_TOOL1, ID_TOOLx); </p>
<p style="font-size: 10pt; font-family: Verdana;">一个 "Tools" 新页面将加入到自定义对话框中 <br>为了使能动态可裁剪菜单：</p>
<p style="font-size: 10pt; font-family: Verdana;">在 STRING 资源表中保留部分条目。这些标识符将被当作控制栏标识符使用。</p>
<p style="font-size: 10pt; font-family: Verdana;">ID_TEAR_OFF1 "" <br>ID_TEAR_OFF2 "" <br>....... <br>ID_TEAR_OFFx ""</p>
<p style="font-size: 10pt; font-family: Verdana;">对于每一个可裁剪弹出式菜单，把 "Break" 属性改位 "Bar" (MF_MENUBARBREAK) <br>在应用程序的 InitInstance() 中调用：<br>EnableTearOffMenus (_T("RegBase", ID_TEAR_OFF1, ID_TEAR_OFFx); </p>
<p style="font-size: 10pt; font-family: Verdana;">为了使能静态可裁剪菜单</p>
<p style="font-size: 10pt; font-family: Verdana;">在 STRING 资源表中保留一个条目。这个标识符将区别于动态 可裁剪 标识符（如上所述）。</p>
<p style="font-size: 10pt; font-family: Verdana;">ID_TEAR_OFF_BAR ""</p>
<p style="font-size: 10pt; font-family: Verdana;">在主框架的 OnShowPopupMenu，为特定的菜单按钮使能可裁剪：<br>pMenuButton-&gt;SetTearOff (D_TEAR_OFF_BAR);<br><br><br>以下地址有破解版下载<br><a  href="http://www.skkk.net/Download.asp?ID=22532&amp;URL=http://http.skkk.net/061124/download/BCGControlBar.Professional.v7.31.Final.rar">http://www.skkk.net/Download.asp?ID=22532&amp;URL=http://http.skkk.net/061124/download/BCGControlBar.Professional.v7.31.Final.rar</a></p>
<p style="font-size: 10pt; font-family: Verdana;">安装密码 TEAM&nbsp;&nbsp; ZWT</p><img src ="http://www.cppblog.com/vcmatlab/aggbug/90104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vcmatlab/" target="_blank">ferrero</a> 2009-07-15 09:26 <a href="http://www.cppblog.com/vcmatlab/archive/2009/07/15/90104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BCG开始设置</title><link>http://www.cppblog.com/vcmatlab/archive/2009/05/29/86059.html</link><dc:creator>ferrero</dc:creator><author>ferrero</author><pubDate>Fri, 29 May 2009 01:53:00 GMT</pubDate><guid>http://www.cppblog.com/vcmatlab/archive/2009/05/29/86059.html</guid><wfw:comment>http://www.cppblog.com/vcmatlab/comments/86059.html</wfw:comment><comments>http://www.cppblog.com/vcmatlab/archive/2009/05/29/86059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vcmatlab/comments/commentRss/86059.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vcmatlab/services/trackbacks/86059.html</trackback:ping><description><![CDATA[原文网址http://www.bcgsoft.com/doc/getting_started.htm<br>1.确定在你程序的InitInstance()函数中调用了<strong>AfxOleInit()</strong>函数<br>2.在<strong>ExistInstance()</strong>调用<strong>BCGCBProCleanUp()</strong><br>3.在stdafx.h中添加下面的语句：<br>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">#include "BCGCBProInc.h"</font></td>
        </tr>
    </tbody>
</table>
4.使你的程序类派生自<strong>CBCGWorkspace：<br></strong>
<table bgcolor="#ffffff" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td>
            <div align="left">
            <table class="text_all" border="0" cellspacing="0">
                <tbody>
                    <tr>
                        <td rowspan="2" bgcolor="#f0f2f6" valign="top"><font color="#0000ff">class</font> <font color="#800000">CMyApp</font> :&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
                        <td bgcolor="#f0f2f6" valign="top"><font color="#0000ff">public</font> <font color="#800000">CWinApp</font>,</td>
                    </tr>
                    <tr>
                        <td bgcolor="#f0f2f6" valign="top"><font color="#0000ff">public</font> <font color="#800000">CBCGPWorkspace</font></td>
                    </tr>
                </tbody>
            </table>
            </div>
            </td>
        </tr>
    </tbody>
</table>
5.首先你需要确定在注册表的什么位置保存你自定义的数据，需要什么样的自定义特征（鼠标，键盘，上下文菜单）。为了完成这个工作，需要在<strong>CMyApp::InitInstance</strong>中设置注册表项，并且初始化自定义管理器<br><blockquote>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">SetRegistryBase</font> (_T("<font color="#ff0000">Settings</font>"));<br><br><font color="#008000">// Initialize
            customization managers:<br></font><font color="#800000">InitMouseManager();<br>InitContextMenuManager();<br>InitKeyboardManager();</font></td>
        </tr>
    </tbody>
</table>
</blockquote>6.如果你决定使用鼠标或者上下文菜单自定义功能，你需要&#8220;附加&#8221;一个视类到鼠标自定义管理器，并且初始化上下文菜单。然后重载<strong>CBCGPWorkspace::PreLoadState</strong>方法<strong>：<br></strong><blockquote>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#0000ff">class </font><font color="#800000">CMyApp
            ....<br>{<br>...</font><font color="#0000ff"><br>virtual void</font> <font color="#800000">PreLoadState();<br>...<br>};</font><br><br><font color="#0000ff">void</font> <font color="#800000">CMyApp</font>::<font color="#800000">PreLoadState()<br>{<br>&nbsp;&nbsp;&nbsp; </font><font color="#008000">// Associate
            mouse event with specific view(s):</font><font color="#800000"><br>&nbsp;&nbsp;&nbsp;
            GetMouseManager()-&gt;AddView (iIdTestView, _T("</font><font color="#ff0000">Test
            view</font><font color="#800000">"), IDR_VIEW);<br><br>&nbsp;&nbsp;&nbsp; </font><font color="#008000">// Initialize context menus:</font><font color="#800000"><br>&nbsp;&nbsp;&nbsp;
            GetContextMenuManager()-&gt;AddMenu (_T("</font><font color="#ff0000">Test
            menu</font><font color="#800000">"),
            idMenu);&nbsp;<br>}</font></td>
        </tr>
    </tbody>
</table>
</blockquote>7.在mainfrm.h和mainfrm.cpp中将 <strong>CMDIFrameWnd </strong>换成 <strong>CBCGPMDIFrameWnd</strong><strong> </strong>（在单文档程序中将<strong>CFrameWnd</strong> 变成 <strong>CBCGPFrameWnd</strong>）<br>8.将<strong>CMDIChildWnd</strong> 变成&nbsp; <strong>CBCGPMDIChildWnd</strong> <br>9.将<strong>CToolbar</strong> 变成 <strong>CBCGPToolBar</strong>并且添加一个植入式菜单栏到你的<strong> </strong>CMainFrame 类：<br><blockquote>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">CBCGPMenuBar&nbsp;&nbsp;&nbsp;
            m_wndMenuBar;&nbsp;&nbsp;&nbsp;</font><font color="#008000">&nbsp; // New menu bar</font><font color="#800000"><br>CBCGPToolBar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_wndToolBar;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#008000">// Application
            toolbar</font></td>
        </tr>
    </tbody>
</table>
</blockquote>10.在<strong>CMainFrame::OnCreate() 中添加下面的语句，激活新的菜单栏</strong><br>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#008000">// Create menu bar (replaces the
            standard menu):</font><font color="#800000"><br>if (!m_wndMenuBar.Create
            (</font><font color="#0000ff">this</font><font color="#800000">))<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            TRACE0("Failed to create menubar\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#0000ff">return</font><font color="#800000"> -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#008000">// fail to create</font><font color="#800000"><br>}</font>
            <p><font color="#800000">m_wndMenuBar.SetBarStyle (m_wndMenuBar.GetBarStyle()
            |<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CBRS_TOOLTIPS | CBRS_FLYBY |
            CBRS_SIZE_DYNAMIC);</font></p>
            </td>
        </tr>
    </tbody>
</table>
11.使得菜单栏能浮动，需要添加下面的语句：<br>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">m_wndMenuBar.EnableDocking
            (CBRS_ALIGN_ANY);<br>DockControlBar
            (&amp;m_wndMenuBar);</font></td>
        </tr>
    </tbody>
</table>
12.重要：你能在程序中使用任何数量的<strong>CBCGToolBar</strong>工具栏。所有的工具栏图像都将自动的整合到一张位图图像中。虽然如此，但是只有一个<strong>CBCGMenuBar</strong> 对象能被使用。<br>为了使工具栏和菜单能自定义，一定要进行下面的改变：<br>&nbsp;&nbsp;&nbsp; 添加工具栏和菜单自定义命令（比如<font color="#000000"><strong>View | Customize...</strong></font>）<br>&nbsp;&nbsp;&nbsp; 实现<strong>OnViewCustomize </strong>方法。代码有点像下面所示：<br>
<ul>
    <li><font color="#000000">&nbsp;</font> </li>
</ul>
<blockquote>
<blockquote>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">void
            CMainFrame::OnViewCustomize()<br>{<br></font><font color="#008000">&nbsp;// Create a
            customize toolbars dialog:</font><font color="#800000"><br>&nbsp;CBCGPToolbarCustomize*
            pDlgCust = new CBCGPToolbarCustomize (</font><font color="#0000ff">this</font><font color="#800000">,<br>TRUE </font><font color="#008000">/* Automatic menus scaning */</font><font color="#800000">);</font>
            <p><font color="#800000">&nbsp;</font><font color="#008000">// Add predefined
            toolbars:</font><font color="#800000"><br>&nbsp;pDlgCust-&gt;AddToolBar ("Main",
            IDR_MAINFRAME);<br>&nbsp;....</font></p>
            <p><font color="#008000">&nbsp;// Add user-defined commands:</font><font color="#800000"><br>&nbsp;pDlgCust-&gt;AddButton ("User", CBCGPToolbarButton
            (ID_USER_TOOL1, 1, "User Tool 1", TRUE));<br>&nbsp;pDlgCust-&gt;AddButton ("User",
            CBCGPToolbarButton (ID_USER_TOOL2, 2, "User Tool 2",
            TRUE));<br>&nbsp;pDlgCust-&gt;AddButton ("User", CBCGPToolbarButton (ID_USER_TOOL3,
            3, "User Tool 3", TRUE));<br>&nbsp;....</font></p>
            <p><font color="#800000">&nbsp;pDlgCust-&gt;SetUserCategory&nbsp;("User");</font></p>
            <p><font color="#008000">&nbsp;// Enable Create/Delete of the user-defined
            toolbars:</font><font color="#800000"><br>&nbsp;pDlgCust-&gt;EnableUserDefinedToolbars
            ();</font></p>
            <p><font color="#800000">&nbsp;pDlgCust-&gt;Create
            ();<br>}</font></p>
            </td>
        </tr>
    </tbody>
</table>
</blockquote></blockquote>
<p>&nbsp;&nbsp; <br></p>
<p><br></p>
<p> <span style="font-weight: bold;">实现office 2000菜单</span></p>
<p>&nbsp;&nbsp;&nbsp; 定义你自己的基本命令设置（通常在CMainFrame::OnCreate()中）：</p>
<blockquote>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">CList&lt;UINT, UINT&gt;
            lstBasicCoomads;<br></font>
            <p><font color="#800000">lstBasicCoomads.AddTail
            (ID_FILE_NEW);<br>lstBasicCoomads.AddTail
            (ID_FILE_OPEN);<br>lstBasicCoomads.AddTail (ID_FILE_SAVE);</font></p>
            <p><font color="#800000">......<br>lstBasicCoomads.AddTail
            (ID_APP_ABOUT);<br><br>CBCGPToolBar::SetBasicCommands
            (lstBasicCoomads);</font></p>
            </td>
        </tr>
    </tbody>
</table>
</blockquote>
<p>&nbsp;&nbsp;&nbsp; 这些命令会显示在下拉菜单中</p>
<p><br></p>
<p><span style="font-weight: bold;">在运行时改变菜单字体</span></p>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">CBCGPMenuBar::SetMenuFont (LPLOGFONT
            lpLogFont, BOOL bHorz = TRUE);</font></td>
        </tr>
    </tbody>
</table>
<br><span style="font-weight: bold;"><br>激活&#8220;页面&#8221;(自定义)按钮只需要调用：</span><br>
<blockquote>
<blockquote>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">m_wndToolBar.EnableCustomizeButton
            (TRUE,
            id_of_customize_command,<br>_T("Customize..."));</font></td>
        </tr>
    </tbody>
</table>
</blockquote></blockquote>
<p><strong><font color="#000000"><br></font></strong></p>
<p><strong><font color="#000000">激活在按钮图像下的文字：</font></strong></p>
<table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
    <tbody>
        <tr>
            <td bgcolor="#f0f2f6"><font color="#800000">m_wndToolBar.EnableTextLabels (BOOL
            bEnable = TRUE);</font></td>
        </tr>
    </tbody>
</table>
<br><span style="font-weight: bold;">激活用户定义的工具</span>：<br>&nbsp;&nbsp;&nbsp; 增加一个新的菜单项：ID_TOOLS_ENTRY。这项会自动的被实际的工具表代替<br>&nbsp;&nbsp;&nbsp; 增加下面的项到STRING资源中：<br>
<ol>
    <li>ID_TOOL1&nbsp;&nbsp;&nbsp; "Activates user-defined tool\nUser Tool"
    </li>
    <li>ID_TOOL2&nbsp;&nbsp;&nbsp; "Activates user-defined tool\nUser Tool"<br>....
    </li>
    <li>ID_TOOLx&nbsp;&nbsp;&nbsp; "Activates user-defined tool\nUser Tool"<br><br><span style="font-weight: bold;"></span><br>为了每个可&#8220;分离式&#8221;弹出菜单项，将"Break"属性变成"Bar"(MF_MENUBARBREAK)<br><span style="font-weight: bold;">在程序的</span><strong style="font-weight: bold;">InitInstance() </strong><span style="font-weight: bold;">调用</span><strong style="font-weight: bold;">：</strong><br><font color="#800000">EnableTearOffMenus (_T("RegBase"), ID_TEAR_OFF1,
    ID_TEAR_OFFx);</font><br><span style="font-weight: bold;"><br>激活静态可"分离"（"可分开"）菜单</span>：<br><br>在STRIING资源表中保留一个项目，这个项的ID应该与动态的可分离ID不同（如上所示）<br>ID_TEAR_OFF_BAR&nbsp;&nbsp;&nbsp; "&lt;dummy&gt;"<br>在框架类OnShowPopupMenu中，为了特别的菜单按钮激活&#8220;可分离&#8221;<br>
    <table class="text_all" bgcolor="#7195c4" border="0" cellpadding="9" cellspacing="1">
        <tbody>
            <tr>
                <td bgcolor="#f0f2f6"><font color="#800000">pMenuButton-&gt;SetTearOff
                (D_TEAR_OFF_BAR);</font></td>
            </tr>
        </tbody>
    </table>
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></li>
</ol>
<br><br>
<p>&nbsp;</p><img src ="http://www.cppblog.com/vcmatlab/aggbug/86059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vcmatlab/" target="_blank">ferrero</a> 2009-05-29 09:53 <a href="http://www.cppblog.com/vcmatlab/archive/2009/05/29/86059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5月20</title><link>http://www.cppblog.com/vcmatlab/archive/2008/05/20/50586.html</link><dc:creator>ferrero</dc:creator><author>ferrero</author><pubDate>Tue, 20 May 2008 15:02:00 GMT</pubDate><guid>http://www.cppblog.com/vcmatlab/archive/2008/05/20/50586.html</guid><wfw:comment>http://www.cppblog.com/vcmatlab/comments/50586.html</wfw:comment><comments>http://www.cppblog.com/vcmatlab/archive/2008/05/20/50586.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vcmatlab/comments/commentRss/50586.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vcmatlab/services/trackbacks/50586.html</trackback:ping><description><![CDATA[<p>主要是遇到了设置控件消息处理函数<br>然后有牵扯到<br>SetWindowLong()<br>这个函数很奇怪的要求自定义的消息处理函数是static<br>但是按照网上的代码调了半天都没有调出来<br>因为老是提示找不到定义的static变量<br>后来发现静态初始化不能在构造函数中<br>而应该是在类外，构造函数之前<br>说明c++学的不扎实，浪费了一天的时间！！！</p>
<img src ="http://www.cppblog.com/vcmatlab/aggbug/50586.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vcmatlab/" target="_blank">ferrero</a> 2008-05-20 23:02 <a href="http://www.cppblog.com/vcmatlab/archive/2008/05/20/50586.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回调函数</title><link>http://www.cppblog.com/vcmatlab/archive/2008/05/10/49427.html</link><dc:creator>ferrero</dc:creator><author>ferrero</author><pubDate>Sat, 10 May 2008 06:03:00 GMT</pubDate><guid>http://www.cppblog.com/vcmatlab/archive/2008/05/10/49427.html</guid><wfw:comment>http://www.cppblog.com/vcmatlab/comments/49427.html</wfw:comment><comments>http://www.cppblog.com/vcmatlab/archive/2008/05/10/49427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/vcmatlab/comments/commentRss/49427.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/vcmatlab/services/trackbacks/49427.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/vcmatlab/archive/2008/05/10/49427.html'>阅读全文</a><img src ="http://www.cppblog.com/vcmatlab/aggbug/49427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/vcmatlab/" target="_blank">ferrero</a> 2008-05-10 14:03 <a href="http://www.cppblog.com/vcmatlab/archive/2008/05/10/49427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>