Newsgroup: it.comp.programmare.win32
Titolo: Visual C - Modeless Dialog (2)

Salve
Cosa va impostato per consentire l'utente di inserire testo
in un editbox posto in una modeless dialog ? Mentre per una
modal mi funziona senza alcun accorgimento, per la modeless
sembra che debba .. settare il focus ? Ho fatto diversi
tentativi, ma proprio non riesco ad inserire testo in un
controllo edit. Mentre invece per semplici bottoni tutto
funziona normalmente.
Grazie
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 in un editbox posto in una modeless dialog ?
Normalmente basta un setfocus nell oninitdialog, restituendo false.

> Normalmente basta un setfocus nell oninitdialog, restituendo false.
Tentativo gia fatto. Nella WndProc che gestisce la Dialog ho inserito:
switch(message)
{
     case WM_INITDIALOG:
                             SetActiveWindow(hDlg);
                             SetFocus(hDlg);
                             return TRUE;
      . . .. . .
}
Premetto che SetActiveWindow e SetFocus funzionano nel momento
in cui le eseguo (ho provato in quel blocco case ad usare le
GetActiveWindow e GetFocus, e mi hanno restituito l'handle della
dialog) ma terminato il blocco, la finestra attiva torna la owner.
In esecuzione, la modeless dialog non e' mai attiva, focalizzata, o
meglio..la sua title bar e' sempre grigia :(


                             return TRUE;
????? 

 ?????
Ovviamente ho provato con TRUE e FALSE.. non va :(
Una precisazione riguardo quanto dicevo prima. Se nel blocco case
WM_INITDIALOG, eseguo SetFocus(myDlg) questa mi ritorna l'handle
della window che aveva precedentemente il focus, ma se subito dopo
eseguo una GetFocus() questa mi ritorna sempre la vecchia window
e non la myDlg.


 e non la myDlg.
Hai un applicativo SDI o MDI?
Queste finestre sono WS_POPUP / WS_CHILD / WS_OVERLAPPED?
Eventualmente hai provato a cambiare il tipo? 

 Eventualmente hai provato a cambiare il tipo?
MDI. Creo una finestra main che contiene un menu. Eseguo
la sua creazione prima registrando una WNDCLASSEX a cui
associo il menu, quindi CreateWindow.
La modeless dialog in questione, viene generata da utente,
selezionando un item dal menu, e la sua creazione la eseguo
con CreateDialog a cui passo il template resource di una
dialog definita come Child. Se lo cambio in Popup o Overlapped
funziona, la dialog ha focus ed e' attiva, posso scrivere negli
edit-box ma non si comporta come una child, cioe interna alla
parent, cioe che se sposto la parent sposto anche la child e cosi via..


 parent, cioe che se sposto la parent sposto anche la child e cosi via..
Sembrerebbe propro che le WS_CHILD con un applicativo MDI non possono 
funzionare.
Ho trovato qualcuno che ha risolto il tuo problema in questo modo:
//----------------------- MainFrm.cpp: -------------------------- 
void CMainFrame::OnMenuClickInMainFrame()
{
        RECT  _tChildWinPos =  {0,0,100,100} ; // initial position of 
Child-win
        CChildFrame * _pcChildFrame;
    // create a MDI-Child:
        _pcChildFrame = new CChildFrame ();
        _pcChildFrame->Create (      NULL, "Win-Title",
                            WS_SYSMENU | WS_CHILD | WS_VISIBLE |
                                                        WS_CAPTION | 
WS_MINIMIZEBOX,
                                                        _tChildWinPos,
                                                        this) ;
        _pcChildFrame->ShowModelessDialog();  // my own func
        return;
} // OnMenuClickInMainFrame()
//---------------------- ChildFrm.cpp ---------------------- 
void CChildFrame::ShowModelessDialog( )
{
        // non-modal-dialog
        int                     _nCaptionSize;
        int                     _nFrameSizeX;
        int                     _nFrameSizeY;
        WINDOWPLACEMENT _tWndPl;
        // ptr to Dialog-Class
        CDialModeless * _pcDial;
        BOOL ok;
        _pcDial = new CDialModeless ( );
        _pcDial->Create(IDD_RESOURCE_ID_OF_DIALOG, this);
        // get own metrics and make the modeless-dialog fit into this frame
        _nCaptionSize = GetSystemMetrics(SM_CYCAPTION);
        _nFrameSizeY  = GetSystemMetrics(SM_CYFRAME);
        _nFrameSizeX  = GetSystemMetrics(SM_CXFRAME);
        // get the size of the dialog-window / base-class-member-func
        _pcDial->GetWindowPlacement(&_tWndPl);
         //compute metrics + placement:
        _tWndPl.rcNormalPosition.bottom += (_nCaptionSize);
        // set the size of the MDI-child-window (this class)
        ok = SetWindowPlacement(&_tWndPl );
        return;
} // ShowModelessDialog()
//---------------------- modeless_dialog.h --------------------- 
// insert this as public members
    BOOL Create (UINT nID, CWnd * pWnd)  //   manually inserted
        { return CDialog::Create(nID, pWnd);}
    virtual void PostNcDestroy ()                //   manually: overrides 
CWnd
        {delete this;}
------------------------------------------------------------

 dialog definita come Child.
Tenendo la dialog sempre come Child, ho aggiunto tra i More
Style del suo resource, Control. Con questo la dialog alla sua
visualizzazione ha focus e quindi posso accedere ai suoi
edit-box. Purtroppo perde la title bar e il system menu, pur
tenendoli sempre selezionati.. perche' ? C'č modo di riaverli
entrambi con il Control ?


 --------------------------------
per avere il comportamento che desideri devi creare una MDIChild. Se poi 
vuoi usare un dialogo lo inserisci come child della MDIChild. E, alla 
creazione, imposti l'area client della MDIChild alle dimensioni del dialog.