home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / helpex.pak / HELPEX.C < prev    next >
C/C++ Source or Header  |  1997-07-23  |  13KB  |  429 lines

  1. /****************************************************************************
  2.  
  3.    PROGRAM:    HelpEx.c
  4.  
  5.    Copyright (c) 1991, 1992 Borland International, Inc.
  6.  
  7.    PURPOSE:    Illustrates calls to WinHelp and context-sensitive help.
  8.          HelpEx loads library MenuHook, which detects F1 keystrokes in
  9.          the HelpEx application menus.
  10.  
  11.    FUNCTIONS:
  12.  
  13.    WinMain() - Calls initialization function, processes message loop.
  14.    InitApplication() - Initializes window data and registers window class.
  15.    InitInstance() - Saves instance handle and creates main window.
  16.    MainWndProc() - Processes window messages.
  17.    About() - Processes messages for "About" dialog box.
  18.    MakeHelpPathName() - Derives path name of help file.
  19.  
  20. ****************************************************************************/
  21.  
  22. #define  STRICT
  23. #include <windows.h>
  24. #pragma hdrstop
  25. #include "helpex.h"
  26. #include "helpids.h"
  27. #include <windowsx.h>
  28.  
  29. HWND       hWnd;               /* Handle to main window */
  30. HINSTANCE  hInst;              /* Handle to instance data*/
  31. BOOL       bHelp = FALSE;      /* Help mode flag; TRUE = "ON"*/
  32. HCURSOR    hHelpCursor;        /* Cursor displayed when in help mode*/
  33. char       szHelpFileName[EXE_NAME_MAX_SIZE+1];    /* Help file name*/
  34. HACCEL     hAccTable;                              /* handle to accelerator table */
  35.  
  36. void MakeHelpPathName(char*);  /* Function deriving help file path */
  37.  
  38.  
  39. /****************************************************************************
  40.  
  41.    FUNCTION:   WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
  42.  
  43.    PURPOSE:    Calls initialization function, processes message loop.
  44.  
  45. ****************************************************************************/
  46. #pragma argsused
  47.  
  48. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  49.                    LPSTR lpCmdLine, int nCmdShow)
  50. {
  51.    MSG msg;
  52.  
  53.    if (!hPrevInstance)
  54.        if (!InitApplication(hInstance))
  55.        return (FALSE);
  56.  
  57.    if (!InitInstance(hInstance, nCmdShow))
  58.        return (FALSE);
  59.  
  60.    while (GetMessage(&msg, NULL, 0, 0)) {
  61.  
  62.       /* Only translate message if it is not an accelerator message */
  63.       if (!TranslateAccelerator(hWnd, hAccTable, &msg)) {
  64.  
  65.           TranslateMessage(&msg);
  66.           DispatchMessage(&msg);
  67.       }
  68.    }
  69.    return (msg.wParam);
  70. }
  71.  
  72.  
  73. /****************************************************************************
  74.  
  75.    FUNCTION:   InitApplication(HINSTANCE)
  76.  
  77.    PURPOSE:    Initializes window data and registers window class.
  78.  
  79.    RETURNS:    Status of RegisterClass() call.
  80.  
  81. ****************************************************************************/
  82.  
  83. BOOL InitApplication(HINSTANCE hInstance)
  84. {
  85.    WNDCLASS wc;
  86.  
  87.    wc.style = 0;
  88.    wc.lpfnWndProc = MainWndProc;
  89.    wc.cbClsExtra = 0;
  90.    wc.cbWndExtra = 0;
  91.    wc.hInstance = hInstance;
  92.    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  93.    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  94.    wc.hbrBackground = GetStockObject(WHITE_BRUSH);
  95.    wc.lpszMenuName ="HelpexMenu";
  96.    wc.lpszClassName = "HelpexWClass";
  97.  
  98.    return (RegisterClass(&wc));
  99. }
  100.  
  101.  
  102. /****************************************************************************
  103.  
  104.    FUNCTION:   InitInstance(HINSTANCE, int)
  105.  
  106.    PURPOSE:    Saves instance handle in global variable and creates main
  107.                window.
  108.  
  109.    RETURNS:    Status of CreateWindow() call.
  110.  
  111. ****************************************************************************/
  112.  
  113. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  114. {
  115.  
  116.    hInst = hInstance;
  117.  
  118.    hAccTable = LoadAccelerators(hInst, "HelpexAcc");
  119.  
  120.    hWnd = CreateWindow(
  121.        "HelpexWClass",
  122.        "Help Example ",
  123.        WS_OVERLAPPEDWINDOW,
  124.        CW_USEDEFAULT,
  125.        CW_USEDEFAULT,
  126.        CW_USEDEFAULT,
  127.        CW_USEDEFAULT,
  128.        NULL,
  129.        NULL,
  130.        hInstance,
  131.        NULL
  132.        );
  133.  
  134.    if (!hWnd)
  135.        return (FALSE);
  136.  
  137.    ShowWindow(hWnd, nCmdShow);
  138.    UpdateWindow(hWnd);
  139.  
  140.    EnableMenuItem(GetSubMenu(GetMenu(hWnd), 1), IDM_CLEAR, MF_ENABLED);
  141.  
  142.    MakeHelpPathName(szHelpFileName);
  143.    hHelpCursor = LoadCursor(hInst,"HelpCursor");
  144.  
  145.    return (TRUE);
  146.  
  147. }
  148.  
  149. /****************************************************************************
  150.  
  151.    FUNCTION:   MainWndProc(HWND, UINT, WORD, LONG)
  152.  
  153.    PURPOSE:    Processes window messages.
  154.  
  155.    MESSAGES:
  156.  
  157.        WM_COMMAND- Application menu item
  158.        WM_DESTROY- Destroy window
  159.  
  160. ****************************************************************************/
  161.  
  162. #pragma warn -eff
  163. LRESULT CALLBACK _export MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  164. {
  165.    DLGPROC lpProcAbout;
  166.    DWORD   dwHelpContextId;
  167.  
  168.    switch (message) {
  169.  
  170.        case WM_COMMAND:
  171.            /* Was F1 just pressed in a menu, or are we in help mode */
  172.            /* (Shift-F1)? */
  173.  
  174.      if (bHelp) {
  175.          UINT  id = GET_WM_COMMAND_ID(wParam, lParam);
  176.  
  177.          dwHelpContextId =
  178.        (id == IDM_NEW)    ? (DWORD) HELPID_FILE_NEW     :
  179.        (id == IDM_OPEN)   ? (DWORD) HELPID_FILE_OPEN    :
  180.        (id == IDM_SAVE)   ? (DWORD) HELPID_FILE_SAVE    :
  181.        (id == IDM_SAVEAS) ? (DWORD) HELPID_FILE_SAVE_AS :
  182.        (id == IDM_PRINT)  ? (DWORD) HELPID_FILE_PRINT   :
  183.        (id == IDM_EXIT)   ? (DWORD) HELPID_FILE_EXIT    :
  184.        (id == IDM_UNDO)   ? (DWORD) HELPID_EDIT_UNDO    :
  185.        (id == IDM_CUT)    ? (DWORD) HELPID_EDIT_CUT     :
  186.        (id == IDM_CLEAR)  ? (DWORD) HELPID_EDIT_CLEAR   :
  187.        (id == IDM_COPY)   ? (DWORD) HELPID_EDIT_COPY    :
  188.        (id == IDM_PASTE)  ? (DWORD) HELPID_EDIT_PASTE   :
  189.               (DWORD) 0L;
  190.  
  191.          if (!dwHelpContextId)
  192.          {
  193.        MessageBox( hWnd, "Help not available for Help Menu item",
  194.              "Help Example", MB_OK                          );
  195.        return (DefWindowProc(hWnd, message, wParam, lParam));
  196.          }
  197.  
  198.          bHelp = FALSE;
  199.          WinHelp(hWnd,szHelpFileName,HELP_CONTEXT,dwHelpContextId);
  200.          break;
  201.      }
  202.  
  203.      switch (GET_WM_COMMAND_ID(wParam, lParam)) {
  204.          case IDM_NEW:
  205.          case IDM_OPEN:
  206.          case IDM_SAVE:
  207.          case IDM_SAVEAS:
  208.          case IDM_PRINT:
  209.          case IDM_UNDO:
  210.          case IDM_CUT:
  211.          case IDM_CLEAR:
  212.          case IDM_COPY:
  213.          case IDM_PASTE:
  214.        MessageBox(hWnd,
  215.        "Command not implemented",
  216.        "Help Example",
  217.        MB_OK);
  218.        break;
  219.  
  220.          case IDM_EXIT:
  221.         DestroyWindow(hWnd);
  222.         break;
  223.  
  224.          case IDM_HELP_INDEX:
  225.        WinHelp(hWnd,szHelpFileName,HELP_INDEX,0L);
  226.        break;
  227.  
  228.          case IDM_HELP_KEYBOARD:
  229.        WinHelp(hWnd,szHelpFileName,HELP_KEY,(DWORD)(LPSTR)"keys");
  230.        break;
  231.  
  232.          case IDM_HELP_HELP:
  233.        WinHelp(hWnd,"WINHELP.HLP",HELP_INDEX,0L);
  234.        break;
  235.  
  236.          case IDM_ABOUT:
  237.        lpProcAbout = (DLGPROC)MakeProcInstance((FARPROC)About, hInst);
  238.        DialogBox(hInst,
  239.            "AboutBox",
  240.            hWnd,
  241.            lpProcAbout);
  242.        FreeProcInstance((FARPROC)lpProcAbout);
  243.        break;
  244.  
  245.          default:
  246.        return (DefWindowProc(hWnd, message, wParam, lParam));
  247.      }
  248.  
  249.      break;
  250.  
  251.        case WM_LBUTTONDOWN:
  252.      if (bHelp)
  253.      {
  254.          bHelp = FALSE;
  255.          WinHelp( hWnd, szHelpFileName, HELP_CONTEXT,
  256.       (DWORD) HELPID_EDIT_WINDOW          );
  257.          break;
  258.      }
  259.  
  260.            return (DefWindowProc(hWnd, message, wParam, lParam));
  261.  
  262.        case WM_NCLBUTTONDOWN:
  263.            /* If we are in help mode (Shift-F1) then display context- */
  264.            /* sensitive help for non-client area. */
  265.  
  266.            if (bHelp) {
  267.                dwHelpContextId =
  268.                    (wParam == HTCAPTION)     ? (DWORD) HELPID_TITLE_BAR     :
  269.                    (wParam == HTREDUCE)      ? (DWORD) HELPID_MINIMIZE_ICON :
  270.                    (wParam == HTZOOM)        ? (DWORD) HELPID_MAXIMIZE_ICON :
  271.                    (wParam == HTSYSMENU)     ? (DWORD) HELPID_SYSTEM_MENU   :
  272.                    (wParam == HTBOTTOM)      ? (DWORD) HELPID_SIZING_BORDER :
  273.                    (wParam == HTBOTTOMLEFT)  ? (DWORD) HELPID_SIZING_BORDER :
  274.                    (wParam == HTBOTTOMRIGHT) ? (DWORD) HELPID_SIZING_BORDER :
  275.                    (wParam == HTTOP)         ? (DWORD) HELPID_SIZING_BORDER :
  276.                    (wParam == HTLEFT)        ? (DWORD) HELPID_SIZING_BORDER :
  277.                    (wParam == HTRIGHT)       ? (DWORD) HELPID_SIZING_BORDER :
  278.                    (wParam == HTTOPLEFT)     ? (DWORD) HELPID_SIZING_BORDER :
  279.                    (wParam == HTTOPRIGHT)    ? (DWORD) HELPID_SIZING_BORDER :
  280.                                                (DWORD) 0L;
  281.  
  282.                if (!((BOOL)dwHelpContextId))
  283.                    return (DefWindowProc(hWnd, message, wParam, lParam));
  284.  
  285.                bHelp = FALSE;
  286.                WinHelp(hWnd,szHelpFileName,HELP_CONTEXT,dwHelpContextId);
  287.                break;
  288.            }
  289.  
  290.            return (DefWindowProc(hWnd, message, wParam, lParam));
  291.  
  292.        case WM_KEYDOWN:
  293.            if (wParam == VK_F1) {
  294.  
  295.                /* If Shift-F1, turn help mode on and set help cursor */
  296.  
  297.                if (GetKeyState(VK_SHIFT)<0) {
  298.                    bHelp = TRUE;
  299.                    SetCursor(hHelpCursor);
  300.                    return (DefWindowProc(hWnd, message, wParam, lParam));
  301.                }
  302.  
  303.                /* If F1 without shift, then call up help main index topic */
  304.                else {
  305.                    WinHelp(hWnd,szHelpFileName,HELP_INDEX,0L);
  306.                }
  307.            }
  308.  
  309.            else if (wParam == VK_ESCAPE && bHelp) {
  310.  
  311.                /* Escape during help mode: turn help mode off */
  312.                bHelp = FALSE;
  313.              #if defined(__WIN32__)
  314.                SetCursor((HCURSOR)GetClassLong(hWnd,GCL_HCURSOR));
  315.              #else
  316.                SetCursor((HCURSOR)GetClassWord(hWnd,GCW_HCURSOR));
  317.              #endif
  318.            }
  319.  
  320.            break;
  321.  
  322.        case WM_SETCURSOR:
  323.            /* In help mode it is necessary to reset the cursor in response */
  324.            /* to every WM_SETCURSOR message.Otherwise, by default, Windows */
  325.            /* will reset the cursor to that of the window class. */
  326.  
  327.            if (bHelp) {
  328.                SetCursor(hHelpCursor);
  329.                break;
  330.            }
  331.            return (DefWindowProc(hWnd, message, wParam, lParam));
  332.  
  333.        case WM_INITMENU:
  334.            if (bHelp) {
  335.                SetCursor(hHelpCursor);
  336.            }
  337.            return (TRUE);
  338.  
  339.        case WM_ENTERIDLE:
  340.            if ((wParam == MSGF_MENU) && (GetKeyState(VK_F1) & 0x8000)) {
  341.                bHelp = TRUE;
  342.                PostMessage(hWnd, WM_KEYDOWN, VK_RETURN, 0L);
  343.            }
  344.            break;
  345.  
  346.        case WM_DESTROY:
  347.            WinHelp(hWnd,szHelpFileName,HELP_QUIT,0L);
  348.            PostQuitMessage(0);
  349.            break;
  350.  
  351.        default:
  352.            return (DefWindowProc(hWnd, message, wParam, lParam));
  353.    }
  354.  
  355.    return 0L;
  356. }
  357. #pragma warn .eff
  358.  
  359. /****************************************************************************
  360.  
  361.    FUNCTION:   About(HWND, UINT, WORD, LONG)
  362.  
  363.    PURPOSE:    Processes messages for "About" dialog box
  364.  
  365.    MESSAGES:
  366.  
  367.        WM_INITDIALOG - Initialize dialog box
  368.        WM_COMMAND- Input received
  369.  
  370. ****************************************************************************/
  371. #pragma argsused
  372.  
  373. BOOL FAR PASCAL _export About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  374. {
  375.    switch (message) {
  376.        case WM_INITDIALOG:
  377.            return (TRUE);
  378.  
  379.        case WM_COMMAND:
  380.      if (GET_WM_COMMAND_ID(wParam, lParam) == IDOK) {
  381.                EndDialog(hDlg, TRUE);
  382.                return (TRUE);
  383.            }
  384.            break;
  385.    }
  386.  
  387.    return (FALSE);
  388. }
  389.  
  390.  
  391. /****************************************************************************
  392.  
  393.    FUNCTION:   MakeHelpPathName
  394.  
  395.    PURPOSE:    HelpEx assumes that the .HLP help file is in the same
  396.                directory as the HelpEx executable.This function derives
  397.                the full path name of the help file from the path of the
  398.                executable.
  399.  
  400. ****************************************************************************/
  401.  
  402. void MakeHelpPathName(char* szFileName)
  403. {
  404.    char *  pcFileName;
  405.    int     nFileNameLen;
  406.  
  407.    nFileNameLen = GetModuleFileName(hInst,szFileName,EXE_NAME_MAX_SIZE);
  408.    pcFileName = szFileName + nFileNameLen;
  409.  
  410.    while (pcFileName > szFileName) {
  411.        if (*pcFileName == '\\' || *pcFileName == ':') {
  412.            *(++pcFileName) = '\0';
  413.            break;
  414.        }
  415.    nFileNameLen--;
  416.    pcFileName--;
  417.    }
  418.  
  419.    if ((nFileNameLen+13) < EXE_NAME_MAX_SIZE) {
  420.        lstrcat(szFileName, "helpex.hlp");
  421.    }
  422.  
  423.    else {
  424.        lstrcat(szFileName, "?");
  425.    }
  426.  
  427.    return;
  428. }
  429.