// 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; } } }