Windows实验报告第二次实验

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操作系统实验三实验报告

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

相关推荐