2020-09-30 17:12:29 +02:00

238 lines
5.7 KiB
C++

// callwinh.cpp : implementation file
//
#include "stdafx.h"
#include "callwinh.h"
#include "..\common\waitcur.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
static CString* m_pcszHelpFile;
typedef struct {
PCSTR psz;
UINT value;
} HELP_MAPPING;
static HELP_MAPPING help_map[] = {
{ "HELP_CONTEXT", 0x0001 },
{ "HELP_CONTENTS", 0x0001 },
{ "HELP_CONTEXTPOPUP", 0x0008 },
{ "HELP_FORCEFILE", 0x0009 },
{ "HELP_KEY", 0x0101 },
{ "HELP_COMMAND", 0x0102 },
{ "HELP_PARTIALKEY", 0x0105 },
{ "HELP_FINDER", 0x000b },
{ "HELP_SETPOPUP_POS", 0x000d },
{ "HELP_SETCONTENTS", 0x0005 },
#ifdef _DEBUG
{ "HELP_FORCE_GID", 0x000e },
{ "HELP_HASH", 0x0095 },
{ "HELP_HASH_POPUP", 0x0096 },
{ "HELP_HELPONHELP", 0x0004 },
{ "HELP_MULTIKEY", 0x0201 },
{ "HELP_SETWINPOS", 0x0203 },
{ "HELP_TOPIC_ID", 0x0103 },
{ "HELP_TOPIC_ID_POPUP",0x0104 },
#endif
{ NULL, 0 }
};
/////////////////////////////////////////////////////////////////////////////
// CCallWinHelpAPI dialog
BEGIN_MESSAGE_MAP(CCallWinHelpAPI, CDialog)
//{{AFX_MSG_MAP(CCallWinHelpAPI)
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
ON_CBN_SELCHANGE(IDC_COMBO_COMMAND, OnSelchangeComboWindows)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_CONTEXTMENU, OnContextMenu)
ON_MESSAGE(WM_HELP, OnHelp)
END_MESSAGE_MAP()
CCallWinHelpAPI::CCallWinHelpAPI(CString* pcszHelpFile, UINT* pcomamnd,
CString* pcszData, CWnd* pParent /*=NULL*/)
: CDialog(CCallWinHelpAPI::IDD, pParent)
{
m_pcszHelpFile = pcszHelpFile;
m_pcommand = pcomamnd;
m_pcszData = pcszData;
//{{AFX_DATA_INIT(CCallWinHelpAPI)
//}}AFX_DATA_INIT
}
void CCallWinHelpAPI::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCallWinHelpAPI)
//}}AFX_DATA_MAP
DDX_CBString(pDX, IDC_EDIT_DATA, *m_pcszData);
DDX_CBIndex(pDX, IDC_COMBO_COMMAND, (int&) *m_pcommand);
DDX_CBString(pDX, IDC_COMBO_HELP_FILES, *m_pcszHelpFile);
DDV_MaxChars(pDX, *m_pcszHelpFile, MAX_PATH);
if (pDX->m_bSaveAndValidate) {
// Convert position to a command
*m_pcommand = help_map[*m_pcommand].value;
}
}
BOOL CCallWinHelpAPI::OnInitDialog()
{
UINT pos;
CWaitCursor wait;
SetChicagoDialogStyles(m_hWnd);
// Convert command to a position
for (pos = 0; help_map[pos].psz; pos++) {
if (help_map[pos].value == *m_pcommand) {
*m_pcommand = pos;
break;
}
}
CDialog::OnInitDialog();
CComboBox* pcombo;
pcombo = (CComboBox*) GetDlgItem(IDC_COMBO_HELP_FILES);
phlpFile->FillComboBox(pcombo);
// If a filename wasn't specified when we were called, then
// select the first filename in our list, which will be the
// last filename compiled.
if (m_pcszHelpFile->IsEmpty())
pcombo->SetCurSel(0);
else
pcombo->SetWindowText(*m_pcszHelpFile);
pcombo = (CComboBox*) GetDlgItem(IDC_COMBO_COMMAND);
for (pos = 0; help_map[pos].psz; pos++)
pcombo->AddString(help_map[pos].psz);
pcombo->SetCurSel(*m_pcommand);
((CEdit*) GetDlgItem(IDC_EDIT_DATA))->SetWindowText(*m_pcszData);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CCallWinHelpAPI message handlers
void CCallWinHelpAPI::OnBrowse()
{
ASSERT(StrRChr(GetStringResource(IDS_EXT_HLP), '.', _fDBCSSystem));
CStr cszExt(StrRChr(GetStringResource(IDS_EXT_HLP), '.', _fDBCSSystem));
CFileDialog cfdlg(TRUE, cszExt, NULL,
OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST,
GetStringResource(IDS_HLP_EXTENSION));
if (cfdlg.DoModal() == IDOK) {
/*
* Contrary to the docs, the extension is not always added,
* so we make sure it gets added here.
*/
char szFile[_MAX_PATH];
strcpy(szFile, cfdlg.GetPathName());
PSTR psz = StrRChr(szFile, '.', _fDBCSSystem);
if (!psz)
ChangeExtension(szFile, cszExt);
((CComboBox*) GetDlgItem(IDC_COMBO_HELP_FILES))->
SetWindowText(cfdlg.GetPathName());
}
}
static const DWORD aHelpIds[] = {
IDC_COMBO_HELP_FILES, IDH_COMBO_CALL_API_HELP,
IDC_BROWSE, IDH_BTN_BROWSE_CALL_API,
IDC_COMBO_COMMAND, IDH_COMBO_CALL_API_COMMAND,
IDC_EDIT_DATA, IDH_COMBO_CALL_API_DWDATA,
IDOK, IDH_BTN_CALL_API_START,
0, 0
};
LRESULT CCallWinHelpAPI::OnContextMenu(WPARAM wParam, LPARAM lParam)
{
::WinHelp((HWND) wParam,
AfxGetApp()->m_pszHelpFilePath,
HELP_CONTEXTMENU, (DWORD) (LPVOID) aHelpIds);
return 0;
}
LRESULT CCallWinHelpAPI::OnHelp(WPARAM wParam, LPARAM lParam)
{
::WinHelp((HWND) ((LPHELPINFO) lParam)->hItemHandle,
AfxGetApp()->m_pszHelpFilePath,
HELP_WM_HELP, (DWORD) (LPVOID) aHelpIds);
return 0;
}
#ifndef HELP_FORCE_GID
#define HELP_FORCE_GID 0x000e // undocumented in 4.0
#endif
void CCallWinHelpAPI::OnSelchangeComboWindows()
{
int iSelected = ((CComboBox*) GetDlgItem(IDC_COMBO_COMMAND))->
GetCurSel();
if (iSelected != -1) {
switch (help_map[iSelected].value) {
default:
((CStatic*) GetDlgItem(IDC_DATA))->
SetWindowText(GetStringResource(IDS_DATA_DEFAULT));
break;
case HELP_CONTEXT:
((CStatic*) GetDlgItem(IDC_DATA))->
SetWindowText(GetStringResource(IDS_DATA_CONTEXT));
break;
case HELP_KEY:
case HELP_PARTIALKEY:
((CStatic*) GetDlgItem(IDC_DATA))->
SetWindowText(GetStringResource(IDS_DATA_KEYWORD));
break;
case HELP_COMMAND:
((CStatic*) GetDlgItem(IDC_DATA))->
SetWindowText(GetStringResource(IDS_DATA_COMMAND));
break;
case HELP_MULTIKEY:
((CStatic*) GetDlgItem(IDC_DATA))->
SetWindowText(GetStringResource(IDS_DATA_MULTIKEY));
break;
case HELP_SETWINPOS:
((CStatic*) GetDlgItem(IDC_DATA))->
SetWindowText(GetStringResource(IDS_DATA_WIN_POS));
break;
case HELP_HELPONHELP:
case HELP_FORCE_GID:
case HELP_FINDER:
case HELP_FORCEFILE:
((CStatic*) GetDlgItem(IDC_DATA))->
SetWindowText(GetStringResource(IDS_DATA_IGNORE));
break;
}
}
}