|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1994.
//
// File: inplace.cxx
//
// Contents: Stripped-down OLE2 inplace.cpp
//
// History: 11-Apr-94 DrewB Copied from OLE2
//
//----------------------------------------------------------------------------
#include "headers.cxx"
#pragma hdrstop
#include <ole2int.h>
#include "inplace.h"
WORD wSignature; // = (WORD) {'S', 'K'};
UINT uOleMessage; #define OM_CLEAR_MENU_STATE 0 // lParam is NULL
#define OM_COMMAND_ID 1 // LOWORD(lParam) contains the command ID
OLEAPI OleTranslateAccelerator (LPOLEINPLACEFRAME lpFrame, LPOLEINPLACEFRAMEINFO lpFrameInfo, LPMSG lpMsg) { WORD cmd; BOOL fFound;
fFound = IsAccelerator(lpFrameInfo->haccel, lpFrameInfo->cAccelEntries, lpMsg, &cmd); if (!fFound && lpFrameInfo->fMDIApp) fFound = IsMDIAccelerator(lpMsg, &cmd);
if (fFound) { AssertSz(lpFrameInfo->hwndFrame, "OleTranslateAccelerator: Invalid lpFrameInfo->hwndFrame"); SendMessage(lpFrameInfo->hwndFrame, uOleMessage, OM_COMMAND_ID, MAKELONG(cmd, 0)); #ifdef _DEBUG
OutputDebugString((LPSTR)"IOleInPlaceFrame::TranslateAccelerator called\r\n"); #endif
return lpFrame->TranslateAccelerator(lpMsg, cmd); } else { if (wSysKeyToKey(lpMsg) == WM_SYSCHAR) { // Eat the message if it is "Alt -". This is supposed to bring
// MDI system menu down. But we can not support it. And we also
// don't want the message to be Translated by the object
// application either. So, we return as if it has been accepted by
// the container as an accelerator.
// If the container wants to support this it can have an
// accelerator for this. This is not an issue for SDI apps,
// because it will be thrown away by USER anyway.
if (lpMsg->wParam != '-') SendMessage(lpFrameInfo->hwndFrame, lpMsg->message, lpMsg->wParam, lpMsg->lParam); #ifdef _DEBUG
else OutputDebugString((LPSTR)"OleTranslateAccelerator: Alt+ - key is discarded\r\n"); #endif
return NOERROR; } } return ResultFromScode(S_FALSE); }
inline UINT wSysKeyToKey(LPMSG lpMsg) { UINT message = lpMsg->message; // if the ALT key is down when a key is pressed, then the 29th bit of the
// LPARAM will be set
// If the message was not made with the ALT key down, convert the message
// from a WM_SYSKEY* to a WM_KEY* message.
if (!(HIWORD(lpMsg->lParam) & 0x2000) && (message >= WM_SYSKEYDOWN && message <= WM_SYSDEADCHAR)) message -= (WM_SYSKEYDOWN - WM_KEYDOWN); return message; }
OLEAPI_(BOOL) IsAccelerator (HACCEL hAccel, int cAccelEntries, LPMSG lpMsg, WORD FAR* lpwCmd) { WORD cmd = NULL; WORD flags; BOOL fFound = FALSE; BOOL fVirt; LPACCEL lpAccel = NULL; UINT message;
message = wSysKeyToKey(lpMsg);
switch (message) { case WM_KEYDOWN: case WM_SYSKEYDOWN: fVirt = TRUE; break;
case WM_CHAR: case WM_SYSCHAR: fVirt = FALSE; break;
default: goto errRtn; }
if (! (hAccel && (lpAccel = (LPACCEL) LockResource(hAccel)))) goto errRtn;
if (! cAccelEntries) goto errRtn; do { flags = lpAccel->fVirt; if ((lpAccel->key != (WORD) lpMsg->wParam) || ((fVirt != 0) != ((flags & FVIRTKEY) != 0))) goto Next;
if (fVirt) { if ((GetKeyState(VK_SHIFT) < 0) != ((flags & FSHIFT) != 0)) goto Next; if ((GetKeyState(VK_CONTROL) < 0) != ((flags & FCONTROL) != 0)) goto Next; }
if ((GetKeyState(VK_MENU) < 0) != ((flags & FALT) != 0)) goto Next;
if (cmd = lpAccel->cmd) fFound = TRUE;
goto errRtn; Next: lpAccel++;
} while (--cAccelEntries); errRtn: if (lpAccel) UnlockResource(hAccel); if (lpwCmd) *lpwCmd = cmd;
return fFound; }
BOOL IsMDIAccelerator(LPMSG lpMsg, WORD FAR* lpCmd) { if (lpMsg->message != WM_KEYDOWN && lpMsg->message != WM_SYSKEYDOWN) return FALSE;
/* All of these have the control key down */ if (GetKeyState(VK_CONTROL) >= 0) return FALSE;
if (GetKeyState(VK_MENU) < 0) return FALSE;
switch ((WORD)lpMsg->wParam) { case VK_F4: *lpCmd = SC_CLOSE;
case VK_F6: case VK_TAB: if (GetKeyState(VK_SHIFT) < 0) *lpCmd = SC_PREVWINDOW; else *lpCmd = SC_NEXTWINDOW; break; default: return FALSE; }
return TRUE; }
LPOLEMENU wGetOleMenuPtr(HOLEMENU holemenu) { LPOLEMENU lpOleMenu; if (! (holemenu && (lpOleMenu = (LPOLEMENU) GlobalLock((HGLOBAL) holemenu)))) return NULL; if (lpOleMenu->wSignature != wSignature) { AssertSz(FALSE, "Error - handle is not a HOLEMENU"); GlobalUnlock((HGLOBAL) holemenu); return NULL; } return lpOleMenu; }
inline void wReleaseOleMenuPtr(HOLEMENU holemenu) { GlobalUnlock((HGLOBAL) holemenu); }
|