2013-02-04 21 views
10

Ho un controllo personalizzato che è essenzialmente una tela da disegno e un programma che lo usa per modificare i file. Quando viene aperto un nuovo file, tuttavia, può accadere qualcosa di molto strano.Come si impedisce a un doppio clic su una finestra di dialogo Apri file di registrare un clic sul modulo sottostante?

Se il doppio utente fa clic sul file nella finestra di dialogo Apri file (di serie TOpenDialog controllo) invece di selezionare un elemento e colpire ENTER, la tela registra sotto un evento click e finisce per l'esecuzione di un'azione pareggio nella posizione di il cursore immediatamente dopo il caricamento è completo.

Ovviamente questo non è il comportamento previsto per questo. Ho notato prima che quando si fa doppio clic con il mouse, il messaggio doppio clic arriva prima del il secondo messaggio di clic. Penso che la finestra di dialogo potrebbe essere chiusa dal doppio clic, e poi il secondo messaggio di clic arriva e viene inviato a qualsiasi cosa con le coordinate appropriate ora che non c'è più.

C'è un modo in cui posso far smettere questo? Non riesco a dire al mio codice "dopo aver caricato, mangio il clic successivo", perché potrebbe essere stato aperto con il tasto "INVIO", e poi sarebbe mancato il primo clic legittimo. Qualcuno può pensare a un modo migliore per gestire questo? (Utilizzando Windows 7, nel caso in cui faccia la differenza.)

+0

I Immagino tu voglia una soluzione per entrambe le finestre di dialogo, quella XP e quella Vista. –

+1

Qualche possibilità di un esempio di codice duplicato? Non registra un clic su un modulo con un progetto vuoto. –

+0

Lo vedo costantemente, su Windows 7. (Forse è diverso per sistemi operativi diversi?) –

risposta

7

Se c'è un "secondo clic", c'è qualcosa di sbagliato. (Per prima cosa, Windows non ha i messaggi "clic", solo i messaggi mouse-up e mouse-down.) A double click goes like this: mouse down, mouse su, doppio clic, mouse su. La finestra di dialogo scompare tra il messaggio doppio clic e il secondo messaggio di passaggio del mouse. Se il tuo controllo riceve il messaggio di mouse e lo tratta come un clic completo, allora questo spiega il problema e devi fermarti; un clic è sempre un coppia di messaggi mouse-down e mouse-up. Se non hai ottenuto entrambi, allora non è un clic.

+0

Il problema sembra che il controllo stia effettivamente recuperando un mouse anziché un clic (voglio dire, come se fosse * set * prendere il primo piuttosto che il secondo). –

+0

perfetto! sì, ho risolto usando un flag sul metodo che l'evento Down fa fuoco. evento Down è attivato solo se picturebox è davvero cliccked: private void pictureBox1_MouseD (object sender, MouseEventArgs e) { picturebox_sel_clicked = true; Console.WriteLine ("D"); } – elle0087

1

In realtà, è stato generato il 2o evento di passaggio del mouse nella casella immagine, che porta all'invocazione del gestore di eventi. Sembra un bug OpenFileDialog. È necessario aggiungere il controllo per IsMouseCaptured per l'evento mouse su, un clic è mouse down e mouse su, invece di solo un mouse su.

1

ho risolto in questo modo (si tratta ovviamente di un work-around):

CFileDialog my_file_dialog(...); 
    if (my_file_dialog.DoModal()!=IDOK) 
     return; 

    CString fileName= my_file_dialog.GetPathName(); 

    //... 

    CSelectItemsDlg dlg; 


    // Avoid that the double-click on the CFileDialog sends the WM_LBUTTONUP message to the next window causing the Unselect of an item that is under the mouse cursor. 
    // http://www.experts-exchange.com/Programming/System/Windows__Programming/Q_10287063.html#a2476475 
    MSG msg; 
    while(PeekMessage(&msg,0,WM_LBUTTONUP,WM_LBUTTONUP,PM_REMOVE)); 

    int DoModalRes = dlg.DoModal(); 

e si può credere che ho messo un grande sorriso sul volto del mio capo :)