home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / wpj_mag / wpjv1n7.zip / HELLO.ZIP / HELLO.C < prev    next >
C/C++ Source or Header  |  1993-07-25  |  15KB  |  521 lines

  1. /*============================================================================
  2.   Hello - Windows Programmer's Journal Volume 1 Number 6
  3.  
  4.   File      : Hello.C
  5.  
  6.   Prototype : 
  7.  
  8.   Call      : 
  9.  
  10.   Library   : 
  11.  
  12.   Example   : 
  13.  
  14.   24 April 1993 - dlcampbell
  15.   1993 Dave Campbell WynApse
  16. ----------------------------------------------------------------------------*/
  17. #define WINVER 0x0300
  18. #include <windows.h>
  19. #include "hello.h"
  20. #include "fileo.h"
  21. #include <string.h>
  22.  
  23. char       szAppName[] = "Hello";
  24. HANDLE     hInst;
  25. HWND       hWndMain;
  26. HANDLE     hFileo;
  27. HICON      hIcon, hIconMain;
  28. int        InitSettings;
  29. static     HMENU hMainMenu, hAlternateMenu;
  30.  
  31. static     char szFileName[128];
  32. static     char szFileSpec[16];
  33. static     char szDefExt[5];
  34. static     WORD wFileAttr;
  35. OFSTRUCT   of;
  36. LPOFSTRUCT pof;
  37.  
  38. /*----------------------------------------------------------------------------
  39.   Function Prototypes
  40. ----------------------------------------------------------------------------*/
  41. BOOL FAR PASCAL AboutDlgProc(HWND, WORD, WORD, LONG);
  42.  
  43. BOOL FAR PASCAL HelloDlgProc(HWND, WORD, WORD, LONG);
  44. long FAR PASCAL WndProc(HWND, unsigned, WORD, LONG);
  45. BOOL            InitInstance(HANDLE);
  46. BOOL FAR PASCAL TimerProc(HWND, WORD, WORD, LONG);
  47.  
  48. void DoFileOpenDlg(void);
  49. BOOL FAR PASCAL FileOpenDlgProc(HWND, WORD, WORD, LONG);
  50. LPSTR lstrchr (LPSTR str, char ch);
  51.  
  52. /* The main procedure. This is called by Windows when your program is run. */
  53. /* hInstance is the handle for the current instance of the program         */
  54. /* hPrevInst is the handle for the last instance of the program to run     */
  55. /* CmdLine is a pointer to a string of whatever command line params came in*/
  56. /* nCmd is the specifies the applications appearance.                      */
  57.  
  58. int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInst, LPSTR CmdLine,
  59.                                                                      int nCmd)
  60. {
  61. MSG     msg;                                /* Message */
  62. HWND    hWnd;                       /* Our Window Handle */
  63. HMENU   hMenu;
  64.  
  65. if (!hPrevInst)                         /* If no instance already exists, */
  66.    {
  67.     if (!InitInstance(hInstance))       /* try initializing instance */
  68.         return FALSE;                     /* No dice, it failed */
  69.     }
  70.  
  71. hInst = hInstance;
  72.     
  73. hWndMain = CreateWindow(szAppName,              /* Window Class */
  74.                               "Hello World Program",  /* Window caption */
  75.                               WS_OVERLAPPEDWINDOW,    /* Overlapped style */
  76.                               CW_USEDEFAULT,          /* Use defaults for the */
  77.                               CW_USEDEFAULT,          /* X & Y Positions and  */
  78.                               CW_USEDEFAULT,          /* X & Y sizes */
  79.                               CW_USEDEFAULT,          
  80.                               NULL,                   /* Parent Window */
  81.                               NULL,
  82.                               hInstance,              /* Instance */
  83.                               NULL);                  /* Creation Params */
  84.  
  85. if (hWndMain == NULL)
  86.    return 0;
  87.  
  88. hFileo = LoadLibrary("FILEO.DLL");
  89. if (hFileo < 32)
  90.    {
  91.    FreeLibrary(hFileo);
  92.    MessageBox(GetFocus(),"Dynamic Link Library FILEO.DLL must be present",
  93.                                        szAppName, MB_ICONEXCLAMATION | MB_OK);
  94.    return 0;
  95.    }
  96.  
  97. SetTimer(hWndMain, ID_TIMER, 500, MakeProcInstance((FARPROC)TimerProc, hInst));
  98.  
  99. hMenu = GetSystemMenu(hWndMain, FALSE);
  100. hAlternateMenu = LoadMenu(hInstance, "Hello2");
  101.  
  102. AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
  103. AppendMenu(hMenu, MF_STRING,    IDM_HELPABOUT, "About...");
  104. AppendMenu(hMenu, MF_STRING,    IDM_SETUP, "Setup...");
  105.  
  106. ShowWindow(hWndMain, nCmd);
  107. UpdateWindow(hWndMain);
  108.     
  109. while (GetMessage(&msg, NULL, 0, 0))
  110.    {
  111.     TranslateMessage(&msg);
  112.     DispatchMessage(&msg);
  113.    }
  114.     
  115. FreeLibrary(hFileo);
  116. return msg.wParam;
  117. }                                       /* int FAR PASCAL WinMain */
  118.  
  119. BOOL InitInstance (HANDLE hInstance)
  120. {
  121. WNDCLASS wc;                            /* Window class structure */
  122.  
  123. wc.lpszMenuName  = szAppName;
  124. wc.lpszClassName = szAppName;
  125. wc.hbrBackground = GetStockObject(WHITE_BRUSH);  /* White bkgrnd */
  126. wc.hInstance     = hInstance;
  127. wc.style         = CS_VREDRAW | CS_HREDRAW;
  128. wc.lpfnWndProc   = (WNDPROC)WndProc;              /* Name of proc to handle window */
  129. wc.hCursor       = LoadCursor(NULL, IDC_ARROW);  /* Arrow Cursor */
  130. wc.hIcon         = LoadIcon(hInstance, "WPJ");  /* Generic Icon */
  131. wc.cbClsExtra    = 0;                /* no extras */
  132. wc.cbWndExtra    = 0;                /* No Extras */
  133.  
  134. hIconMain = wc.hIcon;
  135.  
  136. return (RegisterClass(&wc)); /* Let's register that class */
  137. }                                       /* BOOL InitInstance */
  138.  
  139. /* This is our main windows procedure. It receives messages in message, then,
  140. depending on what the message is, we react accordingly
  141. */
  142.  
  143. long FAR PASCAL WndProc(HWND hWnd, unsigned message, WORD wParam, LONG lParam)
  144. {
  145. HDC            hdc;
  146. PAINTSTRUCT    ps;
  147. RECT           rect;
  148. HMENU          hMenu;
  149. static FARPROC lpfnHelloDlgProc, lpfnAboutDlgProc;
  150. char           OutMsg[25];
  151.  
  152. lstrcpy(OutMsg, "");
  153.  
  154. switch (message)
  155.    {
  156.    case WM_CREATE :
  157.       hMainMenu = GetMenu(hWnd);
  158.       InitSettings = GetPrivateProfileInt("Hello", "Setup", 1, "Hello.ini");
  159.       InitSettings = InitSettings ? IDM_HELLO : IDM_GOODBYE;
  160.       hdc = GetDC(hWnd);
  161.          InvalidateRect(hWnd, NULL, TRUE);
  162.       ReleaseDC(hWnd, hdc);
  163.  
  164. /*----------------------------------------------------------------------------
  165.   fall through to WM_PAINT...
  166. ----------------------------------------------------------------------------*/
  167.    case WM_PAINT :
  168.       if (IsIconic(hWnd))
  169.          {
  170.          BeginPaint(hWnd, &ps);
  171.  
  172. /*----------------------------------------------------------------------------
  173.   Erase the background of the window with what's on the desktop. This is so
  174.   the desktop bitmap will show through the transparent areas of the icon. 
  175. ----------------------------------------------------------------------------*/
  176.          DefWindowProc(hWnd, WM_ICONERASEBKGND, (WORD)ps.hdc, 0L);
  177.  
  178. /*----------------------------------------------------------------------------
  179.   Now draw the icon. 
  180. ----------------------------------------------------------------------------*/
  181.          DrawIcon(ps.hdc, 0,0, hIcon);
  182.          EndPaint(hWnd, &ps);
  183.          }
  184.       else
  185.          {
  186.          hdc = BeginPaint(hWnd,&ps);        /* returns pointer to hdc */
  187.          GetClientRect(hWnd, &rect);
  188. /*
  189.   -1 tells the DrawText function to calculate length of string based on
  190.   NULL-termination
  191. */
  192.          DrawText(hdc, (InitSettings == IDM_HELLO) ? "Hello Windows!" : "Goodbye Windows!", -1,
  193.                                    &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  194.          EndPaint(hWnd,&ps);
  195.          }
  196.       return 0;
  197.  
  198.    case WM_SYSCOMMAND :
  199.       switch (wParam)
  200.          {
  201.          case IDM_SETUP :
  202.             lpfnHelloDlgProc = MakeProcInstance(HelloDlgProc, hInst);
  203.             DialogBox(hInst, "Hello", hWnd, lpfnHelloDlgProc);
  204.             FreeProcInstance(lpfnHelloDlgProc);
  205.             return 0;
  206.  
  207.          case IDM_HELPABOUT :
  208.             lpfnAboutDlgProc = MakeProcInstance(AboutDlgProc, hInst);
  209.             DialogBox(hInst, "About", hWnd, lpfnAboutDlgProc);
  210.             FreeProcInstance(lpfnAboutDlgProc);
  211.             return 0;
  212.          }
  213.  
  214.       break;
  215.  
  216.  
  217.    case WM_ERASEBKGND:
  218.       if (IsIconic(hWnd))
  219.  
  220. /*----------------------------------------------------------------------------
  221.   Don't erase the background now because we will do it at paint time when
  222.   we paint our icon.
  223. ----------------------------------------------------------------------------*/
  224.          return(TRUE);
  225.       else
  226.          return(DefWindowProc(hWnd, message, wParam, lParam));
  227.  
  228.    case WM_QUERYDRAGICON:
  229.       return((LONG)(WORD)hIconMain);
  230.  
  231.    case WM_COMMAND :
  232.       hMenu = GetMenu(hWnd);
  233.       switch (wParam)
  234.          {
  235.       case IDM_FILENEW :
  236.          lstrcpy(OutMsg, "IDM_FILENEW");
  237.          break;
  238.  
  239.       case IDM_FILEOPEN :
  240.          DoFileOpenDlg();
  241.          lstrcpy(OutMsg, szFileName);
  242.          break;
  243.  
  244.       case IDM_FILESAVE :
  245.          lstrcpy(OutMsg, "IDM_FILESAVE");
  246.          break;
  247.  
  248.       case IDM_FILESAVEAS :
  249.          lstrcpy(OutMsg, "IDM_FILESAVEAS");
  250.          break;
  251.  
  252.       case IDM_FILEPRINT :
  253.          lstrcpy(OutMsg, "IDM_FILEPRINT");
  254.          break;
  255.  
  256.       case IDM_FILEPRINTPREV :
  257.          lstrcpy(OutMsg, "IDM_FILEPRINTPREV");
  258.          break;
  259.  
  260.       case IDM_FILEPRINTSETUP :
  261.          lstrcpy(OutMsg, "IDM_FILEPRINTSETUP");
  262.          break;
  263.  
  264.       case IDM_FILEEXIT :
  265.          lstrcpy(OutMsg, "IDM_FILEEXIT");
  266.          break;
  267.  
  268.  
  269.       case IDM_EDITUNDO :
  270.          lstrcpy(OutMsg, "IDM_EDITUNDO");
  271.          break;
  272.  
  273.       case IDM_EDITREPEAT :
  274.          lstrcpy(OutMsg, "IDM_EDITREPEAT");
  275.          break;
  276.  
  277.       case IDM_EDITCUT :
  278.          lstrcpy(OutMsg, "IDM_EDITCUT");
  279.          break;
  280.  
  281.       case IDM_EDITCOPY :
  282.          lstrcpy(OutMsg, "IDM_EDITCOPY");
  283.          break;
  284.  
  285.       case IDM_EDITPASTE :
  286.          lstrcpy(OutMsg, "IDM_EDITPASTE");
  287.          break;
  288.  
  289.       case IDM_EDITCLEAR :
  290.          lstrcpy(OutMsg, "IDM_EDITCLEAR");
  291.          break;
  292.  
  293.       case IDM_EDITPAST :
  294.          lstrcpy(OutMsg, "IDM_EDITPAST");
  295.          break;
  296.  
  297.  
  298.       case IDM_SAMPLEDLG :
  299.          lstrcpy(OutMsg, "IDM_SAMPLEDLG");
  300.          break;
  301.  
  302.  
  303.       case IDM_HELPINDX :
  304.          lstrcpy(OutMsg, "IDM_HELPINDX");
  305.          break;
  306.  
  307.       case IDM_HELPKBD :
  308.          lstrcpy(OutMsg, "IDM_HELPKBD");
  309.          break;
  310.  
  311.       case IDM_HELPCMDS :
  312.          lstrcpy(OutMsg, "IDM_HELPCMDS");
  313.          break;
  314.  
  315.       case IDM_HELPPROCS :
  316.          lstrcpy(OutMsg, "IDM_HELPPROCS");
  317.          break;
  318.  
  319.       case IDM_HELPUSING :
  320.          lstrcpy(OutMsg, "IDM_HELPUSING");
  321.          break;
  322.  
  323.       case IDM_HELPABOUT :
  324.          lpfnAboutDlgProc = MakeProcInstance(AboutDlgProc, hInst);
  325.          DialogBox(hInst, "About", hWnd, lpfnAboutDlgProc);
  326.          FreeProcInstance(lpfnAboutDlgProc);
  327.          return 0;
  328.  
  329.       case IDM_ALTERNATE :
  330.          SetMenu(hWnd, hAlternateMenu);
  331.          return 0;
  332.  
  333.       case IDM_ALTONE : 
  334.          CheckMenuItem(hMenu, IDM_ALTONE, MF_CHECKED);
  335.          CheckMenuItem(hMenu, IDM_ALTTWO, MF_UNCHECKED);
  336.          return 0;
  337.  
  338.       case IDM_ALTTWO : 
  339.          CheckMenuItem(hMenu, IDM_ALTTWO, MF_CHECKED);
  340.          CheckMenuItem(hMenu, IDM_ALTONE, MF_UNCHECKED);
  341.          return 0;
  342.  
  343.       case IDM_ALTGRAY : 
  344.          EnableMenuItem(hMenu, IDM_ALTGRAY, MF_GRAYED);
  345.          EnableMenuItem(hMenu, IDM_ALTUNGRAY, MF_ENABLED);
  346.          return 0;
  347.  
  348.       case IDM_ALTUNGRAY : 
  349.          EnableMenuItem(hMenu, IDM_ALTUNGRAY, MF_GRAYED);
  350.          EnableMenuItem(hMenu, IDM_ALTGRAY, MF_ENABLED);
  351.          return 0;
  352.  
  353.       case IDM_ALTRESTORE : 
  354.          SetMenu(hWnd, hMainMenu);
  355.          return 0;
  356.  
  357.       case WM_DESTROY :
  358.           PostQuitMessage(0);
  359.           return 0;
  360.           }
  361.  
  362.    if (lstrlen(OutMsg) != 0)
  363.       {
  364.       MessageBox(hWnd, OutMsg, szAppName, MB_ICONEXCLAMATION | MB_OK);
  365.       return 0;
  366.       }
  367.  
  368.    }
  369. return DefWindowProc(hWnd, message, wParam, lParam);
  370. }                                       /* long FAR PASCAL WndProc */
  371.  
  372. /*============================================================================
  373.   HelloDlgProc -- 
  374.  
  375.   File      : Hello.C
  376.  
  377.   Prototype : BOOL FAR PASCAL HelloDlgProc(HWND, WORD, WORD, LONG);
  378.  
  379.   Call      : HelloDlgProc(hDlg, message, wParam, lParam);
  380.  
  381.   Library   : 
  382.  
  383.   24 April 1993 - dlcampbell
  384.   (c) 1993 WynApse
  385. ----------------------------------------------------------------------------*/
  386. BOOL FAR PASCAL HelloDlgProc (HWND hDlg, WORD message, WORD wParam,
  387.                                                                   LONG lParam)
  388. {
  389. switch (message)
  390.    {
  391.    case WM_INITDIALOG :
  392.       CheckRadioButton(hDlg, IDM_HELLO, IDM_GOODBYE, InitSettings);
  393.       return TRUE;
  394.  
  395.    case WM_COMMAND :
  396.       switch (wParam)
  397.          {
  398.          case IDM_HELLO : 
  399.                WritePrivateProfileString("Hello", "Setup", "1", "Hello.ini");
  400.             InitSettings = wParam;
  401.             break;
  402.  
  403.          case IDM_GOODBYE : 
  404.                WritePrivateProfileString("Hello", "Setup", "0", "Hello.ini");
  405.             InitSettings = wParam;
  406.             break;
  407.  
  408.          case IDOK :
  409.             EndDialog(hDlg, wParam);
  410.             return TRUE;
  411.  
  412.          }
  413.       break;
  414.  
  415.    }
  416. return FALSE;
  417. }                                       /* HelloDlgProc */
  418. /*============================================================================
  419.   AboutDlgProc
  420.  
  421.   File      : ExitWin.C
  422.  
  423.   Prototype : 
  424.  
  425.   Call      : 
  426.  
  427.   Library   : 
  428.  
  429.   24 April 1993 - dlcampbell
  430.   (c) 1993 WynApse
  431. ----------------------------------------------------------------------------*/
  432. BOOL FAR PASCAL AboutDlgProc (HWND hDlg, WORD message, WORD wParam,
  433.                                                                   LONG lParam)
  434. {
  435. char szBuffer[100];
  436.  
  437. switch (message)
  438.    {
  439.    case WM_INITDIALOG :
  440.       wsprintf(szBuffer, "%s at %s", (LPSTR) __DATE__, (LPSTR) __TIME__);
  441.       SetWindowText(GetDlgItem(hDlg, ID_VERSION), szBuffer);
  442.       return TRUE;
  443.  
  444.    case WM_COMMAND :
  445.       switch (wParam)
  446.          {
  447.          case IDOK :
  448.          case IDCANCEL :
  449.             if (HIWORD(lParam) == BN_CLICKED)
  450.                EndDialog(hDlg, wParam);
  451.             return TRUE;
  452.  
  453.          default :
  454.             return TRUE;
  455.          }
  456.  
  457.    default :
  458.       return FALSE;
  459.    }
  460. }                                       /* AboutDlgProc */
  461.  
  462. /*============================================================================
  463.   DoFileOpenDlg --
  464.  
  465.   File      : Hello.C
  466.  
  467.   Prototype : void DoFileOpenDlg(void);
  468.  
  469.   Call      : DoFileOpenDlg()
  470.  
  471.   Library   : 
  472.  
  473.   24 April 1993 - dlcampbell
  474.   (c) 1993 WynApse
  475. ----------------------------------------------------------------------------*/
  476. void DoFileOpenDlg(void)
  477. {
  478. FARPROC lpfnFileOpenDlgProc = GetProcAddress(hFileo,  "FileOpenDlgProc");
  479.  
  480. (*lpfnFileOpenDlgProc)();
  481. GetPrivateProfileString("FileO", "FileName", "NoName", szFileName, 128,
  482.                                                                  "Hello.ini");
  483. }                                       /* DoFileOpenDlg */
  484.  
  485. /*============================================================================
  486.   TimerProc
  487.  
  488.   File      : Hello.C
  489.  
  490.   Prototype : 
  491.  
  492.   Call      : 
  493.  
  494.   Library   : 
  495.  
  496.   Example   : 
  497.  
  498.   6 June 1993 - dlcampbell
  499.   (c) 1993 Campbell SoftWare
  500. ----------------------------------------------------------------------------*/
  501. BOOL FAR PASCAL TimerProc(HWND hWnd, WORD message, WORD wParam, LONG lParam)
  502. {
  503. static BOOL which = 0;
  504.  
  505. if (IsIconic(hWnd))
  506.    {
  507.    if (which = !which)
  508.       {
  509.       hIcon = LoadIcon(hInst, "GO");
  510.       InvalidateRect(hWnd, NULL, FALSE);
  511.       SendMessage(hWndMain, WM_PAINT, NULL, NULL);
  512.       }
  513.    else
  514.       {
  515.       hIcon = LoadIcon(hInst, "SUNS");
  516.       InvalidateRect(hWnd, NULL, FALSE);
  517.       SendMessage(hWndMain, WM_PAINT, NULL, NULL);
  518.       }
  519.    }
  520. }                                       /* TimerProc */
  521.