Newsgroup: it.comp.programmare.win32
Titolo: [EVC] Dialog scrollabili (forse OT?)

Ciao a tutti, mi scuso se il mess risulterà OT ma non so quale sia il NG +
adatto alla mia domanda. Vengo al dunque:
è possibile (programmo in C++ con EVC) realizzare dialog scrollabili
mediante l'uso di una scrollbar laterale? Mi spiego meglio: ho un dialog con
un certo numero di controlli vari (tipo checkbox, radio button ed edit
control), apro la tastierina per editare qualche campo di edit ma il dialog
viene in parte coperto dalla tastiera.... posso ridimensionarlo aggiungendo
una scrollbar in modo che posso spostarmi sul dialog per visualizzare le
parti coperte (ad esempio per inserire dati in altri edit control che non
risulterebbero + visibili)?
Per intenderci l'effetto che vorrei realizzare è come quello che si ha nei
listcontrol quando aggiungendo righe si finisce fuori dell'area visibile,
per cui appare la scrollbar che mi consente di spostarmi all'interno della
lista, solo che qui la scrollbar dipende dalle dimensioni del dialog che
vengono modificate in "tempo reale" all'apertura del tastierino virtuale.
Bella rogna, eh? ;)
Grazie e scusate per il disturbo.

 mediante l'uso di una scrollbar laterale? [...]
Capisco perfettamente cosa intendi, sto sviluppando un applicazione per
PocketPC anche io (procede mooolto lentamente :) ) e non mi sono ancora
(volutamente) posto il problema, ma visto che prima o poi dovro' risolvere
la cosa tanto vale discuterne adesso. Sto guardando adesso sul PSDK Help che
c'e' la ScrollWindowEx che gestisce anche lo spostamento dei child controls,
pero' non so se c'e' anche su CE. Alternativamente avevo pensato di creare
uno static control trasparente e rendere tutti gli oggetti della dialog box
child dello static e poi gestire lo scrolling spostandolo. Tu non hai il
libro di Bouling? Forse li si trova qualcosa. Se invece usi le MFC e' facile
che ci sia qualcosa di gia' semipronto...
Luca

Mi inserisco sull'argomento...
anke io ho lo stesso problema, e pensavo momentaneamente (per urgenze di
consegna :)) ) di spostare in alto o in basso il tastierino di sistema al
tap su un'icona... ma nn ho idea di come si faccia... qcn potrebbe darmi qke
dritta?
Grazie in anticipo.

 ha scritto nel messaggio
news:67IG9.18996$fa.6...@news1.tin.it...

Qui al lavoro non ho il PPC2002 SDK, quindi niente doc, ma cosi' a occhio
direi che ci metti di meno a scrollare la dialog. Inoltre se fai svolazzare
in giro per lo schermo la tastierina ti scordi la certificazione Microsoft
(sempre che ti interessi essere certificato da loro :) ). La mia idea
sarebbe di realizzare una dialog (io uso il C, quindi e' un filo piu'
complicato creare un oggetto del tutto autonomo e scollegato dal resto) che
se troppo piccola fa apparire e gestisce le scrollbar da sola. Avevo pensato
di passare alla funzione che crea la dialog le dimensioni ideali (chesso',
parola alta e bassa di una dword) e durante il WM_SIZE agire di conseguenza,
visualizzando o nascondendo le scrollbar.
Luca


Complimenti per l'idea ma io ho una fretta ke nn immagini... quindi cercavo
una soluzione veloce... mi riferisco alla tastierina svolazzante (della
certificazione... diciamo ke posso farne a meno... tanto è una soluzione
momentanea)...
Io ho provato a fare qcs del genere:
UINT udm = 0;
SIPINFO sip;
memset( &sip, 0 , sizeof(SIPINFO) );
sip.cbSize = sizeof(SIPINFO);
if(SHSipInfo(SPI_GETSIPINFO, udm , &sip , 0 ))
{ 
    sip.fdwFlags = SIPF_ON;
    sip.rcVisibleDesktop.top = 80;
    sip.rcVisibleDesktop.bottom = 319-26;
    sip.rcVisibleDesktop.left = 0;
    sip.rcVisibleDesktop.right = 239;
    sip.rcSipRect.top = 0;
    sip.rcSipRect.bottom = 79;
    sip.rcSipRect.left = 0;
    sip.rcSipRect.right = 239;
 
    SHSipInfo(SPI_SETSIPINFO, udm , &sip , 0 ); 
}
ma con scarsi risultati... 
Kenny


