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

Interfaces Graphiques Discussion :

appel de CallBack


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Par défaut appel de CallBack
    Bonjour,

    J'ai trouvé plusieurs topic à ce sujet, mais comme ils ne m'ont pas aidé à solutionner mon problème, je viens ouvrir un nouveau sujet sur l'appel de Callback.

    J'essaye de faire une interface Matlab, et j'ai une fonction qui marche très bien. Mais je voudrais ajouter l'utilisation de la molette mais je ne veux pas tout réécrire, surtout que la fonction molette bug....

    J'ai une fonction qui gere un scrollbar, pour naviguer dans la troisème dimension d'une image.

    Quand je le fait avec la gestion de la molette, j'ai quelques fois Matlab qui s'emballe, et veux accéder à une slice bien supérieure à l'image...

    Du coup, je voudrais passer par ma fonction scrollbar, pour cacher ce bug.

    Voici ma fonction scrollbar :
    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
     
    function sliceCall(varargin)
            if ~isempty(handles.ImX)
                try 
                h=varargin{1};  % Get calling handle and structure.
                    switch h  % Who called?
                        case handles.SliceEdit
                            L = get(handles.Slicebar,{'min','max','value'});  % Get the slider's info.
                            E = floor(str2double(get(h,'string')));  % Numerical edit string.
                            if E >= L{1} && E <= L{2}
                                set(handles.Slicebar,'value',E)  % E falls within range of slider.
                            else
                                set(h,'string',L{3}) % User tried to set slider out of range.
                            end
                        case handles.Slicebar
                            % Set edit to current slider.
                            set(handles.SliceEdit,'string',floor(get(h,'value')));
                            handles.s3=floor(get(h,'value'));
                        otherwise
                            % Do nothing, or whatever.
                    end
                    iH=imagesc(handles.ImX(:,:,handles.s3), 'parent', handles.ImageAxes);
                    map1=colormap;
                    colormap(map1);
                    set(iH, 'hittest', 'off');
                    axis(handles.ImageAxes, 'equal');
                    set(handles.ImageAxes, ...
                        'box'             , 'on', ...
                        'xtick'           , [], ...
                        'ytick'           , [], ...
                        'buttondownfcn'   , @winBtnDownFcn, ...
                        'interruptible'   , 'off', ...
                        'busyaction'      , 'queue', ...
                        'handlevisibility', 'callback');
                catch
                end
            end
        end
    Pour les curieux, voici ce que j'avais fait pour la molette :
    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
     
        function scrollWheelFcn(varargin)
     
            if ((~isempty(handles.ImX)) && (handles.in))
                try
                    edata = varargin{2};
                    r = edata.VerticalScrollCount;
                    r2=r/abs(r);
                    if (handles.s3+r2>0 && handles.s3+r2<=handles.s)
                        handles.s3=handles.s3+r2;
                        set(handles.SliceEdit, 'string', sprintf('%d',handles.s3));
    %                     set(handles.SliceEdit, 'string', sprintf('%d',handles.s3));
    %                     set(handles.Slicebar, 'value', handles.s3);
    %                     iH=imagesc(handles.ImX(:,:,handles.s3), 'parent', handles.ImageAxes);
    %                     map1=colormap;
    %                     colormap(map1);
    %                     set(iH, 'hittest', 'off');
    %                     axis(handles.ImageAxes, 'equal');
    %                     set(handles.ImageAxes, ...
    %                         'box'             , 'on', ...
    %                         'xtick'           , [], ...
    %                         'ytick'           , [], ...
    %                         'buttondownfcn'   , @winBtnDownFcn, ...
    %                         'interruptible'   , 'off', ...
    %                         'busyaction'      , 'queue', ...
    %                         'handlevisibility', 'callback');
                    end
                catch
                end
            end
        end
    Merci d'avance de votre aide

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Par défaut
    Bonjour,

    Et quel est le problème exactement?

    Duf

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 6
    Par défaut
    Bonjour Duf,

    Et bien lorsque je navigue dans la troisième dimension de mon image par la molette, j'ai un bug. Au bout d'un moment, la taille de l'image change, et j'arrive à une dimension bien supérieur à la limite....

    Quand j'ai fait des affichages des valeurs, je me suis rendu compte que la taille de l'image changeait. du coup, mon handles.s et mon handles.s3 changent.

    Pourtant, je ne fait que ajouter ou enlever 1 à la valeur de handles.s3....

    Et comme cette même fonction marche tres bien avec un slicebar, je voulais faire un appel de cette fonction avec la molette...

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Je trouve ton code un peu compliqué, tu pourrais commencer pas l'alléger.

    Voici un modèle "simple" :
    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
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    function test(I)
     
    if nargin==0
        r = 25;
        c = 30;
        n = 10;
        I = rand(r,c,n);
    else
        [r, c, n] = size(I);
    end
     
    fig = figure('doublebuffer', 'on', ...
        'windowscrollwheelfcn', @wswfcn);
     
    colormap(jet);
     
    ax = axes('units', 'normalized', ...
        'position', [.1 .15 .8 .8], ...
        'tag', 'ImageAxes', ...
        'xlim',[.5 c+.5], ...
        'ylim',[.5 r+.5], ...
        'dataaspectratio', [1 1 1], ...
        'xtick', [], ...
        'ytick', []);
     
    title(ax, sprintf('Image %d/%d', 1, n));
     
    imagesc('cdata',I(:,:,1), ...
        'parent', ax, ...
        'tag', 'Image')
     
    uicontrol('style', 'edit', ...
        'units', 'normalized', ...
        'position', [.8 .05 .1 .05], ...
        'tag', 'SliceEdit', ...
        'string', '1', ...
        'callback', @sliceCall);
     
    uicontrol('style', 'slider', ...
        'units', 'normalized', ...
        'position', [.1 .05 .6 .05], ...
        'tag', 'Slicebar', ...
        'min', 1, ...
        'max', n, ...
        'sliderstep', [1 1]/(n-1), ...
        'value', 1, ...
        'callback', @sliceCall);
     
    handles = guihandles(fig);
    handles.s3 = 1;
    handles.s = n;
    handles.ImX = I;
     
    guidata(fig,handles);
     
    function sliceCall(obj, event)
     
    handles = guidata(gcbf);
     
    switch get(obj, 'tag')
        case 'Slicebar'
            handles.s3 = round(get(obj,'value'));
        case 'SliceEdit'
            ns = str2double(get(obj,'string'));
            ns = round(ns);
            if ns>0 && ns<=handles.s
                handles.s3 = ns;
            end
    end
     
    update_uis(handles);
     
    guidata(gcbf,handles);
     
    function wswfcn(obj,event)
     
    handles = guidata(gcbf);
     
    r = event.VerticalScrollCount;
    r = r/abs(r);
     
    if (handles.s3+r)<1 || (handles.s3+r)>handles.s
        return
    end
     
    handles.s3 = handles.s3+r;
     
    update_uis(handles);
     
    guidata(gcbf,handles);
     
    function update_uis(h)
     
    set(h.SliceEdit, 'string', num2str(h.s3));
    set(h.Slicebar, 'value', h.s3);
    set(h.Image, 'cdata', h.ImX(:,:,h.s3));
    title(h.ImageAxes, sprintf('Image %d/%d', h.s3, h.s));

Discussions similaires

  1. appel du callback dans une autre fonction
    Par amine_wn dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 08/04/2015, 19h07
  2. Appel de callback
    Par beegees dans le forum jQuery
    Réponses: 3
    Dernier message: 28/07/2014, 00h21
  3. Appel en callBack Java
    Par geforce dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 12/09/2011, 09h50
  4. Réponses: 3
    Dernier message: 12/04/2010, 14h54
  5. appel à un callback avec paramètres
    Par kawther dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 13/03/2009, 01h04

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