begin process at 2012 02 12 07:56:30
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

API

 > NAVIGUATEUR FLASH EN MFC (C++ .NET)

NAVIGUATEUR FLASH EN MFC (C++ .NET)


 Information sur le tutoriel

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

 Description

Ce turorial a pour but de permettre la création de son propre naviguateur flash pour contourner les limites de la projection flash (appel d'exe avec paramètres, dialogue avec une appli sans socket, ...). A partir de là, tout est maintenant possible.

Tutorial

Réalisé avec Microsoft Visual C++ .NET

CREATION DU PROJET

- Nouveau projet (nommé "test" ici)
- MFC > Application MFC
- Type d'application > Basée sur une boîte de dialogue
- Fonctionnalités de l'interface utilisateur :
    - Bouton Réduire
    - Bouton Agrandir
    - Menu Système
    - Boîte de dialogue A propos de


ORGANISATION DE L'INTERFACE

- Supprimer tous les éléments de IDD_TEST_DIALOG (voir affichage des ressources)
    - Bouton OK
    - Bouton Annuler
    - Texte "TODO : ..."
- Etendre le rectangle bleu (limite des composants) aux 4 coins
- Clic droit au centre > Inserer un contrôle ActiveX > Shockwave Flash Object
- Etirer l'object aux 4 coins
- Clic droit sur le contrôle > Ajouter une variable > Nom de variable : m_flash
- Selectionner le contrôle > Propriétés > Evènement de contrôle
- FSCommand : Selectionner " FSCommandShockwaveflash1"
- Selectionner la fenêtre (barre de titre) > Propriétés > Messages
- WM_SIZE > Sélectionner " OnSize"
- WM_SIZING > Sélectionner " OnSizing"
- Selectionner la fenêtre (barre de titre) > Propriétés > Propriétés > Apparence
- Border : Resizing


CHARGEMENT DU FLASH

- ouvrir le fichier testDlg.cpp,
- aller au "TODO" de la fonction CtestDlg::OnInitDialog
- ajouter le code suivant :
    // Charge le swf depuis le repertoire courant
    char currentDir[2048];
    GetCurrentDirectory(2047, currentDir);
    CString swfPath = currentDir;
    swfPath = "file://" + swfPath + "/test.swf";
    m_flash.put_Movie(swfPath);


    // Redimensionne la fenêtre et le contrôle flash aux dimensions du swf
    CRect clientRect, windowRect;
    GetClientRect(&clientRect);
    GetWindowRect(&windowRect);

    long windowW = windowRect.right  - windowRect.left + 1;
    long windowH = windowRect.bottom - windowRect.top + 1;
    long clientW = clientRect.right  - clientRect.left + 1;
    long clientH = clientRect.bottom - clientRect.top + 1;
    long marginW = windowW - clientW;
    long marginH = windowH - clientH;
    long flashW = atol(m_flash.GetVariable("width"));
    long flashH = atol(m_flash.GetVariable("height"));
    long newWinW = flashW + marginW;
    long newWinH = flashH + marginH;

    windowRect.right  = windowRect.left + newWinW -1;
    windowRect.bottom = windowRect.top + newWinH -1;
    clientRect.right  = flashW;
    clientRect.bottom  = flashH;

    MoveWindow(windowRect, 1);
    m_flash.MoveWindow(clientRect, 1);
    CenterWindow();


MINIMISER ET MAXIMISER LA FENETRE

- aller au "TODO" de la fonction CtestDlg::OnSize
- ajouter le code suivant :
    // Minimiser & maximiser
    static bool init = false;
   
    if (init)
    {
        CRect clientRect;
        GetClientRect(&clientRect);
        m_flash.MoveWindow(clientRect, 0);
    }

    init = true;


REDIMENSIONNER MANUELLEMENT LA FENETRE

- aller au "TODO" de la fonction CtestDlg::OnSizing
- ajouter le code suivant :
    // Redimensionner
    static bool init = false;
   
    if (init)
    {
        CRect clientRect;
        GetClientRect(&clientRect);
        m_flash.MoveWindow(clientRect, 0);
    }

    init = true;


RECEVOIR LES REQUETES DU FLASH, LES TRAITER ET REPONDRE

- aller au "TODO" de la fonction CtestDlg::FSCommandShockwaveflash1
- ajouter le code suivant :
    // Traiter la requête
    if (strcmp(command, "send")==0)
    {
        // votre code (après analyse des paramètres args si besoin)
        // ...

        // Acquitement
        m_flash.SetVariable("MFCobjet.msg", "done");
    }

    // Quitter l'application
    if (strcmp(command, "quit")==0)
        OnCancel();


CODE DU FLASH : ENVOI DE DONNEES VERS LE CODE C
fscommand("send", "mes paramètres");
fscommand("exit");
fscommand("exec", "monappli.exe -mesparam"); // à coder dans le MFC
...

Attention > Maintenant, toutes les commandes de fscommand sont à traiter dans le MFC,
elles ne sont plus active par défaut


CODE DU FLASH : RECEPTION DE DONNEES DEPUID LE CODE C

// Création d'un object
MFCobjet = new Object();
MFCobjet.msg = "";

// appellé par le watch quand le paramètre surveillé change
MFCobjet_callback = function (prop, oldVal, newVal, userData)
{   
    // votre code (après analyse des paramètres newVal si besoin)
    // ...

    msg = newVal;
    return newVal;
}

// paramètre "msg" de l'objet "MFCobjet" surveillé
MFCobjet.watch("msg", MFCobjet_callback);


Un exemple dans un précédent post : http://www.cppfrance.com/code.aspx?ID=36405

 Historique

15 mars 2006 09:38:54 :
Ajout d'un lien vers un exemple

Commentaires

Commentaire de fuliculi le 15/03/2006 09:40:45

Exemple à cette adresse :
http://www.cppfrance.com/code.aspx?ID=36405

Commentaire de beni__j le 07/04/2006 16:08:42

Salut
Ce tutoriel est une mine d'or pour moi, si tu étais devant moi je me mettrai à genou (mais non j'en rajoute pas)...
Bref, j'ai suivit ton tutoriel pas à pas et ça marche niquel, enfin presque parce que sinon j'écrirais pas :p, il y a juste un mini mini problème : au démarrage de l'exe une petite boite de dialogue vide s'affiche avec juste une croix erreur, il suffit d'appuyer sur OK pour qu'elle s'enlève et l'exe marche niquel aprés, mais bon ça s'affiche à chaque fois alors ça l'fait pas comme diraient les djeuns (d'ailleur j'en suis un ça tombe bien).
Si j'ai pas été assez clair : enlève le swf du dossier de l'exe, normalement ça te met la même boite de dialogue.
Merci encore pour ce tuto et a+.

