为什么我的RichEdit用了SetOLECallback就响应不了OnDropFiles了? 拖拽实现了,但显示出来的文件图标跟原来的不同,没有把文件名标出,在哪里重写这部分啊? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.codeproject.com/richedit/COleRichEditCtrl.asp //impelement a IRichEditOleCallback interface and register it withtheCRichEditCtrl using SetOLECallback() function. The code for a minimalimplementation of IRichEditOleCallback is below:from the dialogs Header file:class CRichEditOleCallback : public IRichEditOleCallback{public: STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * lplpObj); STDMETHOD_(ULONG, AddRef) (); STDMETHOD_(ULONG, Release) (); STDMETHOD (GetNewStorage) (LPSTORAGE FAR * lplpstg); STDMETHOD (GetInPlaceContext) (LPOLEINPLACEFRAME FAR * lplpFrame,LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo); STDMETHOD (ShowContainerUI) (BOOL fShow); STDMETHOD (QueryInsertObject) (LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp); STDMETHOD (DeleteObject) (LPOLEOBJECT lpoleobj); STDMETHOD (QueryAcceptData) (LPDATAOBJECT lpdataobj, CLIPFORMAT FAR *lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict); STDMETHOD (ContextSensitiveHelp) (BOOL fEnterMode); STDMETHOD (GetClipboardData) (CHARRANGE FAR * lpchrg, DWORD reco,LPDATAOBJECTFAR * lplpdataobj); STDMETHOD (GetDragDropEffect) (BOOL fDrag, DWORD grfKeyState, LPDWORDpdwEffect); STDMETHOD (GetContextMenu) (WORD seltype, LPOLEOBJECT lpoleobj,CHARRANGEFAR *lpchrg, HMENU FAR * lphmenu);};/////////////////////////////////////////////////////////////////////////////// CPasteBitmapToRichEditDlg dialogclass CPasteBitmapToRichEditDlg : public CDialog{// Constructionpublic: CPasteBitmapToRichEditDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data//{{AFX_DATA(CPasteBitmapToRichEditDlg) enum { IDD = IDD_PASTEBITMAPTORICHEDIT_DIALOG }; CRichEditCtrl m_RichEditCtrl;//}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CPasteBitmapToRichEditDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUALprotected: HICON m_hIcon; CRichEditOleCallback m_RichEditOleCallback; // Generated message map functions //{{AFX_MSG(CPasteBitmapToRichEditDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); //}}AFX_MSG DECLARE_MESSAGE_MAP()};Dialogs implementation file:STDMETHODIMP CRichEditOleCallback::QueryInterface(REFIID riid, LPVOID FAR *lplpObj){ if (riid == IID_IUnknown || riid == IID_IRichEditOleCallback) { *lplpObj = (void*)this; return S_OK; } else { *lplpObj = NULL; return E_NOINTERFACE; } }STDMETHODIMP_(ULONG) CRichEditOleCallback::AddRef(){ return 1;}STDMETHODIMP_(ULONG) CRichEditOleCallback::Release(){ return 1;}STDMETHODIMP CRichEditOleCallback::GetNewStorage(LPSTORAGE FAR * lplpstg){ // Create a flat storage and steal it from the client item // the client item is only used for creating the storage COleClientItem item; item.GetItemStorageFlat(); *lplpstg = item.m_lpStorage; HRESULT hRes = E_OUTOFMEMORY; if (item.m_lpStorage != NULL) { item.m_lpStorage = NULL; hRes = S_OK; } return hRes;}STDMETHODIMP CRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR *lplpFrame, LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFOlpFrameInfo){ return E_NOTIMPL;}STDMETHODIMP CRichEditOleCallback::ShowContainerUI(BOOL fShow){ return E_NOTIMPL;}STDMETHODIMP CRichEditOleCallback::QueryInsertObject(LPCLSID lpclsid,LPSTORAGElpstg, LONG cp){ return S_OK;}STDMETHODIMP CRichEditOleCallback::DeleteObject(LPOLEOBJECT lpoleobj){ return E_NOTIMPL;}STDMETHODIMP CRichEditOleCallback::QueryAcceptData(LPDATAOBJECT lpdataobj,CLIPFORMAT FAR * lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict){// implement checks in code here, for example is the format acceptable // user back pointer to CRichEditCtrl (above) to execute certain routines // return S_OK if everthing is OK else return E_FAIL return E_NOTIMPL;}STDMETHODIMP CRichEditOleCallback::ContextSensitiveHelp(BOOL fEnterMode){ return E_NOTIMPL;}STDMETHODIMP CRichEditOleCallback::GetClipboardData(CHARRANGE FAR * lpchrg,DWORD reco, LPDATAOBJECT FAR * lplpdataobj){ return E_NOTIMPL;}STDMETHODIMP CRichEditOleCallback::GetDragDropEffect(BOOL fDrag, DWORDgrfKeyState, LPDWORD pdwEffect){ return E_NOTIMPL;}STDMETHODIMP CRichEditOleCallback::GetContextMenu(WORD seltype, LPOLEOBJECTlpoleobj,CHARRANGE FAR * lpchrg, HMENU FAR * lphmenu){ return E_NOTIMPL;}/////////////////////////////////////////////////BOOL CPasteBitmapToRichEditDlg::OnInitDialog(){ CDialog::OnInitDialog(); . . . BOOL bSuccess = m_RichEditCtrl.SetOLECallback(&m_RichEditOleCallback); . . .}Have a look at the official sample in Q141549 你修改一下 IRichEditOleCallback::GetDragDropEffect的属性试试 ffmpeg改变帧率//怎么不行,是改pFormatCtx中r_frame_rate吗??? [ 如何把txt文本两行合并? varchar和nvarchar问题 关于WebBrowser2的问题 如何得到网上文件的创建日期,作者等信息 高手??帮忙!!!简单,来者给分,在线结贴!! 如何学习vb啊! ====我很迷茫怎么写出进度条!==== 一个关于动画窗口的问题(有源代码) docment-view问题求助 在vc中如何返回一个null,如何判断某个对象的值为null啊 我用VC开发一个单文档界面,要在工具栏下面再生成和工具栏一样的东西,然后在上面做按纽,痛苦啊!求教。
the
CRichEditCtrl using SetOLECallback() function. The code for a minimal
implementation of IRichEditOleCallback is below:from the dialogs Header file:class CRichEditOleCallback : public IRichEditOleCallback
{
public: STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * lplpObj);
STDMETHOD_(ULONG, AddRef) ();
STDMETHOD_(ULONG, Release) ();
STDMETHOD (GetNewStorage) (LPSTORAGE FAR * lplpstg);
STDMETHOD (GetInPlaceContext) (LPOLEINPLACEFRAME FAR * lplpFrame,
LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO lpFrameInfo);
STDMETHOD (ShowContainerUI) (BOOL fShow);
STDMETHOD (QueryInsertObject) (LPCLSID lpclsid, LPSTORAGE lpstg, LONG cp);
STDMETHOD (DeleteObject) (LPOLEOBJECT lpoleobj);
STDMETHOD (QueryAcceptData) (LPDATAOBJECT lpdataobj, CLIPFORMAT FAR *
lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict);
STDMETHOD (ContextSensitiveHelp) (BOOL fEnterMode);
STDMETHOD (GetClipboardData) (CHARRANGE FAR * lpchrg, DWORD reco,
LPDATAOBJECT
FAR * lplpdataobj);
STDMETHOD (GetDragDropEffect) (BOOL fDrag, DWORD grfKeyState, LPDWORD
pdwEffect);
STDMETHOD (GetContextMenu) (WORD seltype, LPOLEOBJECT lpoleobj,CHARRANGE
FAR *
lpchrg, HMENU FAR * lphmenu);
};////////////////////////////////////////////////////////////////////////////
/
// CPasteBitmapToRichEditDlg dialogclass CPasteBitmapToRichEditDlg : public CDialog
{
// Construction
public:
CPasteBitmapToRichEditDlg(CWnd* pParent = NULL); // standard constructor// Dialog Data
//{{AFX_DATA(CPasteBitmapToRichEditDlg)
enum { IDD = IDD_PASTEBITMAPTORICHEDIT_DIALOG };
CRichEditCtrl m_RichEditCtrl;
//}}AFX_DATA // ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CPasteBitmapToRichEditDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUALprotected:
HICON m_hIcon; CRichEditOleCallback m_RichEditOleCallback; // Generated message map functions
//{{AFX_MSG(CPasteBitmapToRichEditDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon(); //}}AFX_MSG
DECLARE_MESSAGE_MAP()};Dialogs implementation file:STDMETHODIMP CRichEditOleCallback::QueryInterface(REFIID riid, LPVOID FAR *
lplpObj)
{
if (riid == IID_IUnknown || riid == IID_IRichEditOleCallback)
{
*lplpObj = (void*)this;
return S_OK;
}
else
{
*lplpObj = NULL;
return E_NOINTERFACE;
}
}STDMETHODIMP_(ULONG) CRichEditOleCallback::AddRef()
{
return 1;
}STDMETHODIMP_(ULONG) CRichEditOleCallback::Release()
{
return 1;
}STDMETHODIMP CRichEditOleCallback::GetNewStorage(LPSTORAGE FAR * lplpstg)
{
// Create a flat storage and steal it from the client item
// the client item is only used for creating the storage
COleClientItem item;
item.GetItemStorageFlat();
*lplpstg = item.m_lpStorage;
HRESULT hRes = E_OUTOFMEMORY;
if (item.m_lpStorage != NULL)
{
item.m_lpStorage = NULL;
hRes = S_OK;
} return hRes;}STDMETHODIMP CRichEditOleCallback::GetInPlaceContext(LPOLEINPLACEFRAME FAR *
lplpFrame, LPOLEINPLACEUIWINDOW FAR * lplpDoc, LPOLEINPLACEFRAMEINFO
lpFrameInfo)
{
return E_NOTIMPL;
}STDMETHODIMP CRichEditOleCallback::ShowContainerUI(BOOL fShow)
{
return E_NOTIMPL;
}STDMETHODIMP CRichEditOleCallback::QueryInsertObject(LPCLSID lpclsid,
LPSTORAGE
lpstg, LONG cp)
{
return S_OK;
}STDMETHODIMP CRichEditOleCallback::DeleteObject(LPOLEOBJECT lpoleobj)
{
return E_NOTIMPL;
}STDMETHODIMP CRichEditOleCallback::QueryAcceptData(LPDATAOBJECT lpdataobj,
CLIPFORMAT FAR * lpcfFormat, DWORD reco, BOOL fReally, HGLOBAL hMetaPict)
{
// implement checks in code here, for example is the format acceptable
// user back pointer to CRichEditCtrl (above) to execute certain routines
// return S_OK if everthing is OK else return E_FAIL
return E_NOTIMPL;
}STDMETHODIMP CRichEditOleCallback::ContextSensitiveHelp(BOOL fEnterMode)
{
return E_NOTIMPL;
}STDMETHODIMP CRichEditOleCallback::GetClipboardData(CHARRANGE FAR * lpchrg,
DWORD reco, LPDATAOBJECT FAR * lplpdataobj)
{
return E_NOTIMPL;
}STDMETHODIMP CRichEditOleCallback::GetDragDropEffect(BOOL fDrag, DWORD
grfKeyState, LPDWORD pdwEffect)
{
return E_NOTIMPL;
}STDMETHODIMP CRichEditOleCallback::GetContextMenu(WORD seltype, LPOLEOBJECT
lpoleobj,CHARRANGE FAR * lpchrg, HMENU FAR * lphmenu)
{
return E_NOTIMPL;
}/////////////////////////////////////////////////
BOOL CPasteBitmapToRichEditDlg::OnInitDialog()
{
CDialog::OnInitDialog();
.
.
.
BOOL bSuccess = m_RichEditCtrl.SetOLECallback(&m_RichEditOleCallback);
.
.
.
}
Have a look at the official sample in Q141549