部分描画実装中
Graphicsに対する描画の際にRectangleを自動的に記録するというのは止めました。
プログラマが明示的に repaint(x, y , w, h)を呼べるように libbayguiを変更中です。
具体的にプログラマは以下のように repaint(x, y, w, h)を呼ぶことで明示的に部分描画を行えます。
#include <baygui.h>
class Canvas : public Component
{
public:
Canvas();
virtual ~Canvas() {};
virtual void paint(Graphics* g);
virtual void drawSomething();
private:
int count;
};
Canvas::Canvas() : count(0)
{
}
void Canvas::paint(Graphics* g)
{
g->setColor(Color::black);
g->drawRect(0, 0, getWidth(), getHeight());
g->setColor(Color::white);
g->fillRect(10, 10, 30, 30);
g->setColor(Color::green);
g->drawString("start", 15, 15);
}
void Canvas::drawSomething()
{
count++;
Graphics* g = getGraphics();
g->setColor(Color::white);
g->fillRect(10, 10, 30, 30);
g->setColor(Color::green);
char buf[32];
sprintf(buf, "%d", count);
g->drawString(buf, 15, 15);
repaint(10, 10, 30, 30);
}
class GTest : public Frame
{
private:
Canvas* canvas;
public:
GTest()
{
setBounds(200, 200, 400, 300);
setTitle("Repaint Test");
canvas = new Canvas();
canvas->setBounds(100, 100, 100, 100);
add(canvas);
}
~GTest()
{
delete canvas;
}
void paint(Graphics* g)
{
}
void processEvent(Event *event)
{
if(event->getType() == KeyEvent::KEY_PRESSED)
{
canvas->drawSomething();
}
}
};
int MonaMain(List<char*>* pekoe)
{
GTest *test = new GTest();
test->run();
delete(test);
return 0;
}
このアプリケーションではキー押下によって部分再描画し数字がカウントアップされます。
以前のBayGUIであれば、全体描画を伴いもっさりとした描画となっていましたが、部分描画により素早くカウントアップされます。
課題は、初期表示がうまくいかないこと。
いろいろいじっていて思ったのですがTinoさんが指摘されていた通り、ライブラリ中で絶対・相対座標がごっちゃになる事があるので、仮引数名などを工夫して分かりやすくすれば良いかもしれません。
