L'approccio alle finestre di easyhand nasce dalla seguenti considerazioni: normalmente quando si sviluppa un programma si lavoro su una finestra per volta, ogni nuova finestra aperta è una nuova sezione del programma, prende il focus di gestione, fino alla sua chiusura.
Quindi la filosofia di approccio è la seguente:
- Le finestre sono numerate (da 0 la prima, in poi); quindi oltre all'handle fornito dal sistema operativo esisto un handle easyhand che identifica la finestra.
- Non si può cambiare il focus da una finestra all'altra (tranne la scrittura)
- Le finiestra possono essere di due tipi: con bitmap associato (emulazione DOS), quindi non ridimensionabili o senza bitmap associato ridimensionabili.
- Quando si apre una finestra tutti le direttiva e funzioni grafiche fanno riferimento a questa.
- Ad ogni finestra sono associabili strutture di oggetti dinamici, oggetti stastici, input e automove.
- Quando si chiude una finestra tutte le risorse ad essa vengono automaticamente liberate.
Queste restrizioni fanno si che la programmazione diventi fluida, veloce e semplice, ma comunque è possibile gestire finestre "figlie" in contemporanea usando gli oggetti o direttamente le API del sistema operativo, dove si ritiene necessario.
Finiestre con gestione di subPainting e/o controllo esterno
Raramente sono necessarie, ma dove serve è possibile controllare la finestra attraverso l'assegnizione di una funzione di controllo, principalmente per controllare il paiting a schermo pieno.
- EH_WIN
Contiene le informazioni della finestra.
Alla finestre in apertura può essere associata una funzione di controllo
void * funcSubWin(EH_SUBWIN_PARAMS *);
- EH_SUBWIN_PARAMS
E' una struttura che contiene un insieme di parametri comunicato alla funzione di controllo della finestra.
Aiuto per migrazione
Il sistema di controllo della finestra è stato cambiato da una funzione generica a questa.
Per migrare i vecchi sorgenti:
dato come unico parametro della funzione EH_SUBWIN_PARAMS * psSwp;
- Il messaggio si trova in psSwp->enMess
- La Paintstruct del messaggio WS_DISPLAY in psSwp->pVoid
- La finestra chiamante in psSwp->iWin
- Se la chiamata prima o dopo le normali operazioni, in psSwp>bAfter (True se dopo)
Esempio di subPainting
static void * _backPaint(EH_SUBWIN_PARAMS * psSwp)
{
switch (psSwp->enMess)
{
case WS_DISPLAY:
if (!psSwp->bAfter) // <-- Solo prima
{
PAINTSTRUCT * ps=psSwp->pVoid;
RECTD rcd;
SIZE siz,sizImage;
RECT rectClient;
INT x,y;
S_FERBO_SRV * psFs;
EH_WIN * psWin=psSwp->psWin;
rectToD(&rcd,&ps->rcPaint);
dcBoxFill(ps->hdc,&rcd,0,0,colorWeba("#052142"));
psFs=srvFerbo(WS_OPEN,0,NULL);
if (!psFs->dmiFerbo.iLength) {
GetClientRect(psWin->hWnd,&rectClient);
IMGGetSize(_p.imgMvWhite,&sizImage);
sizeCalc(&siz,&rectClient);
x=(siz.cx-sizImage.cx)/2;
y=(siz.cy-sizImage.cy)/2;
dcImageShow(ps->hdc,x,y,sizImage.cx,0,_p.imgMvWhite);
}
srvFerbo(WS_CLOSE,0,NULL);
}
break;
}
return NULL;
}