This application is adapted to
viewing text files, it can carry out also creation of new files and editing of
existing files. It allows the user to enter the name of a created or opened
file. The user can scroll the text in a multi-line text component then there
are seen other areas of the text. It is possible to enter the new text, to erase
the old text, to save the created text in a file.
1. ShapeBoxT - The
three-dimensional shape for the multi-line text
The three-dimensional shape for the
multi-line text is coded in a separate class. This class will be received from
ShapeBox and can be used as the basic 3D shape. Our class will be similar to a
parental window in application MDI, it - the container for the interface.
Therefore, applications become three-dimensional text editors, having
initialized this class to be its parent shape. Class has name ShapeBoxT and its
key characteristics are:
- Class ShapeBoxT allows the
application to become text editor. It realizes as the foreground of the text
editor. It means, that it carries out the interface.
- Class ShapeBoxT represents the
parental 3D shape which contains the interface for the text editor. It contains
separate 3D box and its general components, which are used to present the text
editor and to
execute its operations.
-
ShapeBoxT supports the text
editor through TextHyp member. This class has been developed earlier and used to
start the multi-line text.
-
ShapeBox has set of the general
components, which are used to present the application. It - labels, text fields,
and the user buttons which execute various operations.
using
System;
using
System. Collections;
using
System. Drawing;
using
Microsoft. DirectX;
using
D3D=Microsoft. DirectX.Direct3D;
namespace
Code9
{
public class
ShapeBoxT
{
private D3D.Device device;
private D3D.Mesh shMesh;
private D3D.Material shMaterial;
public
string str;
public Position pos;
public Position posc;
public Orientation orient;
public
Size size;
public Position pos4;
public Orientation orient4;
public
Size size4;
public
float scaleX;
public
bool InFocus;
public
string type;
public int
Alfa=15;
public Framer fram;
public Translator trans;
public ButtonSph3 bmenu1;
public MenuHypButton bhypmenu1;
public TextHyp OTH1;
public LineTextCyl LTC1;
public int
k=10;
public Chars CharList;
public Letters MeshList;
This shape contains the following
components:
- Translator trans - the derivative
component representing an opportunity of moving 3D shape, realization of the
general management 3D shape and demonstrations of application name.
- Framer fram - a derivative
component which gives an opportunity of change of the size of 3D shape.
-
MenuHypButton bhypmenu1 - the
three-dimensional push-button menu, realizes the basic functions of the text
editor.
-
TextHyp OTH1 - a multi-line text
field where the user enters the text.
-
LineTextCyl LTC1 - a separate
text line in which editing the text is carried out.
1.1 Creation of the text editor
shape
ShapeBoxT represents the
application of the text editor, the interface of the editor is included in it.
If the copy of this class is initialized, the constructor of a class initialize
its members of starting values. In this function, class ShapeBoxT, is created.
However, components of the interface, such as the menu and the multi-line text,
are created and initialized in method InitializeGpaphics which is developed
further. The following definition shows, as the constructor works.
public ShapeBoxT (D3D.Device device1,
string str1, string
tmp, Position pos1, Orientation orient1, Size
size1, string type1, AlfabitEn AlfE)
{
device = device1;
str=str1;
pos=pos1;
posc=pos;
orient=orient1;
size=size1;
type=type1;
InFocus=false;
scaleX=1.0f;
type = "Box";
Position pos11;
Orientation orient11;
pos11.x=pos.x-size.width/2.0f;
pos11.y=pos.y+size.height/2.0f;
pos11.z=pos.z-size.depth/2.0f+size.depth/2.0f;
Size size11;
size11.width=size.width;
int radius=1;
size11.height=4.0f*radius;
size11.depth=4.0f*radius;
float length=size.depth;
orient11=orient;
fram=new Framer (device, str +
"fram", pos11, orient11, size11, length,
radius);
Position pos2;
Orientation orient2;
Size size2;
pos2.x=pos.x+size.width/2.0f;
pos2.y=pos.y-size.height/2.0f;
pos2.z=pos.z;
orient2=orient;
radius=1;
size2.width=size.depth;
size2.height=4.0f*radius;
size2.depth=4.0f*radius;
length=size2.width;
trans=new Translator (device, str + "trans",
"Teditor", pos2, orient2, size2, length,
radius);
Position pos3;
Orientation orient3;
Size size3;
size3=size;
shMesh=D3D.Mesh. Box (device, size3.width, size3.height,
size3.depth);
shMesh = shMesh. Clone (D3D.MeshFlags. Managed,
D3D.VertexFormats. PositionNormal | D3D.VertexFormats. Diffuse, device);
D3D.CustomVertex. PositionNormalColored [] Dest =
(D3D.CustomVertex. PositionNormalColored []) shMesh.
LockVertexBuffer (typeof (D3D.CustomVertex.
PositionNormalColored), 0, shMesh. NumberVertices);
for (int x=0; x <(Dest. GetLength
(0)); x ++)
{
Dest [x] .Color = Color.
FromArgb (Alfa, 255, 0, 0) .ToArgb ();
}
shMesh. UnlockVertexBuffer ();
pos4=new Position ();
orient4=new Orientation ();
size4=new
Size ();
pos4.x=0.0f; pos4.y =-30.0f; pos4.z =-10.0f;
orient4.x=0.0f; orient4.y=1.0f; orient4.z=0.0f;
orient4.angle=0.75f;
size4.width=20.0f; size4.height=40.0f; size4.depth=20.0f;
OTH1 = new TextHyp (device, tmp, "HypText1",
pos4, orient4, size4, k, 1, AlfE);
}
1.2 Drawing the shape
Drawing of the shape is carried out
by special method Draw ().
Its contents is resulted further:
public void Draw (D3D.Device
device1, Position pos1, Orientation orient1, Size size1, string type1, float
buttlen)
{...}
1.3 Clearing
Clearing of resources is made by
method Dispose () and destructor.
2 Menus - Performance of functions
Till now, for realization of
actions three-dimensional buttons as rather independent components were used.
They have a little interactions with each other. Thus, if the user clicks by the
button - separate function is carried out. For realization of group of the
interconnected functions it is necessary to provide communication between
components so, that one component can cooperate with another. For this purpose
it is possible to use the three-dimensional push-button menu. Buttons allow us
to store pointers on carried out actions and to communicate between them. The
push-button menu has been developed earlier as class MenuHypButton. Certainly,
this class approaches for this case, but there is a problem: as buttons carry
out various functions, you should process clicks of the mouse differently in
different applications. For example, button Copy could copy the contents of the
buffer while other button Exit could finish the application. Use only
MenuHypButton does not allow you to do it. What it is necessary to make for this
purpose? Simply, you should add function - we shall tell My_Copy () - in Form1
and to cause it in the necessary event. The following sections describe each of
the derivative buttons developed for the menu of the text editor.
2.1 The general functions for
processing events of the menu
Work with the three-dimensional
push-button menu is carried out as follows:
- The choice of menu button in
Translator - activization of the menu is carried out;
- Navigation in 3D space for a
choice of the button connected with necessary function is carried out:
-
Click by the button of the mouse
on the active button is carried out.
For this purpose the following
functions are used:
public
void MenuItem_GetFocus (string
msg1, string msg2)
{...}
public void
MenuItem_LostFocus (string msg1,
string msg2)
{...}
public void
MenuItem_Click (string msg1,
string msg2)
{...}
2.2 MyCopy - The button of copying
The first button which will be
developed for the 3D menu - the button of copying. After pressing it handler of
event MyCopy should be coded to copy the text fragment
2.3 MyCut - The button to cut out
The second button which will be
developed for the 3D menu - the button to cut. After pressing it handler of
event MyCut should be coded to cut the text fragment
2.4 MyPaste - The button to insert
When the button to insert click,
are carried out the following action. The content of the text buffer is inserted
into the current position of the text cursor.
2.5 MyEnd - The button stop
Users who will press by the button
end - will finish work with the menu.
2.6 MyExit - The button of closing
The final button which will be
developed for the 3D menu - the button of closing. It is most simple of its
buttons. Everything, that it does, closing of the application, sending the exit
message.
3. TextHyp - The multi-line text
Fig.1 the Multi-line text
Having developed the
three-dimensional push-button menu it is possible to proceed to realization of
the multi-line text for the text editor. It is carried out in class TextHyp of
our application of the text editor. The declaration of a class is given below.
using
System;
using
System. Collections;
using
System. Drawing;
using
Microsoft. DirectX;
using
D3D = Microsoft. DirectX.Direct3D;
using
System. Windows. Forms;
namespace
Code9
{
public class
TextHyp: IEnumerable
{
private D3D.Device device;
private D3D.Mesh meTex =
null;
private TexCursor1 curr1;
public int
CursorPos = 0;
public Position pos;
public
Orientation orient;
public
Size size;
public
float diag;
public
float d2;
public
float d4;
public
string str;
public
string tex;
public int
LengthTex;
private
float angle=0.0f;
private
float x;
private
float y;
private
float z;
public Chars CharList;
public Chars BeginBuffer;
public Chars EndBuffer;
public LineTextCyl LT1;
public Letters MeshList;
public int
k;
public int
m;
public int
mk;
public int
ln;
public int
[] llt;
public int
[] mlt;
public Scroller s;
public
bool InFocus;
public
bool OnPressed;
public
bool OnChange;
public
string StatStr;
public
Size SLetter;
public Components
NentsTexIns;
3.1 TextHyp - The constructor of a
class
For creation of object of the given
class the following constructor is used:
public TextHyp (D3D.Device device1 ,
string str1, string
tex1,
Position pos1, Orientation
orient1, Size size1,
int k1, int m1,
AlfabitEn AlfE)
{...}
3.2 TextHyp - Drawing
For drawing object of the given
class the following method is used:
public
void Draw (D3D.Device device, Position pos,
Orientation orient,
Size size,
int k, float blength, Chars
CharList, Letters MeshList)
{...}
3.3 TextHyp - clearing
At last, multi-line text should be
unloaded, as soon as you have stopped to use it.
4. Example of the program - Teditor
1.5
Having finished development of
auxiliary classes it is possible to include them in the typical application. In
other words, applications can become text editors, only after addition of the
given classes. Except for that it loads all components which are required - such
as labels, buttons, etc. The Declaration of a class is resulted further:
using
System;
using
System. IO;
using
System. Drawing;
using
System. Collections;
using
System. ComponentModel;
using
System. Windows. Forms;
using
System. Data;
using
Microsoft. DirectX;
using
D3D=Microsoft. DirectX.Direct3D;
using
Microsoft. DirectX.DirectInput;
namespace
Code9 // Teditor
{
public struct
Position
{ public
float x;
public
float y;
public
float z;}
public struct
Size
{
public
float width;
public
float height;
public
float depth;
}
public struct
Orientation
{
public float x;
public
float y;
public
float z;
public
float angle;
}
public class
Form1: System. Windows. Forms.
Form
{
*if (! USE_THREADS)
private
bool running = true;
*endif
pr<
ivate D3D.Device device=null;
private
Device deviceM=null;
private Device deviceK=null;
private D3D.Mesh mesh1=null;
private ShapeBoxT shape1;
public
string type;
private Shapes shapes1;
private Components components1;
public LineTextCyl LTC1;
public int
LengTex;
public int
k=10;
public int
l;
public int
m=0;
public AlfabitEn AlfE;
public AlfabitRu AlfR;
public int
ia=0;
public
float buttlen=0.0f;
public Chars CharList;
public Letters MeshList;
public Arrow arr1;
public
float Nz, Nx, Ny, Mz, My, Mx;
public
float sX;
public
float sY;
public
float sZ;
public
float Xold=0.0f;
public
float Yold=0.0f;
public
float Zold=0.0f;
public
float sXold;
public
float sYold;
public
float sZold;
public
bool drag=false;
public
float scale1;
string msg;
public
Position dpos;
public
Size dsize;
private
float angle=0.0f;
private
float x1=2.0f;
private
float y1=2.0f;
private
float z1=2.0f;
private
float x2=2.0f;
private
float y2=2.0f;
private
float z2=2.0f;
private
Position pos1;
private
Size size1;
private
Orientation orient1;
private
Position pos2;
private
Orientation orient2;
private
Size size2;
private
string type1;
public MenuHypButton MHB1;
public MenuLevel ML1;
public Chars TexBuffer;
public int
beginTexBuffer=0;
public int
lengthTexBuffer=0;
public
bool ins=false;
string msg1 =
"";
string msg2 =
" ";
private System. Windows. Forms.
MainMenu mainMenu1;
private System. Windows. Forms.
MenuItem menuItem1;
...
private
System. ComponentModel. Container components =
null;
4.1 Application Teditor - the
constructor
The constructor of the given class
looks so:
public
Form1 ()
{
InitializeComponent ();
TexBuffer=new Chars ();
this. SetStyle (ControlStyles. AllPaintingInWmPaint|ControlStyles.
Opaque, true);
this. KeyDown + = new
KeyEventHandler (OnKeyDown);
this. MouseUp + = new
MouseEventHandler (OnMouseUp);
this. MouseDown + = new
MouseEventHandler (OnMouseDown);
}
4.2. Loading components
The interface for our program of
the text editor will consist of several components. They contain in the form and
include the three-dimensional shape, the three-dimensional menu, the multi-line
text. They allow the user to open a file, to create a new file, to carry out
editing the text, to save a file. Components are loaded in groups by separate
methods - ShapeBoxT (), MenuHypButton (), Arrow (device). These methods causes
InitializeGraphics () method, which is used to load in the text editor a full
set of components and to establish width, height and depth of the form.
4.3 Drawing the text editor
Drawing of the text editor is made
in method OnPaint ().
protected
override void
OnPaint (System. Windows. Forms. PaintEventArgs e)
{...}
5. Usability of application
During using of application Teditor
v. 1.0 there is big difficulties for navigation and a choice of virtual objects
in three-dimensional space with the help of the mouse. For overcoming this
difficulties has been solved to apply gamepad to management of the pointer as
the device adequate 3D space. Thus the first joystick is used for moving on axes
X and Y, and the second joystick for moving on axis Z. Also are used the first
and second button of gamepad. If at your system there is gamepad execute
Option-Joystick command for its activation and further carry out navigation and
a choice with its help. In this case navigation and a choice does not have
essential difficulties as in case of the mouse. For return to using of the
mouse execute Option-Mouse command.
The conclusion
In this article it is submitted the
program which uses results of all this work. See Building Isometric
Application article on www.c-sharpcorner.com. The application of the text
editor, however, can be advanced. Now, it does not support search and
replacement of text fragments. This elements can be added.