Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] Win32 API: Aggiungere parametri alle funzioni parametri di altre funzioni

    Salve a tutti. Utilizzo molte funzioni che richiamano nei propri parametri altre funzioni.
    ES : HANDLE_MSG(hwnd, WM_QUALCOSA, FUNZIONE);
    ES2: SetTimer(hwnd,id,ms,FUNZIONE);
    (le suddette FUNZIONI hanno parametri e valori di ritorno prestabiliti)
    Come faccio ad aggiungere (oltre alle variabili globali) altre variabili contenenti altri dati a queste FUNZIONI?!
    Grazie anticipatamente.

  2. #2
    Esempio 1: cambi funzione in modo che riceva i parametri che ti pare e non usi HANDLE_MSG (che non ha nulla di speciale, è solo una macro) ma richiami la funzione a mano.
    Esempio 2: praticamente tutti i callback utilizzabili in Win32 ricevono un parametro aggiuntivo, in genere di tipo INT_PTR o roba analoga. A seconda della particolare funzione c'è un modo per impostare il parametro in questione quando queste vengono richiamate. Se ti basta passare un intero non c'è problema, altrimenti ci passi (dopo averlo adeguatamente castato) un puntatore ad una struttura contenente i dati da passare al callback.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    Esempio 1: cambi funzione in modo che riceva i parametri che ti pare e non usi HANDLE_MSG (che non ha nulla di speciale, è solo una macro) ma richiami la funzione a mano.
    Esempio 2: praticamente tutti i callback utilizzabili in Win32 ricevono un parametro aggiuntivo, in genere di tipo INT_PTR o roba analoga. A seconda della particolare funzione c'è un modo per impostare il parametro in questione quando queste vengono richiamate. Se ti basta passare un intero non c'è problema, altrimenti ci passi (dopo averlo adeguatamente castato) un puntatore ad una struttura contenente i dati da passare al callback.
    Il problema è che HANDLE_MSG mi da anche l'id, la handle del controllo e il codice notifica (che non saprei dove andare a cercare .-.), e quando richiamo le callback non posso mettere nessun parametro aggiuntivo (per richiamarle dai parametri della funzione principale non apro nemmeno la parentesi per i parametri della callback).
    E in ogni caso se cambiassi funzione con HANDLE_MSG, resta SetTimer da pelare :|

  4. #4
    Originariamente inviato da giorgio_kollias
    Il problema è che HANDLE_MSG mi da anche l'id, la handle del controllo e il codice notifica (che non saprei dove andare a cercare .-.),
    Ma stai scherzando? HANDLE_MSG prende i dati in questione dai parametri della window procedure... è una macro estremamente stupida, se guardi è definita semplicemente come
    codice:
    #define HANDLE_MSG(hwnd, message, fn) \
       case (message) : return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
    il problema poi semmai si sposta nelle HANDLE_xxx dove xxx è il messaggio specifico, ma, anche lì, è tutta roba che puoi fare a mano (come cavare fuori i parametri dei vari messaggi da lParam e wParam è spiegato nella documentazione dei vari messaggi.
    E in ogni caso se cambiassi funzione con HANDLE_MSG, resta SetTimer da pelare :|
    Puoi usare il parametro nIDEvent passandoci dentro un puntatore ai dati da mandare al callback.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Originariamente inviato da MItaly
    Ma stai scherzando? HANDLE_MSG prende i dati in questione dai parametri della window procedure... è una macro estremamente stupida, se guardi è definita semplicemente come
    codice:
    #define HANDLE_MSG(hwnd, message, fn) \
       case (message) : return HANDLE_##message((hwnd), (wParam), (lParam), (fn))
    Non avevo capito i valori di wParam ed lParam, grazie per avermi chiarito le idee!

    Originariamente inviato da MItaly
    Puoi usare il parametro nIDEvent passandoci dentro un puntatore ai dati da mandare al callback.
    Ho provato, ma ho difficoltà nel ri-castare la struttura, mi da un sacco di errori in ogni modo cerchi di castarlo:

    codice:
    typedef struct{
        char nome[20];
        char cognome[20];
        int anno;
    }typeDati;
    
      typeDati Dati,*p;
      p=&Dati;
      SetTimer(hBut1,(UINT)p,1000,ProceduraTimer);
    
    // ProceduraTimer
    
      typeDati *Dati;
      Dati=(typeDati)uMsg;
    //Nell'ultima riga mi da errore: conversion to non-scalar type requested
    Scusa l'ignoranza, ma non ho mai fatto nulla del genere, quindi se ho scritto qualche idiozia, ti prego di capirmi

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Dati=(typeDati*)uMsg;
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Originariamente inviato da Scara95
    Dati=(typeDati*)uMsg;
    E se poi voglio richiamare una qualche variabile all'interno della struttura?

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    codice:
    Dati->nomeVariabile
    Oppure
    codice:
    (*Dati).nomeVariabile
    Ma queste istruzioni sono nozioni di base del linguaggio...
    Dovresti conoscerle a prescindere!

    Comunque è meglio se cambi il tutto in:
    codice:
    typeDati Dati = *((typeDati *)uMsg)
    E accedi ai campi come hai sempre fatto (es: Dati.Nome), così facendo non modifichi la struttura se vuoi modificare quella interna...

    Inoltre puoi cambiare questo spezzone:
    codice:
    typeDati Dati,*p;
    p=&Dati;
    SetTimer(hBut1,(UINT)p,1000,ProceduraTimer);
    In:
    codice:
    typeDati Dati;
    //settaggio valori
    SetTimer(hBut1,(UINT)&Dati,1000,ProceduraTimer);
    E penso che il casting a UINT sia errato, ma non ho esperienza con queste librerie, infatti fino ad ora ti ho parlato solo delle basi del linguaggio...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    Originariamente inviato da Scara95
    codice:
    Dati->nomeVariabile
    Oppure
    codice:
    (*Dati).nomeVariabile
    Ma queste istruzioni sono nozioni di base del linguaggio...
    Dovresti conoscerle a prescindere!
    Le conoscevo già, ma, provandole, non funzionavano, quindi pensavo ci fosse qualche altro modo...
    Le ho provate con un:
    codice:
    SetWindowText(hwnd,(const char*)Dati->Nome/(*Dati).Nome);
    ma niente, non funziona nemmeno con il *((typeDati*)uMsg);

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Hai inizializzato la struttura? Sul codice che tu hai postato non l'hai mai inizializzata, è impossibile funzioni...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.