Upload
alannah-perry
View
215
Download
0
Embed Size (px)
Citation preview
1
Scroll Bars
Providing Scrollbars
2
Objectives
You will be able to: Use Windows Graphics to display
tabular information on a Windows form.
Add graphics capability to objects. Provide scroll bars on a Windows
form.
3
Object Oriented Drawing and Printing
In an object oriented program, everything that appears on the screen should be the visual representation of an object.
Objects should know how to draw themselves. Printing is essentially the same.
4
Schedule Grid
Let’s modify the Schedule Viewer program to use Windows graphics instead of the DataGridView.
We will teach the Schedule_Record class how to draw itself.
5
Schedule Grid
In order for schedule entries to fit on one line with legible type, display only:
Course Number Section Course Title Days Time Building Room
6
Menu
Provide a File menu with commands: Open Print Exit
Use the common dialog for Open. Menu commands should be enabled
only when relevant. Enable Print only when there is something to print. Disable Open once a file is open.
7
Scroll Bars
Provide scroll bars to permit the user to view all of the schedule when it doesn’t fit in the window.
The scroll bars should not be visible if the schedule fits in the window.
8
Start with Schedule Viewer Example
Download the example http://www.cse.usf.edu/~turnerr/Software_Systems_Develo
pment/Downloads/2011_02_22_Schedule_Viewer_2/ File Schedule_Viewer.zip
Also the schedule data files schedule_2010_fall.csv schedule_2010_spring.csv schedule_2011_spring.csv
9
Getting Started
Be sure we have a known Starting Point
Expand and build the project. Verify that the program works.
10
Out with the old!
Delete the DataGridView.
Keep the menu strip and openFileDialog.
11
Stripped Down Project
12
Out with the old!
View the code for Form1.cs Delete all of the DataGridView code.
Lines 86 - 99 (Most of openToolSTripMenuItem_Click)
Lines 63 - 78 (Most of Form1 constructor )
Keep file and menu related functions
Build. Verify that project compiles.
13
In With the New!
Add some member variables to Form1
using System.Drawing;
...
public partial class Form1 : Form
{
List<Schedule_Record> Schedule;
// Graphics information
Font Font1 = new Font("Arial", 10);
Brush Brush1 = SystemBrushes.WindowText;
// Screen information
const int Top_Margin = 30;
const int Bottom_Margin = 30;
const int Left_Margin = 20;
14
Add Graphics
Add Output method to class Schedule_Record.
Initially make it a stub Just output “Schedule Entry”
public void Output(Graphics G, Font F, Brush B, Point P)
{
Pen pen = new Pen(Color.Black, 1);
G.DrawString("Schedule Entry", F, B, P);
}
Will need using System.Drawing;
15
Add a Paint Event Handler to Form1
private void Form1_Paint(object sender, PaintEventArgs e)
{
int y_pos = Top_Margin;
if ((Schedule == null) || (Schedule.Count == 0))
{
return;
}
for (int i = 0; i < Schedule.Count; i++)
{
Point P = new Point(Left_Margin, y_pos);
Schedule[i].Output(e.Graphics, Font1, Brush1, P);
y_pos += Font1.Height;
}
}
16
Open
private void openToolStripMenuItem_Click(object sender,
EventArgs e)
{
Import_Schedule();
this.Invalidate();
this.Update();
}
Build and run.
In Form1.cs
17
Program Running
18
Teaching the Schedule Record to Output Itself
A Schedule Record object should know how to draw itself on the screen or a printed page.
But it must be told: Where to draw itself. The drawing objects to use:
Graphics Font Brush
Download: http://www.cse.usf.edu/~turnerr/Software_Systems_Develop
ment/Downloads/2011_03_22_Scroll_Bars/Output.cs
19
Implement Schedule_Record Output()
public void Output(Graphics G, Font F, Brush B, Point P)
{
Pen pen = new Pen(Color.Black, 1);
int X_Pos = P.X;
int Y_Pos = P.Y;
Rectangle R = new Rectangle(X_Pos, Y_Pos, 75, F.Height);
G.DrawString(course_number, F, B, R);
G.DrawRectangle(pen, R);
X_Pos += R.Width;
R = new Rectangle(X_Pos, Y_Pos, 40, F.Height);
G.DrawString(section.ToString(), F, B, R);
G.DrawRectangle(pen, R);
X_Pos += R.Width;
R = new Rectangle(X_Pos, Y_Pos, 250, F.Height);
G.DrawString(course_title, F, B, R);
G.DrawRectangle(pen, R);
X_Pos += R.Width;
20
Schedule_Record Output()
R = new Rectangle(X_Pos, Y_Pos, 75, F.Height);
G.DrawString(days, F, B, R);
G.DrawRectangle(pen, R);
X_Pos += R.Width;
R = new Rectangle(X_Pos, Y_Pos, 160, F.Height);
G.DrawString(time, F, B, R);
G.DrawRectangle(pen, R);
X_Pos += R.Width;
R = new Rectangle(X_Pos, Y_Pos, 40, F.Height);
G.DrawString(building, F, B, R);
G.DrawRectangle(pen, R);
X_Pos += R.Width;
R = new Rectangle(X_Pos, Y_Pos, 60, F.Height);
G.DrawString(room, F, B, R);
G.DrawRectangle(pen, R);
X_Pos += R.Width;
}
21
Program Running
Note that the schedule runs off the page.
22
Scroll Bars
Let’s add scroll bars.
The Form object will do most of the work for us.
For documentation search for autoscroll in Visual Studio Help.
23
Autoscroll
To get automatic scrollling we must: Set the Autoscroll property to True. Set AutoScrollMinSize property
Scroll bars will be added if form is smaller.
Data dependent! Adjust X and Y coordinates for
output to account for scrolling: AutoScrollPosition.X; AutoScrollPosition.Y;
24
In Schedule_Record.cs
In class definition:
private static int line_width = 500;
public static int Line_width
{
get { return line_width; }
}
At end of function Output()
line_width = X_Pos;
25
Form1_Paint
At top of function:if ((Schedule == null) || (Schedule.Count < 1))
{
return;
}
int Document_Length =
Schedule.Count * Font1.Height + Top_Margin + Bottom_Margin;
int line_width = Schedule_Record.Line_width;
this.AutoScrollMinSize =
new Size(Left_Margin + line_width, Document_Length);
int dx = this.AutoScrollPosition.X;
int dy = this.AutoScrollPosition.Y;
...
Point P = new Point(Left_Margin + dx, y_pos + dy);
26
We have scroll bars!
27
Just One Problem
The menu scrolls off the screen!
Need to scroll just the area below the menu.
How?
28
Saving the Menu
Put a Panel below the menu Fill rest of form
Draw on the Panel rather than the form.
Scroll the panel.
29
Form with Panel
30
Configure the Panel
Position and size the panel to fill the form below the menu strip.
Anchor it on all sides.
31
Configure the Panel
32
Drawing on the Panel
Now we need to draw on the panel rather than the form.
Set AutoScroll true. Add a Paint event handler for the
panel.
Move the contents of Form1_Paint to panel1_Paint.
33
Scrolling the Panel
Change the scrolling information from form1 to panel1.
In openToolStripMenuItem_Click ()...this.panel1.Invalidate();
this.panel1.Update();
In panel1_Paint ()...this.panel1.AutoScrollMinSize =
new Size(Schedule_Record.Line_Width, Document_Length);
int dx = this.panel1.AutoScrollPosition.X;
int dy = this.panel1.AutoScrollPosition.Y;
34
Program Running
35
Some Finishing Touches
Change panel1 BackColor to white.
Add a bit of space below the panel.
Set the Text property of Form1 CSE Schedule
36
Some Finishing Touches
37
Program Running