Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
UppHub
Status & Roadmap
FAQ
Authors & License
Forums
Funding U++
Search on this site











SourceForge.net Logo

SourceForge.net Logo

GitHub Logo

Discord Logo

Scribble

 

Simple drawing application

 

 

 

 

Scribble.cpp

 

#include <CtrlLib/CtrlLib.h>

 

using namespace Upp;

 

#define LAYOUTFILE <Scribble/Scribble.lay>

#include <CtrlCore/lay.h>

 

class Scribble : public TopWindow {

public:

    virtual void   Paint(Draw& w);

    virtual void   MouseMove(Point p, dword keyflags);

    virtual void   LeftDown(Point p, dword keyflags);

    virtual void   Layout();

 

protected:

    Vector< Vector<Point> > image;

    Size       imagesize;

 

    MenuBar    menu;

    ScrollBars scroll;

 

    void    Scroll();

 

    void    SetupSize();

    void    Exit();

    void    About();

 

    void    FileBar(Bar& bar);

    void    EditBar(Bar& bar);

    void    AboutBar(Bar& bar);

    void    MainBar(Bar& bar);

 

public:

    typedef Scribble CLASSNAME;

 

    Scribble();

};

 

void Scribble::Paint(Draw& w)

{

    Size sz = GetSize();

    Point pos = scroll;

    w.Clip(0, 0, imagesize.cx, imagesize.cy);

    w.DrawRect(0, 0, imagesize.cx, imagesize.cy, White);

    for(int i = 0; i < image.GetCount(); i++) {

        const Vector<Point>& stroke = image[i];

        Point p1 = stroke[0] - pos;

        for(int j = 1; j < stroke.GetCount(); j++) {

            Point p2 = stroke[j] - pos;

            w.DrawLine(p1, p2);

            p1 = p2;

        }

        w.DrawRect(p1.x, p1.y, 1, 1, Black);

    }

    w.End();

 

    w.DrawRect(imagesize.cx - pos.x, 0, sz.cx - pos.x, sz.cy, SLtGray);

    w.DrawRect(0, imagesize.cy - pos.y, imagesize.cx - pos.x, sz.cy - pos.y, SLtGray);

    w.DrawRect(-pos.x, -pos.y + imagesize.cy, imagesize.cx, 1, SBlack);

    w.DrawRect(-pos.x + imagesize.cx, -pos.y, 1, imagesize.cy, SBlack);

}

 

void Scribble::MouseMove(Point p, dword keyflags)

{

    if(HasCapture()) {

        image.Top().Add() = scroll + p;

        Refresh();

    }

}

 

void Scribble::LeftDown(Point p, dword keyflags)

{

    image.Add().Add() = scroll + p;

    SetCapture();

    Refresh();

}

 

void Scribble::SetupSize()

{

    WithSizeLayout<TopWindow> dlg;

    CtrlLayoutOKCancel(dlg, "Drawing size");

    dlg.cx.Min(1);

    dlg.cy.Min(1);

    dlg.cx <<= imagesize.cx;

    dlg.cy <<= imagesize.cy;

    if(dlg.Run() != IDOK) return;

    imagesize = Size(~dlg.cx, ~dlg.cy);

    scroll.SetTotal(imagesize);

    Refresh();

}

 

void Scribble::Layout()

{

    scroll.SetPage(GetSize());

    scroll.SetTotal(imagesize);

}

 

void Scribble::Scroll()

{

    SetFocus();

    Refresh();

}

 

void Scribble::Exit()

{

    if(PromptOKCancel("Exit Scribble ?"))

        Close();

}

 

void Scribble::About()

{

    PromptOK("[6R/ Scribble3]&ULTIMATE`+`+ tutorial sample");

}

 

void Scribble::FileBar(Bar& bar)

{

    bar.Add("Exit", THISBACK(Exit));

}

 

void Scribble::EditBar(Bar& bar)

{

    bar.Add("Drawing size..", THISBACK(SetupSize));

}

 

void Scribble::AboutBar(Bar& bar)

{

    bar.Add("About..", THISBACK(About));

}

 

void Scribble::MainBar(Bar& bar)

{

    bar.Add("File", THISBACK(FileBar));

    bar.Add("Edit", THISBACK(EditBar));

    bar.Add("Help", THISBACK(AboutBar));

}

 

Scribble::Scribble()

{

    imagesize = Size(600, 400);

    Title("Scribble").Zoomable().Sizeable();

    AddFrame(menu);

    AddFrame(InsetFrame());

    AddFrame(scroll);

    menu.Set(THISBACK(MainBar));

    scroll.WhenScroll = THISBACK(Scroll);

    WhenClose = THISBACK(Exit);

    BackPaint();

}

 

GUI_APP_MAIN

{

    Scribble().Run();

}

 

 

 

Scribble.lay

 

LAYOUT(SizeLayout, 132, 88)

    ITEM(Label, dv___0, SetLabel(t_("Width")).LeftPosZ(8, 52).TopPosZ(8, 19))

    ITEM(EditIntSpin, cx, LeftPosZ(68, 55).TopPosZ(8, 19))

    ITEM(Label, dv___2, SetLabel(t_("Height")).LeftPosZ(8, 52).TopPosZ(28, 19))

    ITEM(EditIntSpin, cy, LeftPosZ(68, 55).TopPosZ(28, 19))

    ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(8, 56).TopPosZ(56, 24))

    ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(68, 56).TopPosZ(56, 24))

END_LAYOUT

 

 

 

 

 

Do you want to contribute?