📄 oledlgs1.cpp
字号:
ASSERT_VALID(this);
ASSERT(m_ci.lpfnHook != NULL); // can still be a user hook
m_ci.hWndOwner = PreModal();
int iResult = MapResult(::OleUIChangeIcon(&m_ci));
PostModal();
return iResult;
}
BOOL COleChangeIconDialog::DoChangeIcon(COleClientItem* pItem)
{
ASSERT_VALID(this);
ASSERT_VALID(pItem);
// set the picture
if (!pItem->SetIconicMetafile(GetIconicMetafile()))
return FALSE;
// notify the item of the change if the current draw aspect is ICON
if (pItem->GetDrawAspect() == DVASPECT_ICON)
pItem->OnChange(OLE_CHANGED, (DWORD)DVASPECT_ICON);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// COleChangeIconDialog diagnostics
#ifdef _DEBUG
void COleChangeIconDialog::Dump(CDumpContext& dc) const
{
COleDialog::Dump(dc);
dc << "m_ci.cbStruct = " << m_ci.cbStruct;
dc << "\nm_ci.dwFlags = " << (LPVOID)m_ci.dwFlags;
dc << "\nm_ci.hWndOwner = " << (UINT)m_ci.hWndOwner;
dc << "\nm_ci.lpszCaption = " << m_ci.lpszCaption;
dc << "\nm_ci.lCustData = " << (LPVOID)m_ci.lCustData;
dc << "\nm_ci.hInstance = " << (UINT)m_ci.hInstance;
dc << "\nm_ci.lpszTemplate = " << (LPVOID)m_ci.lpszTemplate;
dc << "\nm_ci.hResource = " << (UINT)m_ci.hResource;
if (m_ci.lpfnHook == AfxOleHookProc)
dc << "\nhook function set to standard MFC hook function";
else
dc << "\nhook function set to non-standard hook function";
dc << "\nm_ci.hMetaPict = " << (UINT)m_ci.hMetaPict;
dc << "\n";
}
#endif
/////////////////////////////////////////////////////////////////////////////
// COleLinksDialog
COleLinksDialog::COleLinksDialog(COleDocument* pDoc, CView* pView,
DWORD dwFlags, CWnd* pParentWnd) : COleDialog(pParentWnd),
m_xLinkInfo(pDoc)
{
ASSERT_VALID(pDoc);
if (pView != NULL)
ASSERT_VALID(pView);
memset(&m_el, 0, sizeof(m_el)); // initialize structure to 0/NULL
// fill in common part
m_el.cbStruct = sizeof(m_el);
m_el.dwFlags = dwFlags;
if (!afxData.bWin4 && AfxHelpEnabled())
m_el.dwFlags |= ELF_SHOWHELP;
m_el.lpfnHook = AfxOleHookProc;
m_nIDHelp = AFX_IDD_EDITLINKS;
// specific to this dialog
if (pView != NULL)
m_xLinkInfo.m_pSelectedItem = pDoc->GetPrimarySelectedItem(pView);
else
m_xLinkInfo.m_pSelectedItem = NULL;
m_el.lpOleUILinkContainer = &m_xLinkInfo;
}
COleLinksDialog::~COleLinksDialog()
{
}
int COleLinksDialog::DoModal()
{
ASSERT_VALID(this);
ASSERT(m_el.lpfnHook != NULL); // can still be a user hook
// this function is always used for updating links
m_xLinkInfo.m_bUpdateLinks = TRUE;
m_el.hWndOwner = PreModal();
int iResult = MapResult(::OleUIEditLinks(&m_el));
PostModal();
return iResult;
}
/////////////////////////////////////////////////////////////////////////////
// COleLinksDialog diagnostics
#ifdef _DEBUG
void COleLinksDialog::Dump(CDumpContext& dc) const
{
COleDialog::Dump(dc);
dc << "\nm_el.cbStruct = " << m_el.cbStruct;
dc << "\nm_el.dwFlags = " << (void*)m_el.dwFlags;
dc << "\nm_el.hWndOwner = " << (UINT)m_el.hWndOwner;
dc << "\nm_el.lpszCaption = " << m_el.lpszCaption;
dc << "\nm_el.lCustData = " << (void*)m_el.lCustData;
dc << "\nm_el.hInstance = " << (UINT)m_el.hInstance;
dc << "\nm_el.lpszTemplate = " << (void*)m_el.lpszTemplate;
dc << "\nm_el.hResource = " << (UINT)m_el.hResource;
if (m_el.lpfnHook == AfxOleHookProc)
dc << "\nhook function set to standard MFC hook function";
else
dc << "\nhook function set to non-standard hook function";
dc << "\n";
}
void COleLinksDialog::AssertValid() const
{
COleDialog::AssertValid();
}
#endif
/////////////////////////////////////////////////////////////////////////////
// COleUpdateDialog
COleUpdateDialog::COleUpdateDialog(COleDocument* pDoc,
BOOL bUpdateLinks, BOOL bUpdateEmbeddings, CWnd* pParentWnd)
: COleLinksDialog(pDoc, NULL, 0, pParentWnd)
{
ASSERT_VALID(pDoc);
ASSERT(bUpdateLinks || bUpdateEmbeddings);
// non-base class parameters
m_xLinkInfo.m_bUpdateLinks = bUpdateLinks;
m_xLinkInfo.m_bUpdateEmbeddings = bUpdateEmbeddings;
m_strCaption.LoadString(AFX_IDS_UPDATING_ITEMS);
}
COleUpdateDialog::~COleUpdateDialog()
{
}
int COleUpdateDialog::DoModal()
{
ASSERT_VALID(this);
// first count number of links/embeddings to be updated
DWORD dwLink = 0;
int cLinks = 0;
while ((dwLink = m_el.lpOleUILinkContainer->GetNextLink(dwLink)) != 0)
++cLinks;
// when no links are out-of-date, don't bother
if (cLinks == 0)
return IDCANCEL;
// bring up the dialog that processes all the links
HWND hWndParent = PreModal();
BOOL bResult = OleUIUpdateLinks(m_el.lpOleUILinkContainer,
hWndParent, (LPTSTR)(LPCTSTR)m_strCaption, cLinks);
PostModal();
return bResult ? IDOK : -1;
}
/////////////////////////////////////////////////////////////////////////////
// COleUpdateDialog diagnostics
#ifdef _DEBUG
void COleUpdateDialog::Dump(CDumpContext& dc) const
{
COleLinksDialog::Dump(dc);
dc << "m_strCaption = " << m_strCaption;
dc << "\n";
}
#endif
/////////////////////////////////////////////////////////////////////////////
// COlePasteSpecialDialog
COlePasteSpecialDialog::COlePasteSpecialDialog(DWORD dwFlags,
COleDataObject* pDataObject, CWnd* pParentWnd) : COleDialog(pParentWnd)
{
memset(&m_ps, 0, sizeof(m_ps)); // initialize structure to 0/NULL
// fill in common part
m_ps.cbStruct = sizeof(m_ps);
m_ps.dwFlags = dwFlags | PSF_STAYONCLIPBOARDCHANGE;
if (!afxData.bWin4 && AfxHelpEnabled())
m_ps.dwFlags |= PSF_SHOWHELP;
if (_AfxOlePropertiesEnabled())
m_ps.dwFlags |= PSF_HIDECHANGEICON;
m_ps.lpfnHook = AfxOleHookProc;
m_nIDHelp = AFX_IDD_PASTESPECIAL;
// get LPDATAOBJECT for paste special dialog
COleDataObject dataObject;
if (pDataObject == NULL)
{
VERIFY(dataObject.AttachClipboard());
pDataObject = &dataObject;
}
ASSERT(pDataObject != NULL);
m_ps.lpSrcDataObj = pDataObject->GetIDataObject(TRUE);
// complete initialization
m_ps.arrPasteEntries = NULL;
m_ps.cPasteEntries = 0;
m_ps.arrLinkTypes = m_arrLinkTypes;
m_ps.cLinkTypes = 0;
}
COlePasteSpecialDialog::~COlePasteSpecialDialog()
{
_AfxDeleteMetafilePict(m_ps.hMetaPict);
for (int i = 0; i < m_ps.cPasteEntries; i++)
{
free((void*)m_ps.arrPasteEntries[i].lpstrFormatName);
free((void*)m_ps.arrPasteEntries[i].lpstrResultText);
}
free(m_ps.arrPasteEntries);
RELEASE(m_ps.lpSrcDataObj);
}
int COlePasteSpecialDialog::DoModal()
{
ASSERT_VALID(this);
ASSERT(m_ps.lpfnHook != NULL); // can still be a user hook
// return error if IDataObject* not available
if (m_ps.lpSrcDataObj == NULL)
return -1;
m_ps.hWndOwner = PreModal();
int iResult = MapResult(::OleUIPasteSpecial(&m_ps));
PostModal();
return iResult;
}
UINT COlePasteSpecialDialog::GetSelectionType() const
{
ASSERT_VALID(this);
ASSERT(m_ps.dwFlags & (PSF_SELECTPASTE|PSF_SELECTPASTELINK));
UINT cf = m_ps.arrPasteEntries[m_ps.nSelectedIndex].fmtetc.cfFormat;
Selection selType = pasteOther;
if (m_ps.dwFlags & PSF_SELECTPASTELINK)
{
selType = pasteLink;
}
else if (cf == _oleData.cfEmbedSource || cf == _oleData.cfEmbeddedObject ||
cf == _oleData.cfLinkSource)
{
selType = pasteNormal;
}
else if (cf == CF_METAFILEPICT || cf == CF_DIB || cf == CF_BITMAP)
{
selType = pasteStatic;
}
return selType;
}
/////////////////////////////////////////////////////////////////////////////
// COlePasteSpecialDialog diagnostics
#ifdef _DEBUG
void COlePasteSpecialDialog::Dump(CDumpContext& dc) const
{
COleDialog::Dump(dc);
dc << "m_ps.cbStruct = " << m_ps.cbStruct;
dc << "\nm_ps.dwFlags = " << (LPVOID)m_ps.dwFlags;
dc << "\nm_ps.hWndOwner = " << (UINT)m_ps.hWndOwner;
dc << "\nm_ps.lpszCaption = " << m_ps.lpszCaption;
dc << "\nm_ps.lCustData = " << (LPVOID)m_ps.lCustData;
dc << "\nm_ps.hInstance = " << (UINT)m_ps.hInstance;
dc << "\nm_ps.lpszTemplate = " << (LPVOID)m_ps.lpszTemplate;
dc << "\nm_ps.hResource = " << (UINT)m_ps.hResource;
if (m_ps.lpfnHook == AfxOleHookProc)
dc << "\nhook function set to standard MFC hook function";
else
dc << "\nhook function set to non-standard hook function";
dc << "\nm_ps.lpSrcDataObj = " << (LPVOID)m_ps.lpSrcDataObj;
dc << "\nm_ps.cPasteEntries = " << m_ps.cPasteEntries;
dc << "\nm_ps.cLinkTypes = " << m_ps.cLinkTypes;
dc << "\nm_ps.nSelectedIndex = " << m_ps.nSelectedIndex;
dc << "\nm_ps.fLink = " << m_ps.fLink;
dc << "\n";
}
void COlePasteSpecialDialog::AssertValid() const
{
COleDialog::AssertValid();
ASSERT(m_ps.cPasteEntries == 0 || m_ps.arrPasteEntries != NULL);
ASSERT(m_ps.arrLinkTypes != NULL);
ASSERT(m_ps.cLinkTypes <= 8);
}
#endif
////////////////////////////////////////////////////////////////////////////
OLEUIPASTEFLAG COlePasteSpecialDialog::AddLinkEntry(UINT cf)
{
ASSERT_VALID(this);
ASSERT(m_ps.cLinkTypes <= 8);
for (int i = 0; i < m_ps.cLinkTypes; i++)
{
if (m_ps.arrLinkTypes[i] == cf)
break;
}
if (i == 8)
return (OLEUIPASTEFLAG)0;
m_ps.arrLinkTypes[i] = cf;
if (i == m_ps.cLinkTypes)
m_ps.cLinkTypes++;
return (OLEUIPASTEFLAG) (OLEUIPASTE_LINKTYPE1 << i);
}
void COlePasteSpecialDialog::AddFormat(UINT cf, DWORD tymed, UINT nFormatID,
BOOL bEnableIcon, BOOL bLink)
{
TCHAR szFormat[256];
if (AfxLoadString(nFormatID, szFormat) == 0)
AfxThrowResourceException();
// the format and result strings are delimited by a newline
LPTSTR lpszResult = _tcschr(szFormat, '\n');
ASSERT(lpszResult != NULL); // must contain a newline
*lpszResult = '\0';
++lpszResult; // one char past newline
// add it to the array of acceptable formats
m_ps.arrPasteEntries = (OLEUIPASTEENTRY *)realloc(m_ps.arrPasteEntries,
sizeof(OLEUIPASTEENTRY) * (m_ps.cPasteEntries +1));
OLEUIPASTEENTRY* pEntry = &m_ps.arrPasteEntries[m_ps.cPasteEntries];
pEntry->fmtetc.cfFormat = (CLIPFORMAT)cf;
pEntry->fmtetc.dwAspect = DVASPECT_CONTENT;
pEntry->fmtetc.ptd = NULL;
pEntry->fmtetc.tymed = tymed;
pEntry->fmtetc.lindex = -1;
pEntry->lpstrFormatName = _tcsdup(szFormat);
pEntry->lpstrResultText = _tcsdup(lpszResult);
pEntry->dwFlags = OLEUIPASTE_PASTE;
if (bEnableIcon)
pEntry->dwFlags |= OLEUIPASTE_ENABLEICON;
if (bLink)
pEntry->dwFlags |= AddLinkEntry(cf);
if (pEntry->dwFlags == OLEUIPASTE_PASTE)
pEntry->dwFlags = OLEUIPASTE_PASTEONLY;
pEntry->dwScratchSpace = NULL;
m_ps.cPasteEntries++;
}
// if the flags parameter includes a LINKTYPE# flag, it should be obtained
// from AddLinkEntry
void COlePasteSpecialDialog::AddFormat(const FORMATETC& formatEtc,
LPTSTR lpszFormat, LPTSTR lpszResult, DWORD dwFlags)
{
ASSERT_VALID(this);
m_ps.arrPasteEntries = (OLEUIPASTEENTRY *)realloc(
m_ps.arrPasteEntries, sizeof(OLEUIPASTEENTRY) * (m_ps.cPasteEntries +1));
OLEUIPASTEENTRY* pEntry = &m_ps.arrPasteEntries[m_ps.cPasteEntries];
pEntry->fmtetc = formatEtc;
pEntry->lpstrFormatName = _tcsdup(lpszFormat);
pEntry->lpstrResultText = _tcsdup(lpszResult);
pEntry->dwFlags = dwFlags;
pEntry->dwScratchSpace = NULL;
m_ps.cPasteEntries++;
}
void COlePasteSpecialDialog::AddStandardFormats(BOOL bEnableLink)
{
// Note: only need to add Embedded Object because Embed Source is
// automatically recognized by the paste special dialog implementation.
ASSERT(_oleData.cfEmbeddedObject != NULL);
AddFormat(_oleData.cfEmbeddedObject, TYMED_ISTORAGE, AFX_IDS_EMBED_FORMAT,
TRUE, FALSE);
// add link source if requested
if (bEnableLink)
{
ASSERT(_oleData.cfLinkSource != NULL);
AddFormat(_oleData.cfLinkSource, TYMED_ISTREAM, AFX_IDS_LINKSOURCE_FORMAT,
TRUE, TRUE);
}
// add formats that can be used for 'static' items
AddFormat(CF_METAFILEPICT, TYMED_MFPICT, AFX_IDS_METAFILE_FORMAT,
FALSE, FALSE);
AddFormat(CF_DIB, TYMED_HGLOBAL, AFX_IDS_DIB_FORMAT, FALSE, FALSE);
AddFormat(CF_BITMAP, TYMED_GDI, AFX_IDS_BITMAP_FORMAT, FALSE, FALSE);
}
BOOL COlePasteSpecialDialog::CreateItem(COleClientItem *pNewItem)
{
ASSERT_VALID(this);
ASSERT(pNewItem != NULL);
ASSERT(m_ps.lpSrcDataObj != NULL);
CWaitCursor wait;
COleDataObject dataObject;
dataObject.Attach(m_ps.lpSrcDataObj, FALSE);
UINT selType = GetSelectionType();
BOOL bResult = TRUE;
switch (selType)
{
case pasteLink:
// paste link
if (!pNewItem->CreateLinkFromData(&dataObject))
{
TRACE0("Warning: CreateLinkFromData failed.\n");
bResult = FALSE;
}
break;
case pasteStatic:
if (!pNewItem->CreateStaticFromData(&dataObject))
{
TRACE0("Warning: CreateStaticFromData failed.\n");
bResult = FALSE;
}
break;
default:
ASSERT(selType == pasteNormal);
if (!pNewItem->CreateFromData(&dataObject))
{
TRACE0("Warning: CreateFromData failed.\n");
bResult = FALSE;
}
break;
}
// deal with Display As Iconic option
if (bResult && GetDrawAspect() == DVASPECT_ICON)
{
// setup iconic cache (it will draw iconic by default as well)
if (!pNewItem->SetIconicMetafile(m_ps.hMetaPict))
{
TRACE0("Warning: failed to set iconic aspect.\n");
bResult = FALSE;
}
else
{
// since picture was set OK, draw as iconic as well...
pNewItem->SetDrawAspect(DVASPECT_ICON);
}
}
return bResult;
}
/////////////////////////////////////////////////////////////////////////////
// Inline function declarations expanded out-of-line
#ifndef _AFX_ENABLE_INLINES
// expand inlines for OLE dialog APIs
static char _szAfxOleInl[] = "afxole.inl";
#undef THIS_FILE
#define THIS_FILE _szAfxOleInl
#define _AFXODLGS_INLINE
#include "afxole.inl"
#endif //!_AFX_ENABLE_INLINES
#ifdef AFX_INIT_SEG
#pragma code_seg(AFX_INIT_SEG)
#endif
IMPLEMENT_DYNAMIC(COleInsertDialog, COleDialog)
IMPLEMENT_DYNAMIC(COleConvertDialog, COleDialog)
IMPLEMENT_DYNAMIC(COleChangeIconDialog, COleDialog)
IMPLEMENT_DYNAMIC(COleLinksDialog, COleDialog)
IMPLEMENT_DYNAMIC(COleUpdateDialog, COleLinksDialog)
IMPLEMENT_DYNAMIC(COlePasteSpecialDialog, COleDialog)
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -