wxWidgets框架下大规模组件自绘制的快速处理方法
【专利摘要】本发明涉及wxWidgets组件的绘制处理技术,其公开了一种wxWidgets框架下大规模组件自绘制的快速处理方法,解决现有技术中采用多个自定义组件挂载多个挂载事件表来处理不同的组件的自定义绘制,导致增加程序代码的长度,降低了开发效率也增加了维护的难度的问题。该方法包括:定义事件挂载表类,在所述事件挂载表类的成员变量中保存自绘制组件对象的指针,事件挂载表类对象在接收到自绘制的事件时通过相应事件处理函数将自绘制组件对象的指针和接收到的事件转发给对应的图形绘制槽函数,从而实现组件的自定义绘制。本发明适用于对大规模组件的自定义绘制的快速处理。
【专利说明】wxWi dgets框架下大规模组件自绘制的快速处理方法
【技术领域】
[0001]本发明涉及wxWidgets组件的绘制处理技术,特别涉及wxWidgets框架下大规模组件自绘制的快速处理方法。
【背景技术】
[0002]目前的应用程序开发,都极注重用户界面的设计,漂亮精简的应用程序广受用户的喜爱。同样,在目前C++的图形用户界面程序开发框架中,wxWidgets,因其可视化的组件开发方式,而受到广大程序员的喜爱,被应用到各种领域。
[0003]现有技术中关于wxWidgets组件自绘制方式有两种:一种是从wxWindow或wxControl继承,实现自己的自定义绘制函数,主要就是处理wxEVT_PAINT (绘制)和wxEVT_ERASE_BACKGROUND (擦除背景)事件;另一种方法是直接采用wxPanel控件(wxWindow类及其子类都可以,但wxPanel在wxFormbui Ider可视化设计环境中,能以可视化的方式进行布局,从而减轻界面布局的工作),然后使用挂载事件表的方法来处理wxEVT_PAINT和wxEVT_
erase_background 事件。
[0004]上述两种处理方式相比而言,采用挂载事件表的处理方式更加简单、灵活;但由于不同的组件需要不同的绘制方法,因此大多数程序里就有很多不同的事件表,对于现代的图形化界面发展趋势,采用这种事件表来开发程序,效率也不是很高,维护仍然比较麻烦。
【发明内容】
[0005]本发明所要解决的技术问题是:提出一种wxWidgets框架下大规模组件自绘制的快速处理方法,解决现有技术中采用多个自定义组件挂载多个挂载事件表来处理不同的组件的自定义绘制,导致增加程序代码的长度,降低了开发效率也增加了维护难度的问题。
[0006]本发明解决上述技术问题所采用的技术方案是:
[0007]wxffidgets框架下大规模组件自绘制的快速处理方法,包括:
[0008]定义事件挂载表类,在所述事件挂载表类的成员变量中保存自绘制组件对象的指针,事件挂载表类对象在接收到自绘制的事件时通过相应事件处理函数将自绘制组件对象的指针和接收到的事件转发给对应的图形绘制槽函数,从而实现组件的自定义绘制。
[0009]进一步,所述自绘制事件包括:绘制事件和擦除背景事件;所述相应事件处理函数包括:绘制事件处理函数和擦除背景事件处理函数;所述对应的图形绘制槽函数包括:绘制槽函数和擦除背景槽函数。
[0010]进一步,所述事件挂载表类中有三个成员变量,其中一个成员变量保存自绘制组件对象的指针,另外两个成员变量分别为绘制信号和擦除背景信号。
[0011]进一步,所述绘制事件处理函数用于将绘制事件、自绘制组件对象的指针添加到绘制信号中,并将该绘制信号转发给绘制槽函数;所述擦除背景事件处理函数用于将擦除背景事件、自绘制组件对象的指针添加到擦除背景信号中,并将该擦除背景信号转发给擦除背景槽函数。[0012]进一步,该方法还包括:
[0013]在窗口初始化时,挂接事件表对象,初始化绘制信号和擦除背景信号,所述事件表对象为所述事件挂载表类的对象实例。
[0014]进一步,挂接事件表对象,初始化绘制信号和擦除背景信号的具体方式为:
[0015]用自绘制组件的指针作为构造函数的参数,创建一个事件挂载表类实例对象;
[0016]将该实例对象的绘制信号连接到绘制槽函数;
[0017]将该实例对象的擦除背景信号连接到擦除背景槽函数;
[0018]将该实例对象压入自定义绘制组件的事件表栈中。
[0019]进一步,该方法还包括:
[0020]在窗口销毁的时候,自绘制组件对象弹出已挂接的事件表。
[0021]本发明的有益效果是:采用单一简单的事件挂载表类,实现绘制事件到信号的转发,使得原本复杂的组件自定义绘制变成简单的函数调用,在很大程度上提高程序员的开发效率,节省了开发时间。
【具体实施方式】
[0022]本发明旨在提 出一种wxWidgets框架下大规模组件自绘制的快速处理方法,解决现有技术中采用多个自定义组件挂载多个挂载事件表来处理不同的组件的自定义绘制,导致增加程序代码的长度,降低了开发效率也增加了维护的难度的问题。
[0023]本发明的核心思想是:为了使单一的事件挂载表类能实现不同组件的自定义绘制,我们需要在类成员变量中保存不同组件的实例。采用信号/槽模式,在事件挂载表类对象收到绘制事件时,通过信号/槽机制连接到真实的绘制函数上,把组件的实例和接收到的事件作为参数传递给真实的图形绘制函数,从而实现组件自定义绘制。
[0024]下面结合【具体实施方式】对本发明的方案作进一步的描述:
[0025]对于事件挂载表类的实现方式如下:定义一个事件挂载表类(假设名为CustomPaintHandler,从库中wxEvtHandler类继承),用来接收自绘制的两个事件,即绘制事件和擦除背景事件。
[0026]在这个事件挂载表类中,有三个成员变量,其中成员变量m_pWindoW保存自绘制组件对像的指针,类型为wxWindows*。在这个事件挂载类的构造函数中将自定义绘制对象的指针作为参数,保存在110^^(10?8变量中;另外两个成员变量,代表两个信号,分别表示绘制信号和擦除背景信号。
[0027]两个信号成员定义如下(这里采用BOOST库里的信号):
[0028]boost:: signals2:: signaKvoid (wxffindow*, wxPaintEvent&) >m_sig0nPaint ;
[0029]boost:: signals2:: signaKvoid (wxffindow*, wxEraseEvent&) >m_sig0nErase ;
[0030]m_sig0nPaint信号对应绘制事件,当有绘制事件发生时,发送这个信号。
[0031]m_sig0nErase信号对应擦除背景事件,当有擦除背景事件发生时,发送这个信号。
[0032]在这个事件挂载表类中,采用绘制事件处理函数和擦除背景事件处理函数来分别处理绘制消息和擦除背景消息事件。这两个事件处理函数主要作用是进行信号转发:在绘制事件处理函数中发送绘制信号,在擦除背景事件处理函数中发送擦除背景信号。对于发送绘制信号,第一个参数传递事件挂载表类的成员变量m_pWindoW,第二个参数绘制事件的参数;对于发送擦除背景信号,第一个参数也是传递事件挂载表类的成员变量m_pWindoW,第二参数是擦除背景事件的参数。
[0033]利用上述事件挂载表类实现组件自定义的实现步骤如下:
[0034](I)在窗口中放置一个需自定义绘制的组件,如wxPanel*m_panelCustom。如果没有采用界面编辑软件来创建这个组件,还需要新建一个具体的组件实例;
[0035](2)在窗口所在类中实现两个槽函数(绘制槽函数与擦除背景槽函数),与事件挂载表类中的信号相对应(可以只实现一个槽函数,但后面只能连接一个信号和槽),真正的绘制代码就放在槽函数里面。如下定义:
[0036]void OnPaneICustomPaintHandler(wxffindow*pffindow, wxPaintEvent&event);
[0037]void OnPaneICustomEraseHandler(wxffindow*pffindow, wxEraseEvent&event);
[0038]由于槽函数的参数里有自定义绘制组件的指针和事件,所以可以根据程序的实际需要做图形绘制。比如在绘制槽函数里把自定义绘制组件的指针传给WxBufferedPaintDC的构造函数来创建一个DC,用wxBufferedPaintDC::DrawRectangle绘制一个矩形图形。
[0039](3)在窗口初始化的时候,挂接事件表对象(CustomPaintHandler的实例),重点是初始化两个信号。初始化包括:
[0040]用自定义绘制组件指针作为构造函数的参数,创建一个挂接事件表对像实例。
[0041]把挂接事件表对像实例的绘制信号连接到(2)中的绘制槽函数(如果定义了绘制槽函数)。
[0042]把挂接事件表对像实例的擦除背景信号连接到(2)中的擦除背景槽函数(如果定义了擦除背景槽函数)。
[0043]最后我们把这个事件表压入在自定义绘制组件的事件表栈中,这样当自定义绘制组件产生绘制事件和擦除背景事件时,就会进入到挂接事件表中这两个事件的处理函数中,再经过信号转发后进入槽函数,也就是真正的绘制函数,完成自定义绘制。
[0044](4)在窗口销毁的时候,自定义绘制组件弹出已挂载的事件表。
[0045]当自定义绘制组件弹出事件表后,自定义绘制就不再起作用了。
[0046]相比现有技术,本发明的技术方案的优势体现在:
[0047]1、在处理自定义组件绘制的时候,不再需要单独继承基础组件或继承事件表类;
[0048]2、把多步骤的组件的自定义绘制实现简化为一两个实际绘制函数(即绘制槽函数和擦除槽函数,可以根据需要只实现一种,当然那样的话,只也能连接相对应的一个信号)。
[0049]3、在大规模的组件自绘制程序中,明显减少程序的代码长度,提高程序的编译速度和运行速度。
【权利要求】
1.wxffidgets框架下大规模组件自绘制的快速处理方法,其特征在于,包括: 定义事件挂载表类,在所述事件挂载表类的成员变量中保存自绘制组件对象的指针,事件挂载表类对象在接收到自绘制的事件时通过相应事件处理函数将自绘制组件对象的指针和接收到的事件转发给对应的图形绘制槽函数,从而实现组件的自定义绘制。
2.如权利要求1所述的wxWidgets框架下大规模组件自绘制的快速处理方法,其特征在于,所述自绘制事件包括:绘制事件和擦除背景事件;所述相应事件处理函数包括:绘制事件处理函数和擦除背景事件处理函数;所述对应的图形绘制槽函数包括:绘制槽函数和擦除背景槽函数。
3.如权利要求2所述的wxWidgets框架下大规模组件自绘制的快速处理方法,其特征在于,所述事件挂载表类中有三个成员变量,其中一个成员变量保存自绘制组件对象的指针,另外两个成员变量分别为绘制信号和擦除背景信号。
4.如权利要求3所述的wxWidgets框架下大规模组件自绘制的快速处理方法,其特征在于,所述绘制事件处理函数用于将绘制事件、自绘制组件对象的指针添加到绘制信号中,并将该绘制信号转发给绘制槽函数;所述擦除背景事件处理函数用于将擦除背景事件、自绘制组件对象的指针添加到擦除背景信号中,并将该擦除背景信号转发给擦除背景槽函数。
5.如权利要求4所述的wxWidgets框架下大规模组件自绘制的快速处理方法,其特征在于,该方法还包括: 在窗口初始化时,挂接事件表对象,初始化绘制信号和擦除背景信号,所述事件表对象为所述事件挂载表类中的对象实例。
6.如权利要求5所述的wxWidgets框架下大规模组件自绘制的快速处理方法,其特征在于,挂接事件表对象,初始化绘制信号和擦除背景信号的具体方式为: 用自绘制组件的指针作为构造函数的参数,创建一个事件挂载表类实例对象; 将该实例对象的绘制信号连接到绘制槽函数; 将该实例对象的擦除背景信号连接到擦除背景槽函数; 将该实例对象压入自定义绘制组件的事件表栈中。
7.如权利要求6所述的wxWidgets框架下大规模组件自绘制的快速处理方法,其特征在于,该方法还包括: 在窗口销毁的时候,自绘制组件对象弹出已挂接的事件表。
【文档编号】G06F9/44GK103544018SQ201310529590
【公开日】2014年1月29日 申请日期:2013年10月31日 优先权日:2013年10月31日
【发明者】刘贵华, 范海鹏, 文均波 申请人:成都飞鱼星科技开发有限公司