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

C++Builder Discussion :

Utilisation ActiveX Tpdf


Sujet :

C++Builder

  1. #1
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut Utilisation ActiveX Tpdf
    salut,

    J'ai un petit probleme pour l'utilisation de l'ActiveX Acrobat reader,
    au moment d'utiliser la fonction "PrintPages(long from,long to)"

    Après avoir charger mon fichier j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              int num_page=2;
              Pdf1->PrintPages(num_page,num_page);
    et là ,Acrobat m'affiche l' avertissement:
    "ATTENTION! Un script a demandé l'impression d'un fichier acrobat.Il peut s'agir d'un document complet.Voulez vous continuer l'"

    Pas de probleme si je reponds oui ou non (cependant je ne veux pas de message).Miracle dans cette boite il ya une case à cocher : "ne plus afficher ce message", que je coche...

    Et là , l'impression via printPages ne fonctionne plus.(Plus de message ,mais pas d'impression).
    ( Le seul moyen pour retrouver le message d'alerte c'est d'aller dans les configuration d'acrobat etde faire réinitialiser les avertissements)..

  2. #2
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    Bon ,apparement c'est un bug d'acrobat, l'ActiveX acrobat n'étant pas supporté officiellement, aucune correction n'est prévue...

    J'ai donc décidé de simuler l'envoi de la touche entrée sur la boite de dialogue.

    Voilà comment faire pour ceux que ça interresse :

    (necessaire seulement si vous devez imprimer 1 page specifique d'un document pdf/ sinon utilisez plutot shellexecute)

    Après une petite enquete grâce à windowsspy(modifié) on s'apercoit
    qu'envoyer directement le message "touche entrée apuyée" à la boite
    de dialog ou au bouton ok ne sert à rien c'est le label (Static) comprenant
    le texte qui peut recevoir le message "entree"(=oui valider l'impression).

    Donc on doit :
    1) trouver la boite de dialog de confirmation d'acrobat (API FindWindow)
    2) comme le label n'a pas d'id (GWL_ID,donc introuvable avec GetItemCtrId ou GetWindowLong )
    il faut trouver le label(Static) dans cette boite de dialog (API EnumWindowProc )
    3) envoyer le message "touche entree" à ce label.

    contrainte:attendre que la boite s'affiche.


    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
     
     
    // code de simulation de l'appui sur la touche ENTREE
    BOOL CALLBACK EnumChildProc(hwndChild, lParam)
    HWND hwndChild;
    LPARAM lParam;
    {
        char Texte[250];
        char classname[250];
        GetWindowText(hwndChild,Texte,sizeof(Texte));
        GetClassName( hwndChild,classname,sizeof(classname));
        String ClassName=String(classname);
        String Text1=String(Texte);
        	//if(ClassName=="Static" && Text1!=""){   
        	//il y a 4 "static" dont 1 seul  qui contient le texte, bizarrement parfois le programme nedetecte aucun texte 
     
        //envoie du message à tous les labels
        if(ClassName=="Static" ){
            // simulationde la touche entree   
            SendMessage(hwndChild,WM_KEYDOWN,VK_RETURN,0);
            SendMessage(hwndChild,WM_KEYUP,VK_RETURN,0);
     
        }
        return TRUE;
    }
     
    //fonction  à associer à un evenement OnTimer d'un timer crée dynamiquement
    // code de recherche de la boite de dialoque et du label (Static) à l'intérieur de cette fenetre
    void __fastcall TForm1::TimerAction(TObject * Sender)
    {
            HWND Hdl=NULL;
     
            //recherche de la boite de dialogue
            Hdl = FindWindow("#32770","Adobe Acrobat"); //les parametres classe et nom ont été trouvé avec windowspy
     
            if(Hdl!=NULL){
                    RECT rcClient;
                    ::GetClientRect(Hdl, &rcClient);
                    // on enumère tous 
                    EnumChildWindows(Hdl, EnumChildProc,(LPARAM) &rcClient);
                    //ok=true;
                    TIMER_PRINT->Enabled=false;
                    delete (TTimer*)Sender;
            }
    }
     
    void __fastcall TForm1::ImprimerPdf()
    {
     
     
                    Pdf1->printPages(num_page,num_page);
                    Application->ProcessMessages();
     
                    // on utilise un Timer qui contrôlera toutes les 50 ms 
                    // si la fenetre existe et le cas echéant, la fermera
                    TTimer * ATimer = new TTimer(this);
                    ATimer->Enabled=false;
                    ATimer->Interval=50;
                    ATimer->OnTimer=TimerAction;
                    ATimer->Enabled=true;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème utilisation Activex
    Par Wassim123 dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 02/12/2008, 11h14
  2. utiliser activex dans ma page web
    Par asrekik dans le forum ASP
    Réponses: 0
    Dernier message: 09/02/2008, 21h34
  3. utilisation activex vlc
    Par gentelmand dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/11/2007, 00h31
  4. Utilisation ActiveX Word
    Par Tiwaz dans le forum C++Builder
    Réponses: 1
    Dernier message: 14/03/2007, 22h48
  5. BDS - Utilisation ActiveX ShDocVw.dll
    Par RamDevTeam dans le forum Delphi .NET
    Réponses: 5
    Dernier message: 20/09/2006, 18h43

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