<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 6.1 鼠標輸入 總的說來,有兩類的鼠標事件。基本的鼠標事件使用wxMouseEvent作為參數,不加任何翻譯的發送給響應的窗口事件處理函數,而窗口事件處理函數則通常把它們翻譯成對應的命令事件(wxCommandEvent)。 舉例來說,當你在你的事件表中增加EVT_BUTTON事件映射宏的時候,它的處理函數的參數是一個由按鈕產生的wxCommandEvent類型。而在控件內部,這個wxCommandEvent類型是按鈕控件對EVT_LEFT_DOWN事件宏進行處理并將對應的鼠標事件翻譯成 wxCommandEvent事件的結果。(當然,在大多數平臺上,按鈕都是使用本地控件實現的,不需要自己處理底層的鼠標事件,但是對于別的定制的類來說,確是如此) 因為我們在前面已經介紹過處理命令事件的方法,我們將主要介紹怎樣處理基本的鼠標事件。 你可以分別攔截鼠標左鍵,中鍵或者右鍵的鼠標按下,鼠標釋放或者鼠標雙擊事件。你還可以攔截鼠標的移動事件(無論有沒有鼠標按下)。你還可以攔截那些用來告訴你鼠標正在移入或者移出某個窗口的事件,最后,如果這個鼠標有滾輪,你還可以攔截鼠標的滾輪事件。 當你收到一個鼠標事件時,你可以獲得鼠標按鈕的狀態信息,以及象Shift,Alt等等這些狀態鍵的信息,你還可以獲得鼠標指針相對于當前窗口客戶區域左上角的座標值。 下表列出了所有對應的鼠標事件映射宏。需要注意的是,wxMouseEvent事件是不會傳遞給父窗口處理的,所以,為了處理這個事件,你必須重載一個新的窗口類,或者重載一個新的wxEvtHandler,然后將其掛載在某個窗口上,當然你還可以使用動態事件處理函數Connect,相關內容參見第三章。 | EVT_LEFT_DOWN(func | 用來處理wxEVT_LEFT_DOWN事件, 在鼠標左鍵按下的時候產生. | |:--- |:--- | | EVT_LEFT_UP(func) | 用來處理wxEVT_LEFT_UP事件, 在鼠標左鍵被釋放的時候產生. | | EVT_LEFT_DCLICK(func) | 用來處理wxEVT_LEFT_DCLICK事件,在鼠標左鍵被雙擊的時候產生. | | EVT_MIDDLE_DOWN(func) | 用來處理wxEVT_MIDDLE_DOWN事件, 在鼠標中鍵被按下的時候產生. | | EVT_MIDDLE_UP(func) | 用來處理wxEVT_MIDDLE_UP事件,當鼠標中鍵被釋放的時候產生. | | EVT_MIDDLE_DCLICK(func) | 用來處理wxEVT_MIDDLE_DCLICK事件,在鼠標中鍵被雙擊的時候產生. | | EVT_RIGHT_DOWN(func) | 用來處理wxEVT_RIGHT_DOWN事件,鼠標右鍵被按下的時候產生. | | EVT_RIGHT_UP(func) | 用來處理wxEVT_RIGHT_UP事件,鼠標右鍵被釋放的時候產生. | | EVT_RIGHT_DCLICK(func) | 用來處理wxEVT_RIGHT_DCLICK事件,鼠標右鍵被雙擊的時候產生. | | EVT_MOTION(func) | 用來處理wxEVT_MOTION事件,鼠標指針移動的時候產生. | | EVT_ENTER_WINDOW(func) | 用來處理wxEVT_ENTER_WINDOW事件,鼠標指針移入某個窗口的時候產生. | | EVT_LEAVE_WINDOW(func) | 用來處理wxEVT_LEAVE_WINDOW事件,鼠標移出某個窗口的時候產生. | | EVT_MOUSEWHEEL(func) | 用來處理wxEVT_MOUSEWHEEL事件,鼠標滾輪滾動的時候產生. | | EVT_MOUSE_EVENTS(func) | 用來處理所有的鼠標事件. | 處理按鈕和鼠標指針移動事件 按鈕和指針移動事件是你想要處理的最主要的鼠標事件。 要檢測當產生某個事件時狀態鍵的狀態,可以使用AltDown,MetaDown,ControlDown或者ShiftDown等函數.使用CmdDown函數來檢測Mac OS X平臺上的Meta鍵或者別的平臺上的Control鍵的狀態.本章稍后的"狀態鍵變量"小節會對這些函數進行更詳細的介紹. 要檢測那個鼠標按鈕正被按下,你可以使用LeftIsDown, MiddleIsDown和RightIsDown函數,或者你可以使用wxMOUSE_BTN_LEFT, wxMOUSE_BTN_MIDDLE, wxMOUSE_BTN_RIGHT或wxMOUSE_BTN_ANY參數來調用Button函數.要注意這些函數通常只是反應在事件產生那個時刻鼠標的狀態,而不是反應鼠標的狀態改變.(譯者注:換句話說,兩續同樣按鈕的兩個事件中的按鈕狀態可能是一樣的). 在Mac OS X上,Command鍵被翻譯成Meta,Option鍵是Alt.因為在Mac系統上通常使用的是一鍵鼠標,當用戶按下Control鍵點擊鼠標的時候將產生右鍵單擊事件.因此在MacOS上沒有按下Control鍵時進行右鍵單擊這樣的事件,除非你正在使用的是一個兩鍵或者三鍵的鼠標. 你還可以用下面的函數來或者鼠標事件的類型:Dragging (某個鍵正按下時鼠標移動), Moving (鼠標正在移動而沒有鼠標鍵被按下), Entering, Leaving, ButtonDown, ButtonUp, ButtonDClick, LeftClick, LeftDClick, LeftUp, RightClick, RightDClick, RightUp, ButtonUp和IsButton等. 你可以使用GetPosition函數或者GetX和GetY函數獲取鼠標指針當前的設備單位位置,也可以給GetLogicalPosition函數傳遞某個設備上下文參數以便得到對應的邏輯位置. 下面的例子演示了一個涂鴉程序中的鼠標處理過程: ``` BEGIN_EVENT_TABLE(DoodleCanvas, wxWindow) EVT_MOUSE_EVENTS(DoodleCanvas::OnMouseEvent) END_EVENT_TABLE() void DoodleCanvas::OnMouseEvent(wxMouseEvent& event) { static DoodleSegment *s_currentSegment = NULL; wxPoint pt(event.GetPosition()); if (s_currentSegment && event.LeftUp()) { // 鼠標按鈕釋放的時候停止當前線段 if (s_currentSegment->GetLines().GetCount() == 0) { // 釋放線段記錄并且釋放指針 delete s_currentSegment; s_currentSegment = (DoodleSegment *) NULL; } else { // 已經得到一個有效的線段,把它存下來 DrawingDocument *doc = GetDocument(); doc->GetCommandProcessor()->Submit( new DrawingCommand(wxT("Add Segment"), DOODLE_ADD, doc, s_currentSegment)); doc->Modify(true); s_currentSegment = NULL; } } else if (m_lastX &gt; -1 && m_lastY &gt; -1 && event.Dragging()) { //正在拖動鼠標,增加一行到當前的線段中 if (!s_currentSegment) s_currentSegment = new DoodleSegment; DoodleLine *newLine = new DoodleLine(m_lastX, m_lastY, pt.x, pt.y); s_currentSegment->GetLines().Append(newLine); wxClientDC dc(this); DoPrepareDC(dc); dc.SetPen(*wxBLACK_PEN); dc.DrawLine( m_lastX, m_lastY, pt.x, pt.y); } m_lastX = pt.x; m_lastY = pt.y; } ``` 在上面的應用程序中,線段被存在文檔類型.當用戶使用鼠標左鍵在窗口上拖拽時,上面的函數增加一個線條到當前的線段中,并且把它畫出來, 當用戶釋放左鍵的時候,當前的線段被提交到文檔類進行處理(文檔類是wxWidgets的文檔視圖框架的一部分) ,以便進一步實現文檔的重做或者撤消動作,而在窗口的OnPaint函數(代碼沒有被展示) 中,整個文檔被重繪.在第19章"使用文檔和視圖"中,我們會完整的介紹這個例子. 如果想讓這個程序更專業一點,可以在鼠標按下的時候捕獲鼠標并且在鼠標釋放的時候釋放捕獲,以便當鼠標左鍵按下并且移出窗口的時候仍然可以收到鼠標事件. 處理鼠標滾輪事件 當處理鼠標滾輪事件的時候,你可以使用GetWheelRotation函數獲得滾輪滾過的位置的大小(可能為負數).用這個數除以 GetWheelDelta以便得到實際滾動行數的值.多數的設備每個GetWheelDelta發送一個滾輪事件,但是將來的設備也許會以更快的頻率發送事件,因此你需要進行這種計算以便只有在滾輪滾過一整行的時候才滾動窗口,或者如果你可以滾動半行也可以.你還要把用戶在控制面板中設置的滾輪每次滾動數量計算進去,這個數目可以通過GetLinesPerAction函數獲得,要乘以這個值來得到實際用戶希望滾動的數量. 另外,鼠標滾輪還可以被設置為每次滾動一頁,你需要調用IsPageScroll函數來判斷是否屬于這種情況. 我們來舉個例子,下面的代碼是wxScrolledWindow的默認滾輪處理事件處理函數,其中的變量m_wheelRotation對已經滾動的位置進行累加,只有在滾動超過一行的時候才進行滾動. ``` void wxScrollHelper::HandleOnMouseWheel(wxMouseEvent& event) { m_wheelRotation += event.GetWheelRotation(); int lines = m_wheelRotation / event.GetWheelDelta(); m_wheelRotation -= lines * event.GetWheelDelta(); if (lines != 0) { wxScrollWinEvent newEvent; newEvent.SetPosition(0); newEvent.SetOrientation(wxVERTICAL); newEvent.m_eventObject = m_win; if (event.IsPageScroll()) { if (lines &gt; 0) newEvent.m_eventType = wxEVT_SCROLLWIN_PAGEUP; else newEvent.m_eventType = wxEVT_SCROLLWIN_PAGEDOWN; m_win->GetEventHandler()->ProcessEvent(newEvent); } else { lines *= event.GetLinesPerAction(); if (lines &gt; 0) newEvent.m_eventType = wxEVT_SCROLLWIN_LINEUP; else newEvent.m_eventType = wxEVT_SCROLLWIN_LINEDOWN; int times = abs(lines); for (; times &gt; 0; times) m_win->GetEventHandler()->ProcessEvent(newEvent); } } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看