#include 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); 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(); } void MyApp::LeftDrag(Point p, dword keyflags) { String bin; bin.Cat((byte *)&data.color, sizeof(data.color)); bin.Cat(data.text); VectorMap d; d.Add("MyAppData", bin); Append(d, data.text); 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(d, 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(); }