home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / os2 / mh.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-02  |  14.2 KB  |  448 lines

  1. /*========================================================*/
  2. /*                          MH.C                          */
  3. /*        (C) 1993 Michael Hoffmeister &DMV-Verlag        */
  4. /*   Demonstration für die Nutzung von Bitmaps in der     */
  5. /*            Menüleiste von OS/2-Programmen              */
  6. /*              Compiler: Microsoft C 6.0                 */
  7. /*========================================================*/
  8.  
  9. #define INCL_PM
  10. #define INCL_WIN
  11. #define INCL_GPI
  12. #define INCL_DOS
  13. #define INCL_DEV
  14. #define INCL_BASE
  15.  
  16.  
  17. #include <os2.h>
  18. #include <stdio.h>
  19. #include <ctype.h>
  20. #include <string.h>
  21. #include <stdlib.h>
  22. #include "mh.h"
  23.  
  24. struct     Lade_struktur
  25. {
  26.   CHAR     szName[13];
  27.   CHAR     szEndung[5];
  28.   BOOL     fGeladen;
  29. } Lade_struct;
  30.  
  31. USHORT  cdecl main(VOID);
  32. MRESULT EXPENTRY Programm(HWND, USHORT, MPARAM, MPARAM);
  33. MRESULT EXPENTRY DateiLaden(HWND, USHORT, MPARAM, MPARAM);
  34. VOID    Verzeichnisse(HWND);
  35. VOID    Dateien(HWND, PSZ);
  36. VOID    Pfadname(HWND);
  37. VOID    Laufwerk(PSZ);
  38. BOOL    DateiVorhanden(CHAR[13]);
  39.  
  40.  
  41. USHORT main(void)
  42. {
  43.   HAB   hab;
  44.   HMQ   hmq;
  45.   QMSG  qmsg;
  46.   HWND  hwnd, hwndFenster;
  47.   ULONG ulFlags = FCF_TITLEBAR | FCF_SYSMENU |
  48.                   FCF_SIZEBORDER | FCF_MINMAX |
  49.                   FCF_BORDER | FCF_MENU | FCF_ACCELTABLE |
  50.                   FCF_ICON;
  51.   ULONG ulTyp = WS_VISIBLE | FS_ACCELTABLE | FS_ICON;
  52.   static CHAR szFenster[] = "Fenster-Klasse";
  53.  
  54.   hab = WinInitialize(0);
  55.   hmq = WinCreateMsgQueue(hab, 0);
  56.   WinRegisterClass(hab, szFenster, Programm,
  57.                     CS_SIZEREDRAW, 0);
  58.   hwnd = WinCreateStdWindow(HWND_DESKTOP, ulTyp, &ulFlags,
  59.            szFenster, "MH \7 (c)  Michael Hoffmeister",
  60.            0L, (HMODULE) NULL, ID_MENU, &hwndFenster);
  61.   WinSetWindowPos(hwnd, NULL, 40, 20, 555, 420, SWP_SIZE |
  62.                    SWP_MOVE | SWP_SHOW | SWP_ACTIVATE);
  63.   while (WinGetMsg(hab, &qmsg, NULL, 0, 0))
  64.     WinDispatchMsg(hab, &qmsg);
  65.   WinDestroyWindow(hwnd);
  66.   WinDestroyMsgQueue(hmq);
  67.   WinTerminate(hab);
  68.   return 0;
  69. }
  70.  
  71. MRESULT EXPENTRY Programm(HWND hwnd, USHORT msg,
  72.                           MPARAM mp1, MPARAM mp2)
  73. {
  74.          HPS    hps;
  75.   static POINTL ptl;
  76.   static RECTL  rcl;
  77.  
  78.   switch (msg)
  79.   {
  80.     case WM_PAINT:
  81.       hps = WinBeginPaint(hwnd, NULL, NULL);
  82.       GpiErase(hps);
  83.       WinQueryWindowRect(hwnd, &rcl);
  84.       ptl.x = 20;
  85.       ptl.y = rcl.yTop/2;
  86.       if (Lade_struct.fGeladen == TRUE)
  87.       {
  88.         GpiCharStringAt(hps, &ptl,
  89.                          strlen(Lade_struct.szName),
  90.                          Lade_struct.szName);
  91.         Lade_struct.fGeladen = FALSE;
  92.       }
  93.       WinEndPaint(hps);
  94.     return 0L;
  95.  
  96.     case WM_COMMAND:
  97.       switch (COMMANDMSG(&msg)->cmd)
  98.       {
  99.         case ID_START:
  100.           strcpy(Lade_struct.szEndung, "*.*");
  101.           WinDlgBox(HWND_DESKTOP, hwnd, DateiLaden,
  102.                    (HMODULE) NULL, ID_MH_LADEN, NULL);
  103.           WinInvalidateRect(hwnd, NULL, FALSE);
  104.         return 0L;
  105.       }
  106.     return 0L;
  107.  
  108.     case WM_CREATE:
  109.       hps = WinGetPS(hwnd);
  110.       WinReleasePS(hps);
  111.     return 0L;
  112.  
  113.     case WM_HELP:
  114.       WinMessageBox(HWND_DESKTOP, hwnd,
  115.                     "Hilfstext.\n \n",
  116.                     "HILFE aus dem Hauptprogramm", 0,
  117.                     MB_OK | MB_ICONASTERISK |
  118.                     MB_SYSTEMMODAL);
  119.     return 0L;
  120.  
  121.     default:
  122.     break;
  123.   }
  124.   return WinDefWindowProc(hwnd, msg, mp1, mp2);
  125. }
  126.  
  127.  
  128. MRESULT EXPENTRY DateiLaden(HWND hwnd, USHORT msg,
  129.                             MPARAM mp1, MPARAM mp2)
  130. {
  131.   static  SHORT   sDatei, sVerzeichnis, sZahl;
  132.   static  CHAR    szRechts[13], szLinks[13], szEndung[5];
  133.   static  NPBYTE  npbGesamt;
  134.   static  BOOL    fWahl;
  135.   static  MRESULT mres;
  136.  
  137.   strcpy(szEndung, Lade_struct.szEndung);
  138.   sZahl = 30;
  139.   fWahl = TRUE;
  140.  
  141.   switch (msg)
  142.   {
  143.     case WM_INITDLG:
  144.       Pfadname(hwnd);
  145.       Verzeichnisse(hwnd);
  146.       Dateien(hwnd, szEndung);
  147.       WinSendDlgItemMsg(hwnd, ID_MH_V_BOX, LM_SELECTITEM,
  148.                         MPFROMSHORT(sVerzeichnis),
  149.                         MPFROMSHORT(fWahl));
  150.       WinSendDlgItemMsg(hwnd, ID_MH_D_BOX, LM_SELECTITEM,
  151.                         MPFROMSHORT(sDatei),
  152.                         MPFROMSHORT(fWahl));
  153.       WinPostMsg(hwnd, WM_CONTROL,
  154.                  MPFROM2SHORT(0, EN_CHANGE),NULL);
  155.     return 0L;
  156.  
  157.     case WM_HELP:
  158.       WinMessageBox(HWND_DESKTOP, hwnd, "Hilfstext.\n \n",
  159.                     "HILFE aus der Dialogbox", 0,
  160.         MB_OK | MB_ICONASTERISK | MB_SYSTEMMODAL);
  161.     return 0L;
  162.  
  163.     case WM_CONTROL: 
  164.       WinQueryDlgItemText(hwnd, ID_MH_AD, strlen(szRechts),
  165.                           (PSZ) szRechts);
  166.  
  167.       switch (SHORT2FROMMP(mp1))
  168.       {
  169.         case LN_SELECT:
  170.           switch (SHORT1FROMMP(mp1))
  171.           {
  172.             case ID_MH_D_BOX:
  173.               mres = WinSendDlgItemMsg(hwnd, ID_MH_D_BOX,
  174.                                        LM_QUERYSELECTION,
  175.                                        MPFROMSHORT(sDatei),
  176.                                        0L);
  177.               sDatei = MAKETYPE(mres, SHORT);
  178.               WinSendDlgItemMsg(hwnd, ID_MH_D_BOX,
  179.                                 LM_QUERYITEMTEXT,
  180.                                 MPFROM2SHORT(sDatei,
  181.                                              sZahl),
  182.                                 MPFROMP(szRechts));
  183.               WinSetDlgItemText(hwnd, ID_MH_AD,
  184.                                  (PSZ) szRechts);
  185.             return 0L;
  186.  
  187.             case ID_MH_V_BOX:
  188.               mres = WinSendDlgItemMsg(hwnd, ID_MH_V_BOX,
  189.                                        LM_QUERYSELECTION,
  190.                                        MPFROMSHORT(
  191.                                          sVerzeichnis), 0L);
  192.               sVerzeichnis = MAKETYPE(mres, SHORT);
  193.               WinSendDlgItemMsg(hwnd, ID_MH_V_BOX,
  194.                                 LM_QUERYITEMTEXT,
  195.                                 MPFROM2SHORT(sVerzeichnis,
  196.                                 sZahl), MPFROMP(szLinks));
  197.               sprintf(npbGesamt, "\\%s\\%s", szLinks,
  198.                       szEndung);
  199.               WinSetDlgItemText(hwnd, ID_MH_AD, npbGesamt);
  200.             return 0L;
  201.           }
  202.         return 0L;
  203.      
  204.         case LN_ENTER:
  205.           switch (SHORT1FROMMP(mp1))
  206.           {    
  207.             case ID_MH_D_BOX:
  208.               mres = WinSendDlgItemMsg(hwnd, ID_MH_D_BOX,
  209.                                        LM_QUERYSELECTION,
  210.                                        MPFROMSHORT(sDatei),
  211.                                        0L);
  212.               sDatei = MAKETYPE(mres, SHORT);
  213.               WinSendDlgItemMsg(hwnd, ID_MH_D_BOX,
  214.                                 LM_QUERYITEMTEXT,
  215.                                 MPFROM2SHORT(sDatei, sZahl),
  216.                                 MPFROMP(szRechts));
  217.               if (DateiVorhanden(szRechts))
  218.               {
  219.                 strcpy(Lade_struct.szName, szRechts);
  220.                 Lade_struct.fGeladen = TRUE;
  221.               }
  222.               else
  223.               {
  224.                 Lade_struct.fGeladen = FALSE;
  225.                 WinMessageBox(HWND_DESKTOP, hwnd,
  226.                         "Diese Datei existiert nicht.\n \n",
  227.                         "Fehler aufgetreten", 0, MB_OK |
  228.                         MB_ICONASTERISK | MB_SYSTEMMODAL);
  229.               }
  230.               WinDismissDlg(hwnd, ID_MH_ABBRUCH);
  231.             return 0L;
  232.  
  233.             case ID_MH_V_BOX:
  234.               mres = WinSendDlgItemMsg(hwnd, ID_MH_V_BOX,
  235.                                        LM_QUERYSELECTION,
  236.                                        MPFROMSHORT(
  237.                                          sVerzeichnis), 0L);
  238.               sVerzeichnis = MAKETYPE(mres, SHORT);
  239.               WinSendDlgItemMsg(hwnd, ID_MH_V_BOX,
  240.                                 LM_QUERYITEMTEXT,
  241.                                 MPFROM2SHORT(sVerzeichnis,
  242.                                              sZahl),
  243.                                 MPFROMP(szLinks));
  244.               Laufwerk(szLinks);
  245.               Pfadname(hwnd);
  246.               WinEnableWindowUpdate(WinWindowFromID(hwnd,
  247.                                        ID_MH_V_BOX), FALSE);
  248.               WinEnableWindowUpdate(WinWindowFromID(hwnd,
  249.                                        ID_MH_D_BOX), FALSE);
  250.               WinSendDlgItemMsg(hwnd, ID_MH_D_BOX,
  251.                                       LM_DELETEALL, 0L, 0L);
  252.               WinSendDlgItemMsg(hwnd, ID_MH_V_BOX,
  253.                                       LM_DELETEALL, 0L, 0L);
  254.               Verzeichnisse(hwnd);
  255.               Dateien(hwnd, szEndung);
  256.               WinShowWindow(WinWindowFromID(hwnd,
  257.                                         ID_MH_V_BOX), TRUE);
  258.               WinShowWindow(WinWindowFromID(hwnd,
  259.                                         ID_MH_D_BOX), TRUE);
  260.               WinSendDlgItemMsg(hwnd, ID_MH_V_BOX,
  261.                                 LM_SELECTITEM,
  262.                                 MPFROMSHORT(0),
  263.                                 MPFROMSHORT(fWahl));
  264.               WinSendDlgItemMsg(hwnd, ID_MH_D_BOX,
  265.                                 LM_SELECTITEM,
  266.                                 MPFROMSHORT(0),
  267.                                 MPFROMSHORT(fWahl));
  268.             return 0L;
  269.           }
  270.         return 0L;
  271.       }
  272.     return 0L;
  273.  
  274.     case WM_COMMAND: 
  275.       switch (SHORT1FROMMP(mp1))
  276.       {    
  277.         case ID_MH_OK:
  278.           WinQueryDlgItemText(hwnd, ID_MH_AD, 15,
  279.                               (PSZ)szRechts);
  280.           if (DateiVorhanden(szRechts))
  281.           {
  282.             strcpy(Lade_struct.szName, szRechts);
  283.             Lade_struct.fGeladen = TRUE;
  284.             WinDismissDlg(hwnd, TRUE);
  285.           }
  286.           else
  287.           {
  288.             Lade_struct.fGeladen = FALSE;
  289.             WinMessageBox(HWND_DESKTOP, hwnd,
  290.                   "Sie können kein Verzeichnis laden.\n \n",
  291.                   "Fehler aufgetreten", 0, MB_OK |
  292.                   MB_ICONASTERISK | MB_SYSTEMMODAL);
  293.           }
  294.         return 0L;
  295.  
  296.         case ID_MH_HILFE:
  297.           WinMessageBox(HWND_DESKTOP, hwnd,
  298.                         "Hilfstext.\n \n",
  299.                         "HILFE aus der Dialogbox", 0,
  300.                         MB_OK | MB_ICONASTERISK |
  301.                         MB_SYSTEMMODAL);
  302.         return 0L;
  303.  
  304.         case ID_MH_ABBRUCH:
  305.           Lade_struct.fGeladen = FALSE;
  306.           WinDismissDlg(hwnd, FALSE);
  307.         return 0L;
  308.       }
  309.     return 0L;
  310.    
  311.     default:
  312.     break;
  313.   }  
  314.   return(WinDefDlgProc(hwnd, msg, mp1, mp2));
  315. }
  316.  
  317.  
  318. VOID Verzeichnisse(HWND hwnd)
  319. {
  320.   FILEFINDBUF  findPuffer;
  321.   HDIR    hdirPfad  = HDIR_CREATE;
  322.   USHORT  usZaehler, usAttr, i, b;
  323.   CHAR    pszLaufwerk[4];
  324.   usZaehler = 1;
  325.   DosFindFirst("*.*", &hdirPfad, FILE_DIRECTORY,
  326.                &findPuffer, sizeof(findPuffer),
  327.                &usZaehler, 0L);
  328.   do
  329.   {
  330.     DosQFileMode(findPuffer.achName, &usAttr, 0L);
  331.     if (strcmp(findPuffer.achName,"."))
  332.       if (usAttr == FILE_DIRECTORY)
  333.         WinSendDlgItemMsg(hwnd, ID_MH_V_BOX,
  334.                           LM_INSERTITEM,
  335.                           MPFROM2SHORT(LIT_SORTASCENDING,
  336.                           0), MPFROMP(findPuffer.achName));
  337.   }
  338.   while (DosFindNext(hdirPfad, &findPuffer,
  339.          sizeof(findPuffer), &usZaehler) ==  0);
  340.   DosPhysicalDisk(1, (PBYTE) &b, 2, NULL, 0);
  341.   for (i=0; i<b; i++)
  342.   { sprintf(pszLaufwerk, "[%c:]", i+67);
  343.     WinSendDlgItemMsg(hwnd, ID_MH_V_BOX, LM_INSERTITEM,
  344.                       MPFROM2SHORT(LIT_SORTASCENDING, 0),
  345.                       MPFROMP(pszLaufwerk));
  346.   }
  347.   DosDevConfig(&b, DEVINFO_FLOPPY, 0);
  348.   for (i=0; i<b; i++)
  349.   {
  350.     sprintf(pszLaufwerk, "[%c:]", i+65);
  351.     WinSendDlgItemMsg(hwnd, ID_MH_V_BOX, LM_INSERTITEM,
  352.                       MPFROM2SHORT(LIT_SORTASCENDING,0),
  353.                       MPFROMP(pszLaufwerk));
  354.   }
  355. }
  356.  
  357.  
  358. VOID Dateien(HWND hwnd, PSZ szEndung)
  359. {
  360.   FILEFINDBUF  findPuffer;
  361.   HDIR    hdirPfad  = HDIR_CREATE;
  362.   USHORT  usZaehler, usAttr;
  363.   static CHAR pszPuffer[13];
  364.   usZaehler = 1;
  365.   strcpy(findPuffer.achName, "");
  366.   DosFindFirst(szEndung, &hdirPfad, FILE_NORMAL,
  367.                &findPuffer, sizeof(findPuffer), &usZaehler,
  368.                0L);
  369.   do
  370.   {
  371.     strcpy(pszPuffer, findPuffer.achName);
  372.     DosQFileMode(pszPuffer, &usAttr, 0L);
  373.     if (usAttr != FILE_DIRECTORY)
  374.       WinSendDlgItemMsg(hwnd, ID_MH_D_BOX, LM_INSERTITEM,
  375.                         MPFROM2SHORT(LIT_SORTASCENDING, 0),
  376.                         MPFROMP(pszPuffer));
  377.   }
  378.   while (DosFindNext(hdirPfad, &findPuffer,
  379.          sizeof(findPuffer), &usZaehler) == 0);
  380. }
  381.  
  382.  
  383. VOID Pfadname(HWND hwnd)
  384. {
  385.   ULONG   ulLaufwerke;
  386.   USHORT  usPfad, usPLatte;
  387.   HHEAP   hHeap;
  388.   NPBYTE  npbyteObjekt, npbyteVerzeichnis;
  389.   usPfad = 0;
  390.   DosQCurDisk(&usPLatte, &ulLaufwerke);
  391.   DosQCurDir(usPLatte, NULL, &usPfad);
  392.   hHeap = WinCreateHeap(0,5 * (usPfad+30), usPfad + 30, 0,
  393.                         0, HM_MOVEABLE);
  394.   npbyteObjekt = WinAllocMem(hHeap, usPfad);
  395.   npbyteVerzeichnis = WinAllocMem(hHeap, usPfad + 30);
  396.   DosQCurDir(usPLatte, npbyteObjekt, &usPfad);
  397.   sprintf(npbyteVerzeichnis, "%c:\\%s", usPLatte + 64,
  398.           npbyteObjekt);
  399.   WinSetDlgItemText(hwnd, ID_MH_AV, npbyteVerzeichnis);
  400.   WinDestroyHeap(hHeap);
  401. }
  402.  
  403. VOID Laufwerk(PSZ pszText2)
  404. {
  405.   ULONG   ulLaufwerke;
  406.   USHORT  usPfad, usPLatte, i;
  407.   PSZ     pszPfad;
  408.   SEL     selPfad;
  409.   if (pszText2[0] == '[')
  410.   {
  411.     i = toascii((int) pszText2[1]) - 64;
  412.     DosSelectDisk(i);
  413.     DosChDir("\\", 0L);
  414.   }
  415.   else
  416.   {
  417.     usPfad = 0;
  418.     DosQCurDisk(&usPLatte, &ulLaufwerke);
  419.     DosQCurDir(usPLatte, NULL, &usPfad);
  420.     DosAllocSeg(usPfad, &selPfad, SEG_NONSHARED);
  421.     pszPfad = MAKEP(selPfad, 0);
  422.     DosQCurDir(usPLatte, pszPfad, &usPfad);
  423.     DosChDir(pszText2, 0L);
  424.   }
  425. }
  426.  
  427. BOOL DateiVorhanden(CHAR pszDatei[13])
  428. {
  429.   FILEFINDBUF   findPuffer;
  430.   HDIR    hdirPfad  = HDIR_CREATE;
  431.   USHORT  usZaehler;
  432.   usZaehler = 1;
  433.   strcpy(findPuffer.achName, " ");
  434.   DosFindFirst("*.*", &hdirPfad, FILE_NORMAL, &findPuffer,
  435.                sizeof(findPuffer), &usZaehler, 0L);
  436.   do
  437.   {
  438.     if (strcmp(pszDatei, findPuffer.achName) == 0)
  439.       return TRUE;
  440.   }
  441.   while (DosFindNext(hdirPfad, &findPuffer,
  442.          sizeof(findPuffer), &usZaehler) ==  0);
  443.   return FALSE;
  444. }
  445.  
  446. /*========================================================*/
  447. /*                      Ende von MH.C                     */
  448.