2013-06-10 37 views
12

Tôi tìm thấy đá quý này (IMO) trong không gian tên System.Windows.Forms. Tôi đang đấu tranh để tìm ra lý do tại sao nó được thiết lập như thế này.Giá trị enum lẻ trong Windows.Forms.MouseButtons

[Flags] 
public enum MouseButtons 
{ 
    None = 0, 
    Left = 1048576, 
    Right = 2097152, 
    Middle = 4194304, 
    XButton1 = 8388608, 
    XButton2 = 16777216, 
} 

ai đó có thể giải thích lý do tại sao nó sử dụng các giá trị (sức mạnh của 2^20-2^24) thay vì điều này:

public enum MouseButtons 
{ 
    None = 0, 
    Left = 1,  // 2^0 
    Right = 2,  // 2^1 
    Middle = 4, // 2^2 
    XButton1 = 8, // 2^3 
    XButton2 = 16, // 2^4 
} 

Giá trị đầu tiên là 100000000000000000000 trong hệ nhị phân, mà lá không gian cho thêm 20 bit! Tại sao chúng ta cần không gian như vậy và tại sao nó được bảo quản như thế này?

+2

Có thể do một số sự cố tương thích từ Win32. –

+1

@newStackExchangeInstance Tâm chia sẻ liên kết hoặc giải thích có thể dẫn đến nội dung như thế này? – Odys

+0

Tôi không có bất kỳ thông tin về trường hợp cụ thể này, nhưng những gì tôi biết là có rất nhiều giá trị lẻ trong enums trong .NET do win32. –

Trả lời

3

Giá trị enum được sử dụng trong Winforms có xu hướng khớp với các bit tương ứng trong winapi nhưng điều đó hoàn toàn không đúng với các nút chuột. Giải thích điều này đòi hỏi một dự đoán khá hoang dã.

Tôi có một cách, cách bạn truy xuất trạng thái các nút chuột mà không dựa vào thông điệp Windows là rất lạ. Bạn gọi GetAsyncKeyState(), chuyển VK_LBUTTON qua VK_XBUTTON2. Các khóa ảo giả thực sự đại diện cho các phím chuột và không phải phím bàn phím. Điều này đã xảy ra cách cách đây quá lâu để tôi đoán tại sao họ đã thực hiện theo cách này thay vì cung cấp hàm getapiMoveBateState() thích hợp.

Việc liệt kê khóa cũng có các giá trị đó, như Keys.LButton etcetera. Một cái gì đó khác là đặc biệt về Keys là nó cũng có thể mã hóa trạng thái của một phím bổ trợ. Có ví dụ Keys.Control và Keys.ControlKey. Và Keys.Shift vs Keys.ShiftKey, v.v. Cái đầu tiên cho biết trạng thái của khóa, cái thứ hai cho biết khóa thực. Cho phép mã thân thiện như keydata == (Keys.Control | Keys.F) để kiểm tra xem Ctrl + F đã được nhấn chưa.

Tầm quan trọng của các giá trị enum của MouseButton sau đó là chúng khớp với giá trị Khóa enum để biểu thị trạng thái của các nút chuột. Để lại 20 bit có sẵn cho các bit mã hóa khóa.

Nghe hay, phải không? Các trục trặc duy nhất là nó không bao giờ được kết hợp theo cách đó trong mô hình đối tượng Winforms. Nhưng có thể trong mã của riêng bạn để xác định một phím tắt cũng sử dụng trạng thái chuột.

1

Tôi đoán là nó phải liên quan đến cách API Windows cơ bản chuyển thông tin chuột đến .NET.

Gói Windows được nhấp vào nút chuột cũng như vị trí con trỏ trong một khối thông tin (nghĩ về cấu trúc MOUSE_EVENT cũ). Các enums trong .NET được thiết lập theo cách chúng có hiệu quả, vì vậy chúng có thể xếp hàng độc đáo với cách thông điệp Windows bên dưới. Vì vậy, thay vì nhận được thông báo cấp thấp hơn và phải chuyển đổi nó thành một tập hợp các giá trị mới, .NET chỉ nhắm mục tiêu các bit trong thông điệp cấp thấp hơn mà nó quan tâm - không chuyển đổi, không có toán học, chỉ hiệu quả.