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 !