专业课程实验报告课程名称:windows程序设计开课学期:2015至2016学年第1学期专业:计算机科学与技术年级班级:2013级学生姓名:学号:实验教师:刘红俊计算机与信息科学学院软件学院实验项目名称实验课(第二次)windows程序设计实验时间11.4实验类型□验证性□设计性□综合性一、实验目的理解DC,映像模式。坐标系统,窗口可视口。学习获取绘图工具(画笔/画刷)的句柄,设置颜色。定义映像模式。学会使用常用的绘图函数。二、实验要求掌握获取字体句柄的两种方法;调用CreateFont函数创建自定义字体;调用SetTextColor和SetBkColor函数设置字体的颜色和背景色;掌握文本输出的过程(获取字体信息,格式化文本,输出文本).编写程序:在窗口上设计一行文字,要求文字能在窗口中向左滚动显示,而且每显示一轮,改变一次颜色和字体。三、实验内容与设计(主要内容,操作步骤、算法描述或程序代码)(一)实验内容:掌握获取字体句柄的两种方法;调用CreateFont函数创建自定义字体;调用SetTextColor和SetBkColor函数设置字体的颜色和背景色;掌握文本输出的过程(获取字体信息,格式化文本,输出文本).编写程序:在窗口上设计一行文字,要求文字能在窗口中向左滚动显示,而且每显示一轮,改变一次颜色和字体。(二)操作步骤:1.创建窗口if(!InitWindowClass(hInstance,nCmdShow)){MessageBox(NULL,L创建窗口失败!,_T(创建窗口),NULL);return1;}2.创建字体句柄:HDChdc;3.定义输出的字符串。以及定义字符串长度变量。定义存放客户区尺寸等变量。intwmId,wmEvent;staticintright;intlength;//字符串字节数TEXTMETRICtm;PAINTSTRUCTps;HDChdc;HFONTHFont;LPWSTRtitle=L设置字体并滚动;length=_tcslen(title);RECTclientDimension;//存放客户区的尺寸4.在switch语句中设置定时器。caseWM_CREATE:SetTimer(hWnd,9,100,NULL);//设置定时器break;caseWM_TIMER:if(wParam==9){InvalidateRect(hWnd,NULL,true);}break;5.在caseWM_PAINT:中获取客户区尺寸用户确定输出文本的起始坐标。获取right为客户区的宽度。GetClientRect(hWnd,&clientDimension);//获取客户区尺寸right=clientDimension.right;6.根据全局变量i定义switch语句。全局变量i初始值为0,所以进入case0。7.在case语句中,我首先应用SetTextColor()函数设置文本颜色,然后创建自定义字体(该字体函数在全局变量处申明过)。然后选择字体。输出文本。通过if循环改变文本输出函数中的坐标变量,使得文本从右向左移动。当移动到最左边时,改变i的值,进入下一case语句。case0:SetTextColor(hdc,RGB(255,0,0));HFont=CreateMyFont(L设置字体并滚动,10,1,1);SelectObject(hdc,HFont);TextOut(hdc,right-x,clientDimension.bottom/2,title,length);if(x(right+length))x=x+20;else{x=0;i=(i+1)%3;//即从右向左滚动完整个屏幕后开始变化字体和颜色}break;(三)算法描述:1.掌握获取字体句柄的两种方法:a.HFONThf;//hf为字体的句柄b.hf=GetStockObject();调用GetStockObject过得系统字体句柄,返回的是系统的默认字体。c.SelectObject(hdc,hf);调用函数将字体选入设备环境。2.创建自定义字体:a.HFONT=CreateFont(……)3.设置字体的颜色和背景色:a.SetTextColor(hdc,crColor);b.SetBkcolor(hdc,crColor);4.掌握文字输出过程(获取字体信息,格式化文本,输出文本)。a.GetTextMetrics(hdc,&tm);//tm为TEXTMETRIC结构。b.调用函数GetTextMetric后,就可获得文字的TEXTMETRIC信息。c.格式化处理一是在文本行中确定后续文本的坐标,二是在换行后确定下一行文本的坐标。d.TextOut是文本输出函数。里面包含hdc句柄,文本起始坐标,字符串的字节数。(四)程序代码://final.cpp:定义应用程序的入口点。//#includestdafx.h#includefinal.h#defineMAX_LOADSTRING100//全局变量:HINSTANCEhInst;//当前实例TCHARszTitle[MAX_LOADSTRING];//标题栏文本TCHARszWindowClass[MAX_LOADSTRING];//主窗口类名intx=0;inti=0;//此代码模块中包含的函数的前向声明:ATOMMyRegisterClass(HINSTANCEhInstance);BOOLInitInstance(HINSTANCE,int);LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);INT_PTRCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);HFONTCreateMyFont(LPCTSTRtitle,intheight,DWORDfdwltalic,DWORDfdwUnderline);intAPIENTRY_tWinMain(_In_HINSTANCEhInstance,_In_opt_HINSTANCEhPrevInstance,_In_LPTSTRlpCmdLine,_In_intnCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);//TODO:在此放置代码。MSGmsg;HACCELhAccelTable;//初始化全局字符串LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);LoadString(hInstance,IDC_FINAL,szWindowClass,MAX_LOADSTRING);MyRegisterClass(hInstance);//执行应用程序初始化:if(!InitInstance(hInstance,nCmdShow)){returnFALSE;}hAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_FINAL));//主消息循环:while(GetMessage(&msg,NULL,0,0)){if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return(int)msg.wParam;}////函数:MyRegisterClass()////目的:注册窗口类。//ATOMMyRegisterClass(HINSTANCEhInstance){WNDCLASSEXwcex;wcex.cbSize=sizeof(WNDCLASSEX);wcex.style=CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=WndProc;wcex.cbClsExtra=0;wcex.cbWndExtra=0;wcex.hInstance=hInstance;wcex.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_FINAL));wcex.hCursor=LoadCursor(NULL,IDC_ARROW);wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName=MAKEINTRESOURCE(IDC_FINAL);wcex.lpszClassName=szWindowClass;wcex.hIconSm=LoadIcon(wcex.hInstance,MAKEINTRESOURCE(IDI_SMALL));returnRegisterClassEx(&wcex);}////函数:InitInstance(HINSTANCE,int)////目的:保存实例句柄并创建主窗口////注释:////在此函数中,我们在全局变量中保存实例句柄并//创建和显示主程序窗口。//BOOLInitInstance(HINSTANCEhInstance,intnCmdShow){HWNDhWnd;hInst=hInstance;//将实例句柄存储在全局变量中hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);if(!hWnd){returnFALSE;}ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);returnTRUE;}////函数:WndProc(HWND,UINT,WPARAM,LPARAM)////目的:处理主窗口的消息。////WM_COMMAND-处理应用程序菜单//WM_PAINT-绘制主窗口//WM_DESTROY-发送退出消息并返回////LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){intwmId,wmEvent;staticintright;intlength;//字符串字节数TEXTMETRICtm;PAINTSTRUCTps;HDChdc;HFONTHFont;LPWSTRtitle=L设置字体并滚动;length=_tcslen(title);RECTclientDimension;//存放客户区的尺寸switch(message){caseWM_CREATE:SetTimer(hWnd,9,100,NULL);//设置定时器break;caseWM_TIMER:if(wParam==9){InvalidateRect(hWnd,NULL,true);}break;caseWM_COMMAND:wmId=LOWORD(wParam);wmEvent=HIWORD(wParam);switch(wmId){caseIDM_ABOUT:DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);break;caseIDM_EXIT:DestroyWindow(hWnd);break;default:returnDefWindowProc(hWnd,message,wParam,lParam);}break;caseWM_PAINT:hdc=BeginPaint(hWnd,&ps);GetClientRect(hWnd,&clientDimension);//获取客户区尺寸right=clientDimension.right;GetTextMetrics(hdc,&tm);/*if(right=clientDimension.le