Newsgroup: it.comp.programmare.win32
Titolo: Nascondere EditBox, Come fare?

Programma in VisualC++6.0 con il seguente problema:
Ho due CEdit (IDC_Text e IDC_Graph); e due Grid (IDC_MFG1 and IDC_MFG2);
Voglio che siano visibili una alla volta.
In Visual Basic č molto semplice:
IDC_Text.Visible=FALSE/TRUE
In VC++  sembra che non esista una tale cosa. A questo punto ho pensato:
Bhe posso cambiare le coordinate, metto altezza e larghezza pari a zero e
cosě non si vede, mentre per quella visibile faccio in modo che abbia la
grandezza giusta.
Ho allora provato in questa maniera (seguendo la documentazione online di
VC++)
int x1,x2,y1,y2;
RECT Rect;
RECT* pRect;
CEdit* pEdit=(CEdit*)GetDlgItem(IDC_Text);
pEdit->GetWindowRect(pRect);
x1=Rect.left;
x2=Rect.right;
y1=Rect.top;
y2=Rect.bottom;
Ora quando eseguo questa routine (per prova lo faccio eseguire premendo un
pulsante), mi genera un errore.
La compilazione funziona, ma diamine l'esecuzione nn va. Sapete dirmi in
cosa sbaglio?
Oppure ancora meglio, come cavolo faccio a nascondere questi dannati
controlli?
Sono tutti derivati da CWnd, cosa vuol dire che i comandi che sono validi
per CWnd sono validi tutti anche per gli oggetti dellle classi derivate o
che solo alcune sono valide per le classi derivate?
--------
Ciao da Spieg
SMAV AMVI
XII Gruppo AMVI
UIN 27730515
--
--------
Ciao da Spieg
SMAV AMVI
XII Gruppo AMVI
UIN 27730515

In Visual Basic è molto semplice:
Tu usi le MFC per cui la mia risposta non ti e' direttamente utile, ma
usando direttamente le API c'e' la ShowWindow(hwnd,SW_HIDE) o
ShowWindow(hwnd,SW_NORMAL), dove per i controlli hwnd e' l'handle del
controllo stesso. Se invece hwnd e' l'handle della parent window
allora puoi usare
ShowWindow(GetDlgItem(hwnd,IDC_TUOCONTROLLO),SW_HIDE).
Immagino che ci sia un metodo Show anche per la classe CEdit.
Stefano "HappyMan" (Lago Maggiore - NO)
--
http://www.sgr.info
Email happyman69 (at) 
libero.it

 Immagino che ci sia un metodo Show anche per la classe CEdit.
E' membro della classe CWnd, CEdit ereditando da CWnd la può utilizzare.
Es:
CWnd* pEdit = GetDlgItem(IDC_CONTROLLO);
pEdit->ShowWindow(SW_HIDE);

 E' membro della classe CWnd, CEdit ereditando da CWnd la puň utilizzare.


Come detto, ora riesco a nascondere la finestra.
Curiosando tra i comandi ho però notato il flag:
SW_SHOWMAXIMIZED
Ho quindi scritto il seguente codice assegnandolo al solito pulsante:
 CWnd* pDialog = GetDlgItem(IDD_F4PERFORMANCES_DIALOG);
 pDialog->ShowWindow(SW_SHOWMAXIMIZED);
Perché ora mi da di nuovo l'errore?
Ho già provato a cambiare il puntatore da CWnd* a CDialog*, ma nulla, sempre
lo stesso errore.
Leggendo l'help ho trovato questo:
ShowWindow must be called only once per application for the main window with
CWinApp::m_nCmdShow. Subsequent calls to ShowWindow must use one of the
values listed above instead of the one specified by CWinApp::m_nCmdShow.
Non mi sembra che sia questo il mio caso, o sbaglio?

 Perché ora mi da di nuovo l'errore?
verifica che il puntatore ritornato sia valido
ciao


Se vuoi rendere nuovamente visibile il controllo devi utilizzare il flag
SW_SHOW e non SW_SHOWMAXIMIZED.
Il flag SW_SHOWMAXIMIZED serve ad esempio se all'apertura del programma vuoi
visualizzare la finestra a tutto schermo (è l'equivalente della pressione
del tasto Ingrandisci sulla barra del titolo), non l'ho mai provato su un
controllo quindi non ti so dire l'effetto.
Antonio.

 Diciamo che come primo programma non posso lamentarmi.
