mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
502 lines
14 KiB
502 lines
14 KiB
//**********************************************************************
|
|
// 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);
|
|
}
|
|
|
|
|