C++ Builder XE4 > UI > 구현: 마우스 클릭과 마우스로 범위 선택을 결정

운영 환경
C++ Builder XE4

개요


  • 마우스 클릭
  • 왼쪽 클릭
  • 클릭 해제

  • 마우스에서 범위 선택
  • 왼쪽 클릭
  • 이동
  • 클릭 해제


  • 상기를 판별하는 구현을 생각했다.

    구현



    Unit1.h
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    #include <Vcl.ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // IDE で管理されるコンポーネント
        TPanel *Panel1;
        TMemo *Memo1;
        void __fastcall Panel1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
              int X, int Y);
        void __fastcall Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
              int X, int Y);
        void __fastcall Panel1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y);
    
    private:    // ユーザー宣言
        bool m_bfMouseMove; // マウス移動があったかどうか
    public:     // ユーザー宣言
        __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    
    

    Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Panel1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
              int X, int Y)
    {
        if (m_bfMouseMove == false) {
            Memo1->Lines->Add(L"Click");
        } else {
            Memo1->Lines->Add(L"Range Select");
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
              int X, int Y)
    {
        m_bfMouseMove = false;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift, int X,
              int Y)
    {
        m_bfMouseMove = true;
    }
    //---------------------------------------------------------------------------
    
    

    동작 예





    비고1



    「X, Y위치를 유지해 MouseUp시에 어긋남이 없는지 확인」이라고 하는 방안도 생각했지만, 위의 실장이 심플할 것이다.

    Panel1MouseUp()만을 사용하는 구현이 있으면 알고 싶다.

    비고 2



    왼쪽 클릭시 조금이라도 좌표가 움직이면 클릭으로 인식되지 않는다.
    "클릭한 것의 처리되지 않는다"라고 유저에게 생각되는 장면이 있을 것 같다.

    좌표의 이동량을 보고, 다소의 이동이면 클릭으로서 처리하는 등의 궁리가 필요할지도 모른다.

    좋은 웹페이지 즐겨찾기