Newsgroup: it.comp.programmare.win32
Titolo: DialogBox modale da HWND

salve,
ho il seguente problema: voglio ottenere una DialogBox modale a partire da
una finestra già creata (con CreateWindowEx).
la documentazione delle DialogBox dice di usare una dialog template (creata
in memory o da resource file), ma io vorrei se possibile evitare questa
strada.
ho provato in tutti i modi, ma incontro i seguenti problemi:
1) se lancio un message loop che risponda solo alla DialogBox e disattivo la
Main Window, cliccando sulla Main Window non mi viene portato in foreground
il DialogBox.
2) se sostituisco temporaneamente la wndproc della Main Window con una che
risponda solo a WM_ACTIVATE attivando la DialogBox, quando clicco sulla Main
Window e poi sulla DialogBox, quest'ultima si sposta sullo schermo in
maniera del tutto incomprensibile.
non so se è molto chiara la spiegazione, forse perché è il problema stesso a
non essermi molto chiaro :-)
il codice, ridotto all'osso, che ho provato è il seguente:
// ipotesi 1: disattivo la Main Window
LRESULT DoModal1(HWND hParent, HWND hModal) {
  int stayhere;
  BOOL fDone;
  ShowWindow(hModal, SW_SHOWNORMAL);
  BringWindowToTop(hModal);
  SetForegroundWindow(hModal);
  if(hParent != NULL) EnableWindow(hParent,FALSE);
  stayhere = 1;
  for(fDone=FALSE; !fDone; WaitMessage()) {
    while(stayhere = PeekMessage(&msg,0,0,0,PM_REMOVE)) {
      if(stayhere == -1) {
        stayhere = 0;
        msg.wParam = -2; // an error occurred...
        fDone = TRUE;
      } else {
        if(!IsDialogMessage(hModal,&msg)) {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
        }
      }
    }
  }
  if(hParent != NULL) EnableWindow(hParent,TRUE);
  ShowWindow(hModal, SW_HIDE);
  return msg.wParam;
}
// ipotesi 2: sostituisco la wndproc della Main Window
LRESULT CALLBACK InactiveMsgLoop(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM
lParam) {
  HWND hModal = (HWND) GetWindowLong(hwnd, GWL_USERDATA);
  if( IsWindow(hModal) ) {
    if(uMsg == WM_ACTIVATE && LOWORD(wParam) == WA_ACTIVE) {
      SendMessage(hModal, WM_ACTIVATE, wParam, (LPARAM) hModal);
      return 0;
    }
  }
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
LRESULT DoModal1(HWND hParent, HWND hModal) {
  WNDPROC wndProcOrig;
  int stayhere;
  BOOL fDone;
  wndProcOrig = (WNDPROC) GetWindowLong(hParent, GWL_WNDPROC);
  SetWindowLong(hParent, GWL_USERDATA, (LONG) hModal);
  SetWindowLong(hParent, GWL_WNDPROC, (LONG) InactiveMsgLoop);
  ShowWindow(hModal, SW_SHOWNORMAL);
  BringWindowToTop(hModal);
  SetForegroundWindow(hModal);
  stayhere = 1;
  for(fDone=FALSE; !fDone; WaitMessage()) {
    while(stayhere = PeekMessage(&msg,0,0,0,PM_REMOVE)) {
      if(stayhere == -1) {
        stayhere = 0;
        msg.wParam = -2; // an error occurred...
        fDone = TRUE;
      } else {
        if(!IsDialogMessage(hModal,&msg)) {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
        }
      }
    }
  }
  ShowWindow(hModal, SW_HIDE);
  SetWindowLong(hParent, GWL_WNDPROC, (LONG) wndProcOrig);
  return msg.wParam;
}
cosa altro potrei provare? ma soprattutto, è possibile una cosa del genere o
devo assolutamente ricorrere ai dialog template?
cheers,
Aldo
__END__
$_=q,just perl,,s, , another ,,s,$, hacker,,print;

 [...]
Crei un dialog con DialogBox(), poi nel gestore del WM_INITDIALOG crei i
controlli della dialog con delle CreateWindow() o CreateWindowEx().
Ciao. Federico.