Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How to Manipulate and Record Objects in a Dialog with XML
Creating movable, re-sizable objects that are defined and displayed using data in an external file that will also record changes in those objects.

An XML file that contains information (size and position..x y cx cy) about rectangles (A B C D).
Rectangles "snap" to a grid that is 25x25.
Rectangles can only be sized in increments of 25.
Rectangles cannot overlap.
Rectangles contain editable text that will be displayed in the top left corner of the rectangle.
New rectangles can be created and defined.
Existing rectangles can be moved and edited.
Changes will be updated in XML file immediately (AutoSave)
A right click menu on rectangle with options to delete, copy, edit the rectangle. (on Edit menu selection Edit Dialog to define the x y cx cy and text of the rectangle will be called. Data in Edit Dialog updates data in XML file and rectangle displays changes immediatley.)

I'm pretty sure all this can be done. Just look at the Dialog Editor for QM. Pretty much what I am defining here.

I'll be working on this over the next couple days, any help or ideas would be totally rad! Especially a point to get started at.

Jimmy Vig
Gintaras...Example using something like DE_Grid and DE_Drag outside of the Dialog Editor?
Function Dialog69
Copy      Help
function# hDlg message wParam lParam
if(hDlg) goto messages

str controls = "3"
str e3
if(!ShowDialog("Dialog69" &Dialog69 &controls)) ret

;0 "" 0x90C80A44 0x100 0 0 223 135 "Dialog"
;1 Button 0x54030001 0x4 120 116 48 14 "OK"
;2 Button 0x54030000 0x4 170 116 48 14 "Cancel"
;3 Edit 0x54231044 0x200 4 30 96 48 ""
;4 Static 0x54000000 0x0 4 4 76 22 "Move with Shift[]Resize with Ctrl"
;DIALOG EDITOR: "" 0x2030001 "" "" ""

sel message
,case WM_COMMAND goto messages2
,case WM_SETCURSOR ;;use it to detect left button down. Don't use WM_LBUTTONDOWN because it is sent to the control, not to the dialog.
,sel lParam>>16 ;;mouse message
,,case WM_LBUTTONDOWN ;;left down
,,sel GetDlgCtrlID(wParam) ;;control id
,,,case 3 ;;edit control
,,,int m=GetMod
,,,sel m
,,,,case [1,2] ;;Shift or Ctrl
,,,,PostMessage hDlg WM_APP wParam m ;;don't use loop on WM_SETCURSOR. Do it async.
,,,,ret DT_Ret(hDlg 1)
,case WM_APP
,MoveSizeControlLoop hDlg wParam lParam 1
sel wParam
,case IDOK
ret 1

Function MoveSizeControlLoop
Copy      Help
function hDlg hctrl action mouseButton ;;action: 1 move, 2 resize.  mouseButton: 1 left, 2 right

MSG m; int mb;

RECT r; GetWindowRect hctrl &r
sel action
,case 1
,POINT po; xm po; po.x-r.left; ;;get mouse offset in control
,case 2
,mou r.right r.bottom ;;move mouse to right-bottom

int hcur=LoadCursor(0 +IDC_CROSS)

,if(GetCapture()!=hDlg || GetMessage(&m, 0, 0, 0)<=0) break
,if(m.message==WM_KEYDOWN && m.wParam==VK_ESCAPE) ReleaseCapture(); break

,,POINT p; xm p
,,sel action
,,,case 1
,,,ScreenToClient hDlg &p
,,,mov p.x-po.x p.y-po.y hctrl
,,,case 2
,,,siz p.x-r.left hctrl


Thanks a bunch...I really got the ball rolling with that bit you sent me Gentaras!

Here's what I worked out so far.

.qml   Objects in a Dialog with XML.qml (Size: 3.3 KB / Downloads: 452)

I am having troubles getting the position of the edit box to be relative to the dialog window. It always comes out a little off.

Also, what designates Ctr and Shift in the bit you sent? I can't seem to quite see I can't change it.

Thanks again for all your help,
Jimmy Vig
GetMod returns 1 for Shift, 2 for Ctrl.

in XML_Data_Position x y
x and y are mouse coordinates in hDlg. That is, you save mouse coordinates, not control coordinates. Control coordinates are retrieved by GetWinXY.
I also played with it a little.
Now supports multiple objects, Add, Delete, text.

Attached Files
.qml   Objects in a Dialog with XML.qml (Size: 4.65 KB / Downloads: 140)
Totally rad...this would make a good quick note board...

I like how you made the XML update when the mouse is released. I was going to work on that next...but you beat me to it Smile

Holy cow...looking at this thing more...I'm going to have to spend the next week breaking the code down. I'm sure I'll have a lot of small little for example, I have no clue what this is doing:
for(idctrl 100 1000000) if(!id(idctrl hwnd)) break

I am determined to figure it out!

Now I'm going to try to tackle the grid thing!

Thanks for all your help!
In my code, edit controls have different id, starting from 100: 100, 101, 102,...
The code finds the first id that is not assigned to an edit control.

Forum Jump:

Users browsing this thread: 1 Guest(s)