Windows实验报告
计算机科学与技术学院 计112 1113022032 康照玲
一、实验一
1、题目:在一个窗口中央加载一个任意位图,位图尺寸为窗口面积的四分之一,当单击鼠标左键或键盘上的向上箭头时,位图向上移动,当移动到窗口的上边界时,在模式对话框中显示“不能再向上移动了”字样;当单击鼠标右键或键盘上的向下箭头时,位图向下移动,当到达窗口的下边界时,在模式对话框中显示“不能再向下移动了”字样;当单击键盘上的向左箭头时,位图向左移动,当移动到窗口的左边界时,在模式对话框中显示“不能再向左移动了”字样;当单击键盘上的向右箭头时,位图向右移动,当移动到窗口的右边界时,在模式对话框中显示“不能再向右移动了”字样。并要求图片在移动到窗口的任意边界时不消失。
2、关键代码分析
首先设置窗口大小,加载位图,获得位图左上角的坐标,在按下上下左右键的时候对相关坐标进行加减,同时建立相关的模式对话框,在对位图进行移动到相关边界时出现相关对话框。
相关代码:
PAINTSTRUCT ps; //定义包含绘图信息的结构变量
switch(iMessage)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_UP: //按上箭头时,位置-10
iY=iY-10;
break;
case VK_DOWN: //按下箭头时,位置+10
iY=iY+10;
break;
case VK_LEFT: //按左箭头时,位置-10
iX=iX-10;
break;
case VK_RIGHT: //按右箭头时,位置+10
iX=iX+10;
break;
}
InvalidateRect(hWnd,NULL,1);//刷新用户区
break;
case WM_CREATE: //初始化窗口消息
hDC=GetDC(hWnd); //得到设备环境指针
hdcmem=CreateCompatibleDC(hDC); //得到内存指针
ReleaseDC(hWnd,hDC); //删除设备环境指针
case WM_PAINT: //处理绘图消息
hDC=BeginPaint(hWnd,&ps); //得到设备环境指针
if(iX>0&&iX<iWindowWidth/2) //当位图完整的在窗口中时
{
SelectObject(hdcmem,hBm); //选入内存句柄
BitBlt(hDC,iX,iY,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY);//输出位图
}
else if(iX<=0) //当位图的左边界超出了窗口时
{ DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG3),hWnd,(DLGPROC)ModalDlgProc);
}
else //当位图的右边界超出了窗口时
{ DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG4),hWnd,(DLGPROC)ModalDlgProc);
}
if(iY>0&&iY<iWindowHeight/2) //当位图完整的在窗口中时
{
SelectObject(hdcmem,hBm); //选入内存句柄
BitBlt(hDC,iX,iY,bm.bmWidth,bm.bmHeight,hdcmem,0,0,SRCCOPY); break; //输出位图
}
else if(iY<=0) //当位图的上边界超出了窗口时
{
DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),hWnd,(DLGPROC)ModalDlgProc);
}
else //当位图的下边界超出了窗口时
{ DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG2),hWnd,(DLGPROC)ModalDlgProc);
}
EndPaint(hWnd,&ps); //输出环境指针
break;
case WM_DESTROY: //关闭窗口消息
DeleteObject(hBm); //删除内存句柄
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
return 0;
3、模式对话框的设置,相关代码如下:
IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 187, 96
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "对话"
FONT 10, "System"
BEGIN
PUSHBUTTON "确定",IDCANCEL,130,82,50,14
LTEXT "不能再向上移动了"IDC_STATIC,50,35,170,10
END
IDD_DIALOG2 DIALOG DISCARDABLE 0, 0, 187, 96
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "对话"
FONT 10, "System"
BEGIN
PUSHBUTTON "确定",IDCANCEL,130,82,50,14
LTEXT "不能再向下移动了"IDC_STATIC,50,35,170,10
END
IDD_DIALOG3 DIALOG DISCARDABLE 0, 0, 187, 96
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "对话"
FONT 10, "System"
BEGIN
PUSHBUTTON "确定",IDCANCEL,130,82,50,14
LTEXT "不能再向左移动了"IDC_STATIC,50,35,170,10
END
IDD_DIALOG4 DIALOG DISCARDABLE 0, 0, 187, 96
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "对话"
FONT 10, "System"
BEGIN
PUSHBUTTON "确定",IDCANCEL,130,82,50,14
LTEXT "不能再向右移动了"IDC_STATIC,50,35,170,10
END
二、实验二
1、题目:建立两套菜单,第一套菜单:单击menu2,窗口加载第二套菜单:给每套菜单的每个菜单项放置热键和加速键,单击menu1后,加载第一套菜单。
2、关键代码分析:
首先设置两套菜单,在窗口中分别加载菜单,在点击相应的菜单选项是出现菜单的转换。在需要点击图形时,设置相关画图标志以及填充颜色标志,点击时出现的相应图形和相应颜色的填充。
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HBRUSH hbrush;
static BOOL bColorR=FALSE,bColorY=FALSE;
static BOOL bCircle = FALSE,bRect = FALSE; //设置绘制圆和矩形的标志变量
switch (message)
{
case WM_COMMAND:
wmId= LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case ID_MENU1:
hmenu1 = LoadMenu(hInst,MAKEINTRESOURCE(IDC_MY7_91)); //得到菜单句柄
SetMenu(hWnd,hmenu1);
DrawMenuBar(hWnd);
bCircle = FALSE; //绘圆标志为假
bRect = FALSE; //绘矩形标志为假
break;
case ID_MENU2:
hmenu2 = LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1)); //得到菜单句柄
SetMenu(hWnd,hmenu2);
DrawMenuBar(hWnd);
bCircle = FALSE; //绘圆标志为假
bRect = FALSE; //绘矩形标志为假
break;
case ID_CIRCLE: //绘制圆形
bCircle = TRUE; //绘圆标志为真
bRect = FALSE; //绘矩形标志为假
InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
break;
case ID_RANGLE: //绘制矩形
bCircle = FALSE; //绘圆标志为假
bRect = TRUE; //绘矩形标志为真
InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
break;
case ID_RED:
bColorR=TRUE;
bColorY=FALSE;
InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
break;
case ID_YELLOW:
bColorY=TRUE;
bColorR=FALSE;
InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd,&rect1);
x=(rect1.left+rect1.right)/2;
y=(rect1.top+rect1.bottom)/2;
z=min(x,y)-100;
if(bCircle == TRUE)
{ //绘制圆形
if(bColorR==TRUE)
{
hbrush=CreateSolidBrush(RGB(255,0,0));
SelectObject(hdc,hbrush);
}
if(bColorY==TRUE)
{
hbrush=CreateSolidBrush(RGB(255,200,0));
SelectObject(hdc,hbrush);
}
Ellipse(hdc,x-z,y-z,x+z,y+z);
}
if(bRect == TRUE)
{ //绘制矩形
if(bColorR==TRUE)
{
hbrush=CreateSolidBrush(RGB(255,0,0));
SelectObject(hdc,hbrush);
}
if(bColorY==TRUE)
{
hbrush=CreateSolidBrush(RGB(255,200,0));
SelectObject(hdc,hbrush);
}
Rectangle(hdc,x-z,y-z,x+z,y+z);
}
EndPaint(hWnd,&ps);
//InvalidateRect(hWnd,NULL,TRUE); //发出刷新信息
break;
3、菜单相关代码:
IDC_MY7_91 MENU
BEGIN
POPUP "图形(&F)"
BEGIN
MENUITEM "圆", ID_CIRCLE
MENUITEM "矩形", ID_RANGLE
END
POPUP "填充(&T)"
BEGIN
MENUITEM "红", ID_RED
MENUITEM "黄", ID_YELLOW
END
POPUP "更换菜单(&G)"
BEGIN
MENUITEM "menu1\t Ctrl+ P", ID_MENU1
MENUITEM "menu2\t Ctrl+ D", ID_MENU2
END
END
IDR_MENU1 MENU
BEGIN
POPUP "统计(&J)"
BEGIN
MENUITEM "求和", ID_SUM
MENUITEM "方差", ID_CHA
END
POPUP "报表(&B)"
BEGIN
MENUITEM "曲线", ID_LINE
MENUITEM "柱状", ID_ZHU
END
POPUP "更换菜单(&G)"
BEGIN
MENUITEM "menu1\t Ctrl+ P", ID_MENU1
MENUITEM "menu2\t Ctrl+ D", ID_MENU2
END
END
三、上机体会
本次实验是对windows编程中对菜单的设置及转换,位图的加载和移动以及对模式对话框的相应显示。通过这次实验,我对windows编程有了更多的理解以及能够熟练的运用其中。
Windows操作系统 C/C++ 程序实验
姓名:___________________
学号:___________________
班级:___________________
院系:___________________
______________年_____月_____日
实验三 Windows 2000/xp线程同步
一、背景知识
二、实验目的
在本实验中,通过对事件和互斥体对象的了解,来加深对Windows 2000/xp线程同步的理解。
1) 回顾系统进程、线程的有关概念,加深对Windows 2000/xp线程的理解。
2) 了解事件和互斥体对象。
3) 通过分析实验程序,了解管理事件对象的API。
4) 了解在进程中如何使用事件对象。
5) 了解在进程中如何使用互斥体对象。
6) 了解父进程创建子进程的程序设计方法。
三、工具/准备工作
在开始本实验之前,请回顾教科书的相关内容。
您需要做以下准备:
1) 一台运行Windows 2000/xp Professional操作系统的计算机。
2) 计算机中需安装Visual C++ 6.0专业版或企业版。
四、实验内容与步骤
1. 事件对象
清单4-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。
步骤1:登录进入Windows 2000/xp Professional。
步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。
步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-1.cpp。 步骤4:单击“Build”菜单中的“Compile 3-1.cpp”命令,并单击“是”按钮确认。系统 1
对3-1.cpp进行编译。
步骤5:编译完成后,单击“Build”菜单中的“Build 3-1.exe”命令,建立3-1.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?
____________________________________________________________________ ________________________________________________________________________ 步骤6:在工具栏单击“Execute Program” (执行程序) 按钮,执行3-1.exe程序。 运行结果 (分行书写。如果运行不成功,则可能的原因是什么?) :
1) __________________________________________________________________
2) __________________________________________________________________
3) __________________________________________________________________
4) __________________________________________________________________
5) __________________________________________________________________
6) __________________________________________________________________
这个结果与你期望的一致吗?(从进程并发的角度对结果进行分析)
阅读和分析程序3-1,请回答:
1) 程序中,创建一个事件使用了哪一个系统函数?创建时设置的初始信号状态是什么?
a. __________________________________________________________________
b. __________________________________________________________________
2) 创建一个进程 (子进程) 使用了哪一个系统函数?
____________________________________________________________________
3) 从步骤6的输出结果,对照分析3-1程序,可以看出程序运行的流程吗?请简单描述:
____________________________________________________________________
________________________________________________________________________ ________________________________________________________________________
2. 互斥体对象
步骤7:在Visual C++ 窗口的工具栏中单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-2.cpp。
步骤8:单击“Build”菜单中的“Compile 3-2.cpp”命令,并单击“是”按钮确认。系统对3-2.cpp进行编译。
步骤9:编译完成后,单击“Build”菜单中的“Build 3-2.exe”命令,建立3-2.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?
2
____________________________________________________________________ ________________________________________________________________________ 步骤10:在工具栏单击“Execute Program”按钮,执行3-2.exe程序。
分析程序3-2的运行结果,可以看到线程 (加和减线程) 的交替执行 (因为Sleep() API允许Windows切换线程) 。在每次运行之后,数值应该返回初始值 (0) ,因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。
1) 请描述运行结果 (如果运行不成功,则可能的原因是什么?) :
____________________________________________________________________
________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ 3
________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________
2) 根据运行输出结果,对照分析4-2程序,可以看出程序运行的流程吗?请简单描述: ____________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________
4
操作系统实验报告windows部分班级姓名学号31Windows任务管理器的进程管理实验估计时间60分钟实验目的工具准备工作背景知…
实验一Windows7基本操作一实验目的1掌握文件和文件夹基本操作2掌握资源管理器和计算机基本操作二实验要求1请将操作结果用Alt…
Windows操作系统CC程序实验姓名王晨璐学号1131000046班级1班院系信息工程学院20xx年10月26日实验二Windo…
操作系统实验报告专业年级学号提交日期实验一操作系统环境11Windows20xx系统管理实验估计时间60分钟实验内容与步骤1计算机…
北方工业大学操作系统专题训练实验报告学生姓名雷峰津学号12101020xx4班级计121北方工业大学第2页共13页北方工业大学第3…
苏州市职业大学实习实训报告名称20xx年12月24日至20xx年12月28日共1周院系计算机工程系班级11网络技术1班姓名系主任教…
Windows编程实验报告1GDI图形程序设计姓名专业学号框架窗口程序和20xx3241Windows编程实验报告1Windows…
操作系统实验报告windows部分班级姓名学号31Windows任务管理器的进程管理实验估计时间60分钟实验目的工具准备工作背景知…
实验报告册课程计算机组装与维护姓名刘蓉学号101124004专业信息技术学院班级10网络指导老师赵秀英20xx至20xx学年第2学…
windowsXP中错误报告电脑的应用有很强的技术性同时又有很强的经验性但经验性会误导用户只记步骤或只专注于部分功能如只记步骤则对…
下面是官方资料宽带连接错误代码大全发生内部错误重新启动计算机以确保所有最近所作的配置更改都能生效601检测到无效的端口句柄发生内部…