C语言实训报告

实 训 报 告

桌面万年历设计与开发

姓名***

专业名称: 班 级 学 号:

信息科学与工程学院

二零一三年十一月

信息科学与工程学院软件实践实训报告

目 录

1. 概述 ................................ 错误!未定义书签。

2. 相关技术 ............................ 错误!未定义书签。

2.1 win32 消息机制 ............................ 错误!未定义书签。

2.2 Windows API 函数 .......................... 错误!未定义书签。

2.3 Windows对话框 ............................ 错误!未定义书签。

2.4 bmp图像处理技术 .......................... 错误!未定义书签。

3. 总体设计与详细设计................... 错误!未定义书签。

3.1 系统模块划分 .............................. 错误!未定义书签。

3.2 主要功能模块 .............................. 错误!未定义书签。

4. 编码实现 ............................ 错误!未定义书签。

5. 实训中遇到的主要问题及解决方法 ....... 错误!未定义书签。

6. 实训体会 ............................ 错误!未定义书签。

2

信息科学与工程学院软件实践实训报告

1. 概述

本项目是桌面小时钟的实现,表盘上可以实现星期、年月日、时分秒、生肖以及天干地支,右击可以打开延伸项目,包括进入日历、表盘风格、以及退出等选型,在日历表中可以实现从1901-20xx年公历农历 以及周几的查询,在日历表格中也可以进行换肤操作,本项目还有整点报时的功能,到整点会自动播放音乐报时,同时还有音乐,通过“音乐”“停止”这两个按钮来实现对音乐开关的控制。

2. 相关技术

2.1 win32 消息机制

消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。消息本身是作为一个记录传递给应用程序的,这个记录(一般在 C/Java/汇编中称为“结构体”)中包含了消息的类型以及其他信息。根据已给样本的提示,绘制了日历的矩形背景,并且也根据公历日期来计算出农历日期,并且标注了一些重要节日,像“春节 、元宵节、清明节、端午节、中秋节”等一些重要的节日,并且将节假日的字体颜色设置为蓝色,然后又写了获取当前系统本机时间的函数,成功的获得了当前本机的时间。

2.2 Windows API 函数

GetLocalTime: 获得当前时间(公历:年、月、日、周)

CreateCompatibleDC :申请内存空间,创建一个内存设备场景

MoveToEx: 移动划线的起点

LoadImage: 装载图标,光标,或位图

LineTo: 绘制到某一点

SetTextColor: 设置要绘制的文字颜色

RGB: 设置RGB颜色

TextOut: 绘制文字

SetBkMode: 设置背景显示模式

wsprintf: 整数转换为字符串,宽字符,用Unicode码

GetClientRect:获取窗口大小

GetDC: 获取内存设备

SetTimer: 设置定时器

FillRect: 填充矩形

CreateSolidBrush:创建刷子

CreateFont: 创建一种有特殊性的字体

SYSTEMTIME: 描述时间类型,包括年月日、时分秒、周(结构体类型)

2.3 Windows对话框

Windows下的模式对话框和非模式对话框切换技术、非模式对话框的隐藏。

对话框分为两类:「模态的」和「非模态的」,其中模态对话框最为普遍。当您的程序显示一个模态对话框时,使用者不能在对话框与同一个程序中的另一个窗口之间进行切换,使用者必须主动结束该对话框,这由通过按一下「OK」或者「Cancel」键来完成。不过,在显示模态对话框时,使用者通常可以从目前的程序切换到另一个程序。而有些对话框(称为「系统模态」)甚至连这样的切换程序操作也不允许。在Windows中,显示了系统模态对话框之后,要完成其它任何工作,都必须先结束该对话框。

3

信息科学与工程学院软件实践实训报告

2.4 bmp图像处理技术

BMP是bitmap的缩写形式,bitmap顾名思义就是位图也即windows位图。使用bmp图像处理技术,以及屏蔽绘图机制。将两张相同的图片通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。

3. 总体设计与详细设计

3.1 系统模块划分

桌面万年历程序是典型的Windows界面程序,根据需求文档中要求的功能,以及Windows程序的特点,将系统分为三个子系统:主界面子系统、日历显示子系统、参数设定子系统,这样设计简单易实现。

其中,主界面子系统负责程序主界面的显示、程序主逻辑的控制、以及其他子系统的调用。日历显示子系统负责万年历计算、显示。参数设定子系统负责皮肤等设定。

下图是三个子系统之间的逻辑关系图:

3.2 主要功能模块

3.2.1主界面子系统

主界面子系统负责程序主界面的显示、程序主逻辑的控制、以及其他子系统的调用。分为以下模块:程序入口模块、主界面消息处理模块、主界面贴图模块、时间处理模块。

下图是模块之间的关系图。

C语言实训报告

4

信息科学与工程学院软件实践实训报告

其中,程序入口模块,是Windows程序的入口函数,在该模块内创建主界面。消息处理模块负责响应用户的鼠标和键盘操作。时间处理模块负责时间运算和显示。界面贴图模块负责主界面的图像显示。以下是各模块的详细说明。

C语言实训报告

C语言实训报告

3.2.2日历显示子系统

5

信息科学与工程学院软件实践实训报告

其中,消息处理模块负责响应用户的鼠标和键盘操作。日期处理及显示模块负责万年历

C语言实训报告

C语言实训报告

6

信息科学与工程学院软件实践实训报告

C语言实训报告

3.2.3参数设定子系统

参数设定子系统负责设定皮肤、整点报时、尺寸大小、闹铃和备忘录的设定,该子系统

C语言实训报告

皮肤的更换:

C语言实训报告

7

信息科学与工程学院软件实践实训报告

4. 编码实现

#include <Windows.h>

#include <string.h>

#include <mmsystem.h>

#include <wingdi.h>

#include "resource.h"

#include <math.h>

#include <commdlg.h>

#pragma comment(lib,"WinLib.lib")

#pragma comment(lib,"WINMM.LIB")//导入声音用

void SetDlgMenuID(UINT nMainDlgID,UINT nCalendarDlgID,UINT nMenuID);

void SetButtonID(UINT nCalendarID,UINT nExitID,UINT nBiaoPan1,UINT nBiaoPan2,UINT nBiaoPan3,UINT nBiaoPan4);

INT_PTR ShowMainDlg();

HINSTANCE g_hInst;//保存操作系统传递进来的"应用程序实例句柄"

//Windows程序入口函数

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,

{

}

// SetLayeredWindowAttributes(HDC hdc, COLORREF crKey, BYTE bAlpha, DWORD dwFlags );

typedef struct _stDateTime

{

int nYear; int nMonth; int nDay; g_hInst = hInstance; SetDlgMenuID(IDD_DLG_CLOCK,IDD_DLG_CALENDAR,IDR_MENU); SetButtonID(ID_CALENDAR,ID_EXIT,ID_BIAO1,ID_BIAO2,ID_BIAO3,ID_BIAO4); ShowMainDlg(IDD_DLG_CLOCK); LPSTR lpCmdLine, int nShowCmd )

}stDateTime;

//定义表格,存储年-20xx年的农历信息:每年的大小月、闰月信息、春节所在的公历日期

unsigned int LunarCalendarTable[199] =

{

0x04AE53,0x0A5748,0x5526BD,0x0D2650,0x0D9544,0x46AAB9,0x056A4D,0x09AD42,0x24AEB6,0x040x6A4DBE,0x0A4D52,0x0D2546,0x5D52BA,0x0B544E,0x0D6A43,0x296D37,0x095B4B,0x749BC1,0x00x0A4B48,0x5B25BC,0x06A550,0x06D445,0x4ADAB8,0x02B64D,0x095742,0x2497B7,0x04974A,0x6640x0D4A51,0x0EA546,0x56D4BA,0x05AD4E,0x02B644,0x393738,0x092E4B,0x7C96BF,0x0C9553,0x0DAE4A,/*1901-1910*/ 49754,/*1911-1920*/ B3E,/*1921-1930*/ 8

信息科学与工程学院软件实践实训报告

4A48,/*1931-1940*/

};

char* TianGanDizhi[60]=

{

}; "甲子", "乙丑","丙寅","丁卯","戊辰","已巳","庚午","辛未","壬申","癸酉", "甲戌","乙亥","丙子","丁丑","戊寅","已卯","庚辰","辛巳","壬午","癸未", "甲申","乙酉","丙戌","丁亥","戊子","已丑","庚寅","辛卯","壬辰","癸巳", "甲午","乙未","丙申","丁酉","戊戌","已亥","庚子","辛丑","壬寅","癸卯", "甲辰","乙巳","丙午","丁未","戊申","已酉","庚戌","辛亥","壬子","癸丑", "甲寅","乙卯","丙辰","丁巳","戊午","已未","庚申","辛酉","壬戌","癸亥" 0x6DA53B,0x0B554F,0x056A45,0x4AADB9,0x025D4D,0x092D42,0x2C95B6,0x0A954A,0x7B4ABD,0x00x0B5546,0x555ABB,0x04DA4E,0x0A5B43,0x352BB8,0x052B4C,0x8A953F,0x0E9552,0x06AA48,0x6A0x0AB54F,0x04B645,0x4A5739,0x0A574D,0x052642,0x3E9335,0x0D9549,0x75AABE,0x056A51,0x0960x54AEBB,0x04AD4F,0x0A4D43,0x4D26B7,0x0D254B,0x8D52BF,0x0B5452,0x0B6A47,0x696D3C,0x00x049B45,0x4A4BB9,0x0A4B4D,0xAB25C2,0x06A554,0x06D449,0x6ADA3D,0x0AB651,0x093746,0x50x04974F,0x064B44,0x36A537,0x0EA54A,0x86B2BF,0x05AC53,0x0AB647,0x5936BC,0x092E50,0x0C90x4D4AB8,0x0D4A4C,0x0DA541,0x25AAB6,0x056A49,0x7AADBD,0x025D52,0x092D47,0x5C95BA,0x0x0B4A43,0x4B5537,0x0AD54A,0x955ABF,0x04BA53,0x0A5B48,0x652BBC,0x052B50,0x0A9345,0x470x06AA4C,0x0AD541,0x24DAB6,0x04B64A,0x69573D,0x0A4E51,0x0D2646,0x5E933A,0x0D534D,0x00x36B537,0x096D4B,0xB4AEBF,0x04AD53,0x0A4D48,0x6D25BC,0x0D254F,0x0D5244,0x5DAA38,0x00x056D41,0x24ADB6,0x049B4A,0x7A4BBE,0x0A4B51,0x0AA546,0x5B52BA,0x06D24E,0x0ADA42,0x0x09374B,0x8497C1,0x049753,0x064B48,0x66A53C,0x0EA54F,0x06B244,0x4AB638,0x0AAE4C,0x0920x3C9735,0x0C9649,0x7D4ABD,0x0D4A51,0x0DA545,0x55AABA,0x056A4E,0x0A6D43,0x452EB7,0x00x8A95BF,0x0A9553,0x0B4A47,0x6B553B,0x0AD54F,0x055A45,0x4A5D38,0x0A5B4C,0x052B42,0x3A0x069349,0x7729BD,0x06AA51,0x0AD546,0x54DABA,0x04B64E,0x0A5743,0x452738,0x0D264A,0x8E0x0D5252,0x0DAA47,0x66B53B,0x056D4F,0x04AE45,0x4A4EB9,0x0A4D4C,0x0D1541,0x2D92B5 6CA51,/*1941-1950*/ D53C,/*1951-1960*/ D46,/*1961-1970*/ 95B50,/*1971-1980*/ 497BB,/*1981-1990*/ 645,/*1991-2000*/ 0A954E,/*2001-2010*/ 4AB9,/*2011-2020*/ 5AA43,/*2021-2030*/ B5A4C,/*2031-2040*/ 355B37,/*2041-2050*/ E42,/*2051-2060*/ 52D4B,/*2061-2070*/ 93B6,/*2071-2080*/ 933E,/*2081-2090*/ /*2091-2099*/

