C++ 我可以用滑块更改屏幕上显示的图像吗?
我想使用这个滑块输出的值来更改加载到img变量中的图像。只要移动滑块,就会调用paint函数 滑块的值为0-2。当滑块大于1时,第二个if语句测试为正确,但是图像不会更改。如果没有if语句,我可以手动切换图像,否则它就无法实现我的预期C++ 我可以用滑块更改屏幕上显示的图像吗?,c++,image,file,slider,juce,C++,Image,File,Slider,Juce,我想使用这个滑块输出的值来更改加载到img变量中的图像。只要移动滑块,就会调用paint函数 滑块的值为0-2。当滑块大于1时,第二个if语句测试为正确,但是图像不会更改。如果没有if语句,我可以手动切换图像,否则它就无法实现我的预期 void ModelGUI::sliderValueChanged(Slider* slider) { rotate.getValue(); DBG(rotate.getValue()); } void ModelGUI::paint (Graphic
void ModelGUI::sliderValueChanged(Slider* slider)
{
rotate.getValue();
DBG(rotate.getValue());
}
void ModelGUI::paint (Graphics& g)
{
DBG("PAINT");
g.setColour(Colours::red);
if(rotate.getValue() < 1)
{
img = ImageFileFormat::loadFrom(f);
}
if(rotate.getValue() > 1)
{
img = ImageFileFormat::loadFrom(f2);
}
g.drawImage(img, model);
g.drawEllipse(225, 230, 2, 2, 2);
g.drawEllipse(240, 240, 2, 2, 2);
g.drawEllipse(245, 275, 2, 2, 2);
}
void ModelGUI::sliderValueChanged(Slider*Slider)
{
rotate.getValue();
DBG(rotate.getValue());
}
void ModelGUI::paint(图形和g)
{
DBG(“涂料”);
g、 设置颜色(颜色:红色);
if(rotate.getValue()<1)
{
img=ImageFileFormat::loadFrom(f);
}
如果(rotate.getValue()>1)
{
img=ImageFileFormat::loadFrom(f2);
}
g、 drawImage(img,model);
g、 抽屉(225230,2,2,2,2);
g、 抽屉(240,240,2,2,2);
g、 抽屉(2452752,2,2,2);
}
为什么会这样?干杯只是一个猜测,但你不应该在
sliderValueChanged
事件中强制重新绘制吗?我不知道juce,但我希望其中一个:
g.Repaint();
g.Refresh();
g.Update();
因为更改滑块可能只是重新绘制滑块本身,而不是更新GUI的其余部分。g
应该是您的Graphics
对象
如果重新喷漆非常耗时,那么我通常会这样做:
bool _redraw=false; // some global variable (or local but accessible to your GUI/Form/Canvas whatever)
void any_event()
{
// here event stuff code
if (need_to_repaint) _redraw=true; // for example you change something hit a special key that changes something etc ...
}
void timer() // any timer with target max fps interval
{
if (_redraw())
{
_redraw=false;
// here force repaint or call the repaint directly
}
}
这样,重新绘制不会太慢其他事件。例如,如果我在轮子上使用“缩放”,并且我正在渲染很多东西,如果在轮子的每次更改上重新绘制,轮子可能会感到松弛。这将仅使用计时器周期重新绘制,如果设置正确,计时器周期应该可以
通常需要此类处理的事件有缩放、鼠标移动/编辑和窗口/视图调整,因为它们每秒可以创建大量事件调用…正如@Spektre所猜测的那样——实际上,组件需要在知道有必要时请求重绘。在这种情况下:
void ModelGUI::sliderValueChanged(Slider* slider)
{
rotate.getValue();
DBG(rotate.getValue());
repaint();
}
…将导致ModelGUI组件(及其所有子组件)在下一个合理的时间点重新绘制
见: