这是wxWidgets论坛的中文版本。在这里,您可以用您的母语汉语讨论上面任一子论坛所涉及的所有关于wxWidgets的话题。欢迎大家参与到对有价值的帖子的中英互译工作中来!
guyanqiu
Knows some wx things
Posts: 25 Joined: Sun Jun 13, 2010 2:44 pm
Post
by guyanqiu » Fri Aug 26, 2011 9:04 am
类似通讯录,就是一个姓名,对应一个照片。
因为照片有大有小,所以我用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
Posts: 3 Joined: Sun Jul 03, 2011 1:27 pm
Post
by dbian » Tue Aug 30, 2011 1:25 pm
Code: Select all
window->SetBackgroundColour(wxColour(*wxWHITE));
这一行注释掉试试,他可能会重绘
guyanqiu
Knows some wx things
Posts: 25 Joined: Sun Jun 13, 2010 2:44 pm
Post
by guyanqiu » Wed Aug 31, 2011 12:26 am
我试了,还是不会重绘。窗口拖到屏幕边缘时,照片还是会被擦掉。
samsam598
Super wx Problem Solver
Posts: 340 Joined: Mon Oct 06, 2008 12:55 pm
Post
by samsam598 » Wed Aug 31, 2011 1:08 am
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
Posts: 25 Joined: Sun Jun 13, 2010 2:44 pm
Post
by guyanqiu » Wed Aug 31, 2011 5:40 am
我测试了一下,也不可以,擦除背景函数如果为空,界面会显示一些界面窗口后面的窗口里的内容,而且照片在窗口拖到屏幕边缘时,也还是会被擦掉。
samsam598
Super wx Problem Solver
Posts: 340 Joined: Mon Oct 06, 2008 12:55 pm
Post
by samsam598 » Wed Aug 31, 2011 6:38 am
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
Posts: 25 Joined: Sun Jun 13, 2010 2:44 pm
Post
by guyanqiu » Fri Sep 02, 2011 3:44 am
samsam598 wrote: guyanqiu wrote:
但仍然能显示大小不同的图片,小于控件的照片直接显示,大于控件范围的照片按比例缩小显示。
不明白为何不用wxStaticBitmap+wxSizer,俺曾用该方案做过测试,可以满足要求。
显示图片的区域是固定不变的,窗口没有标题栏,也不能拉伸。
使用wxStaticBitmap显示图片大小不一样时,这个控件的大小会变,就不符合我的要求了。
通讯录的照片大小都不一样,所以,我就没有使用wxStaticBitmap控件。如果显示同样大小的图片,用这个控件还算可以,但是也会发生拖动到屏幕边缘时,显示的图片会被擦掉,被其他窗口覆盖的话,移开其他窗口也会被擦掉。
baozixishi
In need of some credit
Posts: 1 Joined: Sun Sep 04, 2011 8:58 am
Post
by baozixishi » Sun Sep 04, 2011 9:02 am
楼主:请问你的这个闪烁问题有解决吗?我也遇到同样的问题,就是鼠标在移动的过程中,需要刷新,但是一刷新
就会出现闪烁的问题。
guyanqiu
Knows some wx things
Posts: 25 Joined: Sun Jun 13, 2010 2:44 pm
Post
by guyanqiu » Mon Sep 05, 2011 12:06 am
baozixishi wrote: 楼主:请问你的这个闪烁问题有解决吗?我也遇到同样的问题,就是鼠标在移动的过程中,需要刷新,但是一刷新
就会出现闪烁的问题。
昨天刚刚解决了,在外部把图片处理好,转化成wxBitmap,然后,在UpdateUI事件中,绘制图片
具体可以参考这个
http://wiki.wxwidgets.org/An_image_panel
关键是,只在UpdateUI事件中调用DrawBitmap方法,这样就不闪烁了。
我之前闪烁,是因为在UpdateUI事件中,同时处理了图片。