2013-02-04 45 views
10

Tôi có một điều khiển tùy chỉnh về bản chất là một khung vẽ và một chương trình sử dụng nó để chỉnh sửa tệp. Tuy nhiên, khi một tập tin mới được mở ra, một cái gì đó rất lạ có thể xảy ra.Làm cách nào để ngăn nhấp đúp vào hộp thoại Mở tệp từ đăng ký nhấp chuột vào biểu mẫu bên dưới?

Nếu người dùng nhấp đúp vào tệp trong hộp thoại Mở tệp (điều khiển tiêu chuẩn TOpenDialog) thay vì chọn mục và nhấn ENTER, canvas bên dưới đăng ký sự kiện nhấp và kết thúc thực hiện thao tác vẽ tại vị trí con trỏ ngay lập tức sau khi tải xong.

Rõ ràng đây không phải là hành vi dự định cho việc này. Tôi đã nhận thấy trước đó khi bạn nhấp đúp chuột, thông báo nhấp đúp đến trước thông báo nhấp chuột thứ hai. Tôi nghĩ rằng hộp thoại có thể được đóng từ nhấp đúp, và sau đó thông báo nhấp chuột thứ hai đến và được gửi đến bất cứ điều gì tại tọa độ thích hợp bây giờ nó đã biến mất.

Có cách nào tôi có thể thực hiện việc dừng này không? Tôi không thể nói mã của tôi "sau khi tải, chỉ cần nhấp vào nhấp chuột tiếp theo", bởi vì nó có thể đã được mở bằng phím 'ENTER' thay vào đó, và sau đó nó sẽ bỏ lỡ nhấp chuột hợp pháp đầu tiên. Bất cứ ai có thể nghĩ ra một cách tốt hơn để xử lý này? (Sử dụng Windows 7, trong trường hợp có sự khác biệt.)

+0

tôi đoán bạn muốn có một giải pháp cho cả hai hộp thoại, XP và Vista. –

+1

Bất kỳ cơ hội nào của mẫu mã trùng lặp? Không đăng ký một nhấp chuột vào một biểu mẫu với một dự án trống. –

+0

Tôi nhìn thấy nó một cách nhất quán, trên Windows 7. (Có thể nó khác với các hệ điều hành khác nhau?) –

Trả lời

7

Nếu có "thông báo nhấp chuột thứ hai", có điều gì đó không ổn. (Đối với một điều, Windows không có "bấm" tin nhắn, chỉ cần chuột lên và chuột xuống tin nhắn.) A double click goes like this: chuột xuống, chuột lên, nhấp đúp chuột, chuột lên. Hộp thoại biến mất giữa thông báo nhấp đúp và thông báo di chuột thứ hai. Nếu điều khiển của bạn nhận được thông báo di chuột và xử lý nó như một nhấp chuột đầy đủ, thì điều đó giải thích vấn đề và bạn cần phải dừng lại; nhấp chuột luôn là một cặp của thông báo di chuột lên và chuột. Nếu bạn chưa nhận được cả hai, thì đó không phải là một cú nhấp chuột.

+0

Vấn đề trông giống như điều khiển thực sự bắt chuột lên thay vì nhấp chuột (ý tôi là, nếu nó được * đặt * để bắt các cựu hơn là sau này). –

+0

hoàn hảo! vâng, tôi đã giải quyết bằng cách sử dụng một lá cờ trên phương pháp mà sự kiện Xuống cháy. Sự kiện xuống chỉ được kích hoạt nếu picturebox thực sự bị khóa: riêng void pictureBox1_MouseD (đối tượng người gửi, MouseEventArgs e) { picturebox_sel_clicked = true; Console.WriteLine ("D"); } – elle0087

1

Thực tế, sự kiện chuột thứ hai đã được kích hoạt trên hộp hình ảnh, dẫn đến lời gọi xử lý sự kiện. Điều này có vẻ như một lỗi OpenFileDialog. Cần phải thêm kiểm tra cho IsMouseCaptured cho sự kiện chuột lên, một cú nhấp chuột là chuột xuống và chuột lên, thay vì chỉ một con chuột lên.

1

tôi giải quyết nó theo cách đó (nó là tất nhiên một công việc xung quanh):

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(); 

Và bạn có thể tin rằng tôi đã đặt một nụ cười lớn trên khuôn mặt của ông chủ của tôi :)