Newsgroup: it.comp.programmare.win32
Titolo: La Risoluzione Che Problemone...

Ho fatto un programma con le MFC.
Avendo problemi con la gestione del resizing della finestra
ho settato una dimensione che a 1024x768 occupa 3/4 del monitor ma a 800x600
non si adatta alla risoluzione come immaginavo...
Dovrei forse fare una dialog per ogni risluzione e fare un switch?
(Sono naturalmente ironico...)
Pensavo di usare riferimenti relativi ma non penso sia possibile.
Qualcuno ha idee o ha già affrontato il caso?

 ha scritto nel messaggio
news:c93efd2e.03011...@posting.google.com...

Ahaaaaa.... ti ho beccato con le mani nel sacco!!! ;-)))
Non dicevi che non le volevi usare le MFC?!?
Dario

 wrote

Si!
Questa funzione deve essere eseguita solo UNA SOLA VOLTA quando viene
ricevuto il messaggio WM_PAINT (OnPaint) e dopo aver massimizzato
(ShowWindow(SW_SHOWMAXIMIZED) )la Wnd. Il codice che segue e' gia'
strutturato per essere eseguito una sola volta,.
La funzione SizeControlsToWindow ridimensiona in maniera proporzionale tutti
i controlli presenti nella finestra, ma non fa' un resize dei fonts dei
controlli (possibile, ma con effetti a volte indesiderati) .
Cerca di disegnare la tua dialog in modo che occupi interamente o quasi uno
schermo 640x480.
I controlli del tipo ComboBox hanno dei problemi con questo tipo di
soluzione, nel qual caso ... vedi se riesci da solo .... sforzandoti. Cazzo,
mica dobbiamo dirti tutto!
I pochi commenti presenti sono in Inglese ... perche' mi piace cosi.
....MyDialogWnd::OnPaint(... //
{
... // your code
...
    if(SizeControlsToWindow()) PostMessage(WM_PAINT);
....
}
BOOL MyDialogWnd::SizeControlsToWindow()
{
static BOOL Resized;
            // one time exec
            if (Resized) return FALSE;
WINDOWPLACEMENT MWp ={sizeof WINDOWPLACEMENT};
WINDOWPLACEMENT Wp  ={sizeof WINDOWPLACEMENT};
GetWindowPlacement(&MWp); // main window size and position
int XX=GetSystemMetrics(SM_CXSCREEN); // screen width
int YY=GetSystemMetrics(SM_CYSCREEN); // screen height
double
Xm=(double)XX/((double)MWp.rcNormalPosition.right-MWp.rcNormalPosition.left)
; // X ratio
double
Ym=(double)YY/((double)MWp.rcNormalPosition.bottom-MWp.rcNormalPosition.top)
; // Y ratio
 // resize the whole dialog
 Wp=MWp;
 Wp.rcNormalPosition.top    =(int)(Ym*Wp.rcNormalPosition.top);
 Wp.rcNormalPosition.left   =(int)(Xm*Wp.rcNormalPosition.left);
 Wp.rcNormalPosition.bottom =(int)(Ym*Wp.rcNormalPosition.bottom);
 Wp.rcNormalPosition.right  =(int)(Xm*Wp.rcNormalPosition.right);
SetWindowPlacement(&Wp); // new size
 CWnd* Wnd=GetWindow(GW_CHILD);//first child window
 while (Wnd)
 {
  Wnd->GetWindowPlacement(&Wp); // actual size
  Wp.rcNormalPosition.top    =(int)(Ym*Wp.rcNormalPosition.top);
  Wp.rcNormalPosition.left   =(int)(Xm*Wp.rcNormalPosition.left);
  Wp.rcNormalPosition.bottom =(int)(Ym*Wp.rcNormalPosition.bottom);
  Wp.rcNormalPosition.right  =(int)(Xm*Wp.rcNormalPosition.right);
 Wnd->SetWindowPlacement(&Wp); // new size
 Wnd=Wnd->GetNextWindow();
 }
CenterWindow();
RedrawWindow();
Resized=TRUE;
return TRUE;
}
////////////////////////////////////////////////////////
Emidio Marchese
emm...@tiscali.it

Se rileggi noti che io fino ad adesso ho programmato solo con MFC (per
quanto riguarda il visuale) perchè avevo già la pappa pronta.
Ma sto imparando le api ho già fatto il mio primo hello world e sono
soddisfatto :D
Continuerò ad usare le mfc certo fin quando non crerò delle librerie
mie :D
Lo so sogno troppo ma l'ambizione è tutto e siccome io ci credo c'è la
farò!!!
P.S. per quanto riguarda la risoluzione sai aiutarmi?
Ho fatto un buon Programma Visual Turbo Assembler per ora sono alla
beta1.
Ma lo voglio rendere portatile...
P.S. Sapete qual è la delusione + grande quando in java ti fanno usare
le librerie microzozz in java senza spiegarti cosa fanno... la scuola
e solo un mezzo per crescere e farsi le ossa da soli... che schifo...
Penso che la mia professoressa non sappia cosa sia un gestore di
eventi...
Lei fa doppio click sulla edit e scrive il codice...
Risultato Portatilità 0 e siamo legati di nuovo a Bill (#!@?)
:((((((((((((((((

adesso cerco di capire il tuocode l'ho provato ma mi crasha l'applicazione :D

 adesso cerco di capire il tuocode l'ho provato ma mi crasha l'applicazione
:D
OK! ti do' qualche altro suggerimento.
Se ti va' in crash, esegui il programma in modalita' debug, ti sara' molto
utile per scoprire dove hai fallito e imparare dagli errori commessi (il
debugger del visual e' il migliore).
Posiziona ShowWindow(SW_SHOWMAXIMIZED);  su OnInitDialog(),
"MyDialogWnd" ovviamente la devi sostituire con la tua Classe CDialog,
mentre OnPaint dovrebbe essere piu' o meno cosi:
//////////////////////////////////////////////////////////
void MyDialogWnd::OnPaint()
{
    CPaintDC dc(this); // device context for painting
 if (IsIconic())
 {
  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;
  dc.DrawIcon(x, y, m_hIcon);
  return;
 }
     if(SizeControlsToWindow()) PostMessage(WM_PAINT);
    CDialog::OnPaint();
}
//////////////////////////////////////////////////////////