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

Salve.
Visualizzo all'interno di una owner window, una modeless dialog con
CreateDialog
dunque creata con un dialog box template resource, e posizionata con
SetWindowPos
in una data posizione. Fin qui tutto ok. Vorrei pero' che questa dialog non
potesse
essere spostata dall'utente, e dunque resti in quella posizione. Qualcuno sa
dirmi
come ottenere questa impostazione ?
Grazie
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 impostazione ?
Se intercetti l'evento WM_NCHITTEST ed eviti di restituire HTCAPTION 
dovrebbe essere sufficente.
Oppure togli decisamente la barra del titolo (al limite se ti serve la puoi 
disegnare a mano). 

 dovrebbe essere sufficente.
Dimenticavo: se però visualizzi il menù della dialog ti rimane la voce 
mouvi, minimizza, ripristina, etc... In questo caso dovresti anche 
intercettare l'OnSySMenu e disabilitare i vari comandi.

 dirmi come ottenere questa impostazione ?
dall'editor di risorse di Visual C++ toglici la barra del titolo (cosě ci
togli anche il menu di sistema).
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Dimenticavo: se però visualizzi il menù della dialog
...si, utilizzo il menu di sistema, con il solo tasto close che vorrei
continuare ad usare. Prima mi bastava intercettare WM_CLOSE,
ma ora con il case su WM_NCHITTEST non mi esegue piu il blocco
per il close. Hmhm.. nel blocco WM_NCHITTEST ho provato con
la DefWindowProc ritornando tutti i valori diversi da HTCAPTION
ma niente. Any hint ? :)


 ma niente. Any hint ? :)
Prova a fare semplicemente cosě che funziona:
UINT CMyDialog::OnNcHitTest(CPoint point)
{
    int ret = CDialog::OnNcHitTest(point);
    if (ret == HTCAPTION)
        return HTNOWHERE;
    else
        return ret;
}

 UINT CMyDialog::OnNcHitTest(CPoint point)
Ti ringrazio nuovamente. Funziona, anche se..
Ho fatto in questo modo. Nella WindProc che gestisce
la dialog ho inserito:
      .....
     LRESULT procRes;
     switch(message)
     {
        . ... . .
        case WM_NCHITTEST:
                  procRes = DefWindowProc(hDlg,
                                                                    message,
                                                                    wParam,
                                                                    lParam);
                  if (procRes != HTCAPTION)
                     return HTNOWHERE;
                 return procRes;
        case WM_CLOSE:
                 // codice di chiusura dialog
                 return TRUE;
      }
..in questo modo blocca la dialog e funziona il tasto close.
Ma non capisco perche funziona con quell'operatore logico
e non con l'uguaglianza, ovvero se il puntatore del mouse
e' sopra la title (e quindi procRess == HTCAPTION)
dovrebbe restituire HTNOWHERE, ma se faccio cosi
funziona l'inverso, ovvero mi sposta la dialog e non funziona
il close. Sbaglio io ad interpretare ?



Non mi torna proprio... il controllo deve essere su (procRes ==) e non su 
(procRes !=)
Ti copio e incollo il codice che ho scritto:
 switch (message)
 {
  case WM_NCHITTEST:
   {
    LRESULT procRes = DefWindowProc (hWnd, message, wParam, lParam);
    if (procRes == HTCAPTION)
     return HTNOWHERE;
    else
     return procRes;
   }
Funziona perfettamente, quindi il problema deve essere altrove.