Commentaire de beni__j le 10/04/2006 10:11:42

Re Salut
Je crois avoir trouvé la source du problème, à savoir le swf, quand je crée un swf, cette boite de dialogue apparait alors qu'avec le swf que tu fournis ça marche, j'ai essayé d'enregistrer en flash 7, toujours pareil, j'ai essayé de recréer le swf à partir de ton fla et ca marche, donc je me suis dit que j'allais modifier ton fla, mais dés que je recrée le swf ça me remet cette boite de dialogue. Le pire (enfin dans le sens bizare) c'est que ça marche une fois cette boite de dialogue passée, mais c'est pour mon stage que je dois faire ça alors ça fait pas vraiment sérieux d'avoir une vilaine boite de dialogue vide qui s'affiche à chaque démarrage de l'application.

a+

Commentaire de beni__j le 10/04/2006 10:35:48

Re re salut (désolé c'est pas un chat je sais)

Bon j'ai résolu mon problème, il faut absolument qu'il y ait au moins un composant dans la bibliothèque, même pas besoin qu'il soit dans la scène, étrange...

a+ (j'éspère pas en fait ;))

Commentaire de fuliculi le 10/04/2006 12:38:06

Salut BENI__J,

heureux que le tuto te plaise, même s'il manque d'illustration mais je fais ça pendant mes pauses du taf, alors... Pour ton soucis, t'as trouvé une solution, c'est cool. J'ai eu un problème similaire une fois, et c'était provoqué par la récupération des dimensions du swf dans le code C++. Pour contourner ça, j'avais simplement saisi les valeurs à la place de la récupération automatique de la largeur et hauteur.

Avant j'avais ça :
long flashW = atol(m_flash.GetVariable("width"));
long flashH = atol(m_flash.GetVariable("height"));

Ensuite ça :
long flashW = 530;
long flashH = 250;

Ca ne pose pas problème dans le cas où tu connais à l'avance les dimensions.

Sinon j'ai une autre solution (non testée). Il s'agit de récupérer les dimensions qu'une fois le swf chargé. L'évènement OnProgress du composant devrait le permettre.

Commentaire de snakeeater1 le 07/03/2008 23:10:28

Etrange, dès la compilation sans avoir touché une seule ligne de ton code, j'ai déja 8 erreurs de compilo :/
Du genre:
1>.\XMLeditorDlg.cpp(27) : error C2065: 'IDC_SHOCKWAVEFLASH1' : identificateur non déclaré
1>.\XMLeditorDlg.cpp(52) : error C2664: 'GetCurrentDirectoryW' : impossible de convertir le paramètre 2 de 'char [2048]' en 'LPWSTR'
1>        Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
1>.\XMLeditorDlg.cpp(53) : error C2440: 'initialisation' : impossible de convertir de 'char [2048]' en 'ATL::CStringT<BaseType,StringTraits>'
\XMLeditorDlg.cpp(54) : error C2678: '+' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'const char [8]' (ou il n'existe pas de conversion acceptable)

Etant un programmeur flash avant tout je n'ai que très peu de connaissance en C/C++, ces messages de débug me sont donc complètement obscures :/

Un ptit coup de main ?

Commentaire de estebanpianolo le 16/06/2009 15:45:02

Merci beaucoup pour ce tuto.
Je voudrais savoir si il y a moyen à partir du code c++ de lancer une fonction contenue dans le swf.
Merci d'avance pour vos réponses

Commentaire de fuliculi le 16/06/2009 18:49:34

A ma connaissance oui, mais indirectement.

Si par exemple, je souhaite appeler un fonction flash avec des paramètres : mafonction("tralala", "pouf");

J'ajoute le code C++ suivant :
m_flash.SetVariable("MFCobjet.msg", "<request fct='mafonction' arg1='tralala' arg2='pouf' />");

Puis dans le flash, dans la fonction MFCobjet_callback du tuto (code rédigé à l'arrache, non testé) :

var myXML = new XML(newVal).childNodes[0];
if (myXML.nodeName=="request")
{
  var fctName = myXML.attributes["fct"];
  var arg1 = myXML.attributes["arg1"];
  var arg2 = myXML.attributes["arg2"];

  if (fctName=="mafonction")
    mafonction(arg1, arg2);
}


Le XML me permet de passer un max d'info mais en chaines de caractères. Peut-être existe-t-il plus simple.

Commentaire de estebanpianolo le 17/06/2009 10:13:05

Merci beaucoup, je regarde ce que ça donne!!

Commentaire de vincent303 le 03/05/2010 16:27:15

Voila,
Alors tout d'abord un grand merci, tout marche nickel et pour mon projet c'est génial.
Chapeau l'artiste^^
Mais j'ai un petit souci. Pour question de propreté j'ai passé mon code qui était une fonction appelé en C en une classe c++.
Tout marche a la compilation et l'exécution et au moment de quitter j'ai un message d'erreur: Debug assertion failed! file:cmdtarg.cpp line:48.
Donc voila j'ai besoin d'aide.

Commentaire de fuliculi le 03/05/2010 18:53:42

Désolé Vincent, je n'ai jamais rencontré ce message en utilisant ce tuto.
Je n'est donc pas de solution toute faite à te proposer.
Bon courage pour ta recherche!

Commentaire de kidar81 le 27/07/2010 16:08:39

merci pour ce tuto, ca m'as été trés utile au cours de mon stage.

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,281 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales