Newsgroup: it.comp.programmare.win32
Titolo: finestra non spostabile

Come si può imporre che una finestra non possa essere trascinata e spostata
a piacimento? Vorrei in pratica evitare che cliccando sul titolo della
finestra e trascinandola essa possa muoversi. Come posso fare?
Grazie a tutti.
(uso C++ Builder 4.0 Pro)
Max

Come si puň imporre che una finestra non possa essere trascinata e spostata


finestra e trascinandola essa possa muoversi. Come posso fare?
L'unica cosa che mi viene in mente e' intercettare il messaggio
NCLMOUSEDOWN (Non-Client-MOUSEDOWN) e "mangiarlo" per evitare che
Windows gestisca automaticamente lo spostamento.
Davide

so che c'e' un messaggio WM_MOVING oltre a WM_MOVE
viene mandato mentre sposti la finestra, e da le coordinate della stessa
basta cambiare mettendo le coordinate originali (che ti salvi all'inizio)
e non dovrebbe muoversi piu'...
prova un po'..





Ciao
puoi usare questo spezzone di codice.
--------------------------------------------------------------------------
// scegli quali punti abilitare o disabilitare
static bool whereIs(LRESULT pos)
{
  switch(pos) {
    case HTBOTTOM:      // In the lower horizontal border of a window
    case HTBOTTOMLEFT:  // In the lower-left corner of a window border
    case HTBOTTOMRIGHT: // In the lower-right corner of a window border
    case HTCAPTION:     // In a title bar
    case HTCLIENT:      // In a client area
    case HTGROWBOX:     // In a size box (same as HTSIZE)
    case HTLEFT:        // In the left border of a window
    case HTRIGHT:       // In the right border of a window
//    case HTSIZE:        // In a size box (same as HTGROWBOX)
    case HTTOP:         // In the upper horizontal border of a window
    case HTTOPLEFT:     // In the upper-left corner of a window border
    case HTTOPRIGHT:    // In the upper right corner of a window border
    case HTMENU:        // In a menu
      return true;
    default:
      break;
    }
  return false;
}
--------------------------------------------------------------------------
[...]
    case WM_NCHITTEST:
      do {
        LRESULT result = PMainWin::windowProc(hwnd, message, wParam,
lParam);
        if(whereIs(result))
          return HTCLIENT; // crede di essere sull'area client
          // return HTCAPTION; // crede di essere sulla barra del titolo
        return result;
        } while(false);
    }
  return PMainWin::windowProc(hwnd, message, wParam, lParam);
}
Se attivi il return HTCAPTION puoi muovere la window anche prendendola sui
lati
altrimenti si disabilita il movimento
Ciao
Nazzareno

 Windows gestisca automaticamente lo spostamento.
Bella idea (immagino che ti riferisca al messaggio WM_NCLBUTTONDOWN.
---
Bye! Lorenzo Lutti
http://www.geocities.com/SiliconValley/Peaks/6258/




> Grazie a tutti ora faccio un po' di prove....
non ho il tempo materiale di fare la prova, prova a dare un occhiata al
messaggio WM_ENTERSIZEMOVE, dovrebbe arrivare alla WindowProcedure
all'inizio di un resize/move da parte del mouse...
Ciao, Davide.

ho fatto una prova... devi fare cosi'
case WM_MOVING:
    CopyRect((LPRECT)lParam, rcWindowRect);
    return true;
doev rcWindowRect contiene le coordinate che vuoi mantenere fisse
praticamente quando cerchi di spostarla si accende il quadrato come per
spostarla, ma resta fermo
credo sia la mossa migliore.. se poi vuoi spostarla da codice, puoi farlo
tranquillamente, perche' un MobeWindow o simili non mandano messaggi
WM_MOVING
ciao