📄 document.cpp
字号:
pIDataObject=TransferObjectCreate(fCut);
if (NULL==pIDataObject)
return FALSE;
//End CHAPTER13MOD
fRet=SUCCEEDED(OleSetClipboard(pIDataObject));
pIDataObject->Release();
//Delete our current data if "cut" succeeded.
if (fRet && fCut)
{
m_pPL->New();
FDirtySet(TRUE);
}
return fRet;
}
/*
* CCosmoDoc::RenderFormat
*
* Purpose:
* Renders a specific clipboard format into global memory.
*
* Parameters:
* cf UINT format to render.
*
* Return Value:
* HGLOBAL Global memory handle containing the data.
*/
HGLOBAL CCosmoDoc::RenderFormat(UINT cf)
{
HGLOBAL hMem;
if (cf==m_cf)
{
m_pPL->DataGetMem(VERSIONCURRENT, &hMem);
return hMem;
}
switch (cf)
{
case CF_METAFILEPICT:
return m_pPL->RenderMetafilePict();
case CF_BITMAP:
return (HGLOBAL)m_pPL->RenderBitmap();
}
return NULL;
}
/*
* CCosmoDoc::FQueryPaste
*
* Purpose:
* Determines if we can paste data from the clipboard.
*
* Parameters:
* None
*
* Return Value:
* BOOL TRUE if data is available, FALSE otherwise.
*/
BOOL CCosmoDoc::FQueryPaste(void)
{
LPDATAOBJECT pIDataObject;
BOOL fRet;
if (FAILED(OleGetClipboard(&pIDataObject)))
return FALSE;
fRet=FQueryPasteFromData(pIDataObject);
pIDataObject->Release();
return fRet;
}
/*
* CCosmoDoc::FQueryPasteFromData
* (Protected)
*
* Purpose:
* Determines if we can paste data from a data object.
*
* Parameters:
* pIDataObject LPDATAOBJECT from which we might want to paste.
*
* Return Value:
* BOOL TRUE if data is available, FALSE otherwise.
*/
BOOL CCosmoDoc::FQueryPasteFromData(LPDATAOBJECT pIDataObject)
{
FORMATETC fe;
SETDefFormatEtc(fe, m_cf, TYMED_HGLOBAL);
return (NOERROR==pIDataObject->QueryGetData(&fe));
}
/*
* CCosmoDoc::Paste
*
* Purpose:
* Retrieves the private data format from the clipboard and sets it
* to the current figure in the editor window.
*
* Note that if this function is called, then the clipboard format
* is available because the Paste menu item is only enabled if the
* format is present.
*
* Parameters:
* hWndFrame HWND of the main window.
*
* Return Value:
* BOOL TRUE if successful, FALSE otherwise.
*/
BOOL CCosmoDoc::Paste(HWND hWndFrame)
{
LPDATAOBJECT pIDataObject;
BOOL fRet;
if (FAILED(OleGetClipboard(&pIDataObject)))
return FALSE;
fRet=PasteFromData(pIDataObject);
pIDataObject->Release();
return fRet;
}
/*
* CCosmoDoc::PasteFromData
* (Protected)
*
* Purpose:
* Retrieves the private data format from a data object and sets
* it to the current figure in the editor window.
*
* Parameters:
* pIDataObject LPDATAOBJECT from which to paste.
*
* Return Value:
* BOOL TRUE if successful, FALSE otherwise.
*/
BOOL CCosmoDoc::PasteFromData(LPDATAOBJECT pIDataObject)
{
FORMATETC fe;
STGMEDIUM stm;
BOOL fRet;
SETDefFormatEtc(fe, m_cf, TYMED_HGLOBAL);
fRet=SUCCEEDED(pIDataObject->GetData(&fe, &stm));
if (fRet && NULL!=stm.hGlobal)
{
m_pPL->DataSetMem(stm.hGlobal, FALSE, FALSE, TRUE);
ReleaseStgMedium(&stm);
FDirtySet(TRUE);
}
return fRet;
}
//CHAPTER13MOD
/*
* CCosmoDoc::TransferObjectCreate
* (Protected)
*
* Purpose:
* Creates a DataTransferObject and stuffs the current Polyline
* data into it, used for both clipboard and drag-drop operations.
*
* Parameters:
* fCut BOOL TRUE if we're cutting, FALSE if we're
* copying.
*
* Return Value:
* LPDATAOBJECT Pointer to the object created, NULL on failure
*/
LPDATAOBJECT CCosmoDoc::TransferObjectCreate(BOOL fCut)
{
HGLOBAL hMem;
UINT i;
HRESULT hr;
STGMEDIUM stm;
FORMATETC fe;
LPDATAOBJECT pIDataObject=NULL;
const UINT cFormats=3;
static UINT rgcf[3]={0, CF_METAFILEPICT, CF_BITMAP};
static DWORD rgtm[3]={TYMED_HGLOBAL, TYMED_MFPICT
, TYMED_GDI};
hr=CoCreateInstance(CLSID_DataTransferObject, NULL
, CLSCTX_INPROC_SERVER, IID_IDataObject
, (PPVOID)&pIDataObject);
if (FAILED(hr))
return NULL;
rgcf[0]=m_cf;
for (i=0; i < cFormats; i++)
{
//Copy private data first.
hMem=RenderFormat(rgcf[i]);
if (NULL!=hMem)
{
stm.hGlobal=hMem;
stm.tymed=rgtm[i];
stm.pUnkForRelease=NULL;
SETDefFormatEtc(fe, rgcf[i], rgtm[i]);
pIDataObject->SetData(&fe, &stm, TRUE);
}
}
return pIDataObject; //Caller now responsible
}
/*
* CCosmoDoc::DropSelectTargetWindow
* (Protected)
*
* Purpose:
* Creates a thin inverted frame around a window that we use to
* show the window as a drop target. This is a toggle function:
* It uses XOR to create the effect so it must be called twice to
* leave the window as it was.
*
* Parameters:
* None
*
* Return Value:
* None
*/
void CCosmoDoc::DropSelectTargetWindow(void)
{
HDC hDC;
RECT rc;
UINT dd=3;
HWND hWnd;
hWnd=m_pPL->Window();
hDC=GetWindowDC(hWnd);
GetClientRect(hWnd, &rc);
//Frame this window with inverted pixels
//Top
PatBlt(hDC, rc.left, rc.top, rc.right-rc.left, dd, DSTINVERT);
//Bottom
PatBlt(hDC, rc.left, rc.bottom-dd, rc.right-rc.left, dd
, DSTINVERT);
//Left excluding regions already affected by top and bottom
PatBlt(hDC, rc.left, rc.top+dd, dd, rc.bottom-rc.top-(2*dd)
, DSTINVERT);
//Right excluding regions already affected by top and bottom
PatBlt(hDC, rc.right-dd, rc.top+dd, dd, rc.bottom-rc.top-(2*dd)
, DSTINVERT);
ReleaseDC(hWnd, hDC);
return;
}
//End CHAPTER13MOD
/*
* CCosmoDoc::ColorSet
*
* Purpose:
* Changes a color used in our contained Polyline.
*
* Parameters:
* iColor UINT index of the color to change.
* cr COLORREF new color.
*
* Return Value:
* COLORREF Previous color for the given index.
*/
COLORREF CCosmoDoc::ColorSet(UINT iColor, COLORREF cr)
{
return m_pPL->ColorSet(iColor, cr);
}
/*
* CCosmoDoc::ColorGet
*
* Purpose:
* Retrieves a color currently in use in the Polyline.
*
* Parameters:
* iColor UINT index of the color to retrieve.
*
* Return Value:
* COLORREF Current color for the given index.
*/
COLORREF CCosmoDoc::ColorGet(UINT iColor)
{
return m_pPL->ColorGet(iColor);
}
/*
* CCosmoDoc::LineStyleSet
*
* Purpose:
* Changes the line style currently used in the Polyline
*
* Parameters:
* iStyle UINT index of the new line style to use.
*
* Return Value:
* UINT Previous line style.
*/
UINT CCosmoDoc::LineStyleSet(UINT iStyle)
{
return m_pPL->LineStyleSet(iStyle);
}
/*
* CCosmoDoc::LineStyleGet
*
* Purpose:
* Retrieves the line style currently used in the Polyline
*
* Parameters:
* None
*
* Return Value:
* UINT Current line style.
*/
UINT CCosmoDoc::LineStyleGet(void)
{
if (NULL==m_pPL) //m_pPL might not be valid yet
return 0L;
return m_pPL->LineStyleGet();
}
/*
* CPolylineAdviseSink::CPolylineAdviseSink
* CPolylineAdviseSink::~CPolylineAdviseSink
*
* Constructor Parameters:
* pv LPVOID to store in this object
*/
CPolylineAdviseSink::CPolylineAdviseSink(LPVOID pv)
{
m_pv=pv;
return;
}
CPolylineAdviseSink::~CPolylineAdviseSink(void)
{
return;
}
/*
* CPolylineAdviseSink::OnPointChange
*
* Purpose:
* Informs the document that the polyline added or removed a point.
*
* Parameters:
* None
*
* Return Value:
* None
*/
void CPolylineAdviseSink::OnPointChange(void)
{
PCDocument pDoc=(PCDocument)m_pv;
pDoc->FDirtySet(TRUE);
return;
}
/*
* CPolylineAdviseSink::OnSizeChange
*
* Purpose:
* Informs the document that the polyline changed size.
*
* Parameters:
* None
*
* Return Value:
* None
*/
void CPolylineAdviseSink::OnSizeChange(void)
{
PCCosmoDoc pDoc=(PCCosmoDoc)m_pv;
RECT rc;
DWORD dwStyle;
/*
* Polyline window is informing us that it changed size in
* response to setting it's data. Therefore we have to
* size ourselves accordingly but without moving the screen
* position of the polyline window.
*/
pDoc->m_fNoSize=TRUE;
//Set the document window size.
GetWindowRect(pDoc->m_pPL->Window(), &rc);
InflateRect(&rc, 8, 8);
//Adjust for a window sans menu
dwStyle=GetWindowLong(pDoc->m_hWnd, GWL_STYLE);
AdjustWindowRect(&rc, dwStyle, FALSE);
SetWindowPos(pDoc->m_hWnd, NULL, 0, 0, rc.right-rc.left
, rc.bottom-rc.top, SWP_NOMOVE | SWP_NOZORDER);
if (NULL!=pDoc->m_pAdv)
pDoc->m_pAdv->OnSizeChange(pDoc, &rc);
pDoc->m_fNoSize=FALSE;
pDoc->FDirtySet(TRUE);
return;
}
/*
* CPolylineAdviseSink::OnDataChange
*
* Purpose:
* Informs the document that the polyline data changed.
*
* Parameters:
* None
*
* Return Value:
* None
*/
void CPolylineAdviseSink::OnDataChange(void)
{
PCCosmoDoc pDoc=(PCCosmoDoc)m_pv;
if (NULL!=pDoc->m_pAdv)
pDoc->m_pAdv->OnDataChange(pDoc);
pDoc->FDirtySet(TRUE);
return;
}
/*
* CPolylineAdviseSink::OnColorChange
*
* Purpose:
* Informs the document that the polyline data changed a color.
*
* Parameters:
* None
*
* Return Value:
* None
*/
void CPolylineAdviseSink::OnColorChange(void)
{
PCCosmoDoc pDoc=(PCCosmoDoc)m_pv;
pDoc->FDirtySet(TRUE);
return;
}
/*
* CPolylineAdviseSink::OnLineStyleChange
*
* Purpose:
* Informs the document that the polyline changed its line style.
*
* Parameters:
* None
*
* Return Value:
* None
*/
void CPolylineAdviseSink::OnLineStyleChange(void)
{
PCCosmoDoc pDoc=(PCCosmoDoc)m_pv;
pDoc->FDirtySet(TRUE);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -