- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我传统上使用 wxWidgets 绘制到 OpenGL Canvas 的方法是从当前 OpenGL Canvas 触发 30 赫兹定时刷新(),然后生成一个“wxEVT_PAINT”,我可以将其传播到其余部分框架。我还绑定(bind)到 wxEVT_PAINT 并调用 refresh() 来捕获任何帧大小调整。
在我没有使用 wxWidgets AUI 的程序中,这个方法完美无缺。
但是,如果我尝试使用 AUI,每次我尝试绑定(bind)到 wxEVT_PAINT 时,我的绘制事件都不会触发。有时绑定(bind)到绘画事件甚至会阻止其他事件(如计时器)的触发。
AUI 是否有一些特殊的方式来处理事件,或者我在这里缺少的 wxEVT_PAINT?在 AUI 托管框架内绘制到 OpenGL 窗口的最佳方法是什么?任何人都可以提供提示或示例,因为关于 AUI 的这个主题似乎不存在文档。
编辑:为了清楚起见,我在下面添加了我的源代码,供任何想帮助查找问题的人使用。我已经删除了 OpenGL 部分,因为我实际上只是想让 wxEVT_PAINT 在我调整窗口大小时触发框架中的绑定(bind)处理程序。
GeneratedFrame.h
#ifndef __GENERATEDFRAME_H__
#define __GENERATEDFRAME_H__
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/panel.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/menu.h>
#include <wx/frame.h>
#include <wx/aui/aui.h>
class MainFrame : public wxFrame
{
private:
protected:
wxPanel* m_panelMainView;
wxMenuBar* m_menubar2;
public:
MainFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("SimpleAui"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 646,516 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
wxAuiManager m_mgr;
~MainFrame();
};
#endif //__GENERATEDFRAME_H__
GeneratedFrame.cpp
#include "GeneratedFrame.h"
MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
m_mgr.SetManagedWindow(this);
m_mgr.SetFlags(wxAUI_MGR_LIVE_RESIZE);
m_panelMainView = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
m_panelMainView->SetForegroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_ACTIVECAPTION ) );
m_panelMainView->SetBackgroundColour( wxSystemSettings::GetColour( wxSYS_COLOUR_INFOBK ) );
m_mgr.AddPane( m_panelMainView, wxAuiPaneInfo() .Name( wxT("MainView") ).Center() .Caption( wxT("Main View") ).MinimizeButton( true ).PinButton( true ).Dock().Resizable().FloatingSize( wxDefaultSize ).Floatable( false ) );
m_menubar2 = new wxMenuBar( 0 );
this->SetMenuBar( m_menubar2 );
m_mgr.Update();
this->Centre( wxBOTH );
}
MainFrame::~MainFrame()
{
m_mgr.UnInit();
}
AppFrame.h
#ifndef __AppFrame_h__
#define __AppFrame_h__
#include "GeneratedFrame.h"
#include "SimpleAuiApp.h"
class AppFrame : public MainFrame
{
public:
// Constructor/Descructor
AppFrame( wxWindow* parent, ApplicationData* pAppData );
~AppFrame( );
// display update (called from main App on an update event)
void UpdateDisplay( );
private:
// pointer to the main data structure
ApplicationData* m_pAppData;
void OnPaint( wxPaintEvent& event );
};
#endif //__AppFrame_h__
AppFrame.cpp
#include "AppFrame.h"
#include "SimpleAuiApp.h"
#include <iostream>
// Constructor for the frame
AppFrame::AppFrame( wxWindow* parent, ApplicationData* pAppData )
: MainFrame( parent )
{
// Pull in the app data pointer
m_pAppData = pAppData;
// Set the size of the inner drawing area of the frame
SetClientSize( 500, 500 );
// Show the frame
Show();
// Layout the frame
Layout();
// Bind to the wxEVT_PAINT event
Bind( wxEVT_PAINT, &AppFrame::OnPaint, this );
}
// Destructor for the frame
AppFrame::~AppFrame( )
{
// stop the update timer for the application, otherwise a timer update
// event can be generated while data is being deleted
if( m_pAppData->m_pTimer )
{
m_pAppData->m_pTimer->Stop( );
}
}
void AppFrame::OnPaint( wxPaintEvent& event )
{
std::cout << "Running AppFrame::OnPaint\n";
UpdateDisplay( );
}
// perform frame update for the display
void AppFrame::UpdateDisplay( )
{
std::cout << "Running AppFrame::UpdateDisplay\n";
}
SimpleAuiApp.h
#ifndef __SimpleAuiApp_h__
#define __SimpleAuiApp_h__
#include <wx/wx.h>
#define DEFAULT_UPDATE_RATE (10) // in Hz (set to 0 for OnIdle)
// Forward declarations
class AppFrame;
struct ApplicationData
{
// constructor
ApplicationData( )
{
m_pFrame = NULL;
m_pTimer = NULL;
m_nDisplayUpdateRate = DEFAULT_UPDATE_RATE;
}
// timer object for frame based updates
wxTimer* m_pTimer;
// rate of display update (in HZ) (0=update on idle)
int m_nDisplayUpdateRate;
// pointer to the main frame instance
AppFrame* m_pFrame;
};
// Main application class
// (derived from the wxWidget App class)
class SimpleAuiApp : public wxApp
{
public:
SimpleAuiApp( );
virtual ~SimpleAuiApp( );
// the main application data structure
ApplicationData m_AppData;
private:
// called by wxApp when starting up, program setup should be done here
bool OnInit( );
// called by wxApp when shutting down, program cleanup should be done here
int OnExit( );
// When running with "fixed" framerate, called for each timer event (frame)
void OnTimer( wxTimerEvent& event );
};
DECLARE_APP( SimpleAuiApp )
#endif //__SimpleAuiApp_h__
SimpleAuiApp.cpp
#include <wx/wx.h>
#include "SimpleAuiApp.h"
#include "AppFrame.h"
#include <iostream>
IMPLEMENT_APP( SimpleAuiApp )
SimpleAuiApp::SimpleAuiApp( )
{
}
SimpleAuiApp::~SimpleAuiApp( )
{
}
bool SimpleAuiApp::OnInit( )
{
// Open a console window for errors and standard output
AllocConsole( );
freopen( "CONOUT$", "wb", stdout );
freopen( "CONOUT$", "wb", stderr );
std::cout << "Initialization started...\n";
// Create the main application frame
m_AppData.m_pFrame = new AppFrame( (wxWindow*) NULL, &m_AppData );
// Bring the frame to the front
SetTopWindow( m_AppData.m_pFrame );
// See if a fixed frame rate is specified
if ( m_AppData.m_nDisplayUpdateRate > 0 )
{
// Start a timer to update the display at a fixed frame rate.
// Note that rate is increased by 10% to make up for wxWidget's inaccurate timers.
m_AppData.m_pTimer = new wxTimer( this );
float fMilliSeconds = 1000.0 / ( m_AppData.m_nDisplayUpdateRate * 1.1f );
m_AppData.m_pTimer->Start( fMilliSeconds );
Bind( wxEVT_TIMER, &SimpleAuiApp::OnTimer, this );
}
else
{
// capture the "on idle" event when not running at a fixed frame rate
Bind( wxEVT_IDLE, &SimpleAuiApp::OnIdle, this );
}
std::cout << "Initialization completed...\n";
return true;
}
// -------------------------------------------------------------
// Framerate - functions bound to framerate related events.
// Either OnTimer() or OnIdle() should be called here for each
// frame, but never both. They are two different refresh
// methods.
// -------------------------------------------------------------
// Called by widget app code on timer event
void SimpleAuiApp::OnTimer( wxTimerEvent& event )
{
std::cout << "Called SimpleAuiApp::OnTimer \n";
// update the frame's display
m_AppData.m_pFrame->UpdateDisplay( );
}
// -------------------------------------------------------------
// OnExit - Called by widget app code on shutdown
// -------------------------------------------------------------
int SimpleAuiApp::OnExit( )
{
// stop (and delete) the update timer if needed
if ( m_AppData.m_pTimer )
{
m_AppData.m_pTimer->Stop( );
delete m_AppData.m_pTimer;
m_AppData.m_pTimer = NULL;
}
// close the console window if needed
FreeConsole( );
// exit successful
return 0;
}
最佳答案
问题最终是您附加到主框架的 AUI 管理器在传播时确实消耗了 wxEVT_PAINT 事件,并且它永远不会到达框架的类。但是,Frame 的子级会收到事件。
我没有使用 Frame 类中的 Bind(),而是调用了 m_panelgl->Bind,其中 m_panelgl 是我的子容器,它包含 OpenGL Canvas 。
关于c++ - 带有 AUI : OpenGL render loop method and wxPaintEvent 的 wxWidgets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30809720/
我有一个用户信息表单,其中我的表单中有合金 au 按钮。 " method="post" id="saveUserForm" name="saveUserForm" onSubmit='' >
我正在检查 Liferay Site用于 Alloy UI 日期选择器。 给定示例中的问题是没有选择选项。如果我的用户的 DOB 在 70 年代,那么用户必须多次单击后退按钮。 这对用户来说不是一个愉
我在 aui 表单中有一些字段,我只想在选中相应的复选框时需要这些字段,否则不需要它们。我将使用 启用这些输入字段一旦启用该复选框,只有 aui 验证才可以工作。 我尝试隐藏 取决于脚本中的条件。
首先,我为我在 liferay 中的笨手笨脚而道歉。 当我使用例如 时 liferay jsp 文件中的标记没问题,没有任何问题,但是当我想使用 out.println 生成相同的输入字段时,它不起
在表单编译期间,我需要能够插入一个值,显示一个已使用值的列表(通常的列表框行为)。但我还需要能够输入一个新值,所以我选择了 aui:autocomplete(下面的代码)。 默认情况下,它允许选择由“
我有一个复选框。 我在页面加载时加载复选框的先前状态。检查之前的状态后,我执行以下操作。 var namespace = ""; window.onload = function() { v
我们使用 Liferay 6.2 EE 创建了一个简单的 Web 内容模板。 模板是用freemarker构建的。 现在我们想使用我们自己制作的 css 文件将我们的样式应用到网页内容模板。 但是li
在 liferay DXP (v 3.0) 中使用 AUI 轮播。Liferay DXP使用AUI 3.0版本在每个图像上,它都重定向到不同的网址。对于以下演示代码重定向不起作用
我想将数据库中的地址显示到自动完成 aui 输入字段。一切似乎工作正常。但我无法检索记录的地址号。如何使用自动完成列表的更改事件或如何我访问所选项目的 json 对象 @Override
我正在 Liferay 中使用如下形式制作一个 portlet: " id="myForm" > ${attr}
我的一个 jsps 中有这个脚本。它用于预览liferay中的文档。我的问题是在哪里可以找到此功能的实现,我可以更改它以便在预览中添加其他内容..或更改某些内容。 new Liferay.P
我正在使用 liferay 6.1。我的 JSP 有输入文本。我在输入文本上写入值并想将该值传递给 Portlet Controller 。但操作不会发送到 Controller 。 JSP代码
我正在使用 Liferay 6.2-ce-ga4,试图在 aui-datatable 列中嵌入自定义 renderURL。以下代码有效,除非我尝试从列格式化程序函数中调用以下代码行: var rend
我正在使用 wx.aui 来构建我的用户界面。我正在定义一个继承自 wx.Panel 的类,我需要在调整其窗口 Pane 大小时更改该面板的内容。 我使用的代码与下面的代码非常相似(它是找到的示例代码
我想检测在加载到对话框中的 html 文本字段中是否使用了 Enter。 如果按下回车键,我想模拟单击保存按钮。 我尝试了很多东西,基本上插入了这个代码: $(document).keypress(
我有一些带有某些字段的简单表单,我只想在客户端验证我的字段,所以我正在使用它并且它可以处理模糊事件 问题是当我提交表单时显示错误消息并且表单已提交 我正在尝试对表单提交进行验证,但如何才能知道哪个验证
在 View.jsp 中,我使用 . 创建了一个表单。上面有一些输入和 3 个选择框,实际上我想验证所有这些。对于我使用的输入,但我不知道如何验证我的 实际上我想验证这三个: 这是我的view.
我通过循环创建复选框(见图)。 " value="" /> 复选框本身工作正常,但如果我单击复选框的标签(名称),第一个复选框将被激活/停用(在图中,如果我单击名称“Messreihe4”,第一
我的wx.Frame派生类由AuiManager管理。我在此框架中有几个 Pane (所有 Pane 均源自 wx.Panel 并且都设置了 wx.TAB_TRAVERSAL 标志)。按键盘上的 TA
我有一个从 agw 库构建的 auiNotebook。现在我添加了几页现在我必须一次性删除所有页面。请让我知道如何执行此操作。 或者是否有任何方法可以为我提供所有添加页面的页面索引列表,以便我可以使用
我是一名优秀的程序员,十分优秀!