2015-06-22 9 views
5

Ho notato uno strano effetto quando creo un Listview.Strano effetto durante la creazione di un ListView

Quando creo un controllo ListView senza creare anche un pulsante, l'elemento selezionato in ListView presenta un bordo punteggiato. Tuttavia, quando creo anche un pulsante, l'oggetto selezionato ListView non ha più un bordo tratteggiato. Questo accade solo quando ho un file manifesto che consente controlli comuni 6:

enter image description here

Questo è il codice che ho usato per creare la finestra e ListView e Button:

// Create Window 
HWND hWnd = CreateWindowEx(0, "WinClass", "My Window", WS_OVERLAPPEDWINDOW, 261, 172, 394, 284, NULL, NULL, hInstance, NULL); 

// Create ListView 
HWND hListView = CreateWindowEx(0, WC_LISTVIEW, "", WS_CHILD | LVS_REPORT | WS_VISIBLE, 0, 0, 232, 190, hWnd, 0, GetModuleHandle(NULL), NULL); 

// Create Button 
HWND hButtonRefresh = CreateWindowEx(NULL, "BUTTON", "OK", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 10, 200, 110, 25, hWnd, NULL, GetModuleHandle(NULL), NULL); 

Nota: Non ho problemi con questo effetto, voglio solo capire perché sta succedendo!

+0

Il "bordo tratteggiato" indica che l'elenco ha lo stato attivo di input. Presumibilmente, a seconda di quale controllo viene creato per ultimo, l'input focus viene impostato per impostazione predefinita, ovvero quando si dispone di un pulsante è presente al posto del listview. –

+1

^questo. Come si può vedere, l'OK è bordato di blu. – Eregrith

+0

@Jonathan Potter Ma in entrambe le immagini, faccio clic sull'oggetto ListView, quindi ListView ha il focus e non il pulsante. – paul

risposta

0

Credo che il bordo tratteggiato indichi il controllo predefinito. Nella seconda schermata, vai alle Proprietà del pulsante e imposta Default Button su false e quindi dovresti vedere il bordo tratteggiato attorno al testo come nel primo screenshot.

Per fare ciò aprire la finestra di dialogo in visualizzazione Risorse, selezionare il pulsante e scegliere Proprietà dal menu del tasto destro del mouse. Nella finestra Proprietà dovresti vedere il pulsante Predefinito nella sezione Comportamento - basta cambiarlo in False.

alternativa nel codice provare qualcosa di simile: -

DWORD style = m_BtnOk.GetStyle(); 
// remove default push button style 
style &= ~BS_DEFPUSHBUTTON; 
// set the style 
::SendMessage(m_BtnClose.GetSafeHwnd(), BM_SETSTYLE, (WPARAM)style, (LPARAM)TRUE); 
+0

Come si imposta il pulsante predefinito su falso? – paul

+0

Non sto usando le risorse, puoi vedere il codice che ho usato per creare il pulsante nella mia domanda. – paul

+0

Doh - mi spiace. Basta eliminare BS_DEFPUSHBUTTON dalla riga per il pulsante OK. –

1

E 'solo perché il pulsante ha la messa a fuoco e la visualizzazione elenco perso, fare clic sulla visualizzazione elenco ei punti dovrebbero riapparire.

+0

No, questo non è il problema. Anche quando clicco su qualsiasi oggetto ListView, lo stile rimane lo stesso. – paul

+0

@paul E 'stato spiegato cosa sta succedendo nei commenti. Cosa altro non capisci? Perché stai sprecando una taglia su questo? –

0

Come altri hanno indicato, lo scopo è indicare il fuoco di input. Se si utilizza la scheda nella scheda attorno a qualsiasi modulo nativo, si vedrà il rettangolo saltare attorno agli indici impostati dallo sviluppatore.

La ragione per cui appare a tutti è perché ha un TabStop. Poiché esiste un solo elemento nel primo esempio, esiste una sola possibilità per un punto di tabulazione, quindi è indicato dal rettangolo. Gioca con la proprietà TabStop, Tab in giro, guarda cosa cambia.

Problemi correlati