📄 datauser.cpp
字号:
/*
* DATAUSER.CPP
* Data Object User Chapter 10
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/
#define INITGUIDS
#include "datauser.h"
//These are for displaying clipboard formats textually.
static TCHAR * rgszCF[13]={TEXT("Unknown"), TEXT("CF_TEXT")
, TEXT("CF_BITMAP"), TEXT("CF_METAFILEPICT")
, TEXT("CF_SYLK"), TEXT("CF_DIF"), TEXT("CF_TIFF")
, TEXT("CF_OEMTEXT"), TEXT("CF_DIB")
, TEXT("CF_PALETTE"), TEXT("CF_PENDATA")
, TEXT("CF_RIFF"), TEXT("CF_WAVE")};
static TCHAR szSuccess[] =TEXT("succeeded");
static TCHAR szFailed[] =TEXT("failed");
static TCHAR szExpected[] =TEXT("expected");
static TCHAR szUnexpected[] =TEXT("unexpected!");
/*
* WinMain
*
* Purpose:
* Main entry point of application.
*/
int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hInstPrev
, LPSTR pszCmdLine, int nCmdShow)
{
MSG msg;
PAPP pApp;
SETMESSAGEQUEUE(96);
pApp=new CApp(hInst, hInstPrev, nCmdShow);
if (NULL==pApp)
return -1;
if (pApp->Init())
{
while (GetMessage(&msg, NULL, 0,0 ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
delete pApp;
return msg.wParam;
}
/*
* DataUserWndProc
*
* Purpose:
* Window class procedure. Standard callback.
*/
LRESULT APIENTRY DataUserWndProc(HWND hWnd, UINT iMsg
, WPARAM wParam, LPARAM lParam)
{
HRESULT hr;
PAPP pApp;
HMENU hMenu;
FORMATETC fe;
WORD wID;
pApp=(PAPP)GetWindowLong(hWnd, DATAUSERWL_STRUCTURE);
switch (iMsg)
{
case WM_NCCREATE:
pApp=(PAPP)((LPCREATESTRUCT)lParam)->lpCreateParams;
SetWindowLong(hWnd, DATAUSERWL_STRUCTURE, (LONG)pApp);
return (DefWindowProc(hWnd, iMsg, wParam, lParam));
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
pApp->Paint();
break;
case WM_COMMAND:
SETDefFormatEtc(fe, 0, TYMED_HGLOBAL | TYMED_GDI
| TYMED_MFPICT);
hMenu=GetMenu(hWnd);
wID=LOWORD(wParam);
switch (wID)
{
case IDM_OBJECTUSEDLL:
if (!pApp->m_fEXE)
break;
pApp->m_fEXE=FALSE;
pApp->FReloadDataObjects(TRUE);
break;
case IDM_OBJECTUSEEXE:
if (pApp->m_fEXE)
break;
pApp->m_fEXE=TRUE;
pApp->FReloadDataObjects(TRUE);
break;
case IDM_OBJECTDATASIZESMALL:
case IDM_OBJECTDATASIZEMEDIUM:
case IDM_OBJECTDATASIZELARGE:
CheckMenuItem(hMenu
, IDM_OBJECTDATASIZESMALL, MF_UNCHECKED);
CheckMenuItem(hMenu
, IDM_OBJECTDATASIZEMEDIUM, MF_UNCHECKED);
CheckMenuItem(hMenu
, IDM_OBJECTDATASIZELARGE, MF_UNCHECKED);
CheckMenuItem(hMenu, wID, MF_CHECKED);
//Kill old advise.
if (NULL!=pApp->m_pIDataObject
|| 0!=pApp->m_dwConn)
{
pApp->m_pIDataObject->DUnadvise(pApp
->m_dwConn);
}
if (IDM_OBJECTDATASIZELARGE==wID)
pApp->m_pIDataObject=pApp->m_pIDataLarge;
else if (IDM_OBJECTDATASIZEMEDIUM==wID)
pApp->m_pIDataObject=pApp->m_pIDataMedium;
else
pApp->m_pIDataObject=pApp->m_pIDataSmall;
//Setup new advise.
fe.cfFormat=pApp->m_cfAdvise;
pApp->m_pIDataObject->DAdvise(&fe, ADVF_NODATA
, pApp->m_pIAdviseSink, &pApp->m_dwConn);
break;
case IDM_OBJECTQUERYGETDATA:
if (NULL==pApp->m_pIDataObject)
break;
fe.tymed=TYMED_HGLOBAL | TYMED_GDI
| TYMED_MFPICT;
pApp->TryQueryGetData(&fe, CF_TEXT, TRUE, 0);
pApp->TryQueryGetData(&fe, CF_BITMAP, TRUE, 1);
pApp->TryQueryGetData(&fe, CF_DIB, FALSE, 2);
pApp->TryQueryGetData(&fe, CF_METAFILEPICT
, TRUE, 3);
pApp->TryQueryGetData(&fe, CF_WAVE, FALSE, 4);
break;
case IDM_OBJECTGETDATATEXT:
case IDM_OBJECTGETDATABITMAP:
case IDM_OBJECTGETDATAMETAFILEPICT:
if (NULL==pApp->m_pIDataObject)
break;
//Clean up whatever we currently have.
pApp->m_cf=0;
ReleaseStgMedium(&pApp->m_stm);
if (IDM_OBJECTGETDATATEXT==wID)
SETDefFormatEtc(fe, CF_TEXT, TYMED_HGLOBAL);
if (IDM_OBJECTGETDATABITMAP==wID)
SETDefFormatEtc(fe, CF_BITMAP, TYMED_GDI);
if (IDM_OBJECTGETDATAMETAFILEPICT==wID)
{
SETDefFormatEtc(fe, CF_METAFILEPICT
, TYMED_MFPICT);
}
hr=pApp->m_pIDataObject->GetData(&fe
, &(pApp->m_stm));
if (SUCCEEDED(hr))
pApp->m_cf=fe.cfFormat;
InvalidateRect(hWnd, NULL, TRUE);
UpdateWindow(hWnd);
break;
case IDM_OBJECTEXIT:
PostMessage(hWnd, WM_CLOSE, 0, 0L);
break;
case IDM_ADVISETEXT:
case IDM_ADVISEBITMAP:
case IDM_ADVISEMETAFILEPICT:
if (NULL==pApp->m_pIDataObject)
break;
//Terminate the old connection
if (0!=pApp->m_dwConn)
{
pApp->m_pIDataObject->DUnadvise(pApp
->m_dwConn);
}
CheckMenuItem(hMenu, pApp->m_cfAdvise
+IDM_ADVISEMIN, MF_UNCHECKED);
CheckMenuItem(hMenu, wID, MF_CHECKED);
//New format is wID-IDM_ADVISEMIN
pApp->m_cfAdvise=(UINT)(wID-IDM_ADVISEMIN);
fe.cfFormat=pApp->m_cfAdvise;
pApp->m_pIDataObject->DAdvise(&fe, ADVF_NODATA
, pApp->m_pIAdviseSink, &pApp->m_dwConn);
break;
case IDM_ADVISEGETDATA:
pApp->m_fGetData=!pApp->m_fGetData;
CheckMenuItem(hMenu, wID, pApp->m_fGetData
? MF_CHECKED : MF_UNCHECKED);
break;
case IDM_ADVISEREPAINT:
pApp->m_fRepaint=!pApp->m_fRepaint;
CheckMenuItem(hMenu, wID, pApp->m_fRepaint
? MF_CHECKED : MF_UNCHECKED);
break;
default:
break;
}
break;
default:
return (DefWindowProc(hWnd, iMsg, wParam, lParam));
}
return 0L;
}
/*
* CApp::CApp
* CApp::~CApp
*
* Constructor Parameters: (from WinMain)
* hInst HINSTANCE of the application.
* hInstPrev HINSTANCE of a previous instance.
* nCmdShow UINT specifying how to show the app window.
*/
CApp::CApp(HINSTANCE hInst, HINSTANCE hInstPrev
, UINT nCmdShow)
{
m_hInst=hInst;
m_hInstPrev=hInstPrev;
m_nCmdShow=nCmdShow;
m_hWnd=NULL;
m_fEXE=FALSE;
m_pIAdviseSink=NULL;
m_dwConn=0;
m_cfAdvise=0;
m_fGetData=FALSE;
m_fRepaint=FALSE;
m_pIDataSmall =NULL;
m_pIDataMedium=NULL;
m_pIDataLarge =NULL;
m_pIDataObject=NULL;
m_cf=0;
m_stm.tymed=TYMED_NULL;
m_stm.lpszFileName=NULL; //Initializes union to NULL
m_stm.pUnkForRelease=NULL;
m_fInitialized=FALSE;
return;
}
CApp::~CApp(void)
{
//This releases the data object interfaces and advises
FReloadDataObjects(FALSE);
ReleaseStgMedium(&m_stm);
//We called AddRef before so we could do this
ReleaseInterface(m_pIAdviseSink);
if (IsWindow(m_hWnd))
DestroyWindow(m_hWnd);
if (m_fInitialized)
CoUninitialize();
return;
}
/*
* CApp::Init
*
* Purpose:
* Initializes an CApp object by registering window classes,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -