WindowsXP-SP1/com/oleutest/simpdnd/simpdnd.cpp
2020-09-30 16:53:49 +02:00

503 lines
15 KiB
C++

//**********************************************************************
// File name: Simple.cpp
//
// Main source file for the Simple OLE 2.0 object container
//
// Functions:
//
// WinMain - Program entry point
// MainWndProc - Processes messages for the frame window
// About - Processes messages for the about dialog
// DocWndProc - Processes messages for the doc window
//
// Copyright (c) 1992 - 1993 Microsoft Corporation. All rights reserved.
//**********************************************************************
#include "pre.h"
#include "iocs.h"
#include "ias.h"
#include "app.h"
#include "site.h"
#include "doc.h"
#include <stdlib.h>
#include <testmess.h>
#include "tests.h"
// This line is needed for the debug utilities in OLE2UI
extern "C" {
OLEDBGDATA_MAIN(TEXT("SIMPDND"))
}
CSimpleApp FAR * lpCSimpleApp;
BOOL fBeVerbose = FALSE;
extern "C"
void TestDebugOut(LPSTR psz)
{
if (fBeVerbose)
{
OutputDebugStringA(psz);
}
}
BOOL gfUseEmptyEnumerator;
//**********************************************************************
//
// WinMain
//
// Purpose:
//
// Program entry point
//
// Parameters:
//
// HANDLE hInstance - Instance handle for this instance
//
// HANDLE hPrevInstance - Instance handle for the last instance
//
// LPSTR lpCmdLine - Pointer to the command line
//
// int nCmdShow - Window State
//
// Return Value:
//
// msg.wParam or FALSE if failure to initialize
//
// Function Calls:
// Function Location
//
// CSimpleApp::CSimpleApp APP.CPP
// CSimpleApp::fInitApplication APP.CPP
// CSimpleApp::fInitInstance APP.CPP
// CSimpleApp::~CSimpleApp APP.CPP
// CSimpleApp::AddRef APP.CPP
// CSimpleApp::Release APP.CPP
// OleUIInitialize OLE2UI
// OleUIUninitialize OLE2UI
// GetMessage Windows API
// SetMessageQueue Windows API
// MessageBox Windows API
// TranslateMessage Windows API
// DispatchMessage Windows API
//
//
//********************************************************************
int PASCAL WinMain
#ifdef WIN32
(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nCmdShow)
#else
(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
#endif
{
MSG msg;
LPSTR pszTemp;
fBeVerbose = GetProfileInt("OLEUTEST","BeVerbose",0);
if(fBeVerbose == 0)
{
fBeVerbose = GetProfileInt("OLEUTEST","simpdnd",0);
}
// needed for LRPC to work properly...
SetMessageQueue(96);
lpCSimpleApp = new CSimpleApp;
if (!lpCSimpleApp)
{
/* memory allocation problem. We cannot carry on.
*/
MessageBox(NULL, TEXT("Out of Memory"), TEXT("SimpDnD"),
MB_SYSTEMMODAL | MB_ICONHAND);
return(FALSE);
}
// we will add one ref count on our App. later when we want to destroy
// the App object we will release this ref count. when the App's ref
// count goes to 0, it will be deleted.
lpCSimpleApp->AddRef();
// process the command line
if( (pszTemp = strstr(lpCmdLine, "-driver")) )
{
//we were launched by the test driver
lpCSimpleApp->m_hDriverWnd = (HWND)strtoul(pszTemp+8, NULL, 10);
}
// check for the -empty flag (use empty enumerator)
if( strstr(lpCmdLine, "-empty") )
{
gfUseEmptyEnumerator = TRUE;
}
// app initialization
if (!hPrevInstance)
if (!lpCSimpleApp->fInitApplication(hInstance))
{
lpCSimpleApp->Release();
return (FALSE);
}
// instance initialization
if (!lpCSimpleApp->fInitInstance(hInstance, nCmdShow))
{
lpCSimpleApp->Release();
return (FALSE);
}
#if 0
/* Initialization required for OLE 2 UI library. This call is
** needed ONLY if we are using the static link version of the UI
** library. If we are using the DLL version, we should NOT call
** this function in our application.
*/
if (!OleUIInitialize(hInstance, hPrevInstance, TEXT(SZCLASSICONBOX),
TEXT(SZCLASSRESULTIMAGE)))
{
OleDbgOut(TEXT("Could not initialize OLEUI library\n"));
lpCSimpleApp->Release();
return FALSE;
}
#endif
// message loop
while (GetMessage(&msg, NULL, NULL, NULL))
if (!lpCSimpleApp->HandleAccelerators(&msg))
{
TranslateMessage(&msg); /* Translates virtual key codes */
DispatchMessage(&msg); /* Dispatches message to window */
}
#if 0
// De-initialization for UI libraries. Just like OleUIInitialize, this
// funciton is needed ONLY if we are using the static link version of the
// OLE UI library.
OleUIUninitialize();
#endif
// Release the ref count added on the App above. this will make
// the App's ref count go to 0, and the App object will be deleted.
lpCSimpleApp->Release();
return (msg.wParam); /* Returns the value from PostQuitMessage */
}
//**********************************************************************
//
// MainWndProc
//
// Purpose:
//
// Processes messages for the frame window
//
// Parameters:
//
// HWND hWnd - Window handle for frame window
//
// UINT message - Message value
//
// WPARAM wParam - Message info
//
// LPARAM lParam - Message info
//
// Return Value:
//
// LRESULT
//
// Function Calls:
// Function Location
//
// CSimpleApp::lCommandHandler APP.CPP
// CSimpleApp::DestroyDocs APP.CPP
// CSimpleApp::lCreateDoc APP.CPP
// CSimpleApp::lSizeHandler APP.CPP
// CSimpleDoc::lAddVerbs DOC.CPP
// PostQuitMessage Windows API
// DefWindowProc Windows API
// DestroyWindow Windows API
//
//
//********************************************************************
LRESULT FAR PASCAL EXPORT MainWndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_TEST2:
StartTest2(lpCSimpleApp);
break;
case WM_TEST1:
StartTest1(lpCSimpleApp);
break;
case WM_CLOSE:
DestroyWindow(lpCSimpleApp->m_hAppWnd);
break;
case WM_COMMAND: // message: command from application menu
return lpCSimpleApp->lCommandHandler(hWnd, message, wParam,
lParam);
break;
case WM_CREATE:
#ifdef NOTREADY
RemoveMenu(GetSubMenu(GetMenu(hWnd), 1), 0, MF_BYPOSITION);
#endif // NOTREADY
return lpCSimpleApp->lCreateDoc(hWnd, message, wParam, lParam);
break;
case WM_DESTROY: // message: window being destroyed
lpCSimpleApp->DestroyDocs(); // need to destroy the doc...
PostQuitMessage(0);
break;
case WM_INITMENUPOPUP:
// is this the edit menu?
if ( LOWORD(lParam) == 1)
return lpCSimpleApp->m_lpDoc->lAddVerbs();
break;
case WM_SIZE:
return lpCSimpleApp->lSizeHandler(hWnd, message, wParam, lParam);
default: // Passes it on if unproccessed
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (NULL);
}
//**********************************************************************
//
// About
//
// Purpose:
//
// Processes dialog box messages
//
// Parameters:
//
// HWND hWnd - Window handle for dialog box
//
// UINT message - Message value
//
// WPARAM wParam - Message info
//
// LPARAM lParam - Message info
//
// Return Value:
//
// Function Calls:
// Function Location
//
// EndDialog Windows API
//
//
//********************************************************************
INT_PTR
#ifdef WIN32
CALLBACK
#else
FAR PASCAL EXPORT
#endif
About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG: /* message: initialize dialog box */
return (TRUE);
case WM_COMMAND: /* message: received a command */
if (wParam == IDOK /* "OK" box selected? */
|| wParam == IDCANCEL) /* System menu close command? */
{
EndDialog(hDlg, TRUE); /* Exits the dialog box */
return (TRUE);
}
break;
}
return (FALSE); /* Didn't process a message */
}
//**********************************************************************
//
// DocWndProc
//
// Purpose:
//
// Processes dialog box messages
//
// Parameters:
//
// HWND hWnd - Window handle for doc window
//
// UINT message - Message value
//
// WPARAM wParam - Message info
//
// LPARAM lParam - Message info
//
// Return Value:
//
// long
//
// Function Calls:
// Function Location
//
// CSimpleApp::PaintApp APP.CPP
// BeginPaint Windows API
// EndPaint Windows API
// DefWindowProc Windows API
// IOleObject::DoVerb Object
// CSimpleSite::GetObjRect SITE.CPP
// CSimpleDoc::QueryDrag DOC.CPP
// CSimpleDoc::DoDragDrop DOC.CPP
// SetTimer Windows API
// KillTimer Windows API
// SetCapture Windows API
// ReleaseCapture Windows API
//
//
//********************************************************************
LRESULT FAR PASCAL EXPORT DocWndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT ps;
switch (message)
{
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
if (lpCSimpleApp)
lpCSimpleApp->PaintApp (hDC);
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDBLCLK:
{
POINT pt;
pt.x = (int)(short)LOWORD (lParam );
pt.y = (int)(short)HIWORD (lParam );
if (lpCSimpleApp->m_lpDoc->m_lpSite &&
lpCSimpleApp->m_lpDoc->m_lpSite->m_lpOleObject)
{
RECT rect;
lpCSimpleApp->m_lpDoc->m_lpSite->GetObjRect(&rect);
if ( PtInRect(&rect, pt) )
{
// Execute object's default verb
lpCSimpleApp->m_lpDoc->m_lpSite->m_lpOleObject->DoVerb(
OLEIVERB_PRIMARY, (LPMSG)&message,
&lpCSimpleApp->m_lpDoc->m_lpSite->m_OleClientSite,
-1, hWnd, &rect);
}
}
break;
}
case WM_LBUTTONDOWN:
{
POINT pt;
pt.x = (int)(short)LOWORD (lParam );
pt.y = (int)(short)HIWORD (lParam );
/* OLE2NOTE: check if this is a button down on the region
** that is a handle to start a drag operation. for us,
** this this is any where in the window. we
** do NOT want to start a drag immediately; we want to
** wait until the mouse moves a certain threshold. or a
** certain amount of time has elapsed. if
** LButtonUp comes before the drag is started, then
** the fPendingDrag state is cleared. we must capture
** the mouse to ensure the modal state is handled
** properly.
*/
if (lpCSimpleApp->m_lpDoc->QueryDrag(pt) )
{
lpCSimpleApp->m_lpDoc->m_fPendingDrag = TRUE;
lpCSimpleApp->m_lpDoc->m_ptButDown = pt;
SetTimer(hWnd, 1, lpCSimpleApp->m_nDragDelay, NULL);
SetCapture(hWnd);
}
break;
}
case WM_LBUTTONUP:
if (lpCSimpleApp->m_lpDoc->m_fPendingDrag)
{
/* ButtonUP came BEFORE distance/time threshholds were
** exceeded. clear fPendingDrag state.
*/
ReleaseCapture();
KillTimer(hWnd, 1);
lpCSimpleApp->m_lpDoc->m_fPendingDrag = FALSE;
}
break;
case WM_MOUSEMOVE:
{
if (lpCSimpleApp->m_lpDoc->m_fPendingDrag)
{
int x = (int)(short)LOWORD (lParam );
int y = (int)(short)HIWORD (lParam );
POINT pt = lpCSimpleApp->m_lpDoc->m_ptButDown;
int nDragMinDist = lpCSimpleApp->m_nDragMinDist;
if (! ( ((pt.x - nDragMinDist) <= x)
&& (x <= (pt.x + nDragMinDist))
&& ((pt.y - nDragMinDist) <= y)
&& (y <= (pt.y + nDragMinDist)) ) )
{
// mouse moved beyond threshhold to start drag
ReleaseCapture();
KillTimer(hWnd, 1);
lpCSimpleApp->m_lpDoc->m_fPendingDrag = FALSE;
// perform the modal drag/drop operation.
lpCSimpleApp->m_lpDoc->DoDragDrop( );
}
}
break;
}
case WM_TIMER:
{
// drag time delay threshhold exceeded -- start drag
ReleaseCapture();
KillTimer(hWnd, 1);
lpCSimpleApp->m_lpDoc->m_fPendingDrag = FALSE;
// perform the modal drag/drop operation.
lpCSimpleApp->m_lpDoc->DoDragDrop( );
break;
}
default: /* Passes it on if unproccessed */
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (NULL);
}