Code verbessern (Code::Blocks)



  • Hallo zusammen !
    Ich habe hier folgende Code:

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         static TCHAR            szDevice[32], szWindowText[64] ;
         static int              cxChar, cyChar, nCurrentDevice = IDM_BILDSCHIRM, nCurrentInfo = IDM_ALLGEMEINES ;
         static DWORD            dwNeeded, dwReturned ;
         static PRINTER_INFO_4 * pinfo4 ;
         static PRINTER_INFO_5 * pinfo5 ;
         DWORD                   i ;
         HDC                     hdc, hdcInfo ;
         HMENU                   hMenu ;
         HANDLE                  hPrint ;
         PAINTSTRUCT             ps ;
         TEXTMETRIC              tm ;
    
         switch (message)
         {
         case WM_CREATE :
              hdc = GetDC (hwnd) ;
              SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
              GetTextMetrics (hdc, &tm) ;
              cxChar = tm.tmAveCharWidth ;
              cyChar = tm.tmHeight + tm.tmExternalLeading ;
              ReleaseDC (hwnd, hdc) ;
                                               // weiter mit WM_SETTINGCHANGE
         case WM_SETTINGCHANGE:
              hMenu = GetSubMenu (GetMenu (hwnd), 0) ;
    
              while (GetMenuItemCount (hMenu) > 1)
                   DeleteMenu (hMenu, 1, MF_BYPOSITION) ;
    
              if (GetVersion () & 0x80000000)         // Windows 98
              {
                   EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &dwNeeded, &dwReturned);
    
                   pinfo5 = ( PRINTER_INFO_5*) malloc(dwNeeded);
                   //.....
                  //......
                  //.........
                   pinfo4 = (PRINTER_INFO_4*)malloc(dwNeeded);
    
                   EnumPrinters (PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) pinfo4, dwNeeded, &dwNeeded, &dwReturned) ;
    
                   for (i = 0 ; i < dwReturned ; i++)
                   {
                        AppendMenu (hMenu, (i+1) % 16 ? 0 : MF_MENUBARBREAK, i + 1, pinfo4[i].pPrinterName) ;
                   }
    
                   free (pinfo4) ;
              }
    
              AppendMenu (hMenu, MF_SEPARATOR, 0, NULL) ;
              AppendMenu (hMenu, 0, IDM_DEVMODE, TEXT ("Eigenschaften")) ;
    
              wParam = IDM_BILDSCHIRM ;
                                                 // fall through
         case WM_COMMAND :
              hMenu = GetMenu (hwnd) ;
    
              if (LOWORD (wParam) == IDM_BILDSCHIRM ||         // IDM_SCREEN & Drucker
                  LOWORD (wParam) < IDM_DEVMODE)
              {
                   CheckMenuItem (hMenu, nCurrentDevice, MF_UNCHECKED) ;
                   nCurrentDevice = LOWORD (wParam) ;
                   CheckMenuItem (hMenu, nCurrentDevice, MF_CHECKED) ;
              }
              else if (LOWORD (wParam) == IDM_DEVMODE)     // Eigenschaften
              {
                   GetMenuString (hMenu, nCurrentDevice, szDevice,
                                  sizeof (szDevice) / sizeof (TCHAR), MF_BYCOMMAND);
    
                   if (OpenPrinter (szDevice, &hPrint, NULL))
                   {
                        PrinterProperties (hwnd, hPrint) ;
                        ClosePrinter (hPrint) ;
                   }
              }
              else                               // Wahlpunkte des Info-Menüs
              {
                   CheckMenuItem (hMenu, nCurrentInfo, MF_UNCHECKED) ;
                   nCurrentInfo = LOWORD (wParam) ;
                   CheckMenuItem (hMenu, nCurrentInfo, MF_CHECKED) ;
              }
              InvalidateRect (hwnd, NULL, TRUE) ;
              return 0 ;
    
         case WM_INITMENUPOPUP :
              if (lParam == 0)
                   EnableMenuItem (GetMenu (hwnd), IDM_DEVMODE,
                        nCurrentDevice == IDM_BILDSCHIRM ? MF_GRAYED : MF_ENABLED) ;
              return 0 ;
    
         case WM_PAINT :
              lstrcpy (szWindowText, TEXT ("Geräte-Charakteristika: ")) ;
    
              if (nCurrentDevice == IDM_BILDSCHIRM)
              {
                   lstrcpy (szDevice, TEXT ("DISPLAY")) ;
                   hdcInfo = CreateIC (szDevice, NULL, NULL, NULL) ;
              }
              else
              {
                   hMenu = GetMenu (hwnd) ;
                   GetMenuString (hMenu, nCurrentDevice, szDevice,
                                  sizeof (szDevice), MF_BYCOMMAND) ;
                   hdcInfo = CreateIC (NULL, szDevice, NULL, NULL) ;
              }
    
              lstrcat (szWindowText, szDevice) ;
              SetWindowText (hwnd, szWindowText) ;
    
              hdc = BeginPaint (hwnd, &ps) ;
              SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
    
              if (hdcInfo)
              {
                   switch (nCurrentInfo)
                   {
                   case IDM_ALLGEMEINES :
                        DoBasicInfo (hdc, hdcInfo, cxChar, cyChar) ;
                        break ;
    
                   case IDM_ZUSETZLICHEN_DATEN :
                        DoOtherInfo (hdc, hdcInfo, cxChar, cyChar) ;
                        break ;
    
                   case IDM_KURVEN :
                   case IDM_LINIEN :
                   case IDM_POLYGONE :
                   case IDM_TEXT :
                        DoBitCodedCaps (hdc, hdcInfo, cxChar, cyChar,
                                        nCurrentInfo - IDM_KURVEN);
                        break ;
                   }
                   DeleteDC (hdcInfo) ;
              }
    
              EndPaint (hwnd, &ps) ;
              return 0 ;
    
         case WM_DESTROY :
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    
    void DoOtherInfo (HDC hdc, HDC hdcInfo, int cxChar, int cyChar)
    {
         static BITS clip[] =
         {
            CP_RECTANGLE,  TEXT ("CP_RECTANGLE    Unterstützt Clipping:")
    	 } ;
    
    	 static BITS raster[] =
    	 {
              RC_BITBLT,       TEXT ("RC_BITBLT       Unterstützt einfaches BitBlt:"),
              RC_BANDING,      TEXT ("RC_BANDING      Benötigt separate Abschnitte:"),
              RC_SCALING,      TEXT ("RC_SCALING      Setzt Skalierung voraus:"),
              RC_BITMAP64,     TEXT ("RC_BITMAP64     Unterstützt Bitmaps >64K:"),
              RC_GDI20_OUTPUT, TEXT ("RC_GDI20_OUTPUT Arbeitet mit GDI-Version 2.0:"),
              RC_DI_BITMAP,    TEXT ("RC_DI_BITMAP    Kann DIB in Speicher kopieren:"),
              RC_PALETTE,      TEXT ("RC_PALETTE      Unterstützt Farbpaletten:"),
              RC_DIBTODEV,     TEXT ("RC_DIBTODEV     Kann Bitmaps konvertieren::"),
              RC_BIGFONT,      TEXT ("RC_BIGFONT      Unterstützt Schriftdateien >64K:"),
              RC_STRETCHBLT,   TEXT ("RC_STRETCHBLT   Kann StretchBlt ausführen:"),
              RC_FLOODFILL,    TEXT ("RC_FLOODFILL    Kann Flächen füllen:"),
              RC_STRETCHDIB,   TEXT ("RC_STRETCHDIB   Kann DIBs skalieren:")
         } ;
    
         static TCHAR * szTech[] = { TEXT ("DT_PLOTTER (Vektor-Plotter)"),
                                     TEXT ("DT_RASDISPLAY (Raster-Bildschirm)"),
                                     TEXT ("DT_RASPRINTER (Raster-Drucker)"),
                                     TEXT ("DT_RASCAMERA (Raster-Kamera)"),
                                     TEXT ("DT_CHARSTREAM (Zeichenstrom)"),
                                     TEXT ("DT_METAFILE (Zwischendatei)"),
                                     TEXT ("DT_DISPFILE (Display-Datei)") } ;
         int            i ;
         TCHAR          szBuffer[80] ;
    
       //...
    }
    

    1. In Zeilen 37 und 40, "malloc" kommt aus C Sprache, wie kann ich sauber konvertieren ? (habe mit statt "malloc" mit "new" probiert zeigt er Fehler an)

    2. Beim kompilieren in Zeile 153 "CP_RECTANGLE" nicht deklariert, habe in MSDN und Google umgeschaut, kein Support gefunden, einzieges was ich gefunden habe PC_RECTANGLE, wie kann ich diesen Fehler beheben ?



  • pinfo4 = reinterpret_cast<PRINTER_INFO_4*>(new unsigned char[dwNeeded]);
    // ...
    delete[] pinfo4;
    
    #define CP_RECTANGLE 1
    

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877 schrieb:

    CLIPCAPS
    Flag that indicates the clipping capabilities of the device. If the device can clip to a rectangle, it is 1. Otherwise, it is 0.



  • @Hi: Vielen Dank für die Hilfe, funz. alles !


Anmelden zum Antworten