IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] imprimer un dialogue au format DIB


Sujet :

MFC

  1. #1
    Débutant
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Points : 324
    Points
    324
    Par défaut [MFC] imprimer un dialogue au format DIB
    Malheureusement pour moi le code fourni dans la FAQ ne fonctionne pas, je doit mal effectuer une tache de plus personne ne semble comprendre d'ou viens mon erreur.

    Je me suis donc tourné vers le site codeProject et j'ai donc trouvé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
     
    void PrintBitmap(LPCTSTR filename) {
     CPrintDialog printDlg(FALSE);
     printDlg.GetDefaults(); 
     // Or get from user:
     // if (printDlg.DoModal() == IDCANCEL)   
     //        return; 
     CDC dc;
     if (!dc.Attach(printDlg.GetPrinterDC())) {
      AfxMessageBox(_T("No printer found!")); return;
     } 
     
     dc.m_bPrinting = TRUE; 
     DOCINFO di;    
     // Initialise print document details
     ::ZeroMemory (&di, sizeof (DOCINFO));
     di.cbSize = sizeof (DOCINFO);
     di.lpszDocName = filename; 
     BOOL bPrintingOK = dc.StartDoc(&di); // Begin a new print job 
     // Get the printing extents
     // and store in the m_rectDraw field of a 
     // CPrintInfo object
     CPrintInfo Info;
     Info.SetMaxPage(1); // just one page 
     int maxw = dc.GetDeviceCaps(HORZRES);
     int maxh = dc.GetDeviceCaps(VERTRES); 
     Info.m_rectDraw.SetRect(0, 0, maxw, maxh); 
     for (UINT page = Info.GetMinPage(); page <= 
          Info.GetMaxPage() && bPrintingOK; page++) {
      dc.StartPage();    // begin new page
      Info.m_nCurPage = page;
      CBitmap bitmap;
      // LoadImage does the trick here, it creates a DIB section
      // You can also use a resource here
      // by using MAKEINTRESOURCE() ... etc. 
      if(!bitmap.Attach(::LoadImage(
       ::GetModuleHandle(NULL), filename, IMAGE_BITMAP, 0, 0, 
       LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE))) {
        AfxMessageBox(_T("Error loading bitmap!")); return;
       } 
       BITMAP bm;
       bitmap.GetBitmap(&bm);
       int w = bm.bmWidth; 
       int h = bm.bmHeight; 
       // create memory device context
       CDC memDC; 
       memDC.CreateCompatibleDC(&dc);
       CBitmap *pBmp = memDC.SelectObject(&bitmap);
       memDC.SetMapMode(dc.GetMapMode());
       dc.SetStretchBltMode(HALFTONE);
       // now stretchblt to maximum width on page
       dc.StretchBlt(0, 0, maxw, maxh, &memDC, 0, 0, w, h, SRCCOPY); 
       // clean up
       memDC.SelectObject(pBmp);
       bPrintingOK = (dc.EndPage() > 0);   // end page
     } 
     if (bPrintingOK)
       dc.EndDoc(); // end a print job
     else dc.AbortDoc();           // abort job. 
    }
    Cette fonction me permet d'imprimer un bitmap à partir d'un chemin je suppose "LPCTSTR filename" alors en faisant fonctionner ma cervelle
    j'ai pensé à combiner le code de FARSCAPE et celui-ci afin de pouvoir reussir mon impression.

    le code de la FAQ s'effectue directement à partir du dialogue courant.
    il se compose des fonctions suivantes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CBitmap *pBmp=CopyWindowToBitmap(this,true);
    PrintBmp(pBmp);    
    pBmp->DeleteObject();
    delete pBmp;
    or chez moi c'est la fonction PrintBmp(pBmp) qui plante donc à partir de mon dialogue je voudrais savoir si il etait possible de récuperer le chemin de mon dialogue courant et qu'il soit du type LPCTSTR

    voila j'espere avoir été assez explicite et je vous remercie d'avance pour votre aides

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu es quand même incroyable , j'ai copié/collé le code de la faq dans un nouveau projet SDI.
    fais attention à mettre l'include en haut du source.
    puis j'ai déclaré les fonctions indiquées en static .
    et fait finalement l'appel dans la formview.

    compiler/linker 0 erreurs en 3mn.

    http://farscape.developpez.com/Samples/PrintDialog.zip



  3. #3
    Débutant
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Points : 324
    Points
    324
    Par défaut
    je te remercie pour t'etre donné la peine de me realiser cet exemple,
    cependant en analysant ton code je vois que la classe correspondant à ta fenetre printDialogView

    est herité de cette maniere :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class CPrintDialogView : public CFormView

    alors que moi le dialog que je veu imprimer est de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class bar_unique : public CDialog
    je sais pas trop si y a une grosse difference en tout cas j'essaye de l'adapter de la meme maniere mais j'ai encore un paquet d'erreur mais en tout cas j'aiau moin un exemple qui marche c'est deja pas mal

    en tout cas 1000 merci à toi FARSCAPE pour ton aide

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    et alors on s'en fout .....
    CopyWindowToBitmap accepte un CWnd * non ?
    alors CFormView ou CDialog c'est dérivé de CWnd .

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par farscape
    et alors on s'en fout .....
    CopyWindowToBitmap accepte un CWnd * non ?
    alors CFormView ou CDialog c'est dérivé de CWnd .
    Oui mais les CDialog ne fonctionnent pas comme les CView et dérivées.

    Une CDialog c'est en win32 ni plus ni moins qu'une classe de dialogue avec une DlgProc c.a.d une fonction de procédure de gestion de message ( pas très compréhensible tout ca je vous l'accorde )

    Donc pour la gestion des graphismes c'est un peu différent

    donc à partir de mon dialogue je voudrais savoir si il etait possible de récuperer le chemin de mon dialogue courant et qu'il soit du type LPCTSTR



    GetModuleHandle

    The GetModuleHandle function retrieves a module handle for the specified module if the file has been mapped into the address space of the calling process.
    To avoid the race conditions described in the Remarks section, use the GetModuleHandleEx function.
    HMODULE GetModuleHandle( LPCTSTR lpModuleName // module name);

    ou bien pour le répertoire sur volume
    GetCurrentDirectory
    The GetCurrentDirectory function retrieves the current directory for the current process.
    DWORD GetCurrentDirectory( DWORD nBufferLength, // size of directory buffer LPTSTR lpBuffer // directory buffer);

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    dans le cas présent ça n'a aucune importance ,le but de cette fonction c'est de faire un bitmap de la fenetre passée en argument.
    la fenetre servant uniquement a obtenir les coordonnées sur l'ecran ...

  7. #7
    Débutant
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2004
    Messages
    452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 452
    Points : 324
    Points
    324
    Par défaut
    En tout cas Merci a toi farscape pour t'etre donné autant de mal pour m'aider ainsi qu'a mat.M pour ces reponses.

    Pour ce qui est de l'impression je me suis un peu penché dessus mais bon j'ai laissé pour plus tard. en tout cas encore merci à vous 2 pour votres aides

Discussions similaires

  1. [MFC] imprimer une dialogue contenant un graphique
    Par moulefrite dans le forum MFC
    Réponses: 9
    Dernier message: 27/04/2006, 11h49
  2. Réponses: 3
    Dernier message: 17/06/2004, 16h59
  3. [MFC] imprimer un bmp ressource
    Par chronos dans le forum MFC
    Réponses: 6
    Dernier message: 07/06/2004, 17h17
  4. OpenGL - MFC Boite de dialogue
    Par cybertigre dans le forum OpenGL
    Réponses: 3
    Dernier message: 15/04/2004, 16h09
  5. [MFC] Boîte de dialogue chronométrée
    Par mdriesbach dans le forum MFC
    Réponses: 5
    Dernier message: 18/02/2003, 12h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo