Printer HDC in VB NET

lunedì 23 luglio 2007 - 10.00

Giamp72 Profilo | Junior Member

Ciao a tutti,
In breve: ho un OCX che usavo in Visual Basic, l'ho inserito in un progetto VBnet e fin qui tutto bene. tutte le funzioni sono correttamente supportate. Ora però devo utilizzare una funzione di questo OCX che stampa i dati da esso elaborati. Questa funzione si aspetta di ricevere l'HDC della stampante..
(In vb passavo printer.hdc per intenderci) e adesso???
che diavolo gli passo???
Nel processo di stampa non ho capito se devo utlizzare semplicemente il printerSettings o se devo anche creare un PrintDocument... insomma.. se qualcuno di voi ha avuto a che fare con lo stesso problema, vorrei sapere come, e se ha risolto..
Grazie
Giamp72

Brainkiller Profilo | Guru

Ciao,
prova così. Tempo fa ho letto questa soluzione ma mai provata non avendo un OCX che accetta un handle.
Crea un oggetto PrintDocument, e specifica la stampante esempio:

PrintDocument pd = new PrintDocument(); pd.PrinterSettings.PrinterName = printer;

chiama il metodo Print() , scatterà l'evento OnPrintPage che avrà un'istanza di PrintPageEventArgs.
A sua volta PrintPageEventArgs, ha una proprietà Graphics che ha un metodo GetHdc(). Prova a recuperarlo così e a passarlo all'OCX. Se non funzionasse dovrai riscrivere in altro modo la parte di printing dell'OCX o farla direttamente in .NET.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Giamp72 Profilo | Junior Member

sfortunatamente quella strada l'ho già provata e col mio ocx non va...
per ora ho risolto in altra maniera.. però se qualcuno dovesse avere altre novità in merito.....

Giamp72

Brainkiller Profilo | Guru

>sfortunatamente quella strada l'ho già provata e col mio ocx
>non va...
>per ora ho risolto in altra maniera.. però se qualcuno dovesse
>avere altre novità in merito.....

L'altra soluzione penso sia questa.
Utilizzare la API OpenPrinter rimappandola nel codice C#/VB.NET:
http://msdn2.microsoft.com/en-us/library/ms536027.aspx
che restituisce l'Handle (phPrinter) della stampante specificata nel parametro pPrinterName.
A questo punto provare a passare phPrinter all'OCX che dovebbe corrispondere al vecchio Printer.hDC che utilizzavi tu.
Ciao



David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

Giamp72 Profilo | Junior Member

purtroppo non va neppure così.. credo che sia un problema dell'ocx a questo punto!
Ad ogni modo ho risolto con la stampante di default, nel senso che se chiamo la funzione dell'ocx senza nessun hdc, la stampa avviene sull stampante di default..
Ora però s'innesca un'altra avaria, ovvero come cambiare la stampante di default da dentro il codice...
detto, fatto:

Dim q As Long = SetDefaultPrinter(Stampante.PrinterName)
Dim q2 As Long = SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, "windows")

peccato però che il sendnotifymessage non ha alcun effetto e finche non esco dalla mia applicazione, per lei la stampante di default è quella vecchia!!!
Tra l'altro capita che se cambio stampante dal pannello di controllo, dopo aver lanciato il programma, questa variazione non ha alcun effetto!!!

non vorrete mica farmi credere che l'unico modo per risolvere è Application.restart vero?????

chiunque abbia notizie utili... bè è il benvenuto!!
Giamp72
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5