?? document.cpp
字號:
void CCosmoDoc::Undo(void)
{
m_pPL->Undo();
return;
}
/*
* CCosmoDoc::Clip
*
* Purpose:
* Places a private format, a metafile, and a bitmap of the display
* on the clipboard, optionally implementing Cut by deleting the
* data in the current window after rendering.
*
* Parameters:
* hWndFrame HWND of the main window.
* fCut BOOL indicating cut (TRUE) or copy (FALSE).
*
* Return Value:
* BOOL TRUE if successful, FALSE otherwise.
*/
BOOL CCosmoDoc::Clip(HWND hWndFrame, BOOL fCut)
{
BOOL fRet=TRUE;
HGLOBAL hMem;
UINT i;
//This array is so we can loop over the formats we provide.
static UINT rgcf[3]={0, CF_METAFILEPICT, CF_BITMAP};
const UINT cFormats=3;
if (!OpenClipboard(hWndFrame))
return FALSE;
//Clean out whatever junk is in the clipboard.
EmptyClipboard();
rgcf[0]=m_cf;
for (i=0; i < cFormats; i++)
{
//Copy private data first.
hMem=RenderFormat(rgcf[i]);
if (NULL!=hMem)
SetClipboardData(rgcf[i], hMem);
else
fRet &=FALSE;
}
//Free clipboard ownership.
CloseClipboard();
//Delete our current data if copying 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(&hMem);
return hMem;
}
switch (cf)
{
case CF_METAFILEPICT:
m_pPL->RenderMetafilePict(&hMem);
return hMem;
case CF_BITMAP:
m_pPL->RenderBitmap((HBITMAP *)&hMem);
return hMem;
}
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)
{
return IsClipboardFormatAvailable(m_cf);
}
/*
* 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)
{
HGLOBAL hMem;
PPOLYLINEDATA ppl;
BOOL fRet=FALSE;
if (!OpenClipboard(hWndFrame))
return FALSE;
hMem=GetClipboardData(m_cf);
if (NULL!=hMem)
{
ppl=(PPOLYLINEDATA)GlobalLock(hMem);
//TRUE in wParam to cause PLN_SIZECHANGE notification
m_pPL->DataSet(ppl, FALSE, TRUE);
GlobalUnlock(hMem);
FDirtySet(TRUE);
fRet=TRUE;
}
CloseClipboard();
return fRet;
}
/*
* 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)
{
COLORREF crRet;
m_pPL->ColorSet(iColor, cr, &crRet);
return crRet;
}
/*
* 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)
{
COLORREF crRet;
m_pPL->ColorGet(iColor, &crRet);
return crRet;
}
/*
* 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)
{
UINT i;
m_pPL->LineStyleSet(iStyle, &i);
return i;
}
/*
* CCosmoDoc::LineStyleGet
*
* Purpose:
* Retrieves the line style currently used in the Polyline
*
* Parameters:
* None
*
* Return Value:
* UINT Current line style.
*/
UINT CCosmoDoc::LineStyleGet(void)
{
UINT i=0;
//m_pPL might not be valid yet.
if (NULL!=m_pPL)
m_pPL->LineStyleGet(&i);
return i;
}
/*
* CPolylineAdviseSink::CPolylineAdviseSink
* CPolylineAdviseSink::~CPolylineAdviseSink
*
* Constructor Parameters:
* pDoc PCCosmoDoc to store in this object
*/
CPolylineAdviseSink::CPolylineAdviseSink(PCCosmoDoc pDoc)
{
m_pDoc=pDoc;
m_cRef=0;
AddRef();
return;
}
CPolylineAdviseSink::~CPolylineAdviseSink(void)
{
return;
}
/*
* CPolylineAdviseSink::QueryInterface
* CPolylineAdviseSink::AddRef
* CPolylineAdviseSink::Release
*
* Purpose:
* IUnknown members for this IPolylineAdviseSink implementations.
*/
STDMETHODIMP CPolylineAdviseSink::QueryInterface(REFIID riid
, PPVOID ppv)
{
*ppv=NULL;
//CHAPTER8MOD
if (IID_IUnknown==riid || IID_IPolylineAdviseSink8==riid)
*ppv=this;
//End CHAPTER8MOD
if (NULL!=*ppv)
{
((LPUNKNOWN)*ppv)->AddRef();
return NOERROR;
}
return ResultFromScode(S_FALSE);
}
STDMETHODIMP_(ULONG) CPolylineAdviseSink::AddRef(void)
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CPolylineAdviseSink::Release(void)
{
if (0L!=--m_cRef)
return m_cRef;
delete this;
return 0;
}
/*
* CPolylineAdviseSink::OnPointChange
*
* Purpose:
* Informs the document that the polyline added or removed a point.
*
* Parameters:
* None
*
* Return Value:
* None
*/
STDMETHODIMP_(void) CPolylineAdviseSink::OnPointChange(void)
{
m_pDoc->FDirtySet(TRUE);
return;
}
/*
* CPolylineAdviseSink::OnSizeChange
*
* Purpose:
* Informs the document that the polyline changed size.
*
* Parameters:
* None
*
* Return Value:
* None
*/
STDMETHODIMP_(void) CPolylineAdviseSink::OnSizeChange(void)
{
RECT rc;
DWORD dwStyle;
HWND hWnd;
/*
* 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.
*/
m_pDoc->m_fNoSize=TRUE;
//Set the document window size.
m_pDoc->m_pPL->Window(&hWnd);
GetWindowRect(hWnd, &rc);
InflateRect(&rc, 8, 8);
//Adjust for a window sans menu
dwStyle=GetWindowLong(m_pDoc->m_hWnd, GWL_STYLE);
AdjustWindowRect(&rc, dwStyle, FALSE);
SetWindowPos(m_pDoc->m_hWnd, NULL, 0, 0, rc.right-rc.left
, rc.bottom-rc.top, SWP_NOMOVE | SWP_NOZORDER);
if (NULL!=m_pDoc->m_pAdv)
m_pDoc->m_pAdv->OnSizeChange(m_pDoc, &rc);
m_pDoc->m_fNoSize=FALSE;
m_pDoc->FDirtySet(TRUE);
return;
}
/*
* CPolylineAdviseSink::OnDataChange
*
* Purpose:
* Informs the document that the polyline data changed.
*
* Parameters:
* None
*
* Return Value:
* None
*/
STDMETHODIMP_(void) CPolylineAdviseSink::OnDataChange(void)
{
if (NULL!=m_pDoc->m_pAdv)
m_pDoc->m_pAdv->OnDataChange(m_pDoc);
m_pDoc->FDirtySet(TRUE);
return;
}
/*
* CPolylineAdviseSink::OnColorChange
*
* Purpose:
* Informs the document that the polyline data changed a color.
*
* Parameters:
* None
*
* Return Value:
* None
*/
STDMETHODIMP_(void) CPolylineAdviseSink::OnColorChange(void)
{
m_pDoc->FDirtySet(TRUE);
return;
}
/*
* CPolylineAdviseSink::OnLineStyleChange
*
* Purpose:
* Informs the document that the polyline changed its line style.
*
* Parameters:
* None
*
* Return Value:
* None
*/
STDMETHODIMP_(void) CPolylineAdviseSink::OnLineStyleChange(void)
{
m_pDoc->FDirtySet(TRUE);
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -