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

时间:2018-04-03 15:56:27

标签: c++ image file slider juce

我想使用此滑块输出的值来更改加载到img变量中的图像。每当移动滑块时都会调用paint函数。

滑块的值为0 - 2.当滑块为>时,第二个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);
}

为什么会这样?干杯

2 个答案:

答案 0 :(得分:1)

只是一个疯狂的猜测,但你不应该以某种方式强迫在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
  }
 }

这样重绘不会太慢减慢其他事件的速度。例如,如果我在车轮上使用变焦并且我渲染了很多东西,那么如果在每次更换车轮时重新绘制车轮,车轮会感觉很眩晕。这将仅使用计时器周期重新绘制,如果设置正确,该计时器应该没有问题。

需要这样处理的常见事件是缩放,鼠标移动/编辑和窗口/视图调整大小,因为它们可以每秒创建大量事件调用...

答案 1 :(得分:1)

正如@Spektre所猜测 - 在JUCE中,您的组件需要在知道必要时重新绘制它。在这种情况下:

void ModelGUI::sliderValueChanged(Slider* slider)
{
   rotate.getValue();
   DBG(rotate.getValue());
   repaint();
}

...将导致ModelGUI组件(及其所有子组件)在下一个合理的时间点重新绘制。

请参阅:https://docs.juce.com/master/classComponent.html#af3ab3eabec93dd60faf983370f3a1206