txt log 什么的都顷缓可以
但是还是建议你用系统的默认配置文件格式 ini
说白了 这不是格式 这个只是文件后缀名 是什么都没关系
为了规范才用.ini后缀的
关键是你文件里的格式
然后用文件 *** 作进行解析
我以前做过MFC的FTP 和邮件发送
这个的确要用到。
如果 配置参数多 文件雀渣模大的话 推荐用微软的专门解析ini文件的库
如果少 自己解析一下就行了 没必要调用这么大的库
(1)WritePrivateProfileSection()用来在ini文件中直接向指定区域写入键和值的信息,其原型如下:
BOOL WritePrivateProfileSection(
LPCTSTR lpAppName, // 指向指定字段的字符串
LPCTSTR lpString, // 指向要写入的键与值字符串
LPCTSTR lpFileName // 指向文件名称字符串,如果不包含完整路径,则在windows目录下创建
)
用法示梁昌例:
WritePrivateProfileSection(_T(“windows”),_T(“load=c:\\winnt\\notepad.exe”),_T(“c:\\winnt\\win.ini”))
(2)WritePrivateProfileString()与上一个函数的不同点在于其将键和值分开了,原型如下:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName, // 指向指定字段的字符串
LPCTSTR lpKeyName, // 指向指定键的字符串
LPCTSTR lpString, // 指向指定值的字符串
LPCTSTR lpFileName // 指向文件名称字符串
)
用法示例:
WritePrivateProfileString(_T(“windows”),_T(load”)_T(“c:\\winnt\\notepad.exe”),_T(“c:\\winnt\\win.ini”))
(3)WritePrivateProfileStruct()与前面两个的不同在于文件尾有校验和,原型如下:
BOOL WritePrivateProfileStruct(
LPCTSTR lpszSection, //指向指定字段的字符串
LPCTSTR lpszKey, //指向指定键的字符串
LPVOID lpStruct, //指向存放要加入的数据的缓冲区,如果为NULL,则删除键
UINT uSizeStruct, //缓冲区大小,以字节为单位
LPCTSTR szFile //以零结尾的文件名称字符串,如果为空,则向win.ini写入
)
用法示例:
WritePrivateProfileStruct(_T(“windows”),_T(“load”),pBuffer,sizeof(pBuffer),_T(“c:\\winnt\\win.ini”))
(4)还有两个函数,是专门用来向win.ini文件写入的,函数原型如下:
BOOL WriteProfileSection(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpString //指向指定值的字符串
)
BOOL WriteProfileString(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向指定键的字符串
LPCTSTR lpString //指向指定值的字符串
)
下面来看几个对应的从ini文件获取信息的API函数,上面已经说得很详细了,这里只说其中两个:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向键的字符串
LPCTSTR lpDefault, //如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量
LPTSTR lpReturnedString, //存放INI文件中值的目的缓存区
DWORD nSize, //目的缓冲区的大小,以字节为单位
LPCTSTR lpFileName //指向INI文件名称的字符串
)
UINT GetPrivateProfileInt(
LPCTSTR lpAppName, //指向指定字段的字符串
LPCTSTR lpKeyName, //指向键的字符串
INT nDefault, //如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量
LPCTSTR lpFileName //指向INI文件名称的字符串
)
程序示例1: 我们在这里建立了一个应用程序“App Name”,并且使用了一个INI文件“appname.ini”,在此INI文件中,我们写入如下内容:
[Section1]
FirstKey = It all worked out okay.
SecondKey = By golly, it works.
ThirdKey = Another test.
代码分析如下:
#include <stdio.h>
#include <windows.h>
//主函数
main()
{
//定义局部
CHAR inBuf[80]
HKEY hKey1, hKey2
DWORD dwDisposition
LONG lRetCode
// 试图创建INI文件的键值
lRetCode = RegCreateKeyEx ( HKEY_LOCAL_MACHINE,
"SOFTWARE\\Microsoft\\Windows NT
\\CurrentVersion\\IniFileMapping\\appname.ini",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,
NULL, &hKey1,
&dwDisposition)
//判断是否出错
if (lRetCode != ERROR_SUCCESS){
printf ("Error in creating appname.ini key\n")
return (0)
}
//试图设置一个节区的值
lRetCode = RegSetValueEx ( hKey1,
"Section1",
0,
REG_SZ,
"USR:App Name\\Section1",
20)
//判断是否出错
if (lRetCode != ERROR_SUCCESS) {
printf ( "Error in setting Section1 value\n")
return (0)
}
//试图创建一个应用名称键值
lRetCode = RegCreateKeyEx ( HKEY_CURRENT_USER,
"App Name",
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,
NULL, &hKey2,
&dwDisposition)
//判断是否出错
if (lRetCode != ERROR_SUCCESS) {
printf ("Error in creating App Name key\n")
return (0)
}
//强制系统重新读取映射区的内容到共享内存中,以便于将来对应用程序的调用可//以找到它,而不需要重新启动系统
WritePrivateProfileStringW( NULL, NULL, NULL, L"appname.ini" )
//向INI文件中添加一些键值
WritePrivateProfileString ("Section1", "FirstKey",
"It all worked out okay.", "appname.ini")
WritePrivateProfileString ("Section1", "SecondKey",
"By golly, it works.", "appname.ini")
WritePrivateProfileSection ("Section1", "ThirdKey = Another Test.",
"appname.ini")
//测试一下添加的正确性
GetPrivateProfileString ("Section1", "FirstKey",
"Bogus Value: Get didn't work", inBuf, 80,
"appname.ini")
printf ("%s", inBuf)
return(0)
}
程序示例2:通过修改win.ini中的字段[windows]中的键load或run,或者是为system.ini中的字段[boot]中的键 shell增加值,可以达到设置程序自动运行的目的。假设我们要自动运行notepad.exe,修改后的win.ini或system.ini文件象这 样就可以:
win.ini
[windows]
load=c:\winnt\notepad.exe
run=c:\winnt\notepad.exe
system.ini
[boot]
shell=c:\winnt\explorer.exe c:\winnt\notepad.exe
注意:system.ini文件的修改要特别注意,如果你单纯改成shell=c:\winnt\notepad.exe,则不能首先运行 explorer.exe,很明显你将看不到桌面和任务栏,呵呵,笔者在做实验时就曾因为粗心造成了这样的后果,不过不用害怕,只要你用我们下面提供的程 序,将它修改过来就可以了,默认时,系统在system.ini中的[boot]下是shell=c:\winnt\explorer.exe。很多非法 程序就是通过修改这两个文件来达到自启动的目的的。
下面这个程序可以在附书光盘中找到,名称为“AutoPlay”,使用VC++6.0写成,核心程序源代码如下:
void CAutoRunDlg::OnBrowse()
{
//只浏览exe文件
CfileDialog fileDlg(TRUE,_T("EXE"),_T("*.exe"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,(_T("Executable Files (*.exe) |*.exe ||")))//显示打开文件的对话框
//当 *** 作者选择OK时,程序取得选择文件的全路径名(包括文件的路径及文件名称),并将相应的数值传输给相关的控件变量。
if(fileDlg.DoModal()==IDOK)
{
m_strFileName=fileDlg.GetPathName()
//向将变量中的数值传输给控件显示出来。
UpdateData(FALSE)
}
}
void CAutoRunDlg::OnApply()
{
//更新数据
UpdateData(TRUE)
//写入ini文件
LPCTSTR filename
filename=m_strFileName
WritePrivateProfileString(_T("windows"),_T("load"),filename,_T("c:\\winnt\\win.ini"))
}
您如果要更改system.ini,可以将WritePrivateProfileString(_T("windows"),_T("load"),filename,_T("c:\\winnt\\win.ini"))
改为 WritePrivateProfileString(_T("boot"),_T("shell"),filename,_T("c:\\winnt \\system.ini"))并且在输入文件名时输入c:\winnt\explorer.exe c:\winnt\notepad.exe。
写到这里,本文的意图基本达到,如果您可以把某些代码亲自实现,相信读者会有比较大的收获。
下面介绍怎样使用AppWizard 创建一个Win32窗口程序示例HelloWorld,步骤如下:
1. 在File菜单上,单击New菜单项,d出New对话框。
2. 在出现的对话框中选择Projects 标签,从左边的列表框中选择项目类型: Win32 Application,在Project
name框中,输入新项目名:Ex1_2,并指定项目存贮位置,如图1-36 所示。
图 1-36 Win32 窗口程序创建选项
3. 在Platforms框中,指定项目的开发平台,确认“Win32”被选中。
4. 输入完以上内容后,单击“OK”按钮,根据所选的项目类型,会出现相应的Wizard(向导),如图
1-37所示。
图 1-37 Win32 窗口程序类型选择
5. 选择A typical“Hello World”application单选按钮,单击“Finish”按钮,生成总结如图 1-38 所示。
图 1-38 生成总结
6. 单击“OK”按钮,将生成项目框架。
在本例中,AppWizard生成了如下文件:
(1) 头文件Ex1_2.h
这是应用程序的主头文件,它含有所有全局符号和用郑丛于包含其他头文件的#include 伪指令。
(2) 源文件Ex1_2.cpp
这个文件是应用程序的主源文件。
(3) 资源文件
AppWizard 会创建一些与资源相关的文件。如:Ex1_2.RC,RESOURCE.H,Ex1_2.rc2,这是项目
的头文件及其资源文件。资源文件含有一般应用程序的默认菜单定义和加速键表、字符串表。它还指定
了默认的 About 对话框和一个图标文件(RES\Ex1_2.ICO)。Ex1_2.rc2 喊斗樱用于存放 Visual Studio 不可直接
编辑的资源。
(4) 预编译头文件 第一章 VC++6.0 开发环境
25
STDAFX.CPP和STDAFX.H这两个文件用于建立一个预编译的头文件Ex1_2.PCH 和一个预定义的
类型文件 STDAFX.CPP。销毕
7. 按“CTRL+F5”或工具栏按钮 ,编译、链接并运行程序,得到画面如图1-39 所示
一、程序窗口设计步骤(1)用AppWizard生成一个名为Clock的单文档(SDI)程序框架滚察。为了简化应用程序,在第四步时去掉Docking toolbar和Initial status bar选择项(不删除也可),其他各选项均可用缺省设置。
(2)编辑项目的菜单资源,在主框架窗口的主菜单(IDR_MAINFRAME)中添加一个名为“时钟控制”的下拉菜单。在“时钟控制”菜单中添加三个菜单选项“启动时钟”、“停止时钟”和“时间设置”。并在菜单属性项中设定“启动时钟”菜单的ID标号为ID_START,“停止时钟”菜单的ID标号为ID_STOP,“时间设置”菜单的ID标号为ID_SETTIME。为了简化菜单,可删除系统原有的“文件”、“编辑”菜单项。
(3)利用ClassWizard为视图类添加菜单命令处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为CClockView类,在Object IDs列表框中分别选择新添加的菜单选项的ID,在Messages列表框中选择COMMAND,按下Add Function按钮添加成员函数。ClassWizard会为“启动时钟”、“停止时钟”和“时间设置”菜单选项添加相应的消息响应函数OnStart ( )、OnStop ( )和OnSettime ( )。
(4)利用ClassWizard为视图类添加定时器和鼠标消息处理函数。进入ClassWizard的Message Maps选项卡,选择Class Name项为 CClockView类,在Messages列表框中分别选择定时器消息WM_TIMER和鼠标消息WM_LBUTIONDOWN,按下Add Function按钮添加成员函数。ClassWizard会添加相应的定时器和鼠标消息响应函数OnTimer和OnLButtonDown。
(5)使用Developer Studio菜单的Insert / Resource…选项调出Insert Source对话框,为项目添加新的对话框资源。在对话框属性中,修改对话框名为“时间设定”。在对话框中增加用来输入年、月、日、时、分、秒的编辑框控件。
通过控件属性,将年、月、日、时、分、秒等编辑控件的ID改为IDC_YEAR、IDC_MONTH、IDC_DAY、IDC_HOUR、IDC_MINUTE和IDC_SECOND。
(6)利用ClassWizard自动建立对话框类。进入ClassWizard后,d出一个对话框询问是否要为该对话框模板建立类。按下“OK”按钮,会d出New Class对话框,在Name栏填写对话框类的名称CSetTimeDlg后按“OK”按钮,即可为对话框创建一个对应的类。
(7) 利用大穗茄ClassWizard为对话框类添加与各控件对应的数据成员。选择MemberVariables选项卡,确保Class Name项为对话框CSetTimeDlg类,然后在选项卡下方的窗口中选择各控件的ID并按下“Add Variable…”按钮,为其添加对应成员变量。
控制ID
变量类型
变量名
变量范围
IDC_YEAR
int
m_Year
0~3000
IDC_MONTH
int
m_Month
1~12
IDC_DAY
int
m_Day
1~31
IDC_HOUR
int
m_Hour
0~23
IDC_MINUTE
int
m_Minute
0~59
IDC_SECOND
int
m_Second
0~59
最后一列为变量取值范围。
(8)编辑工程的图标资源,在Resource View选项窗口中修改Icon结点所包含的族慎主框架图标(IDR_MAINFRAME)。此步非必须。
(9)完成以上工作后,即可修改程序框架,添加必要的代码。
二、主要源代码:
按以下步骤向视图类(CClockView)添加下列数据成员及成员函数。
(1) 添加表示年、月、日、时、分、秒的变量。
int year
int month
int day
int hour
int minute
int second
(2) 添加秒表的计数变量。
int watch
(3) 添加时钟的画笔及画刷变量。
CPen m_HouPen, m_MinPen, m_SecPen// 各种针的画笔
CBrush m_MarkBrush// 表盘标记的画刷
(4) 添加时钟控制变量。
CPoint m_Center// 表的中心
double m_Radius// 表的半径
CPoint m_Hour [2], m_OldHour [2]// 时针当前及前一次位置
CPoint m_Minute [2], m_OldMin [2]// 分针当前及前一次位置
CPoint m_Second [2], m_OldSec [2]// 秒针当前及前一次位置
(5) 添加秒表的两个按钮位置变量。
CRect m_WatchStart
CRect m_WatchStop
(6) 添加两个函数,计算时钟各指针位置。
void SetClock (int hour, int minute, int second)
CPoint GetPoint (int nLenth, int nValue)
(7) 在视图类构造函数中增加初始化语句,之前加上头文件
#include<ctime>
CClockView::CClockView()
{
// 设定时间
char time[32]
SYSTEMTIME st
GetLocalTime(&st)
day = st.wDay
hour = st.wHour
minute = st.wMinute
month = st.wMonth
second = st.wSecond
year = st.wYear
// 设定画笔/画刷
m_HouPen. CreatePen (PS_SOLID, 5, RGB (255, 0, 0) )// 时针画笔
m_MinPen. CreatePen (PS_SOLID, 3, RGB (0, 0, 250) )// 分针画笔
m_SecPen. CreatePen (PS_SOLID, 1, RGB (0, 0, 0) )// 秒针画笔
m_MarkBrush. CreateSolidBrush (RGB (250, 250, 0) )
// 设定表心位置
m_Center. x = 200
m_Center. y = 200
// 设定时钟半径
m_Radius = 200
// 计算指针位置
SetClock (hour, minute, second)
// 设定秒表计数器及按钮位置
watch = 0
m_WatchStart = CRect (480, 310, 560, 340)// 启动钮
m_WatchStop = CRect (590, 310, 670, 340)// 停止钮
}
编写指针位置计算函数SetClock和GetPoint。首先在ClockView. cpp文件头部添加下面两行代码,以便进行数学计算。
#include "math.h"
#define PI 3.14159265
然后添加下列代码:
//计算各个指针位置的函数
void CClockView::SetClock(int hour, int minute, int second)
{
hour=hour*5
hour=hour+minute/12
// 保存时针原位置
m_OldHour [0] = m_Hour[0]
m_OldHour [1] = m_Hour[1]
// 计算时针当前位置
m_Hour[0]= GetPoint(int(m_Radius/2),hour)
m_Hour[1]= GetPoint(7,hour + 30)
// 保存分针原位置
m_OldMin[0]= m_Minute[0]
m_OldMin[1]= m_Minute[1]
// 计算分针当前位置
m_Minute[0]=GetPoint(int(m_Radius*7/10), minute)
m_Minute[1]=GetPoint(10, minute+30)
// 保存秒针原位置
m_OldSec [0] = m_Second [0]
m_OldSec [1] = m_Second [1]
// 计算秒针当前位置
m_Second [0]= GetPoint (int(m_Radius * 8/10), second)
m_Second [1] = GetPoint (30, second + 30)
}
// 计算以表心为原点的指针的端点位置
CPoint CClockView ::GetPoint (int nLenth, int nValue)
{
CPoint p
double angle = nValue* PI /30-PI/2
p.x = m_Center.x + (int) (nLenth * cos(angle))
p.y = m_Center.y + (int) (nLenth * sin(angle))
return p
}
绘制表盘上的标记、时针、分针和秒针,并显示数字时钟及秒表,在OnDraw函数中添加下面代码:
void CClockView::OnDraw(CDC* pDC)
{
CClockDoc* pDoc = GetDocument()
ASSERT_VALID(pDoc)
// 绘制表盘上的标记
pDC->SelectObject(m_MarkBrush)
int k=0
for(int i=0i<60i++)
{
CPoint pt=GetPoint(175,i)
if (i%5==0)
{
//显示表盘上的数字
CString str[12]={"12","1","2","3","4","5","6","7","8","9","10","11"}
pDC->TextOut(pt.x-5,pt.y-5,str[k])
k++
}else
{
//显示数字之间的圆圈
pDC->Ellipse(pt.x-2,pt.y-2,pt.x+2,pt.y+2)
}
}
// 画时针
pDC->SelectObject (m_HouPen)
if (m_OldHour[0]!= m_Hour[0])
{
// 用白色覆盖原位置时针
pDC->SetROP2(R2_WHITE)
pDC->MoveTo(m_OldHour [0] )
pDC->LineTo(m_OldHour [1] )
pDC->SetROP2(R2_COPYPEN)
//时针绘制
pDC->MoveTo(m_Hour[0])
pDC->LineTo(m_Hour[1])
}
else
{
// 时针绘制
pDC->MoveTo(m_Hour[0])
pDC->LineTo(m_Hour[1])
}
// 画分针
pDC->SelectObject (m_MinPen)
if (m_OldMin[0]!=m_Minute[0])
{
// 用白色覆盖原位置分针
pDC->SetROP2(R2_WHITE)
pDC->MoveTo(m_OldMin[0])
pDC->LineTo(m_OldMin[1])
pDC->SetROP2(R2_COPYPEN)
// 分针绘制
pDC->MoveTo(m_Minute[0])
pDC->LineTo(m_Minute[1])
}
else
{
// 分针绘制
pDC->MoveTo(m_Minute[0])
pDC->LineTo(m_Minute[1])
}
// 用白色覆盖原位置秒针
pDC->SelectObject(m_SecPen)
pDC->SetROP2(R2_WHITE)
pDC->MoveTo(m_OldSec[0])
pDC->LineTo(m_OldSec[1])
pDC->SetROP2(R2_COPYPEN)
// 秒针绘制
pDC->MoveTo(m_Second[0])
pDC->LineTo(m_Second[1])
// 数字时钟显示
pDC->SelectStockObject(WHITE_BRUSH)
pDC->Rectangle(450,30,700,180)
pDC->TextOut(535,20,"当前时间")
CString m_Date,m_Time
m_Date.Format ("% 4d年%4d月%4d日",year,month,day)
pDC->TextOut(510,70,m_Date)
m_Time.Format("%4d点%4d分%4d秒",hour,minute,second)
pDC->TextOut(510,100,m_Time)
// 秒表显示
pDC->Rectangle(450,220,700,370)
pDC->TextOut(545,200,"秒 表")
int minSec= watch%100
int Sec=(watch/100)%60
int Min=(watch/100)/60
m_Time.Format("% 02d: % 02d: % 02d",Min,Sec,minSec)
pDC->TextOut(535,260,m_Time)
pDC->Rectangle(&m_WatchStart)
pDC->Rectangle(&m_WatchStop)
pDC->TextOut(m_WatchStart.left + 18,m_WatchStart.top + 5,"启动")
pDC->TextOut(m_WatchStop.left + 18,m_WatchStop.top + 5,"停止")
}
请注意将表示时间的整数转换为CString字符串类型的方法以及秒表的显示方法。另外,watch计数器以1/100秒为计数单位,每达到100则秒数加1。
按照下列步骤增加时钟控制代码:
修改Onstart和OnStop函数,设置时钟运动消息。按比正常时钟快20倍的假定,50ms产生一个消息。本程序采用和正常时间同步,即1000ms产生一个消息, 其代码为:
void CClockView::OnStart()
{
SetTimer (1, 1000, NULL)
}
void CClockView::OnStop()
{
KillTimer (1)
}
修改OnTimer函数,正确计算并处理年、月、日、时、分、秒等变量的联动变化 ,其代码为:
void CClockView::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1)
{
second++// 秒增加
if (second>59)
{
second=0
minute++// 分增加
}
if (minute>59)
{
minute= 0
hour++// 小时增加
}
if (hour>23)
{
hour=0
day++// 日增加
}
switch(month)
{
case 1: // 大月
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (day>31)
{
day= 1
month++// 月增加
}
break
case 4: // 小月
case 6:
case 9:
case 11:
if (day>30)
{
day=1
month++// 月增加
}
break
case 2:
if (year%4 ==0 &&day>29) // 润二月
{
day=1
month++// 月增加
}
if (year%4!=0 &&day>28) // 二月
{
day=1
month++
}
break
}
if (month >12)
{
// 年增加
year++
month=1
}
SetClock (hour, minute, second)
Invalidate (false)
}
// 秒表定时器消息处理
if (nIDEvent == 2)
{
watch++
Invalidate (false)
}
CView::OnTimer(nIDEvent)
}
添加时间设置对话框代码。
首先在ClockView. cpp文件头部添加下列语句:
#include “SetTimeDlg. h”
在时间设定对话框类的构造函数中,做如下修改,将初始日期设为当前时间,之前要加上头文件
#include<ctime>
CSetTimeDlg::CSetTimeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSetTimeDlg::IDD, pParent)
{
//||AFX_DATA_INIT(CSetTimeDlg)
char time[32]
SYSTEMTIME st
GetLocalTime(&st)
m_Day = st.wDay
m_Hour = st.wHour
m_Minute = st.wMinute
m_Month = st.wMonth
m_Second = st.wSecond
m_Year = st.wYear// ||AFX_DATA_INIT
}
最后,在OnSettime函数中添加代码如下:
void CClockView::OnSettime()
{
CSetTimeDlg SetDlg
if (SetDlg.DoModal ()==IDOK)
{
year=SetDlg.m_Year
month= SetDlg.m_Month
day= SetDlg.m_Day
hour=SetDlg.m_Hour
minute=SetDlg.m_Minute
second=SetDlg.m_Second
}
// 计算各指针位置
SetClock (hour,minute,second)
Invalidate (true)
}
按以下步骤设计秒表控制程序:
在OnLButtonDown函数中增加下列内容,以便响应单击秒表启动、停止框所发出的消息:
void CClockView::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_WatchStart.PtInRect(point))
{
watch=0
SetTimer(2,10,NULL)
}
if (m_WatchStop.PtInRect(point))
{
KillTimer (2)
}
CView::OnLButtonDown(nFlags, point)
}
编译,连接,运行程序。
运行结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)