Domanda

Sto cercando di implementare alcune funzionalità di trascinamento della selezione per un sistema materiale in fase di sviluppo nel mio lavoro.Parte di questo sistema include una 'Libreria materiali' che funge da archivio, diviso in gruppi, dei materiali salvati sul disco rigido dell'utente.

Come parte di un miglioramento dell'interfaccia utente, speravo di implementare una funzionalità di tipo "evidenziazione".Durante il trascinamento, le finestre su cui è possibile rilasciare legalmente un materiale cambieranno leggermente colore per migliorare il feedback all'utente che si tratta di un'azione valida.

Sto cambiando la barra con "Materiali di base" (solo un CWnd con un CStatic) da uno sfondo grigio medio quando non evidenziato a uno sfondo blu quando si passa il mouse sopra.Funziona tutto bene, i messaggi OnDragEnter e OnDragExit sembrano robusti e impostano un flag che indica lo stato di evidenziazione.Quindi in OnCtrlColor faccio questo:

    if (!m_bHighlighted) {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kBackgroundColour);
}
else {
    pDC->FillSolidRect(0, 0, m_SizeX, kGroupHeaderHeight, kHighlightedBackgroundColour);
}

Tuttavia, come puoi vedere nello screenshot, il dipinto "si blocca" sotto l'oggetto trascinato, lasciando il grigio originale al suo posto.Sembra davvero brutto e sostanzialmente rovina l'intero effetto.

C'è un modo per aggirare questo problema?

È stato utile?

Soluzione 3

Grazie per le risposte ragazzi, ajryan, sembra che riusciate sempre a trovare aiuto per le mie domande, quindi grazie extra.

Per fortuna questa volta la risposta è stata abbastanza semplice....

ImageList_DragShowNolock(FALSE);
m_pDragDropTargetWnd->SendMessage(WM_USER_DRAG_DROP_OBJECT_DRAG_ENTER, (WPARAM)pDragDropObject, (LPARAM)(&dragDropPoint));
ImageList_DragShowNolock(TRUE);

Questo disattiva il disegno dell'immagine trascinata, quindi invia un messaggio alla finestra in cui si sta accedendo per ridipingerla in uno stato evidenziato, quindi infine ridisegna l'immagine trascinata sopra.Sembra che abbia funzionato.

Altri suggerimenti

Il debug remoto è una manna dal cielo per il debug dei problemi visivi.È complicato da configurare, ma avere una macchina virtuale pronta per il debug remoto ti ripagherà sicuramente.

Quello che mi piace fare è impostare un sacco di punti di interruzione nella gestione della pittura, così come nel codice di pittura stesso.Ciò ti consente di "congelare l'inquadratura" in modo efficace del dipinto senza rovinarlo passando a devenv.In questo modo puoi ottenere un quadro reale di chi sta dipingendo, in quale ordine e dove hai la possibilità di inserire un riempimento che si raddrizzi nel modo desiderato.

Sembra quasi che CStatic non sappia che ha bisogno di ridipingersi, quindi il colore di sfondo dell'oggetto trascinabile viene lasciato indietro.Forse provare a invalidare CStatic e vedere se questo aiuta?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top