wxDC上DrawBitmap,怎么保持刷新而不闪烁 Topic is solved

这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
Post Reply
guyanqiu
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Jun 13, 2010 2:44 pm

wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by guyanqiu »

类似通讯录,就是一个姓名,对应一个照片。
因为照片有大有小,所以我用wxPanel来显示图片:

Code: Select all

/*
 *显示用户照片 
 */
void TestFrm::DrawImageToWindow(wxImage* image,wxWindow* window)
{
    wxClientDC dc(window);
    dc.SetBackground(*wxWHITE_BRUSH); 
    dc.Clear(); 
    
    wxCoord wdwidth,wdheight;
    dc.GetSize(&wdwidth,&wdheight);
    
    int oldwidth = image->GetWidth(); 
    int oldheight = image->GetHeight();
    float widthscale = ((float)wdwidth)/((float)oldwidth );
    float heightscale = ((float)wdheight)/((float)oldheight );
    float fixedscale = (widthscale < heightscale)? widthscale : heightscale ;
    if(fixedscale > 1.0) {fixedscale = 1.0;}
    int newwidth = (int)(oldwidth * fixedscale);
    int newheight = (int)(oldheight * fixedscale);
    image->Rescale(newwidth,newheight);
    
    wxBitmap bitmap(*image); 
    wxCoord posX = (wdwidth - newwidth)/2;
    wxCoord posY = (wdheight - newheight)/2;
    
    dc.DrawBitmap(bitmap,posX,posY);
    window->SetBackgroundColour(wxColour(*wxWHITE));
}
这样显示很正常,但是,当把窗口拖到屏幕边缘时,显示的照片就会被擦掉;或者拖动别的程序的窗口,也能把照片擦掉。
我想知道怎么可以把照片一直显示,不会被擦掉。
我在OnPaint事件里重新绘制,但是,照片会闪烁。在OnUpateUI事件里,也会闪烁。
各位,有没有好办法能不闪烁,但仍然能显示大小不同的图片,小于控件的照片直接显示,大于控件范围的照片按比例缩小显示。
dbian
In need of some credit
In need of some credit
Posts: 3
Joined: Sun Jul 03, 2011 1:27 pm

Re: wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by dbian »

Code: Select all

window->SetBackgroundColour(wxColour(*wxWHITE));
这一行注释掉试试,他可能会重绘
guyanqiu
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Jun 13, 2010 2:44 pm

Re: wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by guyanqiu »

我试了,还是不会重绘。窗口拖到屏幕边缘时,照片还是会被擦掉。
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by samsam598 »

guyanqiu wrote:类似通讯录,就是一个姓名,对应一个照片。
因为照片有大有小,所以我用wxPanel来显示图片:
我在OnPaint事件里重新绘制,但是,照片会闪烁。在OnUpateUI事件里,也会闪烁。
各位,有没有好办法能不闪烁,但仍然能显示大小不同的图片,小于控件的照片直接显示,大于控件范围的照片按比例缩小显示。
重载OnEraseBackground(wxEraseEvent& event)内容为空,试试看。

Code: Select all

void MyForm::OnEraseBackground(wxEraseEvent& event)
{
    //intentionally leave blank to avoid flicking
}
Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
guyanqiu
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Jun 13, 2010 2:44 pm

Re: wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by guyanqiu »

我测试了一下,也不可以,擦除背景函数如果为空,界面会显示一些界面窗口后面的窗口里的内容,而且照片在窗口拖到屏幕边缘时,也还是会被擦掉。
samsam598
Super wx Problem Solver
Super wx Problem Solver
Posts: 340
Joined: Mon Oct 06, 2008 12:55 pm

Re: wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by samsam598 »

guyanqiu wrote: 但仍然能显示大小不同的图片,小于控件的照片直接显示,大于控件范围的照片按比例缩小显示。
不明白为何不用wxStaticBitmap+wxSizer,俺曾用该方案做过测试,可以满足要求。
Regards,
Sam
-------------------------------------------------------------------
Windows 10 64bit
VS Community 2019
msys2-mingw13.2.0 C::B character set: UTF-8/GBK(Chinese)
wxWidgets 3.3/3.2.4 Unicode Mono Static gcc static build
guyanqiu
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Jun 13, 2010 2:44 pm

Re: wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by guyanqiu »

samsam598 wrote:
guyanqiu wrote: 但仍然能显示大小不同的图片,小于控件的照片直接显示,大于控件范围的照片按比例缩小显示。
不明白为何不用wxStaticBitmap+wxSizer,俺曾用该方案做过测试,可以满足要求。
显示图片的区域是固定不变的,窗口没有标题栏,也不能拉伸。
使用wxStaticBitmap显示图片大小不一样时,这个控件的大小会变,就不符合我的要求了。
通讯录的照片大小都不一样,所以,我就没有使用wxStaticBitmap控件。如果显示同样大小的图片,用这个控件还算可以,但是也会发生拖动到屏幕边缘时,显示的图片会被擦掉,被其他窗口覆盖的话,移开其他窗口也会被擦掉。
baozixishi
In need of some credit
In need of some credit
Posts: 1
Joined: Sun Sep 04, 2011 8:58 am

Re: wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by baozixishi »

楼主:请问你的这个闪烁问题有解决吗?我也遇到同样的问题,就是鼠标在移动的过程中,需要刷新,但是一刷新
就会出现闪烁的问题。
guyanqiu
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Jun 13, 2010 2:44 pm

Re: wxDC上DrawBitmap,怎么保持刷新而不闪烁

Post by guyanqiu »

baozixishi wrote:楼主:请问你的这个闪烁问题有解决吗?我也遇到同样的问题,就是鼠标在移动的过程中,需要刷新,但是一刷新
就会出现闪烁的问题。
昨天刚刚解决了,在外部把图片处理好,转化成wxBitmap,然后,在UpdateUI事件中,绘制图片
具体可以参考这个
http://wiki.wxwidgets.org/An_image_panel
关键是,只在UpdateUI事件中调用DrawBitmap方法,这样就不闪烁了。
我之前闪烁,是因为在UpdateUI事件中,同时处理了图片。
Post Reply