master chld/haikuprg / src / Bitdraw.cpp
  1#include <Application.h>
  2#include <Window.h>
  3#include <Bitmap.h>
  4
  5#include <vector>
  6
  7struct Bmp {
  8  BBitmap *b;
  9  BView *v;
 10  BPoint l;
 11  bool dr;
 12};
 13
 14class View:public BView
 15{
 16public:View(BRect f):
 17  BView(f, "Text", B_FOLLOW_ALL, B_WILL_DRAW){
 18
 19  /* bitmap shit */
 20  SetHighColor(0,0,0);
 21  bmp.b=new BBitmap(Bounds(), B_RGB32, true);
 22  bmp.v=new BView(Bounds(), "bmpView", B_FOLLOW_ALL, B_WILL_DRAW);
 23  bmp.b->AddChild(bmp.v);
 24  bmp.b->Lock();
 25
 26  z=20;
 27
 28  bmp.v->SetHighColor(255,255,255);
 29  bmp.v->FillRect(Bounds());
 30  bmp.v->SetHighColor(0,0,0);
 31
 32  bmp.v->SetPenSize(z);
 33  bmp.v->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN);
 34  bmp.b->Unlock();
 35  bmp.dr=false;
 36}
 37
 38  void AttachedToWindow()
 39  {
 40    MakeFocus(true);
 41  }
 42
 43  void Draw(BRect r)
 44  {
 45    bmp.b->Lock();
 46    bmp.v->Sync();
 47    bmp.b->Unlock();
 48    DrawBitmap(bmp.b, r, r);
 49  }
 50
 51  void MouseMoved(BPoint p, uint32 c, const BMessage *m)
 52  {
 53    if (!bmp.dr) return;
 54
 55    bmp.b->Lock();
 56    bmp.v->StrokeLine(bmp.l, p);
 57    bmp.v->Sync();
 58    bmp.b->Unlock();
 59
 60    Invalidate();
 61    bmp.l=p;
 62  }
 63
 64  void MouseDown(BPoint p)
 65  {
 66    bmp.dr=true;
 67    bmp.l=p;
 68  }
 69
 70  void MouseUp(BPoint p)
 71  {
 72    bmp.dr=false;
 73  }
 74
 75  void KeyDown(const char *c, int32 n)
 76  {
 77    bmp.b->Lock();
 78    switch (c[0])
 79      {
 80      case 'c':
 81	bmp.v->SetHighColor(255, 255, 255);
 82	bmp.v->FillRect(Bounds());
 83	bmp.v->SetHighColor(0, 0, 0);
 84	break;
 85      case 'e':
 86	er=!er;
 87	if (er){
 88	  bmp.v->SetHighColor(255, 255, 255);
 89	}else{
 90	  bmp.v->SetHighColor(0, 0, 0);
 91	}
 92	break;
 93      }
 94    bmp.b->Unlock();
 95    Invalidate();
 96  }
 97private:
 98  Bmp bmp;
 99  uint32 z;
100  bool er=false;
101  
102};
103
104class Win:public BWindow
105{
106public:Win(BRect f):
107  BWindow(f, "Bitdraw", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE)
108  {
109    View *view=new View(Bounds());
110    AddChild(view);
111  }
112};
113
114class App:public BApplication
115{
116public:App():BApplication("application/x-vnd.example.typist")
117  {
118    BRect rect(100,100,640,480);
119    Win *w = new Win(rect);
120    w->Show();
121  }
122};
123
124int main(void)
125{
126  App a;
127  a.Run();
128  return 0;
129}