9

信息科学与工程学院软件实践实训报告

char *ChDayTable[] =

{

};

char *ChMonthTable[] = {"*","正","二","三","四","五","六","七","八","九","十","十一","腊"};

unsigned int MonthAdd[12] = {0,31,59,90,120,151,181,212,243,273,304,334};

unsigned int nCurrentYear=0; //button控制年

unsigned int nCurrentMonth=0;//月

unsigned int nCurrentDay=0; //日

UINT Total=0; //自定义的变量,当月的总天数

UINT PreTotal=0; //自定义的当月的前一月的总天数

UINT CurScan=0; //button控制皮肤

UINT SONG=0; //button控制音乐

//TCHAR Hours[255];

SYSTEMTIME BellTime;

UINT Inthour=0;

//判断某年是否为公历闰年

int IsLeapYear(WORD iYear) //学生需要修改此函数(已经修改)

{

}

//公历日期转农历日期的函数

void SunToLunar(const stDateTime* pSunDay,stDateTime* pLunarDay)

{

int i=0; int SunDiff=0; int SpringDiff=0; if((iYear%100!=0 && iYear%4==0)||(iYear%400==0)) else return 0; return 1; "*","初一","初二","初三","初四","初五", "初六","初七","初八","初九","初十", "十一","十二","十三","十四","十五", "十六","十七","十八","十九","二十", "廿一","廿二","廿三","廿四","廿五", "廿六","廿七","廿八","廿九","三十"

10

信息科学与工程学院软件实践实训报告

} for(;;) { } nSpringDay =x+1; //如果有闰月 if(nSpringMonth>bLunar && bLunar>0) nSpringMonth--; int a = (LunarCalendarTable[pSunDay->nYear-1901] & (0x80000>>i));//计算大小月 if(a==0) else i++; nSpringMonth++; a=30; break; if(x<a) x =x - a; a=29; i=0; nSpringMonth=1; if(SunDiff>=SpringDiff)//公历日在春节后 { int x = SunDiff - SpringDiff; int bLunar = (LunarCalendarTable[nSpringYear - 1901] & 0xF00000)>>20;//闰月月份 //SunDiff和SpringDiff的差就是当前公历日离春节的天数 //计算春节所在公历日离元旦的天数:通过查表,计算当年的春节所在的公历日期, if(((LunarCalendarTable[pSunDay->nYear - 1901] & 0x60)>>5)==1)//若春节在公历月 SpringDiff= (LunarCalendarTable[pSunDay->nYear-1901]&0x1F)-1; SpringDiff= (LunarCalendarTable[pSunDay->nYear-1901]&0x1F)-1+31; else//若春节在公历月 //计算当前公历日离当年元旦的天数 SunDiff = MonthAdd[pSunDay->nMonth-1] + pSunDay->nDay - 1; if(IsLeapYear(pSunDay->nYear) && (pSunDay->nMonth > 2) )//若是闰年且大于月,天数再加 SunDiff++; int nSpringYear=pSunDay->nYear; int nSpringMonth=1; int nSpringDay=0;

11

信息科学与工程学院软件实践实训报告

}

//根据公历日期获得星期 } pLunarDay->nYear = nSpringYear; pLunarDay->nMonth= nSpringMonth; pLunarDay->nDay = nSpringDay; if(nSpringMonth<bLunar && bLunar>0) nSpringMonth++; } nSpringDay =x+1; if(x<a) { } x =x - a; i++; nSpringMonth--; x = a-x; break; for(;;) { int a = (LunarCalendarTable[nSpringYear-1901] & (nShift<<i));//计算大小月 if(a==0) else a=30; a=29; if (bLunar == 0)//如果没有闰月 else nShift = 0x80; nShift = 0x100; i=0; nSpringYear--;//需要上一年的农历信息 nSpringMonth=12;//从最后一个月开始计算 int bLunar = (LunarCalendarTable[nSpringYear - 1901] & 0xF00000)>>20;//闰月月份 int x = SpringDiff-SunDiff; int nShift=0; else//公历日在春节前 {

12

信息科学与工程学院软件实践实训报告

int GetDayOfWeek(const stDateTime* pSunDay) {

}

//根据公立年得到农历干支年

char* GetGanZhi(int nYear)

{

}

//日历绘制函数,学生自己实现该函数

void DrawCalendar(HDC hDC,int nWidth,int nHeight) {

//获得日历的背景色

stDateTime SunDay,LunarDay; //存储当时年月日 SYSTEMTIME DateTime; //系统时间 SYSTEMTIME LocTime; int i=(nYear-1984)%60; return TianGanDizhi[i]; return nWeek; nWeek = nYear1/4 - 2*nYear1 + nYear2 + nYear2/4 + (26*(nMonth+1))/10 + nDay - 1; if(nWeek < 0) nWeek = ((nWeek)%7+7);// 有问题吗?nWeek可能小于零,循环加 else nWeek = (nWeek)%7; if(nMonth==1 || nMonth==2) { } nMonth=12+nMonth; nYear1=(pSunDay->nYear-1)/100;//年的前两位数字 nYear2=(pSunDay->nYear-1)%100;//年的后两位数字 int nMonth=pSunDay->nMonth;//公立月数,所求的月份如果是月或月, //则应视为上一年的月或月, //也就是公式中nMonth的取值范围是从到而不是从到 //根据泰勒公式 //nWeek = [nYear1÷] - 2*nYear1 + nYear2 + [nYear2÷] + [26(nMonth+1)÷] + nDay - 1 int nWeek=0; int nYear1=pSunDay->nYear/100;//年的前两位数字 int nYear2=pSunDay->nYear%100;//年的后两位数字 int nDay=pSunDay->nDay; //公立日

13

信息科学与工程学院软件实践实训报告

TCHAR HTime[255];

//绘制日历的矩形背景(改变皮肤)(大皮肤)

switch(CurScan)

{

case 0:

hdc = CreateCompatibleDC(hDC);

//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/12.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进UINT ShengXiao=0; HBITMAP hBkmap; HDC hdc; UINT Week=0;//列数 UINT Hang=0;//行数 TCHAR Str[255],Str1[255],Today[255];//农历和公历年月字符 UINT week=0; UINT hangkuan=0,liekuan=0; UINT First=0; UINT xLeft=0; UINT yRigth=0; TCHAR *WeekDay[] = {"星期天","星期一","星期二","星期三","星期四","星期五","星期六"}; RECT rc,rect; HBRUSH hBrush; HFONT hFont; TCHAR RILI[255]; //日历的标题 TCHAR GraTime[255]; //表格日期 UINT xOrg=60; //x起始坐标 UINT yOrg=60; //y起始坐标 UINT xRight=nWidth-48; //X的右端不包括 UINT yBottom = nHeight; //Y的底部 UINT i=0,biaoGe=0; //日历表格用 14

信息科学与工程学院软件实践实训报告

行位块(bit_block)转换,以传送到目标设备环境。

SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/13.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); case 1: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/14.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 2: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/15.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 3: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/16.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 4: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; 行位块(bit_block)转换,以传送到目标设备环境。

case 5:

15

信息科学与工程学院软件实践实训报告

hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/17.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/18.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 6: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/19.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 7: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/20.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 8: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/21.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 9: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的 16

信息科学与工程学院软件实践实训报告

相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/22.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 10: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; hdc = CreateCompatibleDC(hDC);//创建一个与指定设备兼容的内存设备上下文环境(DC)。 "../image/背景/23.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 行位块(bit_block)转换,以传送到目标设备环境。 case 11: hBkmap = (HBITMAP)LoadImage(g_hInst,

SelectObject(hdc,hBkmap);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

}

SelectObject(hdc,hBkmap); BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY); //绘制日历的矩形背景(改变皮肤)(小皮肤) { case 0: break; case 1: "../image/背景/1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/背景/0.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); BitBlt(hDC,0,0,nWidth,nHeight,hdc,0,0,SRCCOPY);//该函数对指定的源设备环境区域中的像素进 SetBkMode(hDC,TRANSPARENT); break; 行位块(bit_block)转换,以传送到目标设备环境。 hdc = CreateCompatibleDC(hDC); switch(nCurrentMonth%12) hBkmap = (HBITMAP)LoadImage(g_hInst,

17

信息科学与工程学院软件实践实训报告

break; case 2: break; "../image/背景/2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hBkmap= (HBITMAP)LoadImage(g_hInst,

case 3:

hBkmap = (HBITMAP)LoadImage(g_hInst,

break; "../image/背景/3.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

case 4:

hBkmap = (HBITMAP)LoadImage(g_hInst,

break; "../image/背景/4.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

case 5:

hBkmap = (HBITMAP)LoadImage(g_hInst,

break; "../image/背景/5.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

case 6:

hBkmap = (HBITMAP)LoadImage(g_hInst,

break; "../image/背景/6.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

case 7:

hBkmap = (HBITMAP)LoadImage(g_hInst,

break; "../image背景/7.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

case 8:

hBkmap = (HBITMAP)LoadImage(g_hInst,

break; "../image/背景/8.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

case 9:

hBkmap = (HBITMAP)LoadImage(g_hInst,

break; "../image/背景/9.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

case 10:

hBkmap = (HBITMAP)LoadImage(g_hInst, 18

信息科学与工程学院软件实践实训报告

break; "../image/背景/10.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

case 11:

hBkmap = (HBITMAP)LoadImage(g_hInst,

} BitBlt(hDC,60,60,nWidth-108,nHeight-40,hdc,0,0,SRCCOPY); { case 0: break; "../image/背景/11.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(hdc,hBkmap); switch(SONG%12)

break;

case 1:

mciSendString("stop ../image/sound/1.mp3","",0,NULL); mciSendString("play ../image/sound/2.mp3","",0,NULL); break;

case 2:

mciSendString("stop ../image/sound/2.mp3","",0,NULL); mciSendString("play ../image/sound/3.mp3","",0,NULL); break;

case 3:

mciSendString("stop ../image/sound/3.mp3","",0,NULL); mciSendString("play ../image/sound/4.mp3","",0,NULL); break;

case 4:

mciSendString("stop ../image/sound/4.mp3","",0,NULL); mciSendString("play ../image/sound/5.mp3","",0,NULL); break;

case 5:

mciSendString("stop ../image/sound/5.mp3","",0,NULL); mciSendString("play ../image/sound/6.mp3","",0,NULL); break;

case 6:

mciSendString("stop ../image/sound/6.mp3","",0,NULL);

mciSendString("play ../image/sound/7.mp3","",0,NULL); break;

case 7:

mciSendString("stop ../image/sound/7.mp3","",0,NULL); mciSendString("play ../image/sound/8.mp3","",0,NULL); break;

19

信息科学与工程学院软件实践实训报告

case 8:

mciSendString("stop ../image/sound/8.mp3","",0,NULL);

mciSendString("play ../image/sound/9.mp3","",0,NULL); break;

case 9:

mciSendString("stop ../image/sound/9.mp3","",0,NULL); mciSendString("play ../image/sound/10.mp3","",0,NULL); break;

case 10:

mciSendString("stop ../image/sound/10.mp3","",0,NULL); mciSendString("play ../image/sound/11.mp3","",0,NULL); break;

case 11:

mciSendString("stop ../image/sound/10.mp3","",0,NULL);

//列 biaoGe = xRight-xOrg;//只是日历的宽度 biaoGe = biaoGe/7;//要七列 liekuan=biaoGe; for(i=0;i<6;i++)//画七列 { } MoveToEx(hDC,xOrg+biaoGe*(i+1),yOrg,NULL); LineTo(hDC,xOrg+biaoGe*(i+1),yBottom); //星期标题框 MoveToEx(hDC,xOrg,yOrg+28,NULL); LineTo(hDC,xRight,yOrg+28); LineTo(hDC,xRight,yOrg); //行 biaoGe = yBottom-yOrg-20;//只是日历的高度 biaoGe = biaoGe/6;//高度分为六块 hangkuan=biaoGe; for(i=0;i<5;i++)//画五行 { } MoveToEx(hDC,xOrg,yOrg+27+biaoGe*(i+1),NULL); LineTo(hDC,xRight,yOrg+27+biaoGe*(i+1)); mciSendString("play ../image/sound/11.mp3","",0,NULL); } break; MoveToEx(hDC,xOrg,yOrg,NULL);

20

信息科学与工程学院软件实践实训报告

SetTextColor(hDC,RGB(106,90,205)); //字体颜色

GetLocalTime(&LocTime); wsprintf(HTime,"%.2d:%.2d:%.2d",LocTime.wHour,LocTime.wMinute,LocTime.wSecond); SetTextColor(hDC,RGB(106,90,205));//日历上显示时间字体颜色 SetBkMode(hDC,3); TextOut(hDC,2,80,HTime,8) ; SunDay.nYear = nCurrentYear; SunDay.nMonth = nCurrentMonth; SunDay.nDay = nCurrentDay; SunToLunar(&SunDay,&LunarDay);//得到农历 TextOut(hDC,450,40,ChMonthTable[LunarDay.nMonth], strlen(ChMonthTable[LunarDay.nMonth]));//农历显示 TextOut(hDC,480,40,"月",strlen("月")); SunDay.nDay = 1; wsprintf(GraTime,"%.4d年%.2d月%.2d日",nCurrentYear,nCurrentMonth,nCurrentDay);//现在时间 TextOut(hDC,50,40,GraTime,strlen(GraTime));//公历显示 //以下代码是公历显示 if(nCurrentYear==0)//如果当前日期还没有被设定 { } GetLocalTime(&DateTime); nCurrentYear = DateTime.wYear; nCurrentMonth= DateTime.wMonth; nCurrentDay =DateTime.wDay; SetTextColor(hDC,RGB(255,0,0));//日历上星期六、年月日的字体颜色 TextOut(hDC,xOrg+12+biaoGe*6,yOrg+5,WeekDay[6],strlen(WeekDay[6])); SetTextColor(hDC,RGB(0,0,0)); for(i=1;i<6;i++)//星期一到五的字体颜色 { } TextOut(hDC,xOrg+12+biaoGe*i,yOrg+5,WeekDay[i],strlen(WeekDay[i])); //绘制‘星期’标题框内的文字 SetTextColor(hDC,RGB(255,0,0)); TextOut(hDC,xOrg+12,yOrg+5,WeekDay[0],strlen(WeekDay[0]));//星期日的字体颜色 //十二生肖图片 hdc = CreateCompatibleDC(hDC);

21

信息科学与工程学院软件实践实训报告

switch((nCurrentYear-4)%12) { case 0: hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/0.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/3.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/4.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/5.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/6.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/7.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/8.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/9.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: 22

信息科学与工程学院软件实践实训报告

//前一月的总天数 if(SunDay.nMonth==1) { } else if(SunDay.nMonth==12) else PreTotal=MonthAdd[SunDay.nMonth-1]-MonthAdd[SunDay.nMonth-2]; First=GetDayOfWeek(&SunDay); //该月的第一天是星期几 for(i=1;i<=Total;i++) { SunDay.nYear = nCurrentYear; SunDay.nMonth = nCurrentMonth; PreTotal=30; PreTotal=28; if(IsLeapYear(SunDay.nYear)) PreTotal++; PreTotal=31; else if(SunDay.nMonth==3) //该月的总天数 if(SunDay.nMonth==12) { } else { } Total++; Total=MonthAdd[SunDay.nMonth]-MonthAdd[SunDay.nMonth-1]; if(IsLeapYear(SunDay.nYear)&&SunDay.nMonth==2) //PreTotal=30; Total=31; } SelectObject(hdc,hBkmap); BitBlt(hDC,7,25,150,150,hdc,0,0,SRCCOPY); "../image/shengxiao/10.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; hBkmap = (HBITMAP)LoadImage(g_hInst, "../image/shengxiao/11.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); break; case 11: 23

信息科学与工程学院软件实践实训报告

SetTextColor(hDC,RGB(0,0,255));//节日颜色 if(SunDay.nMonth==1&&SunDay.nDay==1) { } else if(SunDay.nMonth==2&&SunDay.nDay==14) { } else if(SunDay.nMonth==3&&SunDay.nDay==12) { } else if(SunDay.nMonth==4&&SunDay.nDay==1) TextOut(hDC,xLeft-12,yRigth-8,"植树节",strlen("植树节")); TextOut(hDC,xLeft-12,yRigth-8,"情人节",strlen("情人节")); TextOut(hDC,xLeft-12,yRigth-8,"元旦",strlen("元旦"));//显示公历 SetRect (&rc,xOrg+(Week)*liekuan,yOrg+27+(Hang)*hangkuan ,xOrg+(Week)*liekuan+liekuan,yOrg+27+(Hang)*hangkuan+hangkuan); } if(nCurrentYear==SunDay.nYear&&nCurrentMonth==SunDay.nMonth&&nCurrentDay==i)//动态显{ if(DateTime.wYear==SunDay.nYear&&DateTime.wMonth==SunDay.nMonth&&DateTime.wDay==i)//显 { SetRect (&rc,xOrg+(Week)*liekuan,yOrg+27+(Hang)*hangkuan ,xOrg+(Week)*liekuan+liekuan,yOrg+27+(Hang)*hangkuan+hangkuan); 示今天 xLeft=xOrg+15+(Week)*liekuan; yRigth=yOrg+40+(Hang)*hangkuan; SunDay.nDay=i; //从一号开始 week=GetDayOfWeek(&SunDay);//得到该月第i号是星期几 Week=week%7; //从第Week列开始 Hang=((First+i-1)-(First+i-1)%7)/7; //从第Hang行开始 SunToLunar(&SunDay,&LunarDay);//得到农历 hBrush=CreateSolidBrush(RGB(65,105,225)); FillRect(hDC,&rc,hBrush); 示每一天 //SetLayeredWindowAttributes(hdc, RGB(255,110,211), 50,LWA_COLORKEY); hBrush=CreateSolidBrush(RGB(0,0,255));//日历当日颜色填充 FillRect(hDC,&rc,hBrush); } 24

信息科学与工程学院软件实践实训报告

//显示农历 { } else if(SunDay.nMonth==5&&SunDay.nDay==1) { } else if(SunDay.nMonth==6&&SunDay.nDay==1) { } else if(SunDay.nMonth==7&&SunDay.nDay==1) { } else if(SunDay.nMonth==8&&SunDay.nDay==1) { } else if(SunDay.nMonth==9&&SunDay.nDay==10) { } else if(SunDay.nMonth==10&&SunDay.nDay==1) { } else if(SunDay.nMonth==11&&SunDay.nDay==11) { } else if(SunDay.nMonth==12&&SunDay.nDay==25) { } else { } wsprintf(Str,"%i",i); TextOut(hDC,xLeft,yRigth,Str,strlen(Str)); //显示公历 SetTextColor(hDC,RGB(153,51,250)); TextOut(hDC,xLeft-12,yRigth-8,"圣诞节",strlen("圣诞节")); TextOut(hDC,xLeft-12,yRigth-8,"光棍节",strlen("光棍节")); TextOut(hDC,xLeft-12,yRigth-8,"国庆节",strlen("国庆节")); TextOut(hDC,xLeft-12,yRigth-8,"教师节",strlen("教师节")); TextOut(hDC,xLeft-12,yRigth-8,"建军节",strlen("建军节")); TextOut(hDC,xLeft-12,yRigth-8,"建党节",strlen("建党节")); TextOut(hDC,xLeft-12,yRigth-8,"儿童节",strlen("儿童节")); TextOut(hDC,xLeft-12,yRigth-8,"劳动节",strlen("劳动节")); TextOut(hDC,xLeft-12,yRigth-8,"愚人节",strlen("愚人节"));

25

信息科学与工程学院软件实践实训报告

}

// 因此,可以理解为,该函数和DrawCalendar函数是联动的 void CalendarButtonEvent(UINT nID,HWND hDlg) {

UINT MeBox; TCHAR szFile[255]; TCHAR Hours[255]; hFont=CreateFont(25,15,0,67,FW_NORMAL,TRUE,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLI ,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS, "宋体"); //字体输出格式 P_DEFAULT_PRECIS SelectObject(hDC,hFont); SetTextColor(hDC,RGB(228,100,55)); wsprintf(RILI,"BY姜晓燕"); TextOut(hDC,160,6,RILI,8); }//for SetTextColor(hDC,RGB(127,0,255));//节日颜色 if(LunarDay.nMonth==1&&LunarDay.nDay==1) { } else if(LunarDay.nMonth==1&&LunarDay.nDay==15) { } else { } SetTextColor(hDC,RGB(75,249,75)); if(LunarDay.nDay==1)//月初改为月名 { } else TextOut(hDC,xLeft,yRigth+15,ChDayTable[LunarDay.nDay], strlen(ChDayTable[LunarDay.nDay]));//农历显示 TextOut(hDC,xLeft,yRigth+15,ChMonthTable[LunarDay.nMonth], strlen(ChMonthTable[LunarDay.nMonth])); TextOut(hDC,xLeft+20,yRigth+15,"月",strlen("月")); TextOut(hDC,xLeft,yRigth+15,"元宵节",strlen("元宵节"));//农历显示 TextOut(hDC,xLeft,yRigth+15,"春节",strlen("春节"));//农历显示

26

信息科学与工程学院软件实践实训报告

nCurrentYear=0; break; { nCurrentDay++; if(nCurrentDay>Total) switch (nID) { case IDC_BTN_YEARUP: nCurrentYear++; //nCurrentMonth=1; break; nCurrentYear--; break; { nCurrentMonth++; if(nCurrentMonth>12) { } } break; { { } else } break; //GetDlgItemText(hDlg,IDC_BELL,Hours,sizeof(Hours)); nCurrentMonth--; nCurrentYear--; nCurrentMonth=12; if(nCurrentMonth==1) nCurrentYear+=1; int temp1; TCHAR Path[255],OpenName[255]; //nCurrentDay=1; case IDC_BTN_YEARDOWN: case IDC_BTN_MONTHUP: nCurrentMonth=1; case IDC_BTN_MONTHDOWN: case IDC_BTN_TODAY: //nCurrentYear = atoi(Hours); case IDC_BUTTON_Day1://动态显示每一天 27

信息科学与工程学院软件实践实训报告

SONG++;

if(SONG>11)

SONG=0;

mciSendString("stop ../image/sound/00.mp3","",0,NULL); break; SONG=0; } break; CurScan++; if(CurScan>11) CurScan=0; break; } } break; { nCurrentDay--; if(nCurrentDay<=0) { nCurrentDay=PreTotal; nCurrentMonth--; if(nCurrentMonth==0) { } nCurrentYear--; { } nCurrentDay=1; nCurrentMonth++; if(nCurrentMonth>12) { } nCurrentYear+=1; nCurrentMonth=1; case IDC_BUTTON_Day2://动态显示每一天 nCurrentMonth=12; case IDC_BUTTON_SCAN: case IDC_PLAYSONG: case IDC_STOPSONG: 28

信息科学与工程学院软件实践实训报告

mciSendString("stop ../image/sound/1.mp3","",0,NULL);

mciSendString("stop ../image/sound/2.mp3","",0,NULL);

mciSendString("stop ../image/sound/3.mp3","",0,NULL);

mciSendString("stop ../image/sound/4.mp3","",0,NULL);

mciSendString("stop ../image/sound/5.mp3","",0,NULL);

mciSendString("stop ../image/sound/6.mp3","",0,NULL);

mciSendString("stop ../image/sound/7.mp3","",0,NULL); mciSendString("stop ../image/sound/8.mp3","",0,NULL); mciSendString("stop ../image/sound/9.mp3","",0,NULL);

case IDC_SHOWTIME:

}

//该函数每.5秒被调用一次,时钟界面上的文字绘制,学生自己实现该函数 void DrawClockText(HDC hDC)

{

//TCHAR year[255]; //获得本地年月日时间 stDateTime DateTime; stDateTime DateTime1,DateTime2; //得到公历农历日期 TCHAR HTime[255]; //存储时分秒 TCHAR YTime[255]; //存储年 TCHAR MTime[255]; //存储月 TCHAR TGAN[255]; //获得天干地支 SYSTEMTIME LocTime; //定义当地时间 RECT rec; HBRUSH hBrush; HFONT hfon; } break; case IDC_BUTTON_BELL: GetDlgItemText(hDlg,IDC_EDIT_YEAR,Hours,sizeof(Hours)); temp1 = atoi(Hours); nCurrentMonth = 1; break; mciSendString("stop ../image/sound/10.mp3","",0,NULL); mciSendString("stop ../image/sound/11.mp3","",0,NULL); break; nCurrentYear = temp1; TCHAR DTime[255];

29

信息科学与工程学院软件实践实训报告

//获得星期 GetLocalTime(&LocTime); if(LocTime.wHour==Inthour) //整点报时 if(LocTime.wSecond==0&&LocTime.wMinute==0) { switch(LocTime.wHour) { case 6: mciSendString("play ../image/sound/06.mp3","",0,NULL); break; case 7: mciSendString("play ../image/sound/07.mp3","",0,NULL); break; case 8: mciSendString("play ../image/sound/08.mp3","",0,NULL); break; case 9: mciSendString("play ../image/sound/09.mp3","",0,NULL); break; case 10: mciSendString("play ../image/sound/10.mp3","",0,NULL); //获取星期和时间(时分秒) SetTextColor(hDC,RGB(195,17,255)); //字体颜色 GetLocalTime(&LocTime); wsprintf(HTime,"%.2d:%.2d:%.2d",LocTime.wHour,LocTime.wMinute,LocTime.wSecond); SetTextColor(hDC,RGB(0,0,0)); SetBkMode(hDC,3); TextOut(hDC,35,50,HTime,8) ; hBrush = CreateSolidBrush( RGB(0,0,255)); //建立画刷颜色 FillRect(hDC,&rec,hBrush); SetBkMode(hDC,TRANSPARENT); //设置背景涂画,以备下次调用 GetClientRect(hDC,&rec) ; //得到表盘背影区域 SetRect (&rec,35,52,91,65) ; //设置这块区域 mciSendString("play ../image/sound/12.mp3","",0,NULL); 30

信息科学与工程学院软件实践实训报告

} DateTime.nYear = LocTime.wYear ; DateTime.nMonth = LocTime.wMonth ; DateTime.nDay = LocTime.wDay ; SetTextColor(hDC,RGB(153,51,250));//表盘字体颜色 switch(GetDayOfWeek(&DateTime)) { case 1: TextOut(hDC,41,69,"星期一",6) ; break; TextOut(hDC,41,69,"星期二",6) ; break; TextOut(hDC,41,69,"星期三",6) ; break; TextOut(hDC,41,69,"星期四",6) ; break; TextOut(hDC,41,69,"星期五",6) ; break; } break; case 11: mciSendString("play ../image/sound/11.mp3","",0,NULL); break; case 12: mciSendString("play ../image/sound/12.mp3","",0,NULL); break; case 13: mciSendString("play ../image/sound/13.mp3","",0,NULL); break; case 14: mciSendString("play ../image/sound/14.mp3","",0,NULL); break; case 15: mciSendString("play ../image/sound/15.mp3","",0,NULL); break; case 16: mciSendString("play ../image/sound/16.mp3","",0,NULL); break; case 2: case 3: case 4: case 5: case 6:

31

信息科学与工程学院软件实践实训报告

//表盘获得年 GetLocalTime(&LocTime); hfon=CreateFont(13,0,3900,67,FW_NORMAL,FALSE,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,C ,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS, ("Arial")); //字体输出格式 TextOut(hDC,68,35,ChDayTable[DateTime2.nDay],4); if(DateTime2.nMonth<11) { } else { } TextOut(hDC,31,35,ChMonthTable[DateTime2.nMonth],4); TextOut(hDC,31,35,ChMonthTable[DateTime2.nMonth],2); TextOut(hDC,50,35,"月",2); SetTextColor(hDC,RGB(253,230,71)); SunToLunar(&DateTime1,&DateTime2); //调用农历函数 //获得农历的年月日 GetLocalTime(&LocTime); DateTime1.nYear = LocTime.wYear ; DateTime1.nMonth = LocTime.wMonth ; DateTime1.nDay = LocTime.wDay ; //得到天干 GetLocalTime(&LocTime); wsprintf(TGAN,GetGanZhi(LocTime.wYear)); SetTextColor(hDC,RGB(34,139,34)); //字体颜色 } TextOut(hDC,41,69,"星期六",6) ; break; TextOut(hDC,41,69,"星期日",6) ; break; break; case 7: default: TextOut(hDC,48,89,TGAN,4); TextOut(hDC,57,35,"月",2); LIP_DEFAULT_PRECIS SelectObject(hDC,hfon); wsprintf(YTime,"%.4d",LocTime.wYear);

SetTextColor(hDC,RGB(128,255,0)); //字体颜色 32

信息科学与工程学院软件实践实训报告

TextOut(hDC,25,25,YTime,4);

//得到月 hfon=CreateFont(13,0,3500,67,FW_NORMAL,FALSE,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,C ,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS, ("Arial")); //字体输出格式 LIP_DEFAULT_PRECIS SelectObject(hDC,hfon); wsprintf(MTime,"%.2d",LocTime.wMonth);

SetTextColor(hDC,RGB(128,255,0)); //字体颜色

TextOut(hDC,68,8,MTime,2);

//得到日

hfon=CreateFont(13,0,3300,67,FW_NORMAL,FALSE,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,C ,DEFAULT_QUALITY,DEFAULT_PITCH | FF_SWISS, ("Arial")); //字体输出格式 LIP_DEFAULT_PRECIS SelectObject(hDC,hfon); wsprintf(DTime,"%.2d",LocTime.wDay);

SetTextColor(hDC,RGB(128,255,0)); //字体颜色

TextOut(hDC,96,20,DTime,2);

} //DeleteObject(hDC);

5. 实训中遇到的主要问题及解决方法

1.发现阳历20xx年1月为甲午马年,而实际应为癸巳蛇年,因为天干地支是按照阴历计算的。

2.音乐发现有问题,只有一两声,因为路径名写错了。

3.程序运行一两分钟就崩溃了,因为定时器设置数值太小了,图片加载不完。

4.将较长文本拆分成较短的文本字段,通过CreatFont:方法(该方法第三个参数=文本倾斜角度*10)对每一文本字段设置不同的倾斜角度来达到弧形输出文本的效果。

5.给所有表盘图片表盘填充统一的背景色(该颜色在图像中没有用到),通过调用SetLayeredWindowAttributes:方法设置某一颜色(背景色)的像素不显示来达到消除表盘背景色的目的。

6. 在实现表盘输出当下操作时,出现了时间重叠现象,改变了插入图片与刷新先后顺序,通过先插入图片,后刷新实现了时间显示的不被遮盖。

6. 实训体会

通过此次实训让我提高了自己查找资料的能力,并且深刻体会了Win32的多文件机制以及其消息传递机制,使我的编程能力大有提高。同时通过此次实训让我熟悉了一些常用的API函数,对于一些函数的使用也有了更加深刻的理解。

还有就是通过此次实训让我更加的了解到自己存在的不足之处,例如;自己的马虎,导致一个小小的输入错误,导致出现错误,并且调试也弄不明白是怎么回事,后来发现竟然是变量的混乱造成的,所以在以后的实践中我要更加的仔细,同时我也需要提高自己的实践能 33

信息科学与工程学院软件实践实训报告

力,通过此次实训实在是感觉自己的压力所在,以后一定更要注意在保证自己的基础文化知识学精的同时再学以致用通过具体的实践来提高自己的实践能力。

通过这次C语言实训,我对C语言,对编程有了更进一步的了解和认识。程序是按照代码的编写、函数的调用一步一步进行的,这就要求程序员的思维必须要严谨,有时候一个小的错误可能就会引起整个程序的崩溃。在写代码的过程中我也遇到了很多错误,有时候输出的错误提示并不是非常精确,这对修改代码就造成了很大的困扰。遇到这样的问题还是要从输出的错误入手,修改之后可能还会有另外的错误,再一步一步的修改,总之问题总会解决掉的。当程序成功运行的那一刻就会冲掉之前所有的烦恼,从中体验到编程的乐趣。想一想,虽然我们自己整天面对的是黑与白,0和1,但是呈现给用户的却是多彩的世界,这就是坚持下去、让我们去解决问题的动力。

这次实训虽然时间短,但是使我更好的了解了一些关于c语言的知识,理解巩固了我c语言的理论知识和应用能力,对我将来的考验或者工作都会有莫大的帮助。同时它让我知道,只要你努力了,任何东西都是可能的。

34

相关推荐