部分描画実装中
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さんが指摘されていた通り、ライブラリ中で絶対・相対座標がごっちゃになる事があるので、仮引数名などを工夫して分かりやすくすれば良いかもしれません。