L'ereditarietà del C++ non è selettiva nel senso che erediti tutte le
variabili e le funzioni membro della classe base, la possibilità di
accederci dipende da come sono state dichiarate nella classe base (public,
protected, private) e nel modo in cui vengono ereditate.
Es:
class A
{
  public:
    int m_A;
  protected:
    int m_B;
  private:
    int m_C;
};
class B : public A
{
}
In B puoi accedere solo alle variabili m_A e m_B.
Antonio.

 controllo quindi non ti so dire l'effetto.
Il fatto è che IDD_F4PERFORMANCES_DIALOG è la finestra di Dialogo principale
della mia applicazione, quindi non capisco come mai non sia ingrandita.
Invece di ingrandire l'applicazione, mi restituisce un errore. Eppure non
dovrebbe.

 ciao
Il problema sembra essere il puntatore in effetti, mi da infatti una
violazione di memoria, quindi mi viene in mente solo che il puntatore sia
errato, ma che posso farci?

 ha scritto nel messaggio
news:avjasi$foa1k$1...@ID-162989.news.dfncis.de...


 errato, ma che posso farci?
penso che l'errore sia nell'id
se chiami getdlgitem in una funzione di una cdialog devi fare cosi:
CEdit *hEdit=(CEdit*)GetDlgItem(/*id dell'edit box*/ID);
ASSERT(hEdit);
hEdit->ShowWindow(SW_HIDE);


scusa la risposta criptica,ma ho dovutoscrivere in fretta :-(
GetDlgItem ti ritorna un puntatore nullo perchè non c'è nessun controllo con
quel'id nella tua dialogbox(se non sbaglio è l'id della dialog stessa) e
quindi la successiva funzione ti da una violazione d'accesso
inoltre per un controllo come un editbox che non è  "massibilizzabile" il
parametro SW_SHOWMAXIMIZED non so cosa possa produrre,usa invece
SW_SHOWNORMAL
se il tuo intento era massimizare la dialog box usa direttamente
ShowWindow(SW_SHOWMAXIMIZED)
spero di essere stato + chiaro ora
ciao

 ha scritto
nel messaggio news:gkdT9.4346$0v.1...@news1.tin.it...


 ha scritto nel messaggio
news:avjgnv$h48$1...@lacerta.tiscalinet.it...

La funzione GetDlgItem ti restituisce NULL perchè la dialog non contiene
nessun controllo child che ha un id uguale a IDD_F4PERFORMANCES_DIALOG (che
sembra essere l'id della dialog stessa).
Per massimizzare la dialog (dall'interno della classe che gestisce la dialog
stessa) devi usare:
ShowWindow(SW_SHOWMAXIMIZED);
che poi corrisponde a:
this->ShowWindow(SW_SHOWMAXIMIZED);
Ovviamente, quando chiami una funzione il puntatore this è implicito e può
essere omesso, come l'oggetto Me all'interno di una form di Visual Basic.
P.S.: quando dici che ti va in errore, dovresti specificare anche quale
errore (nel tuo caso "Access Violation") e in quale riga, visto che a volte
l'errore non salta all'occhio immediatamente osservando il codice.

 Grazie del tuo aiuto.
Invece non è assurdo per niente!
La chiamata GetDlgItem() serve appunto per restituirti un puntatore (CWnd*)
ad un controllo di una DialogBox. Ora, se vuoi massimizzare l'intera Dialog
e non vuoi lavorare con un suo controllo, questa chiamata è inutile.
Più precisamente, stai chiedendo a Windows di restituirti un puntatore al
controllo IDD_F4PERFORMANCES_DIALOG che deve essere presente ALL'INTERNO
della Dialog. La chiamata non lo trova, perchè non c'è, e quindi restituisce
NULL.
Successivamente tu fai
pDialog->ShowWindow(SW_SHOWMAXIMIZED);
dove pDialog = NULL, e quindi ti da un errore di accesso alla memoria.
Se invece chiami direttamente
ShowWindow(SW_SHOWMAXIMIZED);
oppure
this->ShowWindow(SW_SHOWMAXIMIZED);
(le due forme sono IDENTICHE)
allora ShowWindow si riferirà alla classe in cui stai scrivendo il codice,
che è appunto la tua CDialog!!! Quindi viene massimizzata la Dialog.
(this non fa altro che restituirti il puntatore all'oggetto corrente... che
è sempre la tua CDialog)
Spero di essere stato abbastanza chiaro.
Comunque dovresti approfondire un po' di più la programmazione ad oggetti,
per essere veramente produttivo... la pratica va bene, ma, specialmente in
C++, un po' di teoria è **indispensabile**. Ed MFC è una libreria ad
oggetti....
Dario