Guarda, non ho ancora affrontato l'alrgomento SIP, quindi rischierei di
sparare delle grosse cazzate (per lo meno piu' grosse di quelle che dico di
solito...). Giusto per essere precisi cosa intendi per scarsi risultati? La
tastierina non si sposta? Scompare? C'ha i tastini mischiati? Vabbe',
comunque, visto che hai fretta perche' non consideri (probabilmente e' la
prima soluzione a cui hai pensato e non e' realizzabile nel tuo caso) la
riorganizzazione della dialog spostando tutti i campi edit in alto o
sostituendo ad esempio con dei combo box o altro, oppure spezzando del tutto
la dialog in 2, magari con dei tab control (cosi' ti diverti con quelli :) )
Luca

OK... ho risolto così:
Mi creo una tool bar con un'iconcina e la inserisco nelle risorse;
quando apro il tastierino controllo lo stato dell' InputPanel e se aperto
carico la mia tool bar, altrimenti la resetto;
al click sulla mia icona sposto i controlli in alto;
se riclicko sull'icona rimetto i controlli alla loro posizione iniziale;
se kiudo il tastierino i controlli tornano alla loro posizione iniziale e
resetto la toolbar.
Ti copio il codice ke ho usato... magari ti torna utile... cmq grazie di
tutto.
----------------------------
nel .h
protected:
    CCeCommandBar m_wndCommandBar;
    bool windowScrolled; //Inizializzato a false nel costruttore
---------------------------
nel .cpp
BEGIN_MESSAGE_MAP(MyDialog, CDialog)
    //{{AFX_MSG_MAP(MyDialog)
        // NOTE: the ClassWizard will add message map macros here
        ON_COMMAND(ID_SCROLL, OnScroll)
        ON_MESSAGE(WM_SETTINGCHANGE, OnSettingChange)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
void MyDialog::OnScroll()
{
    if(windowScrolled == true)
    {
            MoveWindow(0,26,240,320,FALSE);
            windowScrolled = false;
    }
    else
    {
        MoveWindow(0,-40,240,320,FALSE);
        windowScrolled = true;
    }
}
void MyDialog::OnSettingChange(WPARAM wFlag, LPARAM pszSectionName)
{
    if(wFlag == SPI_SETSIPINFO)
    {
        UINT udm = 0;
        SIPINFO sip;
        memset( &sip, 0 , sizeof(SIPINFO) );
        sip.cbSize = sizeof(SIPINFO);
        if(SHSipInfo(SPI_GETSIPINFO, udm , &sip , 0 ))
        {
            m_wndCommandBar.ResetCommandBar();
            BOOL bOk = TRUE;
            if(m_wndCommandBar.m_hWnd == NULL)
            bOk = m_wndCommandBar.Create(this);
            if(bOk)
            {
                if(sip.fdwFlags == 3)
                    m_wndCommandBar.LoadToolBar(IDR_SCROLL);
                else
                {
                    m_wndCommandBar.ResetCommandBar();
                    MoveWindow(0,26,240,320,FALSE);
                }
            }
        }
    }
}

Ehm... kiedo scusa, sostituisci nel mio post precedente file:// con //...
Ciao.


Sisi, avevo gia' visto... Sono i news reader che storpiano i commenti. Poi
lo dovro' anche convertire in C, ma mi sembra immediato. Lo faro' nel caso
dovessi usare il tuo codice. Comunque sia grazie.
Ciao.
Luca