﻿<?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++博客-时间的痕迹-随笔分类-MFC</title><link>http://www.cppblog.com/ivenher/category/3330.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 13:30:05 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 13:30:05 GMT</pubDate><ttl>60</ttl><item><title>深入浅出MFC文档/视图架构之相互关系二（转）</title><link>http://www.cppblog.com/ivenher/archive/2007/01/21/17860.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Sun, 21 Jan 2007 07:04:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/archive/2007/01/21/17860.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/17860.html</wfw:comment><comments>http://www.cppblog.com/ivenher/archive/2007/01/21/17860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/17860.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/17860.html</trackback:ping><description><![CDATA[<div id=contitle twffan="done">
<h1>深入浅出MFC文档/视图架构之相互关系</h1>
</div>
<div id=conauthor twffan="done"><span twffan="done">2006-03-21 14:20 </span><span twffan="done">作者： 宋宝华 </span><span twffan="done">出处： 天极开发 </span><span twffan="done">责任编辑：<a title=向本编辑提问 href="http://comments.yesky.com/t/%B7%BD%D6%DB/6,324/2341701.shtml" target=_blank>方舟</a></span> </div>
<div class=topadbg twffan="done"><span id=ad9 twffan="done">
<div id=ad9ad twffan="done"></div>
</span></div>
<div id=conneirong twffan="done"><span id=ad3 twffan="done"></span>
<div class=guanggao twffan="done"><span id=contentAdv twffan="done"><iframe src="http://media.yesky.com/adjs/iframe-column/dell-240200.htm" frameBorder=0 width=240 scrolling=no height=200>
</iframe></span></div>
　　2. 消息流动机制<br><br>　　在基于"文档/视图"架构的MFC程序中，用户消息（鼠标、键盘输入等）会先发往视图，如果视图未处理则会发往框架窗口。所以，一般来说，消息映射宜定义在视图中。另外，如果一个应用同时拥有多个视图而当前活动视图没有对消息进行处理则消息也会发往框架窗口。<br><br>　　下面我们来看实例，我们利用Visual C++向导创建一个单文档/视图架构的MFC程序，在其中增加一个菜单项为"自定义"（ID为IDM_SELF，如图6.4）。<br><br>
<table width="90%" align=center border=0>
    <tbody>
        <tr>
            <td>
            <div align=center twffan="done"><img src="http://dev.yesky.com/imagelist/06/03/un43z6389e79.jpg" border=0 twffan="done"><br>图6.4 含"自定义"菜单的单文档/视图架构MFC程序</div>
            </td>
        </tr>
    </tbody>
</table>
<br>　　我们分别在视图类和框架窗口类中为"自定义"菜单添加消息映射，代码如下：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>//视图中的消息映射和处理函数<br>BEGIN_MESSAGE_MAP(CExampleView, CView)<br>　//{{AFX_MSG_MAP(CExampleView)<br>　　ON_COMMAND(IDM_SELF, OnSelf)<br>　//}}AFX_MSG_MAP<br>END_MESSAGE_MAP() <br>void CExampleView::OnSelf() <br>{<br>　// TODO: Add your command handler code here<br>　AfxMessageBox("消息在视图中处理");<br>}<br><br>//框架窗口中的消息映射和处理函数<br>BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)<br>　//{{AFX_MSG_MAP(CMainFrame)<br>　　ON_COMMAND(IDM_SELF, OnSelf)<br>　//}}AFX_MSG_MAP<br>END_MESSAGE_MAP()<br><br>void CMainFrame::OnSelf() <br>{<br>　// TODO: Add your command handler code here<br>　AfxMessageBox("消息在框架窗口中处理");<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　这时候，我们单击"自定义"菜单，弹出对话框显示"消息在视图中处理"；如果我们删除框架窗口中的消息映射，再单击"自定义"菜单，弹出对话框也显示"消息在视图中处理"；但是，若我们将视图中的消息映射删除了，就会显示"消息在框架窗口中处理"！这验证了我们关于消息处理顺序论述的正确性。<br><br>　　欲深入理解消息流动过程，还需认真分析CFrameWnd::OnCmdMsg、CView::OnCmdMsg函数的源代码：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,<br>AFX_CMDHANDLERINFO* pHandlerInfo)<br>{<br>　// pump through current view FIRST<br>　CView* pView = GetActiveView();<br>　if (pView != NULL &amp;&amp; pView-&gt;OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))<br>　　return TRUE;<br><br>　// then pump through frame<br>　if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))<br>　　return TRUE;<br><br>　// last but not least, pump through app<br>　CWinApp* pApp = AfxGetApp();<br>　if (pApp != NULL &amp;&amp; pApp-&gt;OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))<br>　　return TRUE;<br><br>　return FALSE;<br>}<br><br>BOOL CView::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)<br>{<br>　// first pump through pane<br>　if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))<br>　　return TRUE;<br><br>　// then pump through document<br>　BOOL bHandled = FALSE;<br>　if (m_pDocument != NULL)<br>　{<br>　　// special state for saving view before routing to document<br>　　_AFX_THREAD_STATE* pThreadState = AfxGetThreadState();<br>　　CView* pOldRoutingView = pThreadState-&gt;m_pRoutingView;<br>　　pThreadState-&gt;m_pRoutingView = this;<br>　　bHandled = m_pDocument-&gt;OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);<br>　　pThreadState-&gt;m_pRoutingView = pOldRoutingView;<br>　}<br><br>　return bHandled;<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　分析上述源代码可知，WM_COMMAND消息的实际流动顺序比前文叙述的"先视图，后框架窗口"要复杂得多，文档和应用程序都参与了消息的处理过程。如果我们再为文档和应用添加消息映射和处理函数：<br><br>
<table borderColor=#cccccc width="90%" align=center bgColor=#e3e3e3 border=1>
    <tbody>
        <tr>
            <td>//文档的消息映射和处理函数<br>BEGIN_MESSAGE_MAP(CExampleDoc, CDocument)<br>　//{{AFX_MSG_MAP(CExampleDoc)<br>　　ON_COMMAND(IDM_SELF, OnSelf)<br>　//}}AFX_MSG_MAP<br>END_MESSAGE_MAP()<br><br>void CExampleDoc::OnSelf() <br>{<br>　// TODO: Add your command handler code here<br>　AfxMessageBox("消息在文档中处理");<br>}<br><br>//应用的消息映射和处理函数<br>BEGIN_MESSAGE_MAP(CExampleApp, CWinApp)<br>//{{AFX_MSG_MAP(CExampleApp) <br>ON_COMMAND(IDM_SELF, OnSelf)<br>//}}AFX_MSG_MAP<br>END_MESSAGE_MAP()<br><br>void CExampleApp::OnSelf() <br>{<br>　// TODO: Add your command handler code here<br>　AfxMessageBox("消息在应用中处理");<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　屏蔽掉视图和框架窗口的消息映射，再单击"自定义"菜单，弹出对话框显示"消息在文档中处理"；再屏蔽掉文档中的消息映射，弹出对话框显示"消息在应用中处理"！由此可见，完整的WM_COMMAND消息的处理顺序是"视图――文档――框架窗口――应用"！<br><br>　　实际上，关于MFC的消息流动是一个很复杂的议题，陷于篇幅的原因，我们不可能对其进行更详尽的介绍，读者可自行寻找相关资料。
