Handle device context hdc de l'imprimante

sigmatc24 Messages postés 53 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 22 avril 2013 - 27 déc. 2007 à 02:08
sigmatc24 Messages postés 53 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 22 avril 2013 - 28 déc. 2007 à 15:58
Bonjour,

Existe t-il un moyen de récupérer le handle device context hdc de l'imprimante par défaut via une fonction API ou autre.

Il existe la propriété hdc de l'objet printer mais moi j'utilise un autre contrôle pour l'impression qui malheureusement ne gère pas cette propriété.

Merci de m'aider

Cordialement

10 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 déc. 2007 à 09:21
Quel contrôle utilises tu pour l'impression ?
0
sigmatc24 Messages postés 53 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 22 avril 2013
27 déc. 2007 à 10:43
J'utilise le contrôle PrintPreview acheté depuis http://www.ppreview.net/

Malheureusement je n'ai trouvé aucune propriété pour obtenir le hDc de l'imprimante par défaut.

J'en ai besoin pour imprimer correctement un code à barres avec un autre contrôle activex d'imagxpress
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 déc. 2007 à 13:40
je lis ceci :
Load, preview and print bitmaps at any position.

on doit donc pouvoir créer un bitmap contenant le barcode et le dessiner sur le report, par la suite...

non ?
0
sigmatc24 Messages postés 53 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 22 avril 2013
27 déc. 2007 à 15:19
C'est exactement je ce que j'ai fait avant de poser cette question.

Le contrôle Code à barres crée un bitmap que je dessine sur le report à l'aide de PrintPreview. mais ce bitmap est inutilisable bien que dessiné très correctement, les barres apparaissent très clairement. Quand je le scanne avec la douchette...non reconnu

Je suis vraiment perdu là
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 déc. 2007 à 16:32
A traduire en VB:

HDC __stdcall bnGetDefPrinterDC(HWND hOwner)
{
  PRINTDLG pd;
  memset(&pd, 0, sizeof(PRINTDLG));
  pd.nCopies = 1;
  pd.lStructSize = sizeof(PRINTDLG);
  pd.hwndOwner = hOwner;
  pd.Flags = PD_RETURNDC | PD_RETURNDEFAULT;
  PrintDlg(&pd);
  return pd.hDC;
}


Ne pas oublier le DeleteDC()hdc) si bnGetDefPrinterDC() retourne <> 0.

ciao...
BruNews, MVP VC++
0
sigmatc24 Messages postés 53 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 22 avril 2013
27 déc. 2007 à 22:32
Merci BruNews

Mais j'ai presque honte de te demander de me traduire ceci en VB car je suis quasi Null en C++

Cependant si tu n'as pas le temps, ce n'est pas grave, et Merci d'avoir essayé de m'aider.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 déc. 2007 à 23:03
Les souvenirs VB sont trop loin, je n'écrirais que des aneries.
Je préfère laisser cela à Renfield.

Je profire pour corriger l'erreur de frappe: DeleteDC(hdc)
C'est PrintDlgA() de comdlg32.dll qu'il faudra appeler depuis VB (version ANSI).

Essayons d'avancer malgré tout:
version simplifiée perso de la struct C que tu dois mettre en format 'Type' VB:
typedef struct tagPD {
  Long lStructSize;
  Long hwndOwner;
  Long hDevMode;
  Long hDevNames;
  Long hDC;
  Long Flags;
  Long nFromPage;
  Long nA;
  Long nCopies;
  Long hInstance;
  Long lCustData;
  Long lpfnPrintHook;
  Long lpfnSetupHook;
  Long lpPrintTemplateName;
  Long lpSetupTemplateName;
  Long hPrintTemplate;
  Long hSetupTemplate;
} PRINTDLG, *LPPRINTDLG;

17 membres de 4 octets, tu mets donc pd.lStructSize = 68
pd.nCopies = 65536 ' nCopies est en fait le HIWORD, 0 dans le LOWORD
pd.hwndOwner = hOwner ' hwnd de la fenetre appelante, pas obligatoire tu mets 0
pd.Flags = 1280
et tu mets ' = 0' tous les autres membre, tu éviteras l'appel memset().

Prépare tout cela en sytaxe VB et le Declare Function...

ciao...
BruNews, MVP VC++
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 déc. 2007 à 07:59
J'ai pris les déclarations VBisées de API Viewer...
J'ai renommé la fonction pour y glisser le verbe 'Create' pour aider à penser qu'il faut un DeleteDc...


Private Type PrintDlg
lStructSize As Long
hwndOwner As Long
hDevMode As Long
hDevNames As Long
hdc As Long
flags As Long
nFromPage As Integer
nToPage As Integer
nMinPage As Integer
nMaxPage As Integer
nCopies As Integer
hInstance As Long
lCustData As Long
lpfnPrintHook As Long
lpfnSetupHook As Long
lpPrintTemplateName As String
lpSetupTemplateName As String
hPrintTemplate As Long
hSetupTemplate As Long
End Type

Private Const PD_RETURNDC As Long = &H100
Private Const PD_RETURNDEFAULT As Long = &H400

Private Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" (ByRef pPrintdlg As PrintDlg) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long

Private Function CreateDefPrinterDc() As Long
Dim tPd As PrintDlg
With tPd
.nCopies = 1
.lStructSize = LenB(tPd)
.flags = PD_RETURNDC Or PD_RETURNDEFAULT
PrintDlg tPd
CreateDefPrinterDc = .hdc
End With
End Function

Private Sub Form_Load()
Dim hPrinterDc As Long
hPrinterDc = CreateDefPrinterDc()
If hPrinterDc Then
'# ... le traitement que tu souhaites
DeleteDC hPrinterDc
End If
End Sub
0
sigmatc24 Messages postés 53 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 22 avril 2013
28 déc. 2007 à 15:53
Merci beaucoup d'avoir essayé, je vais donc essayer ces bonnes choses et je te tiendrais au courant le plus tôt possible

Cordialement
0
sigmatc24 Messages postés 53 Date d'inscription dimanche 29 avril 2007 Statut Membre Dernière intervention 22 avril 2013
28 déc. 2007 à 15:58
Oups, je n'ai pas lu la suite, Merci beaucoup à Renfield qui a pratiquement traduit en VB.

Vous êtes vraiment sympa les gars.
0
Rejoignez-nous