wxwidgets绘图

来源:互联网 发布:固定区域放大镜软件 编辑:程序博客网 时间:2024/06/07 00:23

图片文件显示

以下,绘图相关函数:

加载位图

    wxBitmap bitmap("test.bmp",wxBITMAP_TYPE_BMP);    if(!bitmap.IsOk())    {        wxMessageBox("狗日的图片读不出来");    }

当然

当然还有其他的加载方式,比较特殊的是xpm文件,它以c代码保存,可以用include直接包含进文件。

选择文件:

    wxMemoryDC temp_dc;    temp_dc.SelectObject(bitmap);

可用的设备上下文:


窗口类一般会收到两种类型的绘画事件:wxPaintEvent事件用来绘制窗口客户区的主要图形而wxEraseEvent事件则用来通知应用程序擦除背景。


而如果你打算绘制一个长时间存在的不会被重绘事件和擦除背景事件所擦除的东西(就叫东西好了。。。),你可以定义一个OnPaint函数,并且与wxPaintEvent通过事件表关联,在《使用wxwidgets进行跨平台开发》一书中说如果你定了窗重画事件处理函数,那么在这里面你必须创建一个wxPaintDC,就算你根本不用它。。。但是我试过直接用clientDC绘图,貌似没什么区别。。书上解释说产生的这个对象将告诉窗口体系需要重画区域已经被重画,这样窗口系统就不会重复发送消息给这个窗口了。也不知新版还有没有这个特性,书的版本可能适合老版本wxwi,因为有些类都已经弃置不用了。。。不过wxwiki也有:

  • If you do catch the paint event, you must create a wx[Buffered]PaintDC in it, even if you don't use it. If a wx[Buffered]PaintDC object isn't created, the event isn't correctly handled which can cause weird behavior.

另外wxWindow::GetUpdateRegion()可以获得需要重画区域,wxWindow::IsExposed()函数可以用来判断某个点或者某个矩形是否需要被重画。然后优化代码使得只有这个区域的内容被重画。重画事件还可以通过调用wxWindow::Refresh和wxWindow::RefreshRect函数手动产生。这两个函数可能不会立即响应,可以调用后用wxWindow::Update。

如果你不想使用EVT_PAINT()这个事件宏可以用wxClientDC来绘图。

说起wxClientDC,一把辛酸泪,用了两三天都没搞好,今天终于搞明白之前为什么显示不出来了。。之前用wxPaintEvent事件试过,可以显示,然后wxEraseEvent事件也可以,鼠标拖拽画图也行,但是我直接在窗口构建函数里显示就是没东西了,今天我突然想起来是不是构建函数构建完之后wxClientDC无效了,然后直接在MyApp::OnInit()里实现。。。竟然真的显示了。。高兴!!wahahahaha去整合到之前写的上位机中去了

wxMemoryDC

可以在位图上作图。

在单色位图上绘图时, 使用 wxWHITEwxWHITE_PEN 和 wxWHITE_BRUSH 将绘制背景色,所有其他颜色都会绘制前景色。

想使用这个位图干任何事都必须先用wxmemorydc选择图片,(原文:A bitmap must be selected into the new memory DC before it may be used for anything. )但是我加载完位图后直接drawbitmap还是可以显示,所以这句话应该是相对图片进行改动必须调用吧。。

记住用这个类修改位图并使用 wxDC::Blit()将位图拷贝到屏幕或对其进行别的操作之前,要先释放掉位图,不然显示操作无效。
释放有两种方法:

1.temp_dc.SelectObject(wxNullBitmap);

2.完全销毁设备上下文。。也就是创建的wxMemoryDC的实例

超出作用域这个类会自动释放位图。
成员函数:
void SelectObject (wxBitmap &bitmap)直接修改,而
void SelectObjectAsSource (const wxBitmap &bitmap)If the argument is wxNullBitmap (or some other uninitialised wxBitmap) the current bitmap is selected out of the device context, and the original bitmap restored, allowing the current bitmap to be destroyed safely.所以比较安全
绘图实例:
    wxPaintDC* adc=new wxPaintDC(this);    wxDC* clientDC=adc;    wxSize sz(100,100);    wxPen pen(*wxRED,1);    clientDC->SetPen(pen);    clientDC->DrawRectangle(wxPoint(0,0),sz);


原始像素显示

wxwidgets是默认24bit的三色RGB位图,我要显示的是灰度图,也就是深度为8的单通道图像,但是wxwi好像并不能直接把这种原始灰度数据转为图像,目前我是没有发现,谷歌了一下,论坛之类的也没找到方法,所以只能屈服了,我当时甚至为了搞这个专门去编译了opencv库拿过来用,后来发现跟那个笨办法是一样的。。。好吧,说笨办法,就是把原始数据拷贝三份,就是RGB三个通道的数据全部是灰度值,若原始数据ABC....,那么处理后的数据为AAABBBCCC...这样。然后用WxImage的一个构造函数就可以生成图像进而显示了。
需要注意的是最后用于WxImage构造函数的原始数据存储数组要是无符号字符型,不然会全黑的。。。
1 0
原创粉丝点击