院 系: 计算机科学学院 专 业: 计算机科学与技术 年 级: 2008 课程名称: windows编程 学 号:08061018 08061021 08061032 姓 名: 易波 陈员 王琪 指导教师: 程鹏
2011年 11 月 3 日
年级 专业 实验名称 实 验 目 的 或 要 求 08级 计算机科学与技术 班号 计科1大班 学号 姓名 实验 类型 设计型 综合型 创新型 使用Win32API实现模态对话框 1. 2. 3. 4. 熟悉基本对话框的原理和实验方法 掌握对话框应用程序的设计技巧 理解模态对话框的特点 学习使用Win32API 实 验 原 理 ( 算 法 流 程 ) 模态对话框的相关API 1)DialogBox函数 函数原型 int DialogBox (HINSTANCE hlnstance, LPCTSTR IpTemplate, HWND hWndParent, DLGPROC IpDialogFunc); 参数: hlnstance: 标识一个模块的事例该模块的可执行文件含有对话框模板。 IpTemplate:标识对话框模板。此参数可以是指向一个以NULL结尾的字符串的指针,该字符串指定对话框模板名,或是指定对话框模板的资源标识符中的一个整型值。如果此参数指定了一个资源标识符则它的高位字一定为零,且低位字一定含有标识符。一定用MAKEINTRESOURCE宏指令创建此值。 hWndParent:指定拥有对话框的窗口。 IpDialogFunc:指向对话框过程的指针。 返回值:如果函数调用成功,则返回值为在对函数EndDialog的调用中的nResult参数.该函数用于中止对话框。如果函数调用失败,则返回值为-1。若想获得更多的错误信息,请调用GetLastError函数。 2)DialogProc对话框消息处理过程 INT_PTR CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) 具体实现方法: 1) 使用运用程序向导创建基于对话框的MFC程序 2) 使用资源编辑器,在主界面添加一个按钮 “IDC_CREATE_DIALOG” 来创建模态对话框。 3) 在“支援视图“中添加一个对话框,ID为”IDD_MODAL_DIALOG“ 4) 定义对话框的消息处理过程 源码: INT_PTR CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch ( uMsg ) { // 处理对话框初始化消息 case WM_INITDIALOG: // 此时的lParam就是DialogBoxParam的最后一个参数dwInitParam所设置的值 return TRUE ; // 处理WM_COMMAND消息 case WM_COMMAND: { switch ( LOWORD(wParam) ) { // 响应对话框的结束消息 case IDCANCEL: ::EndDialog ( hwndDlg, 0 ) ; return TRUE ; } } // 返回FALSE,表示把消息继续传递给系统默认的消息处理过程 // 返回TRUE,就表示不需要继续传递消息 break ; } return FALSE ; } 实验结果: 实 验 结 果 分 析 多页面切换程序: 向导对话框: 通用“字体”对话框: 通用“颜色”对话框: 年级 专业 实验名称 实 验 目 的 或 要 求 实 验 原 理 ( 算 法 流 程 ) 08级 计算机科学与技术 班号 计科1大班 学号 姓名 实验 类型 设计型 综合型 创新型 按钮控件 1. 掌握使用CButton类 2. 和控件的使用方法 3. 设计一个逃跑按钮。 CButton类的主要成员函数: //取得按钮控件状态 UINT GerState()const //设置高亮度状态 void SetState(BOOL bHighlight); //取得复选按钮或单选按钮的选择状态 int GetCheck() const //设置复选按钮或单选按钮的选择状态 int SetCheck(int nCheck) //获取按钮风格 UINT GetButtonStyle()const //设置按钮位图 HBITMAP SetBitmap( HBITMAP hBitmap) //设置按钮图标 HICON SetIcon (HICON hIcon) //设置按钮图标 HICON SetIcon(HICON hIcon) MFC环境下,还能使用窗体相关成员函数,使用这些函数可以根据ID直接进行操作。 void CWnd::CheckRadioButton(int nIDFirstButton //组中的第一个按钮ID int nIDLastButton //组中的最后一个按钮ID int nIDCheckButto); //指定要选定的ID 实现过程: 1) 在对话框编辑器中设计界面 2) 定义控件对象。4个单选按钮和6个复选按钮分别被定义 this->addr1.SetCheck ( BST_CHECKED ) ; this->game1.SetCheck ( BST_CHECKED ) ; this->game2.SetCheck ( BST_CHECKED ) ; this->game3.SetCheck ( BST_CHECKED ) ; this->game4.SetCheck ( BST_CHECKED ) ; this->game5.SetCheck ( BST_CHECKED ) ; this->game6.SetCheck ( BST_CHECKED ) ; 3) 初始设置。地点默认设置为“北京“,兴趣爱好默认设置为全选 4) 添加对“确定“按钮的响应 实 验 原 理 ( 算 法 流 程 ) void CButtonDlg::OnBnClickedSure() { CString szMsg ; szMsg += L\"您的所在地:\" ; if ( this->addr1.GetCheck () == BST_CHECKED ) szMsg += L\"北京\\n\" ; else if ( this->addr2.GetCheck () == BST_CHECKED ) szMsg += L\"上海\\n\" ; else if ( this->addr3.GetCheck () == BST_CHECKED ) szMsg += L\"深圳\\n\" ; else if ( this->addr4.GetCheck () == BST_CHECKED ) szMsg += L\"杭州\\n\" ; szMsg += L\"您的兴趣爱好:\" ; if ( this->game1.GetCheck() == BST_CHECKED ) szMsg += L\"体育运动 \" ; if ( this->game2.GetCheck() == BST_CHECKED ) szMsg += L\"影视娱乐 \" ; if ( this->game3.GetCheck() == BST_CHECKED ) szMsg += L\"黑客技术 \" ; if ( this->game4.GetCheck() == BST_CHECKED ) szMsg += L\"旅游观光 \" ; if ( this->game5.GetCheck() == BST_CHECKED ) szMsg += L\"休闲棋牌 \" ; if ( this->game6.GetCheck() == BST_CHECKED ) szMsg += L\"网络游戏 \" ; this->MessageBox ( szMsg, L\"您的选择\" ) ; } 实 验 结 果 分 析 年级 专业 实验名称 实 验 目 的 或 要 求 08级 计算机科学与技术 班号 计科1大班 学号 姓名 实验 类型 设计型 综合型 创新型 使用GDI对象CPen绘图 1. 了解图形设备接口 2. 学习使用GDI对象,包括CFont,CBrush,Cpen等。 基本对象: 实 验 原 理 ( 算 法 流 程 ) BOOL CreatePen( Int nPenStyle; //画笔风格 Int nWidth, //画笔宽度 COLORREF crColor) //画笔颜色 其中nPenStyle参数表示画笔风格 PS_SOLIN:实线画笔 PS_DASH:虚线画笔 PS_DOT:点线画笔 PS_DASHDOT:点画线画笔 PS_DASHDOTDOT 双点画线画笔 实验步骤 1) 定义数据结构和变量 Typedef struct _MY_ELLTPSE{ CRect rect // 绘制区域 CPen pen //画笔类型 }MY_ELLIPSE; 2) 初始化绘图信息// 创建普通画笔 this->MyEllipse[0].pen.CreatePen ( PS_SOLID, 5, RGB(0,0,255) ) ; this->MyEllipse[1].pen.CreatePen ( PS_DASH, 1, RGB(0,0,255) ) ; this->MyEllipse[2].pen.CreatePen ( PS_DOT, 1, RGB(0,0,255) ) ; this->MyEllipse[3].pen.CreatePen ( PS_DASHDOT, 1, RGB(0,0,255) ) ; this->MyEllipse[4].pen.CreatePen ( PS_DASHDOTDOT, 1, RGB(0,0,255) ) ; this->MyEllipse[5].pen.CreatePen ( PS_NULL, 1, RGB(0,0,255) ) ; this->MyEllipse[6].pen.CreatePen ( PS_INSIDEFRAME, 5, RGB(0,0,255) ) ; 实验结果: 使用GDI对象CPen绘图示例: 实 验 结 果 分 析 使用GDI对象CBrush绘图示例: 使用GDI对象CBitmap绘图示例: 三个基础实验结果分析: 实 验 结 果 分 析 及 心 得 体 会 心得体会: 成 绩 评 定 教师签名: 年 月 日 年级 专业 实验名称 实 验 目 的 或 要 求 08级 计算机科学与技术 班号 计科1大班 学号 姓名 实验 类型 设计型 综合型 创新型 Huffman编码 1. 以数据结构和算法为主,把多项知识点与实践应用相结合 2. 支持对字符串形式进行编码 3. 支持对编码之后的信息进行解码,输入编码字符串以及当前码表就可以得到原来的字符串。 void CHuffmanDlg::CalcFrequent(CString str) { CString temp,temp1,str1=str,strTemp; int flag; for(int i=0;istart=n-1;//初始化 cd->weight=haffTree[i].weight; child=i; parent=haffTree[child].parent; while(parent!=-1) {//循环赋值 if(haffTree[parent].leftchild==child) cd->bit[cd->start]=0;//若为左节点,则赋值为 else cd->bit[cd->start]=1;//若为右节点,则赋值为 cd->start--; child=parent; parent=haffTree[child].parent;//交换父节点信息, } for(j=cd->start+1;jbit[j];//保存每个叶节点的编码 haffCode[i].start=cd->start+1;//保存叶节点的起始位 haffCode[i].weight=cd->weight;//保存编码对应的权值 } 4.对编码的实现,以及控件的使用 CalcFrequent(m_Input); //统计频率 //生成码表 int flag,n=m_WordForm.GetLength(); CString temp,temp1,temp2,InputTemp; HaffNode *myHaffTree=(HaffNode *)malloc(sizeof(HaffNode) *(2*n+1)); Code *myHaffCode =(Code *)malloc(sizeof(Code)*n); if(n>MaxN) { MessageBox(\"Error!\"); exit(0); } 实 验 原 理 ( 算 法 流 程 ) //生车编码树 Haffman(num,n,myHaffTree); //进行编码 HaffmanCode(myHaffTree,n,myHaffCode); m_Group.Format(\"字符 编码\\r\\n\"); for(int i=0;i