Download presentation
Presentation is loading. Please wait.
Published byShinta Oesman Modified 6年之前
1
第五章 Windows窗体界面设计 5.1 鼠标事件与键盘事件 5.2 Windows窗体基本控件 5.3 菜单与工具栏
2
5.1 鼠标事件与键盘事件 常用鼠标事件 1.Click:单击鼠标左键时触发 2.MouseDoubleClick:双击鼠标左键时触发
3.MouseEnter:鼠标进入控件可见区域时触发 4.MouseMove:鼠标在控件区域内移动时触发 5.MouseLeave:鼠标离开控件可见区域时触发 常用键盘事件 1.KeyDown:按下某个键时触发 2.KeyUp:释放按键时触发 3.KeyPress:释放按键后触发
3
buttonOK labelDisplay Visible:false textBox1 label1 图5-1 事件驱动的界面设计示例
4
5.1 鼠标事件与键盘事件(续) 1)textBox1控件 的KeyDown 事件:
private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Up) MessageBox.Show("您现在按下的是向上箭头!"); } if (e.KeyCode == Keys.F1) MessageBox.Show("您现在按下的是功能键F1!是否需要帮助?"); if (e.Alt == true && e.Shift == true && e.Control==true) MessageBox.Show("您现在按下的是组合键Ctrl+Alt+Shift!");
5
5.1 鼠标事件与键盘事件(续) if (e.Control == true) { switch (e.KeyCode)
case Keys.A: MessageBox.Show("您现在按下的是组合键Ctrl+A!"); break; case Keys.B: MessageBox.Show("您现在按下的是组合键Ctrl+B!"); }
6
5.1 鼠标事件与键盘事件(续) 2)buttonOK控件的Click事件、MouseEnter事件、MouseLeave事件代码:
private void buttonOK_Click(object sender, EventArgs e) { label1.Text = textBox1.Text; } private void buttonOK_MouseEnter(object sender, EventArgs e) labelDisplay.Visible = true; labelDisplay.Text = "按下按钮将文本框中的内容显示于下面!"; private void buttonOK_MouseLeave(object sender, EventArgs e) labelDisplay.Text = "";
7
5.2 Windows窗体基本控件 5.2.1 控件中常用的属性和方法 1.常用基本属性
控件中常用的属性和方法 1.常用基本属性 1) Name:指定控件的名称,它是控件在当前应用程序中的唯一标识,代码通过该属性来访问控件 2) Enabled:决定控件是否可用,取值为true时可用,取值为false时不可用 3) Font:设置控件上文本的显示形式,是一个复合属性,包括字体名称、字号以及是否为斜体、加粗和下划线等 4) BackColor:设置控件的背景色 5) ForeColor:设置控件的前景色,即控件上文本的颜色 6) Image:指定控件上所要显示的图像
8
控件中常用的属性和方法(续) 7) Location:定位控件,这是一个复合属性,需要指定控件的左上角相对于其容器左上角的坐标(x,y) 8) Size: 指定控件的高度和宽度,是一个复合属性 9) Text:设置控件上所要显示的文本,如标签、按钮、复选框等控件上的文字 10) Visible:决定控件是否可见,取值为true时可见,取值为false时不可见
9
2.常用方法 Focus:聚焦方法
10
5.2.2 TextBox控件 1.文本框控件常用的基本属性 1) Text:表示文本框中显示的内容。
2) MaxLength:表示用户可以在文本框控件中最多键入的字符数,默认值为32767个字符。注意,由于使用的是Unicode字符,所以对中文和英文的字符计数方法是相同的,即一个英文字符的长度为1,一个汉字字符的长度也是1。 3) Multiline:表示是否可以包含多行内容。 4) PasswordChar:用于指定在屏蔽TextBox控件中输入的密码字符时所要使用的符号。
11
5.2.2 TextBox控件(续) 2. TextBox控件常用的基本事件 1) Enter:表示当前文本框为活动状态时触发的操作。
2) TextChanged:表示文本框中的当前内容(Text属性值)更改时触发的操作。
12
图5-2 用户信息录入界面 textBoxUser MaxLength:6 textBoxInformation Multiline:true textBoxPassword PasswordChar:“*” buttonOK labelResult Visible:false
13
5.2.2 TextBox控件(续) 3. 部分代码 1) buttonOK的Click事件代码
private void buttonOK_Click(object sender, EventArgs e) { labelResult.Visible = true; labelResult.Text = string.Format("用户名是:{0}; 密码是:{1}\n输入的资料是:\n{2}", textBoxUser.Text, textBoxPassword.Text, textBoxInformation.Text); }
14
TextBox控件(续) 2) textBoxPassword和textBoxInformation的TextChanged事件代码 private void textBoxPassword_TextChanged(object sender, EventArgs e) { textBoxUser.ReadOnly = true; } private void textBoxInformation_TextChanged(object sender, EventArgs e) buttonOK.ForeColor = System.Drawing.Color.Red; buttonOK.Size = new System.Drawing.Size(100, 50);
15
MaskedTextBox控件 自学
16
RichTextBox控件 自学
17
5.2.6 CheckedListBox控件 1. CheckedListBox控件常用的基本属性 Items:描述控件对象中的所有项。
MutiColumn:决定是否可以以多列的形式显示各项。在控件对象的指定高度内无法完全显示所有项时可以分为多列,这种情况下若MutiColumn属性值为false,则会在控件对象内出现滚动条。 3) ColumnWidth:当控件对象支持多列时,指定各列所占的宽度。 4) CheckOnClick:决定是否在第一次单击某复选框时即改变其状态。 5) SelectionMode:指示复选框列表控件的可选择性。该属性只有两个可用的值None和One,其中None值表示复选框列表中的所有选项都处于不可选状态;One值则表示复选框列表中的所有选项均可选。
18
5.2.6 CheckedListBox控件 6) Sorted:表示控件对象中的各项是否按字母的顺序排序显示。
7) CheckedItems:表示控件对象中选中项的集合,该属性是只读的。 8) CheckedIndices:表示控件对象中选中索引的集合。
19
2. CheckedListBox控件常用的方法
1) SetItemChecked:设置列表中的某个复选框的选中状态。 2) SetSelected:设置列表中的某个复选框的待选状态。
20
图5-8 课程选择窗体 checkedListBox1 MutiColumn:True Sorted:True CheckOnClick:true buttonOK buttonReference
21
RadioButton控件 RadioButton控件用于接收用户的选择,它是以单项选择的形式出现,一旦某一个选项被选中,则同组中其他RadioButton按钮的选中状态自动清除。单选按钮是以各自所在的容器来划分组的,如果要在一个Form上创建多个单选按钮组,则需要使用GroupBox或者Panel控件作为容器。 RadioButton控件常用的基本属性 1) Text:表示与控件对象相关联的文本。 2) Checked:表示该控件对象是否被选中。 2. 单选按钮控件常用的基本事件 CheckedChanged:当Checked属性值更改时触发的操作。
22
radioButton1 radioButton2 radioButton3 Check:false、false、false
图5-9 用户选择窗体 radioButton1 radioButton2 radioButton3 Check:false、false、false textBoxResult ReadOnly:true
23
ComboBox控件 ComboBox控件由两部分组成:一个文本框和一个列表框。文本框可以用来编辑或者显示当前选中的条目。若列表框隐藏,则单击文本框旁边带有向下箭头的按钮时弹出,使用键盘或者鼠标可以在列表框中快速选择条目。
24
ComboBox控件常用的基本属性 ① Simple:同时显示文本框和列表框,文本框可以被编辑。
1) DropDownStyle属性:表示组合框的样式, 它有三种选择: ① Simple:同时显示文本框和列表框,文本框可以被编辑。 ② DropDown:显示文本框,隐藏列表框,且文本框可以被编辑。 ③ DropDownList:显示文本框,隐藏列表框,且文本框不可以被编辑。 2) MaxDropDownItems属性:默认打开列表框时所显示的最大条目数,多处的部分以滚动条的方式查看。
25
2. ComboBox控件常用的事件 SelectedIndexChanged事件:SelectedIndex属性更改后触发的动作。
26
图5-10 验证文件访问窗体 comboBoxName MaxDropDownItems:5 comboBoxDepartment DropDownStyle: DropDownList richTextBox1 Enable:false buttonAddName buttonOpenFile buttonSaveFile
27
5.2.8 ComboBox控件(续) 3. 部分代码 1) EditEnable方法代码
private void EditEnable(object sender, EventArgs e) { //由于nameComBox控件可以由用户输入新姓名,判断时不能使用SelectedIndex属性 if (comboBoxName.Text != "" && comboBoxDepartment.SelectedIndex > -1) richTextBox1.Enabled = true; buttonOpenFile.Enabled = true; buttonSaveFile.Enabled = true; } 2) addButtonName的Click事件代码
28
ComboBox控件(续) private void addButtonName_Click(object sender, EventArgs e) { if (comboBoxName.Text != "") bool newitem = true; //判断当前comboBoxName中用户输入的姓名是否已经存在于下拉列表中 for (int i = 0; i < comboBoxName.Items.Count; i++) string oneitem = Convert.ToString(comboBoxName.Items[i]); if (oneitem == comboBoxName.Text) newitem = false; } //如果用户输入的姓名不在下拉列表中,则添加 if (newitem) comboBoxName.Items.Add(comboBoxName.Text);
29
5.2.8 ComboBox控件(续) 3) buttonOpenFile和buttonSaveFile的Click事件代码
private void buttonOpenFile_Click(object sender, EventArgs e) { richTextBox1.LoadFile("D:\\source.rtf"); } //保存文件,并清除RTFRichBox中的文本,给出提示信息 private void buttonSaveFile_Click(object sender, EventArgs e) richTextBox1.SaveFile("D:\\source.rtf"); richTextBox1.Clear(); MessageBox.Show("文件保存完毕!"); richTextBox1.Enabled = false; buttonOpenFile.Enabled = false; buttonSaveFile.Enabled = false;
30
ListBox控件 ListBox控件用于显示一组条目,以便让操作者从中选择一条或者多条,然后进行相应的处理,用法及属性有些类似于CheckedListBox。 1. ListBox控件常用的基本属性 1) Items:描述控件对象中的所有项。 2)MutiColumn:决定是否可以以多列的形式显示各项。
31
3) SelectionMode:选择项时可以使用的方法,它有四种选择: ① None:不能选择任何条目。
③ MultiSimple:每次可以选择一个条目或者多个条目,每次单击对应条目即被选中,再次单击取消选中。 ④ MultiExtended:每次可以选择一个条目或者多个条目,仅用鼠标单击各条目时,每次选择一个条目;使用组合键(如Shift或Ctrl)配合时,可以选择多个条目。
32
4) SelectedIndex:当前选定的条目中从零开始的索引。
5) SelectedItems:获取一个集合,该集合包含所有当前选定条目的从零开始的所有项。 6) Selectedindices:获取一个集合,该集合包含所有当前选定条目的从零开始的所有索引。
33
5.2.9 ListBox控件(续) 2. ListBox控件常用的事件
SelectedIndexChanged:当SelectedIndex属性值更改时触发。
34
图5-11 选修课程更改窗体 listBox1 SelectionMode: MultiExtended textBoxAdd buttonDelete buttonDeleteAll buttonAdd
35
5.2.9 ListBox控件(续) 3. 部分代码 1) buttonDelete的Click事件代码
private void buttonDelete_Click(object sender, EventArgs e) { while (listBox1.SelectedIndex >= 0) listBox1.Items.RemoveAt(listBox1.SelectedIndex); }
36
5.2.9 ListBox控件(续) 2) buttonAdd的Click事件代码
private void buttonAdd_Click(object sender, EventArgs e) { string addedText = textBoxAdd.Text; if (addedText == "") MessageBox.Show("没有输入所要添加的课程!"); return; } //检查当前所要添加的新课程是否已存在于课程列表中 //若存在给出提示信息;否则添加新项 if(listBox1.Items.Contains(addedText)) MessageBox.Show("课程<" + addedText + ">在列表中已存在!");
37
5.2.9 ListBox控件(续) else { listBox1.Items.Add(addedText); }
textBoxAdd.Clear();
38
private void buttonDeleteAll_Click(object sender, EventArgs e) {
listBox1.Items.Clear(); }
39
5.2.10 Timer组件 1.Timer组件常用的基本属性 2.Timer组件的事件
1) Enabled:是否启用计时,false表示停止计时,true表示开始计时。 2) Interval:触发Tick事件的间隔时间,以毫秒为单位,默认为100ms。 2.Timer组件的事件 Tick:每隔Interval属性指定的时间都会触发。
40
labelDisplay myTimer Enabled:false Interval:1000(即1秒) buttonOK 图5-12 时钟显示窗体
41
5.2.10 Timer组件(续) 3. 部分代码 1) myTimer的Tick事件和buttonOK的Click事件代码:
private void myTtimer_Tick(object sender, EventArgs e) { labelDisplay.Text = DateTime.Now.ToLongTimeString(); } 2) buttonOK的Click事件代码: private void buttonOK_Click(object sender, EventArgs e) myTimer.Enabled = !myTimer.Enabled; buttonOK.Text =myTimer.Enabled ? "停止" : "开始";
42
5.2.11 PictureBox控件 PictureBox控件是用于显示图像的Windows图片框控件。
1) Image:在PictureBox中显示的图片。 2) SizeMode:图片在控件中的显示方式,有五种选择:
43
① AutoSize:自动调整控件PictureBox大小,使其等于所包含的图片大小。
② CenterImage:将控件的中心和图片的中心对齐显示。如果控件比图片大,则图片将居中显示。如果图片比控件大,则图片将居于控件中心,而外边缘将被剪裁掉。 ③ Normal:图片被置于控件的左上角。如果图片比控件大,则图片的超出部分被剪裁掉。 ④ StretchImage:控件中的图像被拉伸或收缩,以适合控件的大小,完全占满控件。 ⑤ Zoom:控件中的图片按照比例拉伸或收缩,以适合控件的大小,占满控件的长度或高度。
44
SizeMode: StretchImage
pictureBoxSmall pictureBoxMiddle pictureBoxLarge SizeMode: StretchImage trackBar1 Maximum:150 Minimum:10 Value:75 buttonPause 图5-13 动画演示窗体 buttonContinue buttonStart myTimer
45
5.2.11 PictureBox控件(续) 2. 部分代码 1) 双击FormPictureBox窗体,添加窗体的Load事件代码。
private void FormPictureBox_Load(object sender, EventArgs e) { this.BackColor = Color.White; myTimer.Interval = myTrackBar.Value; for (int i = 1; i <= 8; i++) bitmap[i - 1] = new Bitmap(Application.StartupPath + i.ToString() + ".jpg"); } myTimer.Enabled = false;
46
5.2.11 PictureBox控件(续) 2) 双击myTimer,添加myTimer_Tick事件代码。
private void myTimer_Tick(object sender, EventArgs e) { num++; int num1 = (num + 1) % 8; int num2 = (num + 2) % 8; int num3 = (num + 3) % 8; pictureBoxSmall.Image = bitmap[num1]; pictureBoxMiddle.Image = bitmap[num2]; pictureBoxLarge.Image = bitmap[num3]; Random r = new Random(); pictureBoxSmall.Left = (pictureBoxSmall.Left + r.Next(onceMove)) % Width; pictureBoxMiddle.Left = (pictureBoxMiddle.Left + r.Next(onceMove)) % Width; pictureBoxLarge.Left = (pictureBoxLarge.Left + r.Next(onceMove)) % Width; }
47
5.2.11 PictureBox控件(续) 3) myTrackBar_Scroll事件代码:
myTimer.Interval = myTrackBar.Value; 4) 三个Button控件对应的Click事件代码: private void buttonStart_Click(object sender, EventArgs e) { myTimer.Enabled = true; } private void buttonPause_Click(object sender, EventArgs e) myTimer.Enabled = false; private void buttonContinue_Click(object sender, EventArgs e)
48
5.3 菜单与工具栏 5.3.1 MenuStrip控件 MenuStrip控件主要用于生成所在窗体的主菜单。
5.3 菜单与工具栏 MenuStrip控件 MenuStrip控件主要用于生成所在窗体的主菜单。 1.MenuStrip控件的基本属性 1) AllowItemReorder:当程序运行时,按下Alt键是否允许改变各菜单项的左右排列顺序。默认值为false,当更改该属性值为true时,按下Alt键的同时可以用鼠标拖动各菜单项以调整其在菜单栏上的左右位置。 2) Dock:指示菜单栏在窗体中的位置,默认值为Top。 3) GripStyle:是否显示菜单栏的指示符,即纵向排列的多个凹点,默认值为Hidden。当更改该属性值为Visible时,显示位置由GripMargin属性指定。 4) Items:用于编辑菜单栏上显示的各菜单项。
49
5.3.1 MenuStrip控件(续) 2.MenuItem菜单项的基本属性
1) Checked:指示菜单项是否被选中。默认值为false。 2) CheckOnClick:决定单击菜单项时是否使其选中状态发生改变。默认值为false,即单击菜单项不会影响其Checked属性;当更改该属性值为true时,则每次单击菜单项都会影响其Checked属性,使其值在false和true之间切换。 3) CheckState:指示菜单项的状态。与复选框CheckBox控件的ThreeState属性相同,共有3个属性值:Checked、Unchecked、Indeterminate,分别表示选中、未选中、不确定三种状态。 4) Image:指定在该菜单项上显示的图标。
50
MenuStrip控件(续) 5) DisplayStyle:指示菜单项上的显示内容。共有4个属性值:None、Text、Image、ImageAndText,分别表示不显示任何内容、仅显示文本、仅显示图标、同时显示文本和图标。默认值为ImageAndText。 6) DropDownItems:单击该属性后的【…】按钮,调出【项集合编辑器】,以此编辑该菜单项对应的子菜单中的各菜单项。 7) ImageScaling:指定是否调整图标大小。默认属性值为SizeToFit,即调整图标大小以适应菜单项。该属性的另一个属性值为None,即不调整图标大小。 8) ShortcutKeys:为菜单项指定的快捷键。 9) ShowShortCutKeys:指示是否在菜单项上显示快捷键,默认值为true。
51
5.3.1 MenuStrip控件(续) 3.MenuStrip控件的常用事件
1) ItemClicked:当单击菜单栏上各主菜单项时触发。 2) LayoutCompleted:当菜单栏上各主菜单项的排列顺序发生变化之后触发。使用该事件时,AllowItemReorder属性必须设为true。
52
4.MenuItem菜单项的常用事件 1) Click:单击菜单项时触发。 2) DropDownClosed:关闭菜单项的子菜单时触发。
3) DropDownItemClicked:单击菜单项的子菜单中任何一项时触发。 4) DropDownOpened:菜单项的子菜单打开之后触发。 5) DropDownOpening:打开菜单项的子菜单时触发。
53
图5-18 “RTF文件编辑器-主菜单”窗体界面
mainMenuStrip richTextBox1 Enabled:false 图5-18 “RTF文件编辑器-主菜单”窗体界面
54
5.3.1 MenuStrip控件(续) 5. 部分代码 1) 分别双击各菜单项,添加其Click事件,代码如下:
private void 新建NToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.Enabled = true; richTextBox1.Clear(); richTextBox1.Focus(); } private void 保存SToolStripMenuItem_Click(object sender, EventArgs e) // 将文本框中的内容保存为D:\source.rtf,并清除文本框中的内容给出提示信息 richTextBox1.SaveFile("D:\\source.rtf", RichTextBoxStreamType.RichText); MessageBox.Show("文件已保存于source.rtf!"); // 使【打开】菜单项可用,用于打开文件D:\source.rtf 打开OToolStripMenuItem.Enabled = true;
55
MenuStrip控件(续) private void 打开OToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.Enabled = true; richTextBox1.LoadFile("D:\\source.rtf", RichTextBoxStreamType.RichText); } private void 剪切TToolStripMenuItem_Click(object sender, EventArgs e) richTextBox1.Cut(); private void 复制CToolStripMenuItem_Click(object sender, EventArgs e) richTextBox1.Copy(); private void 粘贴PToolStripMenuItem_Click(object sender, EventArgs e) richTextBox1.Paste();
56
MenuStrip控件(续) private void 全选AToolStripMenuItem_Click(object sender, EventArgs e) { richTextBox1.SelectAll(); } private void 帮助HToolStripMenuItem_Click(object sender, EventArgs e) MessageBox.Show("建设中……"); private void 退出XToolStripMenuItem_Click(object sender, EventArgs e) this.Close();
57
ContextMenuStrip控件 ContextMenuStrip控件的功能是制作右键快捷菜单。该控件是用于为其他控件服务的,不能单独使用。 1.ContextMenuStrip控件的基本属性 1) Item:用于编辑快捷菜单上的各菜单项。 2) Opacity:设置快捷菜单的透明度。取值在0%~100%之间,默认值为100%,即不透明。 2.ContextMenuStrip控件的常用事件 1) ItemClicked:快捷菜单中的任何一个菜单项被单击时触发。 2) Opening:快捷菜单打开时触发。
58
ContextMenuStrip: myContextMenuStrip
richTextBox1 ContextMenuStrip: myContextMenuStrip myContextMenuStrip 图5-19 “RTF文件编辑器-快捷菜单”窗体界面
59
5.3.2 ContextMenuStrip控件(续)
3. 部分代码 变量声明 Color oldColor; int smallSize=4; FontStyle oldFontStyle;
60
2) ContextMenuStrip控件中的各菜单项的Click事件代码:
private void toolStripMenuItem大字体_Click(object sender, EventArgs e) { FontFamily oldFontFamily = richTextBox1.SelectionFont.FontFamily; richTextBox1.SelectionFont = new Font(oldFontFamily, 24, oldFontStyle); } private void toolStripMenuItem小字体_Click(object sender, EventArgs e) richTextBox1.SelectionFont = new Font(oldFontFamily, smallSize, oldFontStyle); } private void toolStripMenuItem红色字体_Click(object sender, EventArgs e) richTextBox1.SelectionColor = Color.Red;
61
5.3.2 ContextMenuStrip控件(续)
private void toolStripMenuItem蓝色字体_Click(object sender, EventArgs e) { richTextBox1.SelectionColor = Color.Blue; } private void toolStripMenuItem绿色字体_Click(object sender, EventArgs e) richTextBox1.SelectionColor = Color.Green; private void toolStripMenuItem恢复字体大小_Click(object sender, EventArgs e) richTextBox1.SelectionFont = new Font(oldFontFamily, 8, oldFontStyle); private void 恢复字体颜色ToolStripMenuItem_Click(object sender, EventArgs e) richTextBox1.SelectionColor = oldColor; private void toolStripMenuItem保存文件_Click(object sender, EventArgs e) richTextBox1.SaveFile("D:\\source.rtf");
62
ToolStrip控件 ToolStrip控件的作用是为Windows应用程序添加工具栏。工具栏一般是由多个按钮、标签等排列组成,通过这些项可以快速地执行程序提供的一些常用命令,比使用菜单选择更加方便快捷。 ToolStrip控件的常用属性和事件与MenuStrip控件基本相同,工具栏上各项的属性和事件与MenuStrip控件中菜单项基本相同。
63
5.3.3 ToolStrip控件 部分代码 分别双击ToolStrip控件中的各项,添加其Click事件,代码如下:
private void toolStripButton新建N_Click(object sender, EventArgs e) { richTextBox1.Enabled = true; richTextBox1.Clear(); richTextBox1.Focus(); }
64
ToolStrip控件(续) private void toolStripButton打开O_Click(object sender, EventArgs e) { richTextBox1.LoadFile("D:\\source.rtf"); } private void toolStripButton保存S_Click(object sender, EventArgs e) richTextBox1.SaveFile("D:\\source.rtf"); richTextBox1.Clear(); MessageBox.Show("source.rtf文件已保存!"); private void toolStripButton剪切U_Click(object sender, EventArgs e) richTextBox1.Cut(); private void toolStripButton复制C_Click(object sender, EventArgs e) richTextBox1.Copy(); private void toolStripButton粘贴P_Click(object sender, EventArgs e) richTextBox1.Paste();
65
5.3.3 ToolStrip控件(续) 2)“toolStripComboBox字体”的TextChanged事件的代码如下:
private void toolStripComboBox字体_TextChanged(object sender, EventArgs e) { FontFamily myfontfamily = richTextBox1.SelectionFont.FontFamily; switch (toolStripComboBox字体.Text) case "大字体": richTextBox1.Font = new Font(myfontfamily, 40, System.Drawing.FontStyle.Regular); break; case "小字体": richTextBox1.Font = new Font(myfontfamily, 8, System.Drawing.FontStyle.Regular); case "适中字体": richTextBox1.Font = new Font(myfontfamily, 24, System.Drawing.FontStyle.Regular); }
Similar presentations