199 lines
4.7 KiB
C
199 lines
4.7 KiB
C
/**************************************************************************
|
||
*
|
||
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
||
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
||
* PURPOSE.
|
||
*
|
||
* Copyright (c) 1992 - 1995 Microsoft Corporation. All Rights Reserved.
|
||
*
|
||
**************************************************************************/
|
||
/****************************************************************************
|
||
*
|
||
* help.c: Help system interface
|
||
*
|
||
* Vidcap32 Source code
|
||
*
|
||
***************************************************************************/
|
||
|
||
/*
|
||
* supports F1 key help in app and in dialog by installing a hook,
|
||
*
|
||
* Keep track of which dialog is currently displayed in a global:
|
||
* dialog ids are also topic ids in the help file.
|
||
*/
|
||
|
||
|
||
#include <windows.h>
|
||
#include <windowsx.h>
|
||
#include <string.h>
|
||
|
||
#include "help.h"
|
||
|
||
int CurrentDialogID = 0;
|
||
|
||
|
||
// app info passed to helpinit
|
||
HINSTANCE hInstance;
|
||
TCHAR HelpFile[MAX_PATH];
|
||
HWND hwndApp;
|
||
|
||
//hook proc and old msg filter
|
||
#ifdef _WIN32
|
||
HHOOK hOurHook;
|
||
#else
|
||
FARPROC fnOldMsgFilter = NULL;
|
||
FARPROC fnMsgHook = NULL;
|
||
#endif
|
||
|
||
|
||
// call DialogBoxParam, but ensuring correct help processing:
|
||
// assumes that each Dialog Box ID is a context number in the help file.
|
||
// calls MakeProcInstance as necessary. Uses instance data passed to
|
||
// HelpInit().
|
||
INT_PTR
|
||
DoDialog(
|
||
HWND hwndParent, // parent window
|
||
int DialogID, // dialog resource id
|
||
DLGPROC fnDialog, // dialog proc
|
||
LPARAM lParam // passed as lparam in WM_INITDIALOG
|
||
)
|
||
{
|
||
int olddialog;
|
||
DLGPROC fn;
|
||
INT_PTR result;
|
||
|
||
// remember current id (for nested dialogs)
|
||
olddialog = CurrentDialogID;
|
||
|
||
// save the current id so the hook proc knows what help to display
|
||
CurrentDialogID = DialogID;
|
||
|
||
fn = (DLGPROC) MakeProcInstance(fnDialog, hInstance);
|
||
result = DialogBoxParam(
|
||
hInstance,
|
||
MAKEINTRESOURCE(CurrentDialogID),
|
||
hwndParent,
|
||
fn,
|
||
lParam);
|
||
FreeProcInstance(fn);
|
||
CurrentDialogID = olddialog;
|
||
|
||
return result;
|
||
}
|
||
|
||
|
||
// set the help context id for a dialog displayed other than by DoDialog
|
||
// (eg by GetOpenFileName). Returns the old help context that you must
|
||
// restore by a further call to this function
|
||
int
|
||
SetCurrentHelpContext(int DialogID)
|
||
{
|
||
int oldid = CurrentDialogID;
|
||
CurrentDialogID = DialogID;
|
||
return(oldid);
|
||
}
|
||
|
||
|
||
|
||
// return TRUE if lpMsg is a non-repeat F1 key message
|
||
BOOL
|
||
IsHelpKey(LPMSG lpMsg)
|
||
{
|
||
return lpMsg->message == WM_KEYDOWN &&
|
||
lpMsg->wParam == VK_F1 &&
|
||
!(HIWORD(lpMsg->lParam) & KF_REPEAT) &&
|
||
GetKeyState(VK_SHIFT) >= 0 &&
|
||
GetKeyState(VK_CONTROL) >= 0 &&
|
||
GetKeyState(VK_MENU) >= 0;
|
||
}
|
||
|
||
|
||
|
||
LRESULT CALLBACK
|
||
HelpMsgHook(int nCode, WPARAM wParam, LPARAM lParam)
|
||
{
|
||
if (nCode >= 0) {
|
||
if (IsHelpKey((LPMSG)lParam)) {
|
||
if (CurrentDialogID != 0) {
|
||
WinHelp(hwndApp, HelpFile, HELP_CONTEXT, CurrentDialogID);
|
||
} else {
|
||
WinHelp(hwndApp, HelpFile, HELP_CONTENTS, 0);
|
||
}
|
||
}
|
||
}
|
||
#ifdef _WIN32
|
||
return CallNextHookEx(hOurHook, nCode, wParam, lParam);
|
||
#else
|
||
return DefHookProc(nCode, wParam, lParam, fnOldMsgFilter);
|
||
#endif
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
// help init - initialise the support for the F1 key help
|
||
BOOL
|
||
HelpInit(HINSTANCE hinstance, LPSTR helpfilepath, HWND hwnd)
|
||
{
|
||
LPSTR pch;
|
||
|
||
// save app details
|
||
hwndApp = hwnd;
|
||
hInstance = hinstance;
|
||
|
||
// assume that the help file is in the same directory as the executable-
|
||
// get the executable path, and replace the filename with the help
|
||
// file name.
|
||
GetModuleFileName(hinstance, HelpFile, sizeof(HelpFile));
|
||
|
||
// find the final backslash, and append the help file name there
|
||
pch = _fstrrchr(HelpFile, '\\');
|
||
pch++;
|
||
lstrcpy(pch, helpfilepath);
|
||
|
||
// install a hook for msgs and save old one
|
||
#ifdef _WIN32
|
||
hOurHook = SetWindowsHookEx(
|
||
WH_MSGFILTER,
|
||
(HOOKPROC) HelpMsgHook,
|
||
NULL, GetCurrentThreadId());
|
||
#else
|
||
fnMsgHook = (FARPROC) MakeProcInstance(HelpMsgHook, hInstance);
|
||
fnOldMsgFilter = SetWindowsHook(WH_MSGFILTER, (HOOKPROC) fnMsgHook);
|
||
#endif
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
|
||
|
||
// shutdown the help system
|
||
void
|
||
HelpShutdown(void)
|
||
{
|
||
#ifdef _WIN32
|
||
UnhookWindowsHookEx(hOurHook);
|
||
#else
|
||
if (fnOldMsgFilter) {
|
||
UnhookWindowsHook(WH_MSGFILTER, fnMsgHook);
|
||
FreeProcInstance(fnMsgHook);
|
||
}
|
||
#endif
|
||
|
||
WinHelp(hwndApp, HelpFile, HELP_QUIT, 0);
|
||
}
|
||
|
||
|
||
// start help at the contents page
|
||
void
|
||
HelpContents(void)
|
||
{
|
||
WinHelp(hwndApp, HelpFile, HELP_CONTENTS, 0);
|
||
}
|
||
|
||
|
||
|