Mit ADD PRIVATE PRINTERS kann ein Programm eigene Druckerbeschreibungen zum Dialog hinzufügen. <drv_info> enthält einen Zeiger auf die Liste der verfügbaren Drucker und der Rasterverfahren. Die Treibernummer sollte auf 0x7fff gesetzt werden, um den eigenen Treiber von OS-Treibern zu unterscheiden.
Deklaration: WORD pdlg_add_printers( PRN_DIALOG *prn_dialog, DRV_INFO *drv_info ); Aufruf: ret = pdlg_add_printers( prn_dialog, &drv_info ); Variable Belegung Bedeutung Eingaben: contrl[0] 205 pdlg_set contrl[1] 1 Einträge in intin contrl[3] 2 Einträge in addrin intin[0] 0 pdlg_add_driver addrin[0] prn_dialog Zeiger auf Verwaltungsstruktur addrin[1] driver Ausgaben: contrl[2] 1 Einträge in intout contrl[4] 0 Einträge in addrout intout[0] ret 0: Fehler 1: alles in Ordnung Strukturbeschreibung: typedef struct { LONG magic; /* 'pdnf' */ LONG length; /* Strukturlänge */ LONG format; /* Datenformat */ LONG reserved; /* reserviert */ WORD driver_id; /* Treibernummer fürs VDI */ WORD driver_type; /* Treibertyp */ LONG reserved1; LONG reserved2; LONG reserved3; PRN_ENTRY *printers; /* Liste der zum Treiber gehörenden Drucker */ DITHER_MODE *dither_modes; /* Liste der vom Treiber unterstützten Rasterverfahren */ LONG reserved4; LONG reserved5; LONG reserved6; LONG reserved7; LONG reserved8; LONG reserved9; BYTE device[128]; /* Ausgabedatei des Druckertreibers */ } DRV_INFO; typedef struct _dither_mode { struct _dither_mode *next; LONG length; /* Strukturlänge */ LONG format; /* Datenformat */ LONG reserved; /* reserviert */ LONG dither_id; /* Kennung */ LONG color_modes; /* unterstützte Farbtiefen */ LONG reserved1; LONG reserved2; BYTE name[32]; /* Name des Rasterverfahrens */ } DITHER_MODE; typedef struct _prn_entry /* Gerätebeschreibung */ { struct _prn_entry *next; /* Zeiger auf die die nächste Gerätebeschreibung */ LONG length; /* Strukturlänge */ LONG format; /* Datenformat */ LONG reserved; /* reserviert */ WORD driver_id; /* Treiberkennung */ WORD driver_type; /* Treibertyp */ LONG printer_id; /* Druckerkennung */ LONG printer_capabilities; /* Druckereigenschaften */ LONG reserved1; LONG flags; struct _pdlg_sub *sub_dialogs; /* Zeiger auf die Liste der Unterdialoge für diesen Drucker */ PRN_SWITCH setup_panel; /* Unterdialog bei Druckerwechsel initialisieren */ PRN_SWITCH close_panel; /* Unterdialog bei Druckerwechsel schließen */ PRN_MODE *modes; /* Liste der vorhandenen Auflösungen */ MEDIA_SIZE *papers; /* Liste der vorhandenen Papierformate */ PRN_TRAY *input_trays; /* Liste der Einzüge */ PRN_TRAY *output_trays; /* Liste der Auswürfe */ BYTE name[32]; /* Name des Druckers */ } PRN_ENTRY; /* old_printer kann auch 0L sein */ typedef LONG (cdecl *PRN_SWITCH)( struct _drv_entry *drivers, struct _prn_settings *settings, struct _prn_entry *old_printer, struct _prn_entry *new_printer ); #define PRN_STD_SUBS 0x0001 typedef struct _prn_mode /* Beschreibung eines Druckermodus */ { struct _prn_mode *next; /* Zeiger auf den nächsten Druckermodus */ LONG mode_id; /* Moduskennung (Index innerhalb der Datei) */ WORD hdpi; /* horizontale Auflösung in dpi */ WORD vdpi; /* vertikale Auflösung in dpi */ LONG mode_capabilities; /* Moduseigenschaften */ LONG color_capabilities; /* einstellbare Farbmodi */ LONG dither_flags; /* Flags, die angeben, ob der korrespondierende Farbmodus mit oder ohne Dithern ansprechbar ist */ MEDIA_TYPE *paper_types; /* geeignete Papiertypen */ LONG reserved; BYTE name[32]; /* Modusname */ } PRN_MODE; typedef struct _media_type /* Beschreibung eines Papiertyps/Druckmediums */ { struct _media_type *next; LONG type_id; /* Kennung des Papierformats */ BYTE name[32]; /* Name des Papierformats */ } MEDIA_TYPE; typedef struct _media_size /* Beschreibung eines Papierformats */ { struct _media_size *next; LONG size_id; /* Kennung des Papierformats */ BYTE name[32]; /* Name des Papierformats */ } MEDIA_SIZE; typedef struct _prn_tray /* Beschreibung eines Einzugs/Auswurfs */ { struct _prn_tray *next; LONG tray_id; /* Nummer des Einzugs oder Auswurfs */ BYTE name[32]; /* Name des Schachts */ } PRN_TRAY;