win32实验编写程序在窗口上设计一行文字要求文字能在窗口中向左转动每显示一轮改变一次颜色和字体.docx
《win32实验编写程序在窗口上设计一行文字要求文字能在窗口中向左转动每显示一轮改变一次颜色和字体.docx》由会员分享,可在线阅读,更多相关《win32实验编写程序在窗口上设计一行文字要求文字能在窗口中向左转动每显示一轮改变一次颜色和字体.docx(17页珍藏版)》请在冰豆网上搜索。
win32实验编写程序在窗口上设计一行文字要求文字能在窗口中向左转动每显示一轮改变一次颜色和字体
专业课程实验报告
课程名称:
windows程序设计
开课学期:
2021至2016学年第1学期
专业:
运算机科学与技术年级班级:
2021级
学生姓名:
学号:
实验教师:
刘红俊
运算机与信息科学学院软件学院
实验项目名称
实验课(第二次)windows程序设计
实验时间
实验类型
□验证性□设计性□综合性
一、实验目的
●理解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=;
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,/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句柄,文本起始坐标,字符串的字节数。
(四)程序代码:
//:
定义应用程序的入口点。
//
#include""
#include""
#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,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(int);
}
//
//函数:
MyRegisterClass()
//
//目的:
注册窗口类。
//
ATOMMyRegisterClass(HINSTANCEhInstance)
{
WNDCLASSEXwcex;
=sizeof(WNDCLASSEX);
=CS_HREDRAW|CS_VREDRAW;
=WndProc;
=0;
=0;
=hInstance;
=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_FINAL));
=LoadCursor(NULL,IDC_ARROW);
=(HBRUSH)(COLOR_WINDOW+1);
=MAKEINTRESOURCE(IDC_FINAL);
=szWindowClass;
=LoadIcon,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=;
GetTextMetrics(hdc,&tm);
/*if(right<={
right=;
i=0;
}*/
//for(intk=0;k<3;k++){
switch(i)
{
case0:
SetTextColor(hdc,RGB(255,0,0));
HFont=CreateMyFont(L"设置字体并滚动",10,1,1);
SelectObject(hdc,HFont);
TextOut(hdc,right-x,/2,title,length);
if(x<(right+length))
x=x+20;
else
{
x=0;
i=(i+1)%3;//即从右向左滚动完整个屏幕后开始变化字体和颜色
}
break;
case1:
SetTextColor(hdc,RGB(255,255,0));
HFont=CreateMyFont(L"设置字体并滚动",20,0,0);//创建自定义字体
//SelectObject(hdc,hp);
SelectObject(hdc,HFont);
TextOut(hdc,right-x,/2,title,length);
if(x<(right+length))
x=x+20;
else
{
x=0;
i=(i+1)%3;//即从右向左滚动完整个屏幕后开始变化字体和颜色
}
break;
case2:
//hp=CreatePen(PS_SOLID,2,RGB(0,0,255));//创建画笔
SetTextColor(hdc,RGB(255,0,255));
HFont=CreateMyFont(L"设置字体并滚动",30,0,1);//创建自定义字体
//SelectObject(hdc,hp);
SelectObject(hdc,HFont);
//TextOut(hdc,right-x,/2,title,length);
if(x<(right+length))
{TextOut(hdc,right-x,/2,title,length);
x=x+20;}
else
{
x=0;
i=(i+1)%3;//即从右向左滚动完整个屏幕后开始变化字体和颜色
}
break;
}
EndPaint(hWnd,&ps);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
return0;
}
HFONTCreateMyFont(LPCTSTRtitle,intheight,DWORDfdwltalic,DWORDfdwUnderline)
{
returnCreateFont(
height,
0,
0,
0,
FW_HEAVY,
fdwltalic,
fdwUnderline,
0,
GB2312_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE,
title
);
}
//“关于”框的消息处理程序。
INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam)
{
UNREFERENCED_PARAMETER(lParam);
switch(message)
{
caseWM_INITDIALOG:
return(INT_PTR)TRUE;
caseWM_COMMAND:
if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL)
{
EndDialog(hDlg,LOWORD(wParam));
return(INT_PTR)TRUE;
}
break;
}
return(INT_PTR)FALSE;
}
三、测试数据和执行结果(在给定数据下,执行操作、算法和程序的结果,可使用数据、图表、截图等给出)
第一内容测试结果:
●第一轮字体滚动:
●第二轮字体滚动:
●第三轮字体滚动:
四、实验结果分析及总结(对实验的结果是否达到预期进行分析,总结实验的收获和存在的问题等)
1.在做这个实验的时候,我首先想到的是如何实现字体的滚动,我参考网上的资料,通过:
right=*i;
if(right<={
right=;
i=0;
}
来实现字体的滚动,但是实现字体滚动后,字体并不能随着移动的刷新而实现字体和颜色的刷新。
2.随后,我想到,可以设置全局变量坐标点,通过在循环里改变坐标点的值来实现字体从右到左的移动,并设置if语句,实现case的跳跃。
3.在实现文本输出函数时,我最开始没有透彻理解全局变量的应用。
TextOut函数写在if语句外面时,没有理解为什么if语句中x的变化会引起初始坐标的变化,当我意识到x是全局变量时,意识到了自己基础知识还很薄弱。
4.在if语句中,文本的初始坐标是right-x,x=0,也就是初始坐标是最右边,我通过增加x的值:
x=x+20,来改变文本的坐标,使文本向左移动,直到移动到最左边。
此时x置0,文本重新从最右边输出,i的值改变使得进入下一个case,每一轮字体颜色及字体的改变通过设置case循环来实现。
当到最后一个case时,我结束switch语句,Timer刷新。
教
实验内容和设计(A-E):
师
评
阅
操作过程、算法或代码(A-E):
实验结果(A-E):
实验分析和总结(A-E):
实验成绩(A-E):
反馈评语: