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











SourceForge.net Logo

DragAndDrop2

 

Low-level drag and drop operation, late rendering using GetSelectionData

 

 

main.cpp

 

#include <CtrlLib/CtrlLib.h>

 

using namespace Upp;

 

struct MyAppData {

    String text;

    Color  color;

};

 

struct MyApp : TopWindow {

    Point     pos;

    MyAppData data;

    Point     dragpos;

    

    virtual void CancelMode();

    virtual void Paint(Draw& w);

    virtual void DragAndDrop(Point p, PasteClip& clip);

    virtual void DragLeave();

    virtual void LeftDrag(Point p, dword keyflags);

    virtual String GetSelectionData(const String& fmt) const;

 

    MyApp();

};

 

void MyApp::CancelMode()

{

    dragpos = Null;

    Refresh();

}

 

void MyApp::DragAndDrop(Point p, PasteClip& clip)

{

    if(clip.Accept("MyAppData")) {

        String bin = clip;

        if(bin.GetLength() > sizeof(Color)) { // prudent check

            pos = p;

            memcpy(&data.color, ~bin, sizeof(Color));

            data.text = bin.Mid(sizeof(Color));

        }

        Refresh();

    }

    if(AcceptText(clip)) {

        pos = p;

        data.text = GetString(clip);

    }

    dragpos = clip.IsAccepted() ? p : Null;

    Refresh();

}

 

void MyApp::DragLeave()

{

    dragpos = Null;

    Refresh();

}

 

String MyApp::GetSelectionData(const String& fmt) const

{

    if(fmt == "MyAppData") {

        String bin;

        bin.Cat((byte *)&data.color, sizeof(data.color));

        bin.Cat(data.text);

        return bin;

    }

    return GetTextClip(data.text, fmt);

}

 

void MyApp::LeftDrag(Point p, dword keyflags)

{

    Size sz(128, 64);

    ImageDraw iw(sz);

    iw.DrawRect(sz, Black());

    iw.Alpha().DrawRect(sz, Black());

    iw.Alpha().DrawText(0, 0, data.text, Courier(14), White());

    DoDragAndDrop(String("MyAppData;") + ClipFmtsText(), iw);

}

 

void MyApp::Paint(Draw& w)

{

    w.DrawRect(GetSize(), SColorPaper());

    w.DrawText(pos.x, pos.y, data.text, StdFont(), data.color);

    if(!IsNull(dragpos))

        w.DrawRect(RectC(dragpos.x - 1, dragpos.y - 1, 3, 3), LtBlue);

}

 

MyApp::MyApp()

{

    data.text = FormatIntRoman(Random(2000));

    data.color = Color(Random() & 127, Random() & 127, Random() & 127);

    pos = Point(10, 10);

    SetRect(0, 0, 500, 100);

    dragpos = Null;

}

 

GUI_APP_MAIN

{

    MyApp().Run();

}

 

 

 

 

Do you want to contribute?