📄 document.cpp
字号:
*
* 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;
}
/*
* 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)
{
UINT i;
HRESULT hr;
STGMEDIUM stm;
FORMATETC fe;
LPDATAOBJECT pIDataObject=NULL;
const UINT cFormats=7;
static UINT rgcf[7]={0, 0, 0, CF_METAFILEPICT, CF_BITMAP, 0, 0};
static DWORD rgtm[7]={TYMED_HGLOBAL, TYMED_ISTORAGE, TYMED_HGLOBAL
, TYMED_MFPICT, TYMED_GDI, TYMED_ISTREAM, TYMED_HGLOBAL};
hr=CoCreateInstance(CLSID_DataTransferObject, NULL
, CLSCTX_INPROC_SERVER, IID_IDataObject
, (PPVOID)&pIDataObject);
if (FAILED(hr))
return NULL;
rgcf[0]=m_cf;
rgcf[1]=m_cfEmbedSource;
rgcf[2]=m_cfObjectDescriptor;
//Don't include link stuff for cutting (0 format always fails)
if (!fCut)
{
rgcf[5]=m_cfLinkSource;
rgcf[6]=m_cfLinkSrcDescriptor;
}
for (i=0; i < cFormats; i++)
{
/*
* RenderFormat handles memory handles, but for compound doc
* formats we need something more. So if RenderFormat fails
* (which it will for i=1, try our latest addition which
* writes to a different field in the STGMEDIUM.
*/
stm.hGlobal=RenderFormat(rgcf[i]);
if (NULL==stm.hGlobal)
{
if (!RenderMedium(rgcf[i], &stm))
continue;
}
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;
}
//CHAPTER23MOD
/*
* CCosmoDoc::OpenInPlaceObject
*
* Purpose:
* Instructs the current figure object to open into a window from
* in-place active state, if applicable.
*
* Parameters:
* None
*
* Return Value:
* None
*/
void CCosmoDoc::OpenInPlaceObject(void)
{
if (NULL!=m_pFigure)
m_pFigure->OpenIntoWindow();
return;
}
//End CHAPTER23MOD
/*
* 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 + -