<div class=right twffan="done">共2页。 <a class=page href="http://dev.yesky.com/201/2341701.shtml" target=_self><font face=Webdings>9</font></a><a class=page href="http://dev.yesky.com/201/2341701.shtml" target=_self><font face=Webdings>7</font></a><a class=page href="http://dev.yesky.com/201/2341701.shtml" target=_self><strong>1</strong></a><a class=page href="http://dev.yesky.com/201/2341701_1.shtml" target=_self><font color=#666666><strong>2</strong></font></a></div>
</div>
<img src ="http://www.cppblog.com/ivenher/aggbug/17860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2007-01-21 15:04 <a href="http://www.cppblog.com/ivenher/archive/2007/01/21/17860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中自动改变控件位置和大小的对话框类（转）</title><link>http://www.cppblog.com/ivenher/archive/2007/01/21/17858.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Sun, 21 Jan 2007 06:25:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/archive/2007/01/21/17858.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/17858.html</wfw:comment><comments>http://www.cppblog.com/ivenher/archive/2007/01/21/17858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/17858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/17858.html</trackback:ping><description><![CDATA[<p>我用VC写的一个可以自动改变控件位置和大小的对话框类。从这个类继承的对话框类，只要在OnInitDialog()里写几行简单的代码，对话框上的控件就会随着对话框大小的改变而改变自己的位置和大小。</p>
<div class=con_all twffan="done">
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在用VC开发应用程序时，经常会要做一些可以改变大小的对话框，而这个时候就要求对话框上的控件会随着对话框大小的改变而改变自己的位置和大小。如果控件比较少，那可以在对话框的OnSize()事件里面添加代码，通过计算来调整各个控件的位置和大小；但是，如果对话框上的控件比较多的话，那这将是一件非常痛苦的事情！要是程序中又有很多可以改变大小的对话框，那一个一个的OnSize()写下来，那会使程序员崩溃的！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了解决这个问题，我写了一个自动改变控件位置和大小的对话框类ClxDialog。从这个类继承的对话框类，只要在OnInitDialog()里对控件做一些简单的设置，对话框上的控件就会随着对话框大小的改变而改变自己的位置和大小。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了保存控件信息，我定义了一个结构：</p>
<p>typedef struct _dlgControlTag <br>{<br>&nbsp;&nbsp;&nbsp; int iId;&nbsp; <font color=#339966>//&nbsp; 控件ID</font><br>&nbsp;&nbsp;&nbsp; int iFlag;&nbsp; <font color=#339966>//&nbsp; 标志，表示怎样改变控件的位置或者大小<br></font>&nbsp;&nbsp;&nbsp; int iPercent;&nbsp; <font color=#339966>//&nbsp; 改变值占对话框改变值的百分比<br></font>} DLGCTLINFO, *PDLGCTLINFO;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里要对结构中的iFlag和iPercent进行一些解释。其中iFlag是下面的枚举值：</p>
<p>enum<br>{<br>&nbsp;&nbsp;&nbsp; MOVEX = 0,&nbsp; <font color=#339966>//&nbsp; 控件在X方向（左右）移动<br></font>&nbsp;&nbsp;&nbsp; MOVEY,&nbsp; <font color=#339966>//&nbsp; 控件在Y方向（上下）移动<br></font>&nbsp;&nbsp;&nbsp; MOVEXY,&nbsp; <font color=#339966>//&nbsp; 控件在X方向和Y方向同时移动<br></font>&nbsp;&nbsp;&nbsp; ELASTICX,&nbsp; <font color=#339966>//&nbsp; 控件在X方向（宽度）改变大小</font><br>&nbsp;&nbsp;&nbsp; ELASTICY,&nbsp; <font color=#339966>//&nbsp; 控件在Y方向改（高度）改变大小</font><br>&nbsp;&nbsp;&nbsp; ELASTICXY&nbsp; <font color=#339966>//&nbsp; 控件在X方向和Y方向同时改变大小<br></font>};</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iPercent表示改变值占对话框改变值的百分比。例如，一个控件的iPercent值为100，iFlag值为MOVEX，那么当对话框的宽度改变100个单位的时候，这个控件就在X方向移动100个单位；又如，一个控件的iPercent值为100，iFlag值为ELASTICXY，那么当对话框的宽度和高度分别改变100个单位的时候，控件的高度和宽度也相应的改变100个单位。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是设置控件信息的函数：</p>
<p>BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用起来非常简单，在对话框的OnInitDialog()函数里面添加类似下面的代码就行了：</p>
<p><font color=#339966>//&nbsp; 控件信息数组<br></font>static DLGCTLINFO&nbsp; dcMenuGroup[] = <br>{<br>&nbsp;&nbsp;&nbsp; {IDOK, MOVEX, 100},<br>&nbsp;&nbsp;&nbsp; {IDCANCEL, MOVEX, 100},<br>&nbsp;&nbsp;&nbsp; {IDC_BUTTON1, MOVEX, 50},<br>&nbsp;&nbsp;&nbsp; {IDC_BUTTON1, MOVEY, 100},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT1, ELASTICX, 100},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT2, ELASTICX, 50},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT3, ELASTICX, 50},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT3, MOVEX, 50},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT4, ELASTICY, 100},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT5, ELASTICX, 100},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT5, ELASTICY, 50},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT6, ELASTICX, 100},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT6, ELASTICY, 50},<br>&nbsp;&nbsp;&nbsp; {IDC_EDIT6, MOVEY, 50},<br>};</p>
<p><font color=#339966>//&nbsp; 设置控件信息<br></font>SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGCTLINFO));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面就是使用上面这段代码的对话框改变大小前后的效果图：</p>
<p><img src="http://blog.csdn.net/images/blog_csdn_net/starlee/178527/o_lxDlg1.jpg" twffan="done">&nbsp;</p>
<p><img src="http://blog.csdn.net/images/blog_csdn_net/starlee/178527/o_lxDlg2.jpg" twffan="done">&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对两张截图的比较我们可以很容易的理解上面那段代码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我还提供了一个函数：</p>
<p>void ShowSizeIcon(BOOL bShow = TRUE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来设置是否显示对话框右下角表示可以改变大小的图标。这个图标是从系统中读取的，我上面的截图是Windows2000下的，在WindowsXP中就会自动变成XP风格的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，闲话不多说了，下面贴出该对话框类ClxDialog的源代码，里面有详细的注释：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lxDialog.h文件：</p>
<p><font color=#339966>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自动改变控件位置和大小的对话框类<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件名：lxDialog.h<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：StarLee(</font> <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#111;&#108;&#115;&#116;&#97;&#114;&#108;&#101;&#101;&#64;&#115;&#111;&#104;&#117;&#46;&#99;&#111;&#109;"><font color=#339966>coolstarlee@sohu.com</font> </a><font color=#339966>)<br>//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</font> </p>
<p>class ClxDialog : public CDialog<br>{<br>public:<br>&nbsp;&nbsp;&nbsp; ClxDialog(UINT nID, CWnd* pParent = NULL);</p>
<p>&nbsp;&nbsp;&nbsp; typedef struct _dlgControlTag <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iId;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iFlag;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iPercent;<br>&nbsp;&nbsp;&nbsp; } DLGCTLINFO, *PDLGCTLINFO;</p>
<p>&nbsp;&nbsp;&nbsp; enum<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVEX = 0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVEY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MOVEXY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELASTICX,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELASTICY,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELASTICXY<br>&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 设置控件信息<br></font>&nbsp;&nbsp;&nbsp; BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 是否在对话框右下角显示表示可改变大小的图标<br></font>&nbsp;&nbsp;&nbsp; void ShowSizeIcon(BOOL bShow = TRUE);</p>
<p>protected:<br>&nbsp;&nbsp;&nbsp; virtual BOOL OnInitDialog();<br>&nbsp;&nbsp;&nbsp; afx_msg void OnSize(UINT nType, int cx, int cy);<br>&nbsp;&nbsp;&nbsp; afx_msg void OnSizing(UINT nSide, LPRECT lpRect);<br>&nbsp;&nbsp;&nbsp; DECLARE_MESSAGE_MAP()</p>
<p>private:<br>&nbsp;&nbsp;&nbsp; int m_iClientWidth;&nbsp; <font color=#339966>//&nbsp; 对话框client区域的宽度<br></font>&nbsp;&nbsp;&nbsp; int m_iClientHeight;&nbsp; <font color=#339966>//&nbsp; 对话框client区域的高度<br></font>&nbsp;&nbsp;&nbsp; int m_iMinWidth;&nbsp; <font color=#339966>//&nbsp; 对话框的最小宽度<br></font>&nbsp;&nbsp;&nbsp; int m_iMinHeight;&nbsp; <font color=#339966>//&nbsp; 对话框的最小高度<br></font>&nbsp;&nbsp;&nbsp; PDLGCTLINFO m_pControlArray;&nbsp; <font color=#339966>//&nbsp; 控件信息数组指针<br></font>&nbsp;&nbsp;&nbsp; int m_iControlNumber;&nbsp; <font color=#339966>//&nbsp; 设置控件信息的控件个数<br></font>&nbsp;&nbsp;&nbsp; BOOL m_bShowSizeIcon;&nbsp; <font color=#339966>//&nbsp; 是否显示表示可改变大小的图标<br></font>&nbsp;&nbsp;&nbsp; CStatic m_wndSizeIcon;&nbsp;<font color=#339966> //&nbsp; 放图标的静态控件<br></font>&nbsp;&nbsp;&nbsp;<font color=#339966> //&nbsp; 保存图标的bitmap<br></font>&nbsp;&nbsp;&nbsp; CBitmap m_bmpSizeIcon; <br>&nbsp;&nbsp;&nbsp; BITMAP m_bitmap;&nbsp;<br>};</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lxDialog.cpp文件:</p>
<p><font color=#339966>///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自动改变控件位置和大小的对话框类<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件名：lxDialog.cpp<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：StarLee(</font> <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#111;&#108;&#115;&#116;&#97;&#114;&#108;&#101;&#101;&#64;&#115;&#111;&#104;&#117;&#46;&#99;&#111;&#109;"><font color=#339966>coolstarlee@sohu.com</font> </a><font color=#339966>)<br>//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////</font> </p>
<p>#include "stdafx.h"<br>#include "lxDialog.h"</p>
<p><font color=#339966>//&nbsp; 表示可改变大小的图标ID</font> <br>#ifndef OBM_SIZE<br>#define OBM_SIZE 32766<br>#endif</p>
<p>ClxDialog::ClxDialog(UINT nID, CWnd* pParent /*=NULL*/)<br>&nbsp;&nbsp;&nbsp; : CDialog(nID, pParent)<br>&nbsp;&nbsp;&nbsp; , m_iClientWidth(0)<br>&nbsp;&nbsp;&nbsp; , m_iClientHeight(0)<br>&nbsp;&nbsp;&nbsp; , m_iMinWidth(0)<br>&nbsp;&nbsp;&nbsp; , m_iMinHeight(0)<br>&nbsp;&nbsp;&nbsp; , m_pControlArray(NULL)<br>&nbsp;&nbsp;&nbsp; , m_iControlNumber(0)<br>&nbsp;&nbsp;&nbsp; , m_bShowSizeIcon(TRUE)<br>{}</p>
<p>BEGIN_MESSAGE_MAP(ClxDialog, CDialog)<br>&nbsp;&nbsp;&nbsp; ON_WM_SIZE()<br>&nbsp;&nbsp;&nbsp; ON_WM_SIZING()<br>END_MESSAGE_MAP()</p>
<p>BOOL ClxDialog::OnInitDialog()<br>{<br>&nbsp;&nbsp;&nbsp; CDialog::OnInitDialog();</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 设置对话框为可变大小的<br></font>&nbsp;&nbsp;&nbsp; ModifyStyle(0, WS_SIZEBOX);</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 以对话框的初始大小作为对话框的宽度和高度的最小值<br></font>&nbsp;&nbsp;&nbsp; CRect rectDlg;<br>&nbsp;&nbsp;&nbsp; GetWindowRect(rectDlg);<br>&nbsp;&nbsp;&nbsp; m_iMinWidth = rectDlg.Width();<br>&nbsp;&nbsp;&nbsp; m_iMinHeight = rectDlg.Height();</p>
<p>&nbsp;&nbsp;&nbsp;<font color=#339966> //&nbsp; 得到对话框client区域的大小</font><br>&nbsp;&nbsp;&nbsp; CRect rectClient;<br>&nbsp;&nbsp;&nbsp; GetClientRect(rectClient);<br>&nbsp;&nbsp;&nbsp; m_iClientWidth = rectClient.Width();<br>&nbsp;&nbsp;&nbsp; m_iClientHeight = rectClient.Height();</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; Load图标</font><br>&nbsp;&nbsp;&nbsp; m_bmpSizeIcon.LoadOEMBitmap(OBM_SIZE);<br>&nbsp;&nbsp;&nbsp; m_bmpSizeIcon.GetBitmap(&amp;m_bitmap);</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 创建显示图标的静态控件并放在对话框右下角<br></font>&nbsp;&nbsp;&nbsp; m_wndSizeIcon.Create(NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight), this, 0);<br>&nbsp;&nbsp;&nbsp; m_wndSizeIcon.SetBitmap(m_bmpSizeIcon);<br>&nbsp;&nbsp;&nbsp; m_wndSizeIcon.MoveWindow(m_iClientWidth - m_bitmap.bmWidth, m_iClientHeight - m_bitmap.bmHeight, m_bitmap.bmWidth, m_bitmap.bmHeight);</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 显示图标<br></font>&nbsp;&nbsp;&nbsp; m_wndSizeIcon.ShowWindow(m_bShowSizeIcon);</p>
<p>&nbsp;&nbsp;&nbsp; return TRUE;<br>}</p>
<p>void ClxDialog::OnSize(UINT nType, int cx, int cy) <br>{<br>&nbsp;&nbsp;&nbsp; CDialog::OnSize(nType, cx, cy);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 对话框宽度和高度的增量&nbsp;</font><br>&nbsp;&nbsp;&nbsp; int iIncrementX = cx - m_iClientWidth;<br>&nbsp;&nbsp;&nbsp; int iIncrementY = cy - m_iClientHeight;</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 最小化时增量为0<br></font>&nbsp;&nbsp;&nbsp; if (nType == SIZE_MINIMIZED)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iIncrementX = iIncrementY = 0;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; m_iControlNumber; i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CWnd *pWndCtrl = NULL;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iId = m_pControlArray[i].iId;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iFlag = m_pControlArray[i].iFlag;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iPercent = m_pControlArray[i].iPercent;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 无效值<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((iPercent &lt; 0) || (iPercent &gt; 100))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 得到控件指针<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pWndCtrl = GetDlgItem(iId);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((NULL != pWndCtrl) &amp;&amp; IsWindow(pWndCtrl-&gt;GetSafeHwnd()))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRect rectCtrl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pWndCtrl-&gt;GetWindowRect(rectCtrl);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScreenToClient(rectCtrl);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iLeft = rectCtrl.left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iTop = rectCtrl.top;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iWidth = rectCtrl.Width();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int iHeight = rectCtrl.Height();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (iFlag)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MOVEX:&nbsp; <font color=#339966>//&nbsp; X方向移动<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iLeft += (iIncrementX * iPercent / 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MOVEY:&nbsp; <font color=#339966>//&nbsp; Y方向移动<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iTop += (iIncrementY * iPercent / 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MOVEXY:&nbsp;<font color=#339966> //&nbsp; X方向和Y方向同时移动</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iLeft += (iIncrementX * iPercent / 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iTop += (iIncrementY * iPercent / 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ELASTICX:&nbsp; <font color=#339966>//&nbsp; X方向改变大小<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iWidth += (iIncrementX * iPercent / 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ELASTICY:&nbsp; <font color=#339966>//&nbsp; Y方向改变大小<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iHeight += (iIncrementY * iPercent / 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case ELASTICXY:&nbsp;<font color=#339966> //&nbsp; X方向和Y方向同时改变大小</font><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iWidth += (iIncrementX * iPercent / 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iHeight += (iIncrementY * iPercent / 100);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 把控件移动到新位置<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pWndCtrl-&gt;MoveWindow(iLeft, iTop, iWidth, iHeight);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;<font color=#339966> //&nbsp; 把图标移动到对话框右下角</font><br>&nbsp;&nbsp;&nbsp; if (IsWindow(m_wndSizeIcon.GetSafeHwnd()))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_wndSizeIcon.MoveWindow(cx - m_bitmap.bmWidth, cy - m_bitmap.bmHeight, m_bitmap.bmWidth, m_bitmap.bmHeight);</p>
<p>&nbsp;&nbsp;&nbsp; <font color=#339966>//&nbsp; 记录对话框client区域的大小<br></font>&nbsp;&nbsp;&nbsp; if (nType != SIZE_MINIMIZED)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_iClientWidth = cx;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_iClientHeight = cy;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>void ClxDialog::OnSizing(UINT nSide, LPRECT lpRect)<br>{<br>&nbsp;&nbsp;&nbsp; CDialog::OnSizing(nSide, lpRect);</p>
<p>&nbsp;&nbsp;&nbsp;<font color=#339966> //&nbsp; 对话框不能小于初始大小</font></p>
<p>&nbsp;&nbsp;&nbsp; int iWidth = lpRect-&gt;right - lpRect-&gt;left;<br>&nbsp;&nbsp;&nbsp; int iHeight = lpRect-&gt;bottom - lpRect-&gt;top;</p>
<p>&nbsp;&nbsp;&nbsp; if (iWidth &lt;= m_iMinWidth)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpRect-&gt;right = lpRect-&gt;left + m_iMinWidth;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; if(iHeight &lt;= m_iMinHeight)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpRect-&gt;bottom = lpRect-&gt;top + m_iMinHeight;<br>}</p>
<p>BOOL ClxDialog::SetControlProperty(PDLGCTLINFO lp, int nElements)<br>{<br>&nbsp;&nbsp;&nbsp;<font color=#339966> //&nbsp; 设置控件数组信息</font></p>
<p>&nbsp;&nbsp;&nbsp; if (NULL == lp)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;</p>
<p>&nbsp;&nbsp;&nbsp; if (nElements &lt;= 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;</p>
<p>&nbsp;&nbsp;&nbsp; m_pControlArray = lp;<br>&nbsp;&nbsp;&nbsp; m_iControlNumber = nElements;</p>
<p>&nbsp;&nbsp;&nbsp; return TRUE;<br>}</p>
<p>void ClxDialog::ShowSizeIcon(BOOL bShow /*=NULL*/)<br>{<br>&nbsp;&nbsp;&nbsp; m_bShowSizeIcon = bShow;<br>}</p>
</div>
<img src ="http://www.cppblog.com/ivenher/aggbug/17858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2007-01-21 14:25 <a href="http://www.cppblog.com/ivenher/archive/2007/01/21/17858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CRichEditCtrl  </title><link>http://www.cppblog.com/ivenher/archive/2007/01/13/17593.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Sat, 13 Jan 2007 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/archive/2007/01/13/17593.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/17593.html</wfw:comment><comments>http://www.cppblog.com/ivenher/archive/2007/01/13/17593.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/17593.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/17593.html</trackback:ping><description><![CDATA[<p>数CRichEditCtrl的先天不足及进化方法 <br></p>
<table style="TABLE-LAYOUT: fixed" cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
    <tbody>
        <tr>
            <td><span class=oblog_text twffan="done">
            <ol>
                <li>不能够自动初始化
                <li>不能够接受TAB键
                <li>不能够通过属性设置自动换行
                <li>不能显示图片等其他OLE对象
                <li>不能够使用Ctrl+C来实现拷贝 </li>
            </ol>
            <p><strong>不能够自动初始化</strong> </p>
            <p>当我第一次将Rich Edit控件放在资源窗体上的时候，发现程序根本就不能运行。后来才找到原因，原来Rich Edit 控件是Ole类型的控件。在加载Rich Edit 控件的时候，必须进行初始化。代码如下：<br>BOOLCTestApp::InitInstance(){</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .....<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AfxInitRichEdit();</p>
            <p>}</p>
            <p><strong>&nbsp;不能够接受TAB键</strong> </p>
            <p>将 RichEdit控件放到资源窗体上的时候，发现它的属性页中并没有设置接受TAB键的设置，导致当把焦点放到Rich Edit 控件上的时候，一按tab键，焦点就移动到下一个控件上面去了。<br>具体解决方法就是重载Rich Edit控件的OnGetDlgCode：<br>例子代码：<br>.h文件：<br>class CMyRichEdit : public CRichEditCtrl{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; afx_msg UINT OnGetDlgCode( );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........<br><br>}<br>.cpp文件：<br>BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON_WM_GETDLGCODE( )<br>END_MESSAGE_MAP()<br><br><br>UINT COleRichEditCtrl::OnGetDlgCode( ){</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return DLGC_WANTTAB;</p>
            <p><br>}<br><br></p>
            <p><strong>&nbsp;不能够通过属性设置自动换行</strong> </p>
            <p>当把Rich Edit控件放到资源窗体上的时候，发现在它的属性窗体中并没有设置Rich Edit控件自动换行的属性设置。要达到这一目的，例子代码如下：<br>BOOL CTestDlg::InitDialog(){</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .............<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //m_RichEdit为窗体类的成员变量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this-&gt;m_RichEdit.SetTargetDevice(NULL,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ............</p>
            <p>}<br></p>
            <p><strong>不能显示图片等其他OLE对象</strong> </p>
            <p>MFC提供的CRichEditCtrl没有提供直接显示图片等OLE对象的属性或方法设置，但是提供了一个接口<strong>SetOLECallback( IRichEditOleCallback* </strong><em>pCallback</em><strong> );<br></strong>要让CRichEditCtrl显示图片，就得在IRichEditOleCallback上下功夫。<br>IRichEditOleCallback是windows中的接口，它的定义如下：<br><font color=#0000ff>ContextSensitiveHelp:<br>&nbsp;&nbsp;&nbsp; <font color=#000000>通过该方</font><font color=#000000>法通知应用程序它将以上下文关联方式调度帮助。</font><br>DeleteObject:<br>&nbsp;&nbsp;&nbsp;<font color=#000000> 通过该方</font><font color=#000000>法发出通知：一个对象即将从RichEdit控件中删除<br></font>GetClipboardData:<br>&nbsp;&nbsp;&nbsp; <font color=#000000>通过该方法</font><font color=#000000>允许RichEdit的客户端（调用程序）提供自己的粘贴对象<br></font>GetContextMenu:<br>&nbsp;&nbsp;&nbsp;<font color=#000000> 通过该方法向</font><font color=#000000>应用程序提出通过鼠标右键事件来获取上下文菜单的请求<br></font>GetDragDropEffect:<br>&nbsp;&nbsp;&nbsp;<font color=#000000> 通过该方法允许RichEdit的客户端（调用程序）设置拖动操作的效果<br></font>GetInPlaceContext:<br>&nbsp;&nbsp;<font color=#000000>&nbsp; 通过该方法提供了应用程序级和文档级接口，以及必要的支持In-place激活的信息<br></font>GetNewStrorage:<br>&nbsp;&nbsp;&nbsp; <font color=#000000>通过该方</font><font color=#000000>法存储从粘贴板或超文本流(RTF)中读取的新对象<br></font>QueryAcceptData:<br>&nbsp;&nbsp;&nbsp; <font color=#000000>通过该方法决定在粘贴操作或拖放操作中引入的数据是否可以被接受。<br></font>QueryInsertObject:<br>&nbsp;&nbsp;&nbsp;<font color=#000000> 通过该方法向应用程序询问某个对象是否可以被插入<br></font>ShowContainerUI:<br>&nbsp;&nbsp;&nbsp;</font><font color=#000000> 通过该方法告知应用程序是否显示自己的操作界面<br></font><br>大致了解了IRichEditOleCallback接口后，就应该清楚，要显示图片等ole对象，至少应该实现GetNewStorage方法，因为该方法是存储ole对象的接口方法。<br><br>以下是接口声明的代码：<br>interface IExRichEditOleCallback : IRichEditOleCallback<br>{</p>
            <p>public:<br>&nbsp;&nbsp;IExRichEditOleCallback();<br>&nbsp;&nbsp;virtual ~IExRichEditOleCallback();<br>&nbsp;&nbsp;int m_iNumStorages;<br>&nbsp;&nbsp;IStorage* pStorage;<br>&nbsp;&nbsp;DWORD m_dwRef;</p>
            <p><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE GetNewStorage(LPSTORAGE* lplpstg);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void ** ppvObject);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> ULONG STDMETHODCALLTYPE AddRef();<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> ULONG STDMETHODCALLTYPE Release();<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE GetInPlaceContext(LPOLEINPLACEFRAME FAR *lplpFrame,<br>&nbsp;&nbsp;&nbsp;LPOLEINPLACEUIWINDOW FAR *lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE ShowContainerUI(BOOL fShow);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE QueryInsertObject(LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE DeleteObject(LPOLEOBJECT lpoleobj);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE QueryAcceptData(LPDATAOBJECT lpdataobj, CLIPFORMAT FAR *lpcfFormat,&nbsp;&nbsp;&nbsp;DWORD reco, BOOL fReally, HGLOBAL hMetaPict);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE GetClipboardData(CHARRANGE FAR *lpchrg, DWORD reco, LPDATAOBJECT FAR *lplpdataobj);<br>&nbsp;<font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE GetDragDropEffect(BOOL fDrag, DWORD grfKeyState, LPDWORD pdwEffect);<br><font color=#0000ff>&nbsp;&nbsp;virtual</font> HRESULT STDMETHODCALLTYPE GetContextMenu(WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE FAR *lpchrg,&nbsp;&nbsp;&nbsp;HMENU FAR *lphmenu);</p>
            <p>}<br>关于接口的实现，将被附在最后的附录中。</p>
            <p><br><strong>不能够使用Ctrl+C来实现拷贝</strong> </p>
            <p>实际上，CRichEditCtrl本身是支持Ctrl+C实现拷贝功能的，但是当我在CRichiEditCtrl的继承类中使用了IRichiEditCallback接口后，它就不在支持Ctrl+C实现拷贝功能了。我想问题就出在IRichEditCallback接口上。<br>仔细看了一遍它的帮助文档，我发现问题就出在GetClipboardData上，我没有在它的实现方法中写代码，只是返回了S_OK，如果要处理Ctrl+C，就必须返回E_NOTIMPL。<br><br>以上是我近几天的开发经历，与大家分享，还希望路过的高手多多指教。<br>在以下关于RichEdit的代码例子中，我参考了<a href="http://www.codeproject.com/script/profile/whos_who.asp?vt=arts&amp;id=208786">Mike O'Neill</a> 的代码，再次谢谢他的贡献。<br></p>
            <p><strong>附录</strong> <br>.h文件</p>
            <p>&#160;</p>
            <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">#if</span> <span style="COLOR: #000000">&nbsp;!defined(AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_)</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span> <span style="COLOR: #000000">&nbsp;AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_</span> <span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">#if</span> <span style="COLOR: #000000">&nbsp;_MSC_VER&nbsp;&gt;&nbsp;1000</span> <span style="COLOR: #000000"><br>#pragma&nbsp;once<br></span><span style="COLOR: #0000ff">#endif</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;_MSC_VER&nbsp;&gt;&nbsp;1000</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;OleRichEditCtrl.h&nbsp;:&nbsp;header&nbsp;file<br></span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000"><br><br>＃i&nbsp;nclude&nbsp;</span> <span style="COLOR: #000000">&lt;</span> <span style="COLOR: #000000">richole.h</span> <span style="COLOR: #000000">&gt;</span> <span style="COLOR: #000000"><br><br><br></span><span style="COLOR: #808080">///////////////////////////////////////////////////////////////////////////</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #808080"><br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;COleRichEditCtrl&nbsp;window</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">class</span> <span style="COLOR: #000000">&nbsp;COleRichEditCtrl&nbsp;:&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;CRichEditCtrl<br>{<br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;Construction</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br>&nbsp;COleRichEditCtrl();<br>&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">~</span> <span style="COLOR: #000000">COleRichEditCtrl();<br><br>&nbsp;</span> <span style="COLOR: #0000ff">long</span> <span style="COLOR: #000000">&nbsp;StreamInFromResource(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;iRes,&nbsp;LPCTSTR&nbsp;sType);<br><br><br><br></span><span style="COLOR: #0000ff">protected</span> <span style="COLOR: #000000">:<br>&nbsp;<br>&nbsp;</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;DWORD&nbsp;CALLBACK&nbsp;readFunction(DWORD&nbsp;dwCookie,<br>&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;lpBuf,&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;the&nbsp;buffer&nbsp;to&nbsp;fill</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;LONG&nbsp;nCount,&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;number&nbsp;of&nbsp;bytes&nbsp;to&nbsp;read</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;LONG</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">&nbsp;nRead);&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;number&nbsp;of&nbsp;bytes&nbsp;actually&nbsp;read</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;</span> <span style="COLOR: #0000ff">interface</span> <span style="COLOR: #000000">&nbsp;IExRichEditOleCallback;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;forward&nbsp;declaration&nbsp;(see&nbsp;below&nbsp;in&nbsp;this&nbsp;header&nbsp;file)</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;IExRichEditOleCallback</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">&nbsp;m_pIRichEditOleCallback;<br>&nbsp;BOOL&nbsp;m_bCallbackSet;<br>&nbsp;<br>&nbsp;<br>&nbsp;</span> <span style="COLOR: #0000ff">interface</span> <span style="COLOR: #000000">&nbsp;IExRichEditOleCallback&nbsp;:&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">&nbsp;IRichEditOleCallback<br>&nbsp;{<br>&nbsp;</span> <span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br>&nbsp;&nbsp;IExRichEditOleCallback();<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">~</span> <span style="COLOR: #000000">IExRichEditOleCallback();<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;m_iNumStorages;<br>&nbsp;&nbsp;IStorage</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">&nbsp;pStorage;<br>&nbsp;&nbsp;DWORD&nbsp;m_dwRef;<br><br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;GetNewStorage(LPSTORAGE</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">&nbsp;lplpstg);<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;QueryInterface(REFIID&nbsp;iid,&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">**</span> <span style="COLOR: #000000">&nbsp;ppvObject);<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;ULONG&nbsp;STDMETHODCALLTYPE&nbsp;AddRef();<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;ULONG&nbsp;STDMETHODCALLTYPE&nbsp;Release();<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;GetInPlaceContext(LPOLEINPLACEFRAME&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lplpFrame,<br>&nbsp;&nbsp;&nbsp;LPOLEINPLACEUIWINDOW&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lplpDoc,&nbsp;LPOLEINPLACEFRAMEINFO&nbsp;lpFrameInfo);<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;ShowContainerUI(BOOL&nbsp;fShow);<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;QueryInsertObject(LPCLSID&nbsp;lpclsid,&nbsp;LPSTORAGE&nbsp;lpstg,&nbsp;LONG&nbsp;cp);<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;DeleteObject(LPOLEOBJECT&nbsp;lpoleobj);<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;QueryAcceptData(LPDATAOBJECT&nbsp;lpdataobj,&nbsp;CLIPFORMAT&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lpcfFormat,<br>&nbsp;&nbsp;&nbsp;DWORD&nbsp;reco,&nbsp;BOOL&nbsp;fReally,&nbsp;HGLOBAL&nbsp;hMetaPict);<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;ContextSensitiveHelp(BOOL&nbsp;fEnterMode);<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;GetClipboardData(CHARRANGE&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lpchrg,&nbsp;DWORD&nbsp;reco,&nbsp;LPDATAOBJECT&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lplpdataobj);<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;GetDragDropEffect(BOOL&nbsp;fDrag,&nbsp;DWORD&nbsp;grfKeyState,&nbsp;LPDWORD&nbsp;pdwEffect);<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;GetContextMenu(WORD&nbsp;seltyp,&nbsp;LPOLEOBJECT&nbsp;lpoleobj,&nbsp;CHARRANGE&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lpchrg,<br>&nbsp;&nbsp;&nbsp;HMENU&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lphmenu);<br>&nbsp;};<br>&nbsp;<br><br></span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br><br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;Overrides<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;ClassWizard&nbsp;generated&nbsp;virtual&nbsp;function&nbsp;overrides<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">{{AFX_VIRTUAL(COleRichEditCtrl)</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">protected</span> <span style="COLOR: #000000">:<br>&nbsp;</span> <span style="COLOR: #0000ff">virtual</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;PreSubclassWindow();<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">}}AFX_VIRTUAL<br><br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;Implementation</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">:<br><br><br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;Generated&nbsp;message&nbsp;map&nbsp;functions</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">protected</span> <span style="COLOR: #000000">:<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">{{AFX_MSG(COleRichEditCtrl)</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;afx_msg&nbsp;</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;OnCreate(LPCREATESTRUCT&nbsp;lpCreateStruct);<br>&nbsp;<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">}}AFX_MSG</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;afx_msg&nbsp;UINT&nbsp;OnGetDlgCode(&nbsp;);<br>&nbsp;DECLARE_MESSAGE_MAP()<br>};<br><br></span><span style="COLOR: #808080">///////////////////////////////////////////////////////////////////////////</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #808080"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">{{AFX_INSERT_LOCATION}}<br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;Microsoft&nbsp;Visual&nbsp;C++&nbsp;will&nbsp;insert&nbsp;additional&nbsp;declarations&nbsp;immediately&nbsp;before&nbsp;the&nbsp;previous&nbsp;line.</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#endif</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;!defined(AFX_OLERICHEDITCTRL_H__3DFF15EE_7336_4297_9620_7F00B611DAA1__INCLUDED_)</span> <span style="COLOR: #000000"><br><br><br><br><br></span></div>
            <p><br><br>.cpp文件</p>
            <p>&#160;</p>
            <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;OleRichEditCtrl.cpp&nbsp;:&nbsp;implementation&nbsp;file<br></span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000"><br>＃i&nbsp;nclude&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">stdafx.h</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"><br>＃i&nbsp;nclude&nbsp;</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">OleRichEditCtrl.h</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000"><br><br>#ifdef&nbsp;_DEBUG<br></span><span style="COLOR: #0000ff">#define</span> <span style="COLOR: #000000">&nbsp;new&nbsp;DEBUG_NEW</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#undef</span> <span style="COLOR: #000000">&nbsp;THIS_FILE</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">static</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">char</span> <span style="COLOR: #000000">&nbsp;THIS_FILE[]&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;__FILE__;<br></span><span style="COLOR: #0000ff">#endif</span> <span style="COLOR: #000000"><br><br></span><span style="COLOR: #808080">///////////////////////////////////////////////////////////////////////////</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #808080"><br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;COleRichEditCtrl</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>COleRichEditCtrl::COleRichEditCtrl()<br>{<br>&nbsp;m_bCallbackSet&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;FALSE;<br>}<br><br>COleRichEditCtrl::</span> <span style="COLOR: #000000">~</span> <span style="COLOR: #000000">COleRichEditCtrl()<br>{<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;IExRichEditOleCallback&nbsp;class&nbsp;is&nbsp;a&nbsp;reference-counted&nbsp;class&nbsp;&nbsp;<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;which&nbsp;deletes&nbsp;itself&nbsp;and&nbsp;for&nbsp;which&nbsp;delete&nbsp;should&nbsp;not&nbsp;be&nbsp;called<br><br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;delete&nbsp;m_pIRichEditOleCallback;</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">}<br><br><br>BEGIN_MESSAGE_MAP(COleRichEditCtrl,&nbsp;CRichEditCtrl)<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">{{AFX_MSG_MAP(COleRichEditCtrl)</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;ON_WM_CREATE()<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">}}AFX_MSG_MAP</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;ON_WM_GETDLGCODE(&nbsp;)<br>END_MESSAGE_MAP()<br></span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;COleRichEditCtrl::OnCreate(LPCREATESTRUCT&nbsp;lpCreateStruct)&nbsp;<br>{<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(CRichEditCtrl::OnCreate(lpCreateStruct)&nbsp;</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">-</span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">;<br>&nbsp;&nbsp;<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;m_pIRichEditOleCallback&nbsp;should&nbsp;have&nbsp;been&nbsp;created&nbsp;in&nbsp;PreSubclassWindow</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;ASSERT(&nbsp;m_pIRichEditOleCallback&nbsp;</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #000000">&nbsp;NULL&nbsp;);&nbsp;<br><br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;set&nbsp;the&nbsp;IExRichEditOleCallback&nbsp;pointer&nbsp;if&nbsp;it&nbsp;wasn't&nbsp;set&nbsp;<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;successfully&nbsp;in&nbsp;PreSubclassWindow</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(&nbsp;</span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">m_bCallbackSet&nbsp;)<br>&nbsp;{<br>&nbsp;&nbsp;SetOLECallback(&nbsp;m_pIRichEditOleCallback&nbsp;);<br>&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;COleRichEditCtrl::PreSubclassWindow()&nbsp;<br>{<br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;base&nbsp;class&nbsp;first</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;CRichEditCtrl::PreSubclassWindow();&nbsp;<br><br>&nbsp;m_pIRichEditOleCallback&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;m_pIRichEditOleCallback&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">new</span> <span style="COLOR: #000000">&nbsp;IExRichEditOleCallback;<br>&nbsp;ASSERT(&nbsp;m_pIRichEditOleCallback&nbsp;</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #000000">&nbsp;NULL&nbsp;);<br><br>&nbsp;m_bCallbackSet&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;SetOLECallback(&nbsp;m_pIRichEditOleCallback&nbsp;);<br>}<br><br><br></span><span style="COLOR: #0000ff">long</span> <span style="COLOR: #000000">&nbsp;COleRichEditCtrl::StreamInFromResource(</span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000">&nbsp;iRes,&nbsp;LPCTSTR&nbsp;sType)<br>{<br>&nbsp;HINSTANCE&nbsp;hInst&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;AfxGetInstanceHandle();<br>&nbsp;HRSRC&nbsp;hRsrc&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;::FindResource(hInst,<br>&nbsp;&nbsp;MAKEINTRESOURCE(iRes),&nbsp;sType);<br>&nbsp;<br>&nbsp;DWORD&nbsp;len&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;SizeofResource(hInst,&nbsp;hRsrc);&nbsp;<br>&nbsp;BYTE</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">&nbsp;lpRsrc&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;(BYTE</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)LoadResource(hInst,&nbsp;hRsrc);&nbsp;<br>&nbsp;ASSERT(lpRsrc);&nbsp;<br>&nbsp;<br>&nbsp;CMemFile&nbsp;mfile;<br>&nbsp;mfile.Attach(lpRsrc,&nbsp;len);&nbsp;<br><br>&nbsp;EDITSTREAM&nbsp;es;<br>&nbsp;es.pfnCallback&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;readFunction;<br>&nbsp;es.dwError&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br>&nbsp;es.dwCookie&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;(DWORD)&nbsp;</span> <span style="COLOR: #000000">&amp;</span> <span style="COLOR: #000000">mfile;<br><br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;StreamIn(&nbsp;SF_RTF,&nbsp;es&nbsp;);<br>}<br><br></span></div>
            <p><br>&nbsp;</p>
            <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">/*</span> <span style="COLOR: #008000">&nbsp;static&nbsp;</span> <span style="COLOR: #008000">*/</span> <span style="COLOR: #000000"><br>DWORD&nbsp;CALLBACK&nbsp;COleRichEditCtrl::readFunction(DWORD&nbsp;dwCookie,<br>&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;lpBuf,&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;the&nbsp;buffer&nbsp;to&nbsp;fill</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;LONG&nbsp;nCount,&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;number&nbsp;of&nbsp;bytes&nbsp;to&nbsp;read</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;LONG</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">&nbsp;nRead)&nbsp;&nbsp;&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;number&nbsp;of&nbsp;bytes&nbsp;actually&nbsp;read</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">{<br>&nbsp;CFile</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">&nbsp;fp&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;(CFile&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)dwCookie;<br>&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">nRead&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;fp</span> <span style="COLOR: #000000">-&gt;</span> <span style="COLOR: #000000">Read(lpBuf,nCount);<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #808080">///////////////////////////////////////////////////////////////////////////</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #808080"><br></span><span style="COLOR: #000000"><br></span></div>
            <p><br>&nbsp;</p>
            <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">COleRichEditCtrl::IExRichEditOleCallback::IExRichEditOleCallback()<br>{<br>&nbsp;pStorage&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;m_iNumStorages&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br>&nbsp;m_dwRef&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br><br>&nbsp;</span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;set&nbsp;up&nbsp;OLE&nbsp;storage</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;HRESULT&nbsp;hResult&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;::StgCreateDocfile(NULL,<br>&nbsp;&nbsp;STGM_TRANSACTED&nbsp;</span> <span style="COLOR: #000000">|</span> <span style="COLOR: #000000">&nbsp;STGM_READWRITE&nbsp;</span> <span style="COLOR: #000000">|</span> <span style="COLOR: #000000">&nbsp;STGM_SHARE_EXCLUSIVE&nbsp;</span> <span style="COLOR: #008000">/*</span> <span style="COLOR: #008000">|&nbsp;STGM_DELETEONRELEASE&nbsp;</span> <span style="COLOR: #008000">*/</span> <span style="COLOR: #000000">|</span> <span style="COLOR: #000000">STGM_CREATE&nbsp;,<br>&nbsp;&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">,&nbsp;</span> <span style="COLOR: #000000">&amp;</span> <span style="COLOR: #000000">pStorage&nbsp;);<br><br>&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(&nbsp;pStorage&nbsp;</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">&nbsp;NULL&nbsp;</span> <span style="COLOR: #000000">||</span> <span style="COLOR: #000000"><br>&nbsp;&nbsp;hResult&nbsp;</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #000000">&nbsp;S_OK&nbsp;)<br>&nbsp;{<br>&nbsp;&nbsp;AfxThrowOleException(&nbsp;hResult&nbsp;);<br>&nbsp;}<br>}<br><br>COleRichEditCtrl::IExRichEditOleCallback::</span> <span style="COLOR: #000000">~</span> <span style="COLOR: #000000">IExRichEditOleCallback()<br>{<br>}<br><br></span></div>
            <p><br>&nbsp;</p>
            <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::GetNewStorage(LPSTORAGE</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">&nbsp;lplpstg)<br>{<br>&nbsp;m_iNumStorages</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">;<br>&nbsp;WCHAR&nbsp;tName[</span> <span style="COLOR: #000000">50</span> <span style="COLOR: #000000">];<br>&nbsp;swprintf(tName,&nbsp;L</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">REOLEStorage%d</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,&nbsp;m_iNumStorages);<br><br>&nbsp;HRESULT&nbsp;hResult&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;pStorage</span> <span style="COLOR: #000000">-&gt;</span> <span style="COLOR: #000000">CreateStorage(tName,&nbsp;<br>&nbsp;&nbsp;STGM_TRANSACTED&nbsp;</span> <span style="COLOR: #000000">|</span> <span style="COLOR: #000000">&nbsp;STGM_READWRITE&nbsp;</span> <span style="COLOR: #000000">|</span> <span style="COLOR: #000000">&nbsp;STGM_SHARE_EXCLUSIVE&nbsp;</span> <span style="COLOR: #000000">|</span> <span style="COLOR: #000000">&nbsp;STGM_CREATE&nbsp;,<br>&nbsp;&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">,&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">,&nbsp;lplpstg&nbsp;);<br><br>&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(hResult&nbsp;</span> <span style="COLOR: #000000">!=</span> <span style="COLOR: #000000">&nbsp;S_OK&nbsp;)<br>&nbsp;{<br>&nbsp;&nbsp;::AfxThrowOleException(&nbsp;hResult&nbsp;);<br>&nbsp;}<br><br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;hResult;<br>}<br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::QueryInterface(REFIID&nbsp;iid,&nbsp;</span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">**</span> <span style="COLOR: #000000">&nbsp;ppvObject)<br>{<br><br>&nbsp;HRESULT&nbsp;hr&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">ppvObject&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;NULL;<br>&nbsp;<br>&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(&nbsp;iid&nbsp;</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">&nbsp;IID_IUnknown&nbsp;</span> <span style="COLOR: #000000">||</span> <span style="COLOR: #000000"><br>&nbsp;&nbsp;iid&nbsp;</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">&nbsp;IID_IRichEditOleCallback&nbsp;)<br>&nbsp;{<br>&nbsp;&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">ppvObject&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">;<br>&nbsp;&nbsp;AddRef();<br>&nbsp;&nbsp;hr&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;NOERROR;<br>&nbsp;}<br>&nbsp;</span> <span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000"><br>&nbsp;{<br>&nbsp;&nbsp;hr&nbsp;</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">&nbsp;E_NOINTERFACE;<br>&nbsp;}<br><br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;hr;<br>}<br><br><br><br>ULONG&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::AddRef()<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">m_dwRef;<br>}<br><br></span></div>
            <p>&nbsp;</p>
            <p>&nbsp;</p>
            <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">ULONG&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::Release()<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">&nbsp;(&nbsp;</span> <span style="COLOR: #000000">--</span> <span style="COLOR: #000000">m_dwRef&nbsp;</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">&nbsp;)<br>&nbsp;{<br>&nbsp;&nbsp;delete&nbsp;</span> <span style="COLOR: #0000ff">this</span> <span style="COLOR: #000000">;<br>&nbsp;&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br>&nbsp;}<br><br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;m_dwRef;<br>}<br><br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lplpFrame,<br>&nbsp;LPOLEINPLACEUIWINDOW&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lplpDoc,&nbsp;LPOLEINPLACEFRAMEINFO&nbsp;lpFrameInfo)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>}<br><br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::ShowContainerUI(BOOL&nbsp;fShow)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>}<br><br><br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::QueryInsertObject(LPCLSID&nbsp;lpclsid,&nbsp;LPSTORAGE&nbsp;lpstg,&nbsp;LONG&nbsp;cp)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>}<br><br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::DeleteObject(LPOLEOBJECT&nbsp;lpoleobj)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>}<br><br><br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::QueryAcceptData(LPDATAOBJECT&nbsp;lpdataobj,&nbsp;CLIPFORMAT&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lpcfFormat,<br>&nbsp;DWORD&nbsp;reco,&nbsp;BOOL&nbsp;fReally,&nbsp;HGLOBAL&nbsp;hMetaPict)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>}<br><br><br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::ContextSensitiveHelp(BOOL&nbsp;fEnterMode)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>}<br><br><br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::GetClipboardData(CHARRANGE&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lpchrg,&nbsp;DWORD&nbsp;reco,&nbsp;LPDATAOBJECT&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lplpdataobj)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;E_NOTIMPL;<br>}<br><br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::GetDragDropEffect(BOOL&nbsp;fDrag,&nbsp;DWORD&nbsp;grfKeyState,&nbsp;LPDWORD&nbsp;pdwEffect)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>}<br><br>HRESULT&nbsp;STDMETHODCALLTYPE&nbsp;<br>COleRichEditCtrl::IExRichEditOleCallback::GetContextMenu(WORD&nbsp;seltyp,&nbsp;LPOLEOBJECT&nbsp;lpoleobj,&nbsp;CHARRANGE&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lpchrg,<br>&nbsp;HMENU&nbsp;FAR&nbsp;</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lphmenu)<br>{<br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;S_OK;<br>}<br><br></span><span style="COLOR: #008000">//</span> <span style="COLOR: #008000">&nbsp;TabRichEditCtrl&nbsp;消息处理程序</span> <span style="COLOR: #008000"><br></span><span style="COLOR: #000000">UINT&nbsp;COleRichEditCtrl::OnGetDlgCode(&nbsp;){<br><br>&nbsp;</span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000">&nbsp;DLGC_WANTTAB;<br>}<br><br></span></div>
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/ivenher/aggbug/17593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2007-01-13 17:15 <a href="http://www.cppblog.com/ivenher/archive/2007/01/13/17593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 在VC中调用WORD（显示，修改，存盘，运行宏)（转）</title><link>http://www.cppblog.com/ivenher/archive/2007/01/13/17592.html</link><dc:creator>爱饭盒</dc:creator><author>爱饭盒</author><pubDate>Sat, 13 Jan 2007 08:52:00 GMT</pubDate><guid>http://www.cppblog.com/ivenher/archive/2007/01/13/17592.html</guid><wfw:comment>http://www.cppblog.com/ivenher/comments/17592.html</wfw:comment><comments>http://www.cppblog.com/ivenher/archive/2007/01/13/17592.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ivenher/comments/commentRss/17592.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ivenher/services/trackbacks/17592.html</trackback:ping><description><![CDATA[<span id=ArticleContent1_ArticleContent1_lblContent twffan="done">&nbsp;
<p>（1）使用AppWizard创建一个新的MFC AppWizard(EXE)工程，命名为"office"&nbsp; <br>（2）选择单文档视图(SDI)结构，在第3步中需要选中Container,以提供容器支持,并且选中active document container 其它都为默认</p>
<p>（3）在View菜单中，选ClassWizard,选Automation选项卡,选Add Class,选择From a TypeLibrary, 在Office目录中选中Microsoft Word 97/2000 类型库Word8.olb或Word9.olb，选中application,document,_document。单击ok</p>
<p>(4)给COfficeCntrItem添加一方法。GetIDispatch()</p>
<p>其源码如下：</p>
<p>&nbsp;&nbsp;ASSERT_VALID(this); &nbsp;<br>&nbsp;ASSERT(m_lpObject != NULL); &nbsp;&nbsp;<br>&nbsp;LPUNKNOWN lpUnk = m_lpObject;&nbsp;&nbsp;&nbsp;<br>&nbsp;Run(); &nbsp;&nbsp;<br>&nbsp;LPOLELINK lpOleLink = NULL; &nbsp;<br>&nbsp;if (m_lpObject-&gt;QueryInterface(IID_IOleLink, (LPVOID FAR*)&amp;lpOleLink) == NOERROR) &nbsp;&nbsp;<br>&nbsp;{ &nbsp;&nbsp;<br>&nbsp;&nbsp;ASSERT(lpOleLink != NULL); &nbsp;&nbsp;<br>&nbsp;&nbsp;lpUnk = NULL; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;if (lpOleLink-&gt;GetBoundSource(&amp;lpUnk) != NOERROR) &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;TRACE0("Warning: Link is not connected!\n"); &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;lpOleLink-&gt;Release(); &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;return NULL; &nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;} &nbsp;&nbsp;<br>&nbsp;&nbsp;ASSERT(lpUnk != NULL); &nbsp;&nbsp;<br>&nbsp;} &nbsp;&nbsp;&nbsp;<br>&nbsp;LPDISPATCH lpDispatch = NULL; &nbsp;<br>&nbsp;if (lpUnk-&gt;QueryInterface(IID_IDispatch, (LPVOID FAR*)&amp;lpDispatch)!=NOERROR) &nbsp;&nbsp;<br>&nbsp;{ <br>&nbsp;&nbsp;&nbsp;&nbsp;TRACE0("Warning: does not support IDispatch!\n"); &nbsp;&nbsp;<br>&nbsp;&nbsp;return NULL; <br>&nbsp;&nbsp;<br>&nbsp;} <br>&nbsp;ASSERT(lpDispatch != NULL); &nbsp;<br>&nbsp;return lpDispatch; <br>（5）。在officeView.h添加#include "msword8.h"</p>
<p>（6）。修改void COfficeView::OnInsertObject()，源码如下：</p>
<p>&nbsp;BeginWaitCursor();</p>
<p>&nbsp;COfficeCntrItem* pItem = NULL;<br>&nbsp;TRY<br>&nbsp;{<br>&nbsp;&nbsp;// Create new item connected to this document.<br>&nbsp;&nbsp;COfficeDoc* pDoc = GetDocument();<br>&nbsp;&nbsp;ASSERT_VALID(pDoc);<br>&nbsp;&nbsp;pItem = new COfficeCntrItem(pDoc);<br>&nbsp;&nbsp;ASSERT_VALID(pItem);</p>
<p>&nbsp;&nbsp;// Initialize the item from the dialog data.<br>&nbsp;/*&nbsp;if (!dlg.CreateItem(pItem))<br>&nbsp;&nbsp;&nbsp;AfxThrowMemoryException();&nbsp; // any exception will do<br>&nbsp;&nbsp;ASSERT_VALID(pItem);*/<br>&nbsp;&nbsp;&nbsp;CLSID clsid; //<br>&nbsp;&nbsp;if(FAILED(::CLSIDFromProgID(L"Word.document",&amp;clsid))) <br>&nbsp;&nbsp;&nbsp;AfxThrowMemoryException(); <br>&nbsp;&nbsp;<br>&nbsp;&nbsp;if(!pItem-&gt;CreateNewItem(clsid))&nbsp;<br>&nbsp;&nbsp;/*<a href="file://if/">if</a>(!pItem-&gt;CreateFromFile (filename,clsid)) */<br>&nbsp;&nbsp;&nbsp;AfxThrowMemoryException(); <br>&nbsp;&nbsp;ASSERT_VALID(pItem); <br>&nbsp;&nbsp;<br>&nbsp;&nbsp;pItem-&gt;Activate (OLEIVERB_SHOW,this);<br>&nbsp;&nbsp;<br>&nbsp;</p>
<p>&nbsp;&nbsp;ASSERT_VALID(pItem);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;m_pSelection = pItem;&nbsp;&nbsp; // set selection to last inserted item<br>&nbsp;&nbsp;pDoc-&gt;UpdateAllViews(NULL);<br>&nbsp;&nbsp;// As an arbitrary user interface design, this sets the selection<br>&nbsp;&nbsp;//&nbsp; to the last item inserted.</p>
<p>&nbsp;&nbsp;// TODO: reimplement selection as appropriate for your application</p>
<p>&nbsp;&nbsp;m_pSelection = pItem;&nbsp;&nbsp; // set selection to last inserted item<br>&nbsp;&nbsp;pDoc-&gt;UpdateAllViews(NULL);<br>&nbsp;}<br>&nbsp;CATCH(CException, e)<br>&nbsp;{<br>&nbsp;&nbsp;if (pItem != NULL)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;ASSERT_VALID(pItem);<br>&nbsp;&nbsp;&nbsp;pItem-&gt;Delete();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;AfxMessageBox(IDP_FAILED_TO_CREATE);<br>&nbsp;}<br>&nbsp;END_CATCH</p>
<p>&nbsp;EndWaitCursor();</p>
<p>（7）重载ID—FILE—SAVE，</p>
<p>void COfficeView::OnFileSave() <br>{<br>&nbsp;// TODO: Add your command handler code here<br>&nbsp;&nbsp;TRY{<br>&nbsp;&nbsp; &nbsp;&nbsp;LPDISPATCH lpDisp; <br>&nbsp;&nbsp;<br>&nbsp;&nbsp;lpDisp = m_pSelection-&gt;GetIDispatch(); </p>
<p>&nbsp;&nbsp;&nbsp; Documents docs;<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;_Application app; <br>&nbsp;&nbsp;<br>&nbsp;&nbsp;_Document mydoc;<br>&nbsp;&nbsp;Documents my;</p>
<p>&nbsp;&nbsp;mydoc.AttachDispatch (lpDisp,TRUE);<br>&nbsp;&nbsp;app=mydoc.GetApplication ();<br>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;&nbsp;&nbsp;<a href="file://app.run/">app.Run</a> ("Macro3");*/<br>&nbsp;&nbsp;&nbsp;&nbsp; mydoc.Activate ();<br>&nbsp;&nbsp;BOOL password=mydoc.GetHasPassword ();<br>&nbsp;&nbsp;mydoc.SetPassword ("love");<br>&nbsp;&nbsp;password=mydoc.GetHasPassword ();&nbsp;&nbsp;<br>&nbsp;&nbsp;COleVariant vFalse((short)FALSE);<br>&nbsp;&nbsp;mydoc.SaveAs (COleVariant("c:\\love.doc"),vFalse,vFalse, COleVariant(""),vFalse,<br>&nbsp;&nbsp;&nbsp;COleVariant(""),vFalse,vFalse,vFalse,vFalse,vFalse);<br>&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;CATCH(CException, e)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;END_CATCH<br>}<br><br>bulid,click insert object,and edit ,and save.maybe run macro.</p>
</span>
<img src ="http://www.cppblog.com/ivenher/aggbug/17592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ivenher/" target="_blank">爱饭盒</a> 2007-01-13 16:52 <a href="http://www.cppblog.com/ivenher/archive/2007/01/13/17592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>