/
ChildWinForm.prg
126 lines (93 loc) · 3.95 KB
/
ChildWinForm.prg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/// <summary>Special Subclass of ChildAppWindow to host a windows forms window in a VO GUI hierarchy</summary>
CLASS XSharp.ChildWinForm INHERIT ChildAppWindow
PRIVATE form AS System.Windows.Forms.Form
PRIVATE currentControl AS System.Windows.Forms.Control
/// <inheritdoc/>
CONSTRUCTOR(owner,managed)
SUPER(owner,managed)
/// <summary>Get/Set the form that needs to be hosted in the VO GUI hierarchy</summary>
PROPERTY WinForm AS System.Windows.Forms.Form
SET
form := value
// Set the Windows styles of the form so that it
// can be used as a child of the VO window
WindowStyle.SetStyle(SELF:form:Handle,WS_CHILDWINDOW,TRUE)
WindowStyle.SetStyle(SELF:form:Handle,WS_CAPTION,FALSE)
WindowStyle.SetStyle(SELF:form:Handle,WS_SYSMENU,FALSE)
WindowStyle.SetStyle(SELF:form:Handle,DS_MODALFRAME,FALSE)
WindowStyle.SetStyle(SELF:form:Handle,WS_THICKFRAME,FALSE)
WindowStyle.SetStyle(SELF:form:Handle,WS_MINIMIZEBOX,FALSE)
WindowStyle.SetStyle(SELF:form:Handle,WS_MAXIMIZEBOX,FALSE)
WindowStyle.SetExStyle(SELF:form:Handle,WS_EX_APPWINDOW,FALSE)
WindowStyle.SetExStyle(SELF:form:Handle,WS_EX_CONTROLPARENT,FALSE)
// Put the form into the VO window
SetParent(form:Handle,SELF:Handle())
form:Show()
SetWindowPos(form:Handle,HWND_TOP,0,0,0,0,_OR(SWP_NOACTIVATE,SWP_NOSIZE))
// Size the form to fit in the VO window
LOCAL oldOrigin AS Point
LOCAL oldSize AS Dimension
oldOrigin := SELF:origin
oldSize := SELF:size
SELF:size := Dimension{form:ClientSize:Width+SELF:size:width-SELF:canvasarea:width,form:ClientSize:Height+SELF:size:height-SELF:canvasarea:height}
SELF:Origin := Point{oldOrigin:x,oldOrigin:y+oldSize:height-SELF:size:Height}
form:Show()
SELF:form:Width := SELF:canvasarea:width
SELF:form:Height := SELF:canvasarea:Height
// The application has a list of forms that are being hosted
// Add this form to the list; it will be removed on close
LOCAL oApp AS OBJECT
oApp := GetAppObject()
IF oApp IS VOWinFormApp VAR winformApp
winformApp:RegisterWinForm(form)
ELSE
WarningBox{oApp,"The main app should be of type 'VOWinFormApp'"}:Show()
ENDIF
END SET
GET
RETURN form
END GET
END PROPERTY
/// <inheritdoc/>
METHOD Resize(o)
SUPER:Resize(o)
IF SELF:IsVisible() .AND. ! SELF:form == NULL
SELF:form:Width := SELF:canvasarea:width
SELF:form:Height := SELF:canvasarea:Height
ENDIF
RETURN NIL
/// <inheritdoc/>
METHOD Close(o)
LOCAL oApp AS VOWinFormApp
oApp := (VOWinFormApp)GetAppObject()
oApp:UnRegisterWinForm(form)
SELF:form:Close()
SUPER:Close(o)
RETURN NIL
/// <inheritdoc/>
METHOD Activate(o)
LOCAL u AS USUAL
u := SUPER:Activate(o)
SELF:ActivateWinForm()
RETURN u
PROTECT METHOD ActivateWinForm() STRICT
PostMessage(SELF:form:Handle,WM_SETFOCUS,0,0)
IF SELF:form:Controls:Count > 0
IF currentControl == NULL
currentControl := SELF:form:Controls[SELF:form:Controls:Count-1]
ENDIF
SELF:form:ActiveControl := currentControl
ENDIF
RETURN NIL
/// <inheritdoc/>
METHOD DeActivate(o)
LOCAL u AS USUAL
SELF:DeActivateWinForm()
u := SUPER:DeActivate(o)
RETURN u
PROTECT METHOD DeActivateWinForm() STRICT
IF SELF:form:Controls:Count > 0
currentControl := SELF:form:ActiveControl
ENDIF
RETURN NIL
END CLASS