Avatar billede aaboe Nybegynder
22. januar 2001 - 17:05 Der er 4 kommentarer og
1 løsning

Printerdialog i Visual C++

I Visual C++ 6.0 har jeg lavet et program, hvor i det skal være muligt at udskrive via en printerdialog.

Når brugerne har valgt en printer og dens opsætning, gemmes indstillingerne i registreringsdatabasen.

Mit problem opstår, når jeg skal kalde dialogboxen med de indstillinger som brugeren valgte sidste gang frem.

Jeg kan godt få fat på alt andet end selve printernavnet.

Se nedenstående eksempel, som sørger for at vise printerboxen hvor der er valgt landscape som papirformat:

  CPrintDialog printDlg(TRUE);

  printDlg.GetDefaults();

  printDlg.m_pd.Flags &= ~PD_RETURNDEFAULT;
  printDlg.m_pd.Flags |= PD_PRINTSETUP;
   
  DEVMODE* MinDevMode;

  // Her hentes orientation
  MinDevMode->dmOrientation = 2;
 
  GlobalUnlock(MinDevMode);

  int res = printDlg.DoModal();

Men hvordan får jeg printerdialogboxen til at vise en anden printer end standardprinteren, når dialogboxen vises????
Avatar billede wisen Nybegynder
13. februar 2001 - 08:15 #1
I følge MSDN, burde du kunne bruge \"hDevNames\" i m_pd til at indstille den printer der skal bruges. Jeg har sakset følgende :

hDevNames :
Handle to a movable global memory object that contains a DEVNAMES structure. If hDevNames is not NULL on input, you must allocate a movable block of memory for the DEVNAMES structure and initialize its members. The PrintDlg function uses the input datato initialize the controls in the dialog box. When PrintDlg returns, the DEVNAMES members contain information for the printer chosen by the user. You can use this information to create a device context or an information context.
The hDevNames member can be NULL, in which case, PrintDlg allocates memory for the DEVNAMES structure, initializes its members to indicate the user\'s input, and returns a handle that identifies it.


If both hDevMode and hDevNames are NULL, PrintDlg initializes the dialog box using the current default printer. To initialize the dialog box for a different printer, use the wDeviceOffset member of the DEVNAMES structure to specify the name of the printer.

Note that the dmDeviceName member of the DEVMODE structure also specifies a printer name. However, dmDeviceName is limited to 32 characters, and the wDeviceOffset name is not. If the wDeviceOffset and dmDeviceName names are not the same, PrintDlg initializes the dialog box using the printer specified by wDeviceOffset.


Avatar billede wisen Nybegynder
22. februar 2001 - 12:33 #2
Er det noget liv herinde ?????
Avatar billede wisen Nybegynder
01. marts 2001 - 09:28 #3
Guess not....
Avatar billede aaboe Nybegynder
30. juli 2001 - 15:53 #4
Ups, du må undskylde den (meget) lange svartid.

Du er inde på noget af det rigtige, så du får pointene. Jeg fandt selv en løsning på problemet:

Problemet er ikke at udskrive. Der har du ret i, at man her kan bruge \"hDevNames\" i m_pd til at indstille den printer der skal bruges.

Problemet opstod når man skulle vælge hvilken printer systemet skulle benytte, når programmet udskriver. For at vise den rigtige printer i printerdialogboxen var det nødvendigt at gemme hele DEVMODE og DEVNAMES strukturen i f.eks. registry. Ellers vil Windows altid vise standardprinteren. Disse skulle så overskrive DEVNAMES og DEVMODE, før printerdialogen DoModal() blev kaldt. På den måde blev det muligt at se hvilken en printer brugeren sidst havde benyttet.

I nedenstående på Microsofts hjemmeside findes der hjælp til hvordan det virker!

// HOWTO: Implementing an Application-Defined Default Printer
// Article ID: Q193103
Avatar billede wisen Nybegynder
31. juli 2001 - 08:13 #5
Hmm, sådan.... OK, takker for point...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester