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] Probleme update d'un BITMAP dans une boite.


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut [MFC] Probleme update d'un BITMAP dans une boite.
    Bonjour ,

    voila j'ai un probleme avec une boite modeless.

    sur ma boite principale j'ouvre cette boite comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    calibDlg.Create(IDD_DEVICE_CALIB,this);
    calibDlg.ShowWindow(true);
    	if(un_truc)calibDlg.CalibProcedure_1();
    else calibDlg.CalibProcedure_2();
    calibDlg.DestroyWindow();
    jusque la pas de soucis .
    la boite s'ouvre bien , affiche un BITMAP sur lequel j'ai mis un control .
    ensuite l'une ou l'autre procédure attends un evenement , et bouge le BITMAP de place a chaque evenement , jusqua un nombre d'evenement défini .
    puis a la sorti de l'une ou l'autre procédure la boite est détruite .
    voila une des 2 procédures :

    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
    63
    64
    65
    66
    67
    68
    69
     
    void CCalibDlg::CalibProcedure_1()
    {
    	CMyApp* myapp = (CMyApp*)AfxGetApp();
    	MONITORINFO mi;
    	mi.cbSize = sizeof(mi);
    	int monitorWidth,monitorHeight,xinc,yinc;
    	int maxX = GetSystemMetrics(SM_CXVIRTUALSCREEN);
    	int maxY = GetSystemMetrics(SM_CYVIRTUALSCREEN);
     
    	GetMonitorInfo(GetMonitorHandle(device.d_Mon),&mi);
    	monitorWidth = mi.rcMonitor.right-mi.rcMonitor.left;
    	monitorHeight=mi.rcMonitor.bottom-mi.rcMonitor.top;
     
    	xinc = monitorWidth / 8;
    	yinc = monitorHeight / 8;
     
    	POINT cpt[9];
    	POINT cptd[9];
    	DWORD result;
     
    	int i,j,k=0;
     
    	for(i=1;i<8;i+=3)
    	{
    		for(j=1;j<8;j+=3)
    		{
    			cptd[k].x=(j*xinc+mi.rcMonitor.left)*0x400/maxX;
    			cptd[k].y=(i*yinc+mi.rcMonitor.top)*0x400/maxY;
     
    // C LA QUE JE BOUGE LE BITMAP
                       c_Cross.SetWindowPos(NULL,j*xinc-30,i*yinc-30,60,60,NULL)
    			Invalidate();
    			UpdateWindow();
                  result=WaitForSingleObject(myapp->pSink->calibEvent,10000);
    			switch(result){
     
    			case WAIT_OBJECT_0:
    				cpt[k].x=myapp->pSink->cx;
    				cpt[k].y=myapp->pSink->cy;
    				break;
     
    			case WAIT_TIMEOUT:
    				i=j=k=9;
    				break;
    			}
     
    			k++;
    		}
     
    	}
     
    	if(k == 9)
    	{
    		SetRegistryBinaryValue(device.d_Num,"pt",cpt,72);
    		SetRegistryBinaryValue(device.d_Num,"ptd",cptd,72);
    		//RELANCER LE DEVICE
    		SetRegistryValue(device.d_Num,"CalibOK","1",4);
    		myapp->Wmi_SetMode((FLAG_SET_COM<<8)+device.d_Num);
    	}
    	else
    	{
    		CString info,text;
    		info.LoadString(IDS_INFO_TITLE);
    		text.LoadString(IDS_CALIB_FAIL);
    		MessageBox(text,info,MB_OK);
    		SetRegistryValue(device.d_Num,"CalibOK","0",4);
    	}
    }
    le probleme :
    sur windows XP , apres avoir lancé 2 ou 3 fois la boite en question , il arrive que aléatoirement il arrete de mettre a jour le BITMAP .
    la procédure continu qd meme mais le BITMAP reste bloquer a une des positions .
    sur Windows 2000 je n'ait pas reussi a reproduire le probleme .

    je suis conscient que certaine parti des initialisations peuvent paraitre obscure par manque d'info .. si besoin je peux rajouter des explications et codes .

    j'ai essayer pas mal de chose deja , dont passer la boite en Modal , en envoyant des PostMessage(WM_PROCEDURE); dans le OnInitDialog(); mais sans succès .

  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,
    tout traitement en boucle empeche l'arrivée des messages a la fenetre.
    il faut inserer une pompe à message au milieu du traitement.
    http://c.developpez.com/faq/vc/?page...rk#PumpMessage

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    ok , je pense comprendre .

    donc j'ajoutes une fonction comme celle du tutorial et je l'apelle avant le WaitForSingleObject(); dans mon traitement si j'ai tout suivi ?

  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
    oui c'est ça !
    et au sommet de la boucle ça ne fera pas de mal non plus ...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    bon bah merci beaucoup , a priori c'etait bien ca .

    je continu a testé mais la j'ai lancé une bonne 20 aines de fois sans que ca pose probleme .



    par contre petite remarque ,
    dans la pompe a message , tu utilises la fonction AfxGetApp() .
    dans mon cas j'ai ajouté une pompe non pas pour ma classe d'application mais sur la classe de ma boite de dialogue .
    juste si ca change quelquechose ou pas ?

  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
    si ça change quelque chose ..
    c'st fait pour donner la main a toute l'application pour tous les messages de toutes les fenetres...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/11/2007, 13h48
  2. Réponses: 3
    Dernier message: 23/06/2007, 15h07
  3. Réponses: 2
    Dernier message: 17/02/2004, 23h27
  4. [BPW]Problème de recherche dans une boîte liste
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 14
    Dernier message: 05/07/2003, 15h10
  5. Réponses: 12
    Dernier message: 26/02/2003, 08h14

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