1 // main.cpp 2 3 #include <stdio.h> 4 5 #include "Application.h" 6 #include "Message.h" 7 #include "Button.h" 8 #include "View.h" 9 #include "Window.h" 10 11 enum { 12 MSG_RESET = 'rset' 13 }; 14 15 class TestView : public BView { 16 17 public: 18 TestView(BRect frame, const char* name, 19 uint32 resizeFlags, uint32 flags) 20 : BView(frame, name, resizeFlags, flags), 21 fTracking(false), 22 fLastMousePos(0.0, 0.0) 23 { 24 SetViewUIColor(B_PANEL_BACKGROUND_COLOR); 25 SetLowUIColor(ViewUIColor()); 26 } 27 28 virtual void MessageReceived(BMessage* message); 29 30 virtual void Draw(BRect updateRect); 31 32 virtual void MouseDown(BPoint where); 33 virtual void MouseUp(BPoint where); 34 virtual void MouseMoved(BPoint where, uint32 transit, 35 const BMessage* dragMessage); 36 37 private: 38 bool fTracking; 39 40 BPoint fLastMousePos; 41 }; 42 43 // MessageReceived 44 void 45 TestView::MessageReceived(BMessage* message) 46 { 47 if (message->what == MSG_RESET) 48 ScrollTo(0.0, 0.0); 49 else 50 BView::MessageReceived(message); 51 } 52 53 // Draw 54 void 55 TestView::Draw(BRect updateRect) 56 { 57 // ellipses 58 SetHighColor(200, 90, 0, 100); 59 StrokeEllipse(BPoint(80.0, 50.0), 70.0, 40.0); 60 61 SetDrawingMode(B_OP_ALPHA); 62 63 SetPenSize(2.0); 64 SetHighColor(20, 40, 180, 150); 65 StrokeEllipse(BPoint(230.0, 90.0), 14.0, 60.0); 66 67 SetPenSize(5.0); 68 SetHighColor(60, 20, 110, 100); 69 StrokeEllipse(BPoint(100.0, 180.0), 35.0, 25.0); 70 71 // text 72 SetHighColor(0, 0, 0, 255); 73 SetDrawingMode(B_OP_OVER); 74 const char* message = "Click and drag to scroll this view!"; 75 DrawString(message, BPoint(0.0, 30.0)); 76 } 77 78 // MouseDown 79 void 80 TestView::MouseDown(BPoint where) 81 { 82 fTracking = true; 83 fLastMousePos = where; 84 SetMouseEventMask(B_POINTER_EVENTS); 85 } 86 87 // MouseUp 88 void 89 TestView::MouseUp(BPoint where) 90 { 91 fTracking = false; 92 } 93 94 // MouseMoved 95 void 96 TestView::MouseMoved(BPoint where, uint32 transit, 97 const BMessage* dragMessage) 98 { 99 if (fTracking) { 100 BPoint offset = fLastMousePos - where; 101 ScrollBy(offset.x, offset.y); 102 fLastMousePos = where + offset; 103 } 104 } 105 106 107 108 // show_window 109 void 110 show_window(BRect frame, const char* name) 111 { 112 BWindow* window = new BWindow(frame, name, 113 B_TITLED_WINDOW, 114 B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE); 115 116 BView* view = new TestView(window->Bounds(), "test", B_FOLLOW_ALL, 117 B_WILL_DRAW/* | B_FULL_UPDATE_ON_RESIZE*/); 118 119 window->AddChild(view); 120 BRect b(0.0, 0.0, 60.0, 15.0); 121 b.OffsetTo(5.0, view->Bounds().bottom - (b.Height() + 15.0)); 122 BButton* control = new BButton(b, "button", "Reset", new BMessage(MSG_RESET)); 123 view->AddChild(control); 124 control->SetTarget(view); 125 126 window->Show(); 127 } 128 129 // main 130 int 131 main(int argc, char** argv) 132 { 133 BApplication* app = new BApplication("application/x.vnd-Haiku.Scrolling"); 134 135 BRect frame(50.0, 50.0, 300.0, 250.0); 136 show_window(frame, "Scrolling Test"); 137 138 app->Run(); 139 140 delete app; 141 return 0; 142 } 143