Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以用滑块更改屏幕上显示的图像吗?_C++_Image_File_Slider_Juce - Fatal编程技术网

C++ 我可以用滑块更改屏幕上显示的图像吗?

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

我想使用这个滑块输出的值来更改加载到img变量中的图像。只要移动滑块,就会调用paint函数

滑块的值为0-2。当滑块大于1时,第二个if语句测试为正确,但是图像不会更改。如果没有if语句,我可以手动切换图像,否则它就无法实现我的预期

 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组件(及其所有子组件)在下一个合理的时间点重新绘制

见: