【C语言】【windows】--电子时钟编写
erbi_lucifer吧
全部回复
仅看楼主
level 10
堕erbi 楼主

光影的世界……吾为光为影?



2012年02月23日 04点02分 1
level 10
堕erbi 楼主

程序名称:电子时钟
编译器:vs2010(其它也可以……)
程序大小:10K
文件包括:时钟.exe,skinh.she,SkinH.dll,msvcr100.dll
程序界面:

2012年02月23日 04点02分 2
level 10
堕erbi 楼主
/********************************************************************************
用到timer控件,每次timer时调用一次timer对应函数,获取当前时间并在文本框中显示……当然timer的时间间隔是1000毫秒(1秒),于是就有会走动的时间了……
其中还要用到字体设置函数……
/********************************************************************************
界面只包含:按钮(button)X6、标签(Static Text)和文本框(Edit Control)
对话框在资源那里新建……图标在资源那里添加资源——》导入……
左下角的按钮是关于(按钮属性的caption可以改成其它)和退出……
右边的那4个按钮是用于显示不同样式文字的……
如:
新建空的win32程序……新建cpp代码文件……
新建资源文件dialog,将dialog作为窗体主体,在上面添加控件,改变大小
在消息处理函数DialogProc里面先定义样式:int FONTsty=0;
在初始化消息里(WM_INITDIALOG)
if(FONTsty==0){
SetFONTSty(hwndDlg,0);}
}
设置字体……SetFONTSty (自己定义的函数……)

2012年02月23日 04点02分 3
level 10
堕erbi 楼主
/***************************************************************************
我们看看这个字体设置函数……
VOID SetFONTSty(HWND hwndDlg,int FONTsty)
{
HFONT hFont=CreateFont
(65,16,11,0,500,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,CLIP_D
EFAULT_PRECIS,DEFAULT_QUALITY, FONTsty,TEXT("宋体")); //设置字体
HWND HWNDEdit=GetDlgItem(hwndDlg,IDC_EDI); //得到句柄
SendMessage(HWNDEdit,WM_SETFONT,(WPARAM)hFont,TRUE);//发送改变字体的消息
SetTimer(hwndDlg,0,1000,TimerProc); //设置计时器
}
*****************************************************************************/
CreateFont是一个API函数,详细请看:
http://baike.baidu.com/view/1080748.htm
我们要用到的是第1个参数:设置字体大小,代码里是65……
第2个参数:字体宽度
第5个参数:在0到1000之间指定字体的权值,400表示标准体,700表示黑(粗)体,如果此值为0,则使用缺省的权值。
倒数第2个:可以设置样式,指定字体间距和字体族,用‘|’隔开,当然也可以只指定一个
设置好字体,我们要先得到要显示这些字体的文本框的句柄:
GetDlgItem(所在窗口的句柄,文本框的ID);
接着发送消息:
SendMessage(HWNDEdit,WM_SETFONT,(WPARAM)hFont,TRUE);
//SendMessage(文本框句柄,消息类型,字体,直接执行)
最后我们设置一个计时器:
SetTimer(hwndDlg,0,1000,TimerProc);
// SetTimer(所在窗口的句柄,ID,时间间隔(毫秒),每隔时间段处理一次的函数)

2012年02月23日 04点02分 4
level 10
堕erbi 楼主

时间处理函数
[转头]
/***************************************************************************
VOID CALLBACK TimerProc(HWND hwnd,UINT message,UINT timerID,DWORD TIME)
{
SYSTEMTIME time1;
ZeroMemory(&time1,sizeof(time1));//初始化结构体
GetLocalTime(&time1); //得到系统时间
TCHAR strtime[256]={0};
TCHAR strymd[256]={0};
wsprintf(strtime,_T(" %d : %d : %d"),time1.wHour,time1.wMinute,time1.wSecond);
wsprintf(strymd,_T("%d年%d月%d日 "),time1.wYear,time1.wMonth,time1.wDay);
SetDlgItemText(hwnd,IDC_EDI,strtime); //显示时间
SetDlgItemText(hwnd,IDC_YMD,strymd);
}
*****************************************************************************/
这个程序就是用timer每一秒执行一次:得到系统时间,显示时间……
[睡觉]

2012年02月23日 10点02分 5
level 10
堕erbi 楼主

这个函数里,我们先定义一个SYSTEMTIME型的变量来存放系统时间
将时间按格式放进字符数组strtime,strymd里
最后用SetDlgItemText(窗体句柄,要输出至的控件的ID,要输出的字符数组)输出……
注:其中time1是一个结构体……
原型:
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds; //毫秒
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
你就可以得到时间了,GetLocalTime就是给以上这些赋值……
于是每隔一个时间段(这里是1000毫秒)执行一次这个函数,于是每隔一秒显示一次当前时间,就成为一个时钟了……
2012年02月23日 10点02分 6
level 10
堕erbi 楼主

字体选择
从字体设置函数里我们可以知道有个地方(CreateFont)可以改变显示的字体的样式;
“倒数第2个参数:可以设置样式,指定字体间距和字体族,用‘|’隔开,当然也可以只指定一个(低端二位指定字体的字符间距,它可取下列值之一: DEFAULT_PITCH;FIXED_PITCH; VARIABLE_PITCH)”
于是我们在DialogProc消息处理函数的一开始定义一个放置样式的变量:
int FONTsty=0;
接着我们在左边放置4个按钮,给它们的ID改为: IDC_1, IDC_2, IDC_3, IDC_4
根据按下的按钮为FONTsty赋值,然后调用字体设置函数……
/***************************************************************************
case IDC_1:
{
FONTsty=FIXED_PITCH; //FIXED_PITCH 配合前面成点阵样式
SetFONTSty(hwndDlg,FONTsty);
}
break;
case IDC_2:
{
FONTsty=DEFAULT_PITCH; // DEFAULT_PITCH配合前面的成浑厚样式
SetFONTSty(hwndDlg,FONTsty);
}
break;
case IDC_3:
{
FONTsty=FF_MODERN; // FF_MODERN线性
SetFONTSty(hwndDlg,FONTsty);
}
break;
case IDC_4:
{
FONTsty=FF_SCRIPT; //FF_SCRIPT 歪斜
SetFONTSty(hwndDlg,FONTsty);
}
break;
*****************************************************************************/
更多样式可以自己制作……
2012年02月23日 10点02分 7
level 10
堕erbi 楼主

[在笼子里][震荡]
完整代码!!!
/***************************************************************************
#include <tchar.h>
#include <Windows.h>
#include "resource.h"
*****************************************************************************/
/***************************************************************************
VOID CALLBACK TimerProc(HWND hwnd,UINT message,UINT timerID,DWORD TIME)
{
SYSTEMTIME time1;
ZeroMemory(&time1,sizeof(time1));//初始化
GetLocalTime(&time1);
TCHAR strtime[256]={0};
TCHAR strymd[256]={0};
wsprintf(strtime,_T(" %d : %d : %d "),time1.wHour,time1.wMinute,time1.wSecond);
wsprintf(strymd,_T("%d年%d月%d日 "),time1.wYear,time1.wMonth,time1.wDay);
SetDlgItemText(hwnd,IDC_EDI,strtime);//IDC_YMD
SetDlgItemText(hwnd,IDC_YMD,strymd);
}
*****************************************************************************/

2012年02月23日 10点02分 8
level 10
堕erbi 楼主

[抓墙][少林寺]
/***************************************************************************
VOID SetFONTSty(HWND hwndDlg,int FONTsty)
{
HFONT hFont=CreateFont(65,16,11,0,500,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FONTsty,TEXT("宋体"));
HWND HWNDEdit=GetDlgItem(hwndDlg,IDC_EDI);
SendMessage(HWNDEdit,WM_SETFONT,(WPARAM)hFont,TRUE);
SetTimer(hwndDlg,0,1000,TimerProc);
}
/***************************************************************************
/***************************************************************************
INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int FONTsty=0;
switch(uMsg)
{
case WM_INITDIALOG :
{
if(FONTsty==0){
SetFONTSty(hwndDlg,0);
}
}
break;
case WM_COMMAND :
{
switch (wParam)
{
case IDCANCEL:
{
EndDialog(hwndDlg, IDCANCEL);
}
break;
case IDC_ABOUT:
{
MessageBox(hwndDlg,_T("试手的实验程序O(∩_∩)O哈哈~,……>_<、、、 \n公司:Erbi-lucifer \n作者:【Erbi-lucifer:光影】 \n时间:2012年1月19日9:04:26"),_T("光影软件"),MB_OK);
}
break;
case IDC_1:
{
FONTsty=FIXED_PITCH;//|FF_SCRIPT 歪斜 DEFAULT_PITCH浑厚 FIXED_PITCH 点阵FF_MODERN线性
SetFONTSty(hwndDlg,FONTsty);
}
break;
case IDC_2:
{
FONTsty=DEFAULT_PITCH;
SetFONTSty(hwndDlg,FONTsty);
}
break;
case IDC_3:
{
FONTsty=FF_MODERN;
SetFONTSty(hwndDlg,FONTsty);
}
break;
case IDC_4:
{
FONTsty=FF_SCRIPT;
SetFONTSty(hwndDlg,FONTsty);
}
break;
default:break; }
}
default:break;
} return 0;
}
***************************************************************************/

2012年02月23日 10点02分 9
level 10
堕erbi 楼主

[拍砖]主函数
/***************************************************************************
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
return 0;
}
***************************************************************************/

2012年02月23日 10点02分 10
level 7
windows程序设计看完了,准备把你这写都看下,不过看完这个有个疑问,你这个时钟的数字难道是在编辑控件上输出的?但是我创建了个编辑控件后(用createwindow创建的)没法控制它不接受输入呀,这个不知道怎么处理了,我是想创建个窗口就是这样的,不是用对话框,所以想问下你怎么处理的。
2012年04月12日 13点04分 11
level 10
堕erbi 楼主

是在编辑控件上输出的。
对于编辑框在创建时可以有以下可选风格:
其中ES_READONLY 是只读属性,加入即可。
其它留着以后有用……[抖胸]
编辑风格 说明
ES_AUTOHSCROLL 当在行尾添加一个字符后自动向右滚动10个字符。
ES_AUTOVSCROLL 当输入回车后自动上滚一行。
ES_CENTER 字符居中显示。
ES_LEFT 字符左对齐。
ES_LOWERCASE 统一转化为小写字母。
ES_MULTILINE 允许多行显示。
ES_NOHIDESEL 当编辑失去焦点时隐藏对字符的选定,重新获得焦点后以反色显示选中内容。
ES_OEMCONVERT 将ANSI字符转化为OEM字符。
ES_PASSWORD 以星号显示字符,多用于回显密码。
ES_RIGHT 字符右对齐
ES_UPPERCASE 统一转化为大写字母。
ES_READONLY 设置字符为只读。
ES_WANTRETURN 接受回车键输入。
以上…………………………………………………………

2012年04月12日 15点04分 12
level 7
3q了,等下去试试,谢谢了,十五字,十五字,十五字。
2012年04月13日 14点04分 13
level 7
还是那个程序,我主窗口把焦点给了子窗口编辑控件,是不是主窗口就接受不到wm_timer了?
2012年04月19日 02点04分 14
level 7
但是我又编了一个程序做实验,另外一个也是wm_timer消息的,然后,我用鼠标点了一下桌面,等于说焦点已经不在主窗口了,但是程序在不断变化
2012年04月19日 02点04分 15
level 7
最后发现问题是,我在失去情况下有一gecase wm_paint: return 0;结果就因为这个timer从来没得到过这个消息,不过仍然不知道问什么
2012年04月19日 03点04分 16
level 10
堕erbi 楼主
[抖胸]timer设置后就会一直执行,不管有没有焦点……
2012年04月19日 04点04分 17
1