如何在C++Builder中手动获取TMouseButton

How to manually get TMouseButton in C++Builder

我正在使用 Embarcadero Technology 的 C++Builder。内置的 OnClick 事件处理程序无法识别鼠标单击是左键还是右键。有没有我可以调用的函数来手动填充 TMouseButton 的值。下面是 OnClick 事件处理程序?

void __fastcall TForm::ListBox1Click(TObject *Sender)
{
  TMouseButton Button;

  Button = ???
}

用于鼠标单击事件详细信息的正确事件是 OnMouseDown(还有 OnMouseUpOnMouseMove)。

覆盖事件然后像这样实现 MouseDown 事件

void __fastcall TMyListView::MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y)
{
     if (Button == mbLeft){

     }
     if (Button == mbRight){

     }
}

另请参阅 Embarcadero 文档中的 Vcl.Controls.TControl.OnMouseDown

正如其他人提到的,您可以使用 OnMouseDown 事件来记住当前鼠标按钮状态,以便在 OnClick 中使用,例如

private:
    bool LButtonDown;
    bool RButtonDown;

...

void __fastcall TForm1::ListBox1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
    switch (Button) {
        case mbLeft:
            LButtonDown = true;
            break;

        case mbRight:
            RButtonDown = true;
            break;
    }
}

void __fastcall TForm1::ListBox1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
    switch (Button) {
        case mbLeft:
            LButtonDown = false;
            break;

        case mbRight:
            RButtonDown = false;
            break;
    }
}

void __fastcall TForm::ListBox1Click(TObject *Sender)
{
    if (LButtonDown) ...
    if (RButtonDown) ...
}

如果不想那样做,可以用Win32的APIGetKeyState() or GetAsyncKeyState()函数查询鼠标左右键当前状态,使用VK_LBUTTONVK_RBUTTON 虚拟键码,例如:

void __fastcall TForm::ListBox1Click(TObject *Sender)
{
    if (GetKeyState(VK_LBUTTON)) ...
    if (GetKeyState(VK_RBUTTON)) ...
}