diff --git a/CMakeLists.txt b/CMakeLists.txt index 61a9522..44048a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,7 @@ find_package(wxWidgets REQUIRED COMPONENTS core base) include(${wxWidgets_USE_FILE}) add_executable(wxWidgetStudy main.cpp) -add_executable(wxEvent event_01_exe.cpp src/event_01.cpp) +add_executable(wxEvent event_binary.cpp src/event_demo.cpp) target_link_libraries(wxWidgetStudy PRIVATE ${wxWidgets_LIBRARIES}) target_link_libraries(wxEvent PRIVATE ${wxWidgets_LIBRARIES}) diff --git a/event_01_exe.cpp b/event_01_exe.cpp deleted file mode 100644 index cc1b091..0000000 --- a/event_01_exe.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "src/event_01.h" - -IMPLEMENT_APP(MyApp) -DECLARE_APP(MyApp) \ No newline at end of file diff --git a/event_binary.cpp b/event_binary.cpp new file mode 100644 index 0000000..ddacb12 --- /dev/null +++ b/event_binary.cpp @@ -0,0 +1,4 @@ +#include "src/event_demo.h" + +IMPLEMENT_APP(MyApp) +DECLARE_APP(MyApp) \ No newline at end of file diff --git a/src/event_01.cpp b/src/event_demo.cpp similarity index 99% rename from src/event_01.cpp rename to src/event_demo.cpp index eef412d..8efa180 100644 --- a/src/event_01.cpp +++ b/src/event_demo.cpp @@ -1,4 +1,4 @@ -#include "event_01.h" +#include "event_demo.h" BEGIN_EVENT_TABLE(MainFrame, wxFrame) EVT_MENU(wxID_ABOUT, MainFrame::OnAbout) diff --git a/src/event_01.h b/src/event_demo.h similarity index 66% rename from src/event_01.h rename to src/event_demo.h index f6247b3..2287b8f 100644 --- a/src/event_01.h +++ b/src/event_demo.h @@ -37,6 +37,35 @@ 变)。当然最简单的情形是你完全不需要访问这个参数的任何方法,比如按钮点击事件。 */ +/* +过滤某个事件 + wxWidgets事件处理系统实现了一些和C++中的虚方法非常类似的机制,通过这种机制,你可以通过重载某种基 + 类的事件表的方法来改变基类的默认的事件处理过程。在多数情况下,通过这种方法,你甚至可以改变本地原生 + 控件的默认行为。举例来说,你可以过滤某些按键事件以便本地原生的编辑框控件不处理这些按键。要达到这个 + 目的,你需要实现一个继承自wxTextCtrl的新的类,然后在其事件表中使用EVT_KEY_DOWN事件映射宏。过滤 + 所有的按键事件也许不是你想要的,这时候,你可以通过调用wxEvent::Skip函数来提示事件处理过程对于其中的 + 某些按键事件应该继续寻找其父类的事件表。 + 总的来说,在wxWidgets中,你应该通过调用事件的Skip方法,而不是通过显式直接调用其父类对应函数的方法 + 来实现对特殊事件的过滤。 + 下面的这个例子演示怎样让你自己的文本框控件只接受"a"到"z"和"A"到"Z"的按键,而忽略其它按键的方法: + + void MyTextCtrl::OnChar(wxKeyEvent& event) + { + if ( wxIsalpha(event.KeyCode())) + { + //这些按键在可以接受的范围,所以按照正常的流程处理 + event.Skip(); + } + else + { + // 这些事件不在我们可以接受的范围,所以我们不调用Skip函数 + // 由于事件表已经匹配并且没有调用Skip函数,所以事件处理过程不会 + // 再继续匹配别的事件表,而是认为事件处理已经结束 + wxBell(); + } + } +*/ + class MyApp : public wxApp { public: virtual bool OnInit();