Newsgroup: it.comp.programmare.win32
Titolo: Disabilitare più controlli in un colpo solo

In VB è molto comodo raggruppare più controlli di una finestra di dialogo in
un frame solo e disabilitando (o nascondendo) questo si disabilitano (o si
nascondono) anche tutti i controlli al suo interno.
Lavoro con il VC++, senza MFC nè altre librerie, e ho una finestra con molti
controlli inseriti (solo "graficamente", non so come fare a livello
"logico") dentro un frame. Se disabilito il frame mi si disabilita solo
questo e non anche il suo contenuto. Dovrei ottenere l'hwnd per ogni
controllo tramite tutte chiamate a GetDlgItem e poi disabilitarne uno per
uno tramite EnableWindow?
--
Stefano Pettini
domi...@tiscalinet.it
web.tiscalinet.it/dominion
ICQ#: 38328322

 Lavoro con il VC++, senza MFC nč altre librerie, e ho una finestra con


 uno tramite EnableWindow?
In teoria si` (anche se, con il ritmo delle innovazioni introdotte
nell'interfaccia utente di Windows, non mi soprenderei se in qualche platform
SDK recente esistesse qualcosa che automatizza tutto).
Pero` esistono tecniche che rendono molto meno oppressivo tutto cio`. Ad
esempio puoi circondare il gruppo di controlli che vuoi disabilitare con un
rettangolo invisibile (un banale controllo static senza l'attributo
WS_VISIBLE), poi usi le sue coordinate per abilitare/disabilitare i controlli
che contiene. Scrivere una funzione del tipo
ascondiControlliInRettangolo( UINT idrettangolo) e` quasi immediato...
--
Bye! Lorenzo Lutti (
http://www.geocities.com/SiliconValley/Peaks/6258/
)

> Yes!
Quindi, per disabilitare a runtime 5 controlli che hanno identificativo
IDC_FILEx_NAME, IDC_FILEx_SIZE, IDC_FILEx_D1, IDC_FILEx_D2, IDC_FILEx_D3 e
il frame che li circonda che ha identificativo IDC_FRAMEx (dove x può essere
1 o 2) dovrei fare così?
HWND win=GetDlgItem(hwnd, (n==1)?IDC_FRAME1: IDC_FRAME2);
EnableWindow(win, state);
win=GetDlgItem(hwnd, (n==1)?IDC_FILE1_NAME: IDC_FILE2_NAME);
EnableWindow(win, state);
win=GetDlgItem(hwnd, (n==1)?IDC_FILE1_SIZE: IDC_FILE2_SIZE);
EnableWindow(win, state);
win=GetDlgItem(hwnd, (n==1)?IDC_FILE1_D1: IDC_FILE2_D1);
EnableWindow(win, state);
win=GetDlgItem(hwnd, (n==1)?IDC_FILE1_D2: IDC_FILE2_D2);
EnableWindow(win, state);
win=GetDlgItem(hwnd, (n==1)?IDC_FILE1_D3: IDC_FILE2_D3);
EnableWindow(win, state);
Non c'è un modo più facile? Anche, se non esistono trucchetti Win32, qualche
giochetto C per fare prima a scrivere tutto questo?
--
Stefano Pettini
Risposte solo sul newsgroup, please.

 tua tecnica?
Usando GetWindow(). Tu scorri tutte le child window della dialog (in pratica
scorri tutti i controlli) e per ognuna chiami GetWindowRect(). Guardi se la
finestra sta dentro al rettangolo del tuo frame; se ci sta,
l'abiliti/disabiliti. Schematicamente:
RECT rcFrame, rcChild;
HWND hChild = GetWindow( hWndDialog, GW_CHILD);
GetWindowRect( GetDlgItem( hWndDialog, ICS_FRAME), &rcFrame);
while( hChild != NULL)
{
    GetWindowRect( hChild, &rcChild);
    if( rcChild.top >= rcFrame.top &&
        rcChild.bottom <= rcFrame.bottom &&
        rcChild.left >= rcFrame.left &&
        rcChild.right <= rcFrame.right)
            EnableWindow( hChild, bEnable);
    hChild = GetWindow( hChild, GW_HWNDNEXT);
