MFC操作ini配置文件


MFC操作ini配置文件

概述  
   
在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置、大小、一些用户设置的数据等等,在   Dos   下编程的时候,我们一般自己产生一个文件,由自己把这些数据写到文件中,然后在下一次执行的时候再读出来使用。在   Win32   编程中当然你也可以这样干,但   Windows   已经为我们提供了两种方便的办法,那就是使用注册表或者   ini   文件(Profile)来保存少量数据。本文中先介绍一下   .ini   文件的使用。  
   
ini   文件是文本文件,中间的数据格式一般为:  
[Section1   Name]  
KeyName1=value1  
KeyName2=value2  
...  
   
[Section2   Name]  
KeyName1=value1  
KeyName2=value2  
   
ini   文件可以分为几个   Section,每个   Section   的名称用   []   括起来,在一个   Section   中,可以有很多的  Key,每一个   Key   可以有一个值并占用一行,格式是   Key=value,Win32   对   ini   文件操作的   api   中,有一部分是对   win.ini   操作的,有一部分是对用户自定义的   ini   文件操作的。Win.in   和   system.ini   是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。System.ini   描述了系统硬件的当前状态,Win.ini   文件则包含了Windows   系统运行环境的当前配置。由于   Win.ini   文件的重要性和常用性,Win32   中有专门对   Win.ini   进行操作的   api,它们是:  
   
GetProfileInt   -   从   Win.ini   文件的某个   Section   取得一个   key   的整数值,它的原形是:  
   
GetProfileInt(    
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPCTSTR   lpKeyName,   //   指向包含   Key   名称的字符串地址  
INT   nDefault   //   如果   Key   值没有找到,则返回缺省的值是多少  
);    
   
如果   Key   值没有找到的话,返回值是   nDefault   指定的缺省值,如果   Key   中的值是负数,则返回   0,如果  Key   指定的是数字和字符串的混合,则返回数字部分的值,比如说   x=1234abcd,则返回   1234  
   
   
GetProfileString   -   从   Win.ini   文件的某个   Section   取得一个   key   的字符串,它的原形是:  
   
GetProfileString(  
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPCTSTR   lpKeyName,   //   指向包含   Key   名称的字符串地址  
LPCTSTR   lpDefault,   //   如果   Key   值没有找到,则返回缺省的字符串的地址  
LPTSTR   lpReturnedString,   //   返回字符串的缓冲区地址  
DWORD   nSize   //   缓冲区的长度  
);    
   
返回的字符串在缓冲区内,返回的   eax   值是返回的字符串的长度(不包括尾部的0)  
   
   
GetProfileSection   -   从   Win.ini   文件中读出整个   Section   的内容,它的原形是:  
   
GetProfileSection(  
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPTSTR   lpReturnedString,   //   返回数据的缓冲区地址  
DWORD   nSize   //   返回数据的缓冲区长度  
);    
   
   
WriteProfileSection   -   将一个整个   Section   的值   写入   Win.ini   文件的指定   Section   中,它的原形是:  
   
WriteProfileSection(  
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPCTSTR   lpString   //   要写入的数据的地址  
);  
   
如果   Win.ini   没有指定的   Section,API   会新建立一个并写入数据,如果已经存在,则先删除原来   Seciton   中所有的   Key   值然后写入新的。  
   
   
WriteProfileString   -   将一个   Key   值写入   Win.ini   文件的指定   Section   中,它的原形是:  
   
WriteProfileString(    
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPCTSTR   lpKeyName,   //   指向包含   Key   名称的字符串地址  
LPCTSTR   lpString   //   要写的字符串地址  
);  
   
如果   Win.ini   没有指定的   Section,API   会新建   Section,如果没有指定的   Key   则新建一个   Key   并写入数据,如果已经存在,则用字符串代替原来的值。    
以上的   Api   是对   Win.ini   操作的,当然对于我们来说,用的更多的是在程序运行的目录中建立自己的   ini   文件,如果需要对自己的   ini   文件操作,就要用到另一组   Api,这一组   api   和上面的很象,只要把上面一组的   Profile  换成   PrivateProfile(私有的)就可以了,参数中也相应的多了一个   ini   文件名的参数。例如  GetPrivateProfileInt、GetPrivateProfileSection、WritePrivateProfileString   等等,   下面分别介绍:  
   
GetPrivateProfileInt   -   从   ini   文件的某个   Section   取得一个   key   的整数值,它的原形是:  
   
GetPrivateProfileInt(    
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPCTSTR   lpKeyName,   //   指向包含   Key   名称的字符串地址  
INT   nDefault   //   如果   Key   值没有找到,则返回缺省的值是多少  
LPCTSTR   lpFileName   //   ini   文件的文件名  
);    
   
中间参数和返回值的定义和   GetProfileInt   是一样的。  
   
   
GetPrivateProfileString   -   从   ini   文件的某个   Section   取得一个   key   的字符串,它的原形是:  
   
GetPrivateProfileString(  
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPCTSTR   lpKeyName,   //   指向包含   Key   名称的字符串地址  
LPCTSTR   lpDefault,   //   如果   Key   值没有找到,则返回缺省的字符串的地址  
LPTSTR   lpReturnedString,   //   返回字符串的缓冲区地址  
DWORD   nSize   //   缓冲区的长度  
LPCTSTR   lpFileName   //   ini   文件的文件名    
);    
   
   
GetPrivateProfileSection   -   从   ini   文件中读出整个   Section   的内容,它的原形是:  
   
GetPrivateProfileSection(  
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPTSTR   lpReturnedString,   //   返回数据的缓冲区地址  
DWORD   nSize   //   返回数据的缓冲区长度  
LPCTSTR   lpFileName   //   ini   文件的文件名    
);    
   
这个   api   可以读出整个   section   的内容,当你不知道   section   中有哪些   key   的时候,可以使用这个   api  将整个   section   读出后再处理。  
   
   
GetPrivateProfileSectionNames   -   从   ini   文件中获得   Section   的名称,它的原形是:  
   
GetPrivateProfileSectionNames(    
LPTSTR   lpszReturnBuffer,   //   返回数据的缓冲区地址  
DWORD   nSize   //   返回数据的缓冲区长度  
LPCTSTR   lpFileName   //   ini   文件的文件名    
);  
   
如果   ini   中有两个   Section:   [sec1]   和   [sec2],则返回的是   ‘sec1‘,0,‘sec2‘,0,0   ,当你不知道   ini   中有哪些   section   的时候可以用这个   api   来获取名称  
   
   
WritePrivateProfileSection   -   将一个整个   Section   的内容入   ini   文件的指定   Section   中,它的原形是:  
   
WritePrivateProfileSection(  
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPCTSTR   lpString   //   要写入的数据的地址  
LPCTSTR   lpFileName   //   ini   文件的文件名  
);  
   
   
WritePrivateProfileString   -   将一个   Key   值写入   ini   文件的指定   Section   中,它的原形是:  
   
WritePrivateProfileString(    
LPCTSTR   lpAppName,   //   指向包含   Section   名称的字符串地址  
LPCTSTR   lpKeyName,   //   指向包含   Key   名称的字符串地址  
LPCTSTR   lpString   //   要写的字符串地址  
LPCTSTR   lpFileName   //   ini   文件的文件名  
);  
   
如果   ini   中没有指定的   Section,API   会新建   Section,如果没有指定的   Key   则新建一个   Key   并写入数据,如果已经存在,则用字符串代替原来的值。当指定的   ini   也不存在的时候,API   会自动建立一个新的文件,所以使用   ini   的好处是我们不必为了保存少量的数据涉及到文件操作,就连查找文件是否存在的操作都不必要。  
   
使用要点:  
   
在我们实际使用的时候,用的最多的是   GetPrivateProfileString   和   WritePrivateProfileString,但在对自定义  ini   文件操作的时候要注意的是,如果   lpFileName   指定的文件没有路径的话,Api   会去   Windows   的安装目录去找而不会在当前目录找,但是每次用到   ini   函数要获取当前路径显然太麻烦了,这里有一个变通的办法,你只要在  ini   文件名前面加上   .\   就可以了,比如说要对本目录下的   user.ini   操作,那么文件名就是   ‘.\user.ini‘   这样显然比较方便。另外,当你要把一个   Key   清除的时候,可以使用把   lpString   指向一个空的字符串然后使用  WritePrivateProfileString。当你要把一个   section   的全部内容清空的时候,也不必把   key   一个个的清除,可以使用把   lpString   指向一个空的字符串然后使用   WritePrivateProfileSection。

 

VCMFC如何设置对话框背景颜色

1.

重载OnCtlColor    (CDC*    pDC,    CWnd*    pWnd,    UINT    nCtlColor),即WM_CTLCOLOR消息。  
   ----    ①在CExampleDlgDlg的头文件中,添加一CBrush的成员变量:    
   class    CExampleDlgDlg    :    public    CDialog  
   {...  
   protected:  
   CBrush    m_brush;    
   ...  
   };  
   ----    ②在OnInitDialog()函数中添加如下代码:    
   BOOL    CExampleDlgDlg::OnInitDialog()    
   {  
   ...  
   //    TODO:    Add    extra    initialization    here  
   m_brush.CreateSolidBrush(RGB(0,    255,    0));    //    生成一绿色刷子    
   ...  
   }    
   ----    ③利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:    
   HBRUSH    CExampleDlgDlg::OnCtlColor  
   (CDC*    pDC,    CWnd*    pWnd,    UINT    nCtlColor)    
   {  
     
   return    m_brush;        //返加绿色刷子  
   }

2.

修改对话框的OnPaint,在else中添加如下代码  
           CPaintDC    dc(this);  
           CRect    rect;    
           GetClientRect(rect);    
           dc.FillSolidRect(rect,    RGB(0,0,0));    
           CDialog::OnPaint();

3.

在对话框的应用类(App)的.cpp的Initinstance()中加入代码:  
                   //加在int    nResponse=dlg.DoModal();  
                   前一个RGB设置背景色,第二个设置字体颜色  
   SetDialogBkColor(RGB(0,0,255),RGB(0,255,0));

4.

1.在对话框类中添加成员变量:  
   public:  
           CBrush          m_brushBlue;  
   
   2.在对话框类的OnInitDialog()中添加代码:  
   m_brushBlue.CreateSolidBrush(RGB(0,0,255));  
   
   3.用ClassWizard在对话框类中添加成员函数OnCtlCollor(),并在其中添加代码:  
   if(nCtlColor==CTLCOLOR_DLG)  
   return    m_brushBlue;


MFC最小化到系统托盘

MFC最小化到系统托盘
--《VC编程知识总结》之一
    在VC++中,想实现将MFC最小化到系统托盘,需要调用NOTIFYICONDATA类,并注册相应的消息,以下详细讲解如何实现:
    第一步,声明一个NOTIFYICONDATA类,也就是NOTIFYICONDATA NotifyIcon;该句可以放在Dlg类的声明中,作为Dlg类的一个成员;也可以放在Dlg类的实现中,作为全局变量来使用。
    第二步,声明一个响应函数afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam);用于响应鼠标操作。将这个函数放入Dlg类的声明中,作为Dlg类的一个成员。
    第三步,定义消息名称以消息号,并注册消息,该步很重要!我就是因为没有注册消息,导致调试了很久都找不到问题所在。该步都是在Dlg.cpp(Dlg的实现中)中操作。定义消息名称和消息号:#define WM_NC (WM_USER+1001),1001只是用于指定一个消息号,可以随便指定。注册则是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之间添加ON_MESSAGE(WM_NC,OnNotifyIcon)。
    第四步,在要将MFC最小化到系统托盘的函数中添加如下代码:
    NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
    NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    NotifyIcon.hWnd=m_hWnd;
    lstrcpy(NotifyIcon.szTip,"NotifyIcon Test");
    NotifyIcon.uCallbackMessage=WM_NC;
    NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
    Shell_NotifyIcon(NIM_ADD,&NotifyIcon);
    有了上面的代码,当程序运行到含有如上代码的函数时就会在系统托盘处添加一个图标,想隐藏主对话框,就再添加一句ShowWindow(SW_HIDE);这样就实现了将MFC最小化到系统托盘。但还要添加点击托盘图标时响应鼠标的函数,也就是第二步中的函数OnNotifyIcon。
    第五步,OnNotifyIcon函数,如下:
    void CDlg::OnNotifyIcon(WPARAM wParam,LPARAM IParam)
    {
         if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))
         {
              ModifyStyleEx(0,WS_EX_TOPMOST);
              ShowWindow(SW_SHOW);
              //Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);
         }
    }
    以上函数写的很简单,因为我定义的是基于对话框的MFC,没有添加menu,所以只是实现了简单的点击托盘图标就弹出主对话框。对于右键点击托盘图标弹出小menu,然后选择操作,最好是建立工程的时候就选择基于菜单的MFC,这样会容易很多,详细的我自己还没有研究,就不乱讲了。对于上面函数中Shell_NotifyIcon(NIM_DELETE,&NotifyIcon)一句,是清除托盘图标,在这里可以没有,但在退出整个程序的时候一定要加上,不然程序退出了,托盘处还有一个图标,只有鼠标指到那里时系统才会发现是进程残留而清除,这种做法很不好!

时间: 2024-10-13 12:00:02

MFC操作ini配置文件的相关文章

Python中操作ini配置文件

这篇博客我主要想总结一下python中的ini文件的使用,最近在写python操作mysql数据库,那么作为测试人员测试的环境包括(测试环境,UAT环境,生产环境)每次需要连接数据库的ip,端口,都会不同,那么如何方便的来修改这些内容,就想到了配置文件,接下来我们就了解一下python中的配置文件ini吧 ini配置文件常被用作存储程序中的一些参数,通过它,可以将经常需要改变的参数保存起来 ini文件分为两个部分,一部分是section,一部分是key,value 格式就是: [section1

操作ini配置文件设计一个最基本的可视化数据库系统

对于很多小项目来说,不需要搭建专门的数据库系统(例如用SQLite搭建本地数据库),这时可以用ini配置文件实现一个最基本的数据库,实现数据库最基本的增删改查功能. ini配置文件的用法参考我以前写的文章:http://www.cnblogs.com/xh6300/p/5895759.html 这种配置文件的结构如下: [section1] key1=value1 key2=value2 [section2] key3=value3 key4=value4 …… 具体配置文件如下: 如果要想让这

C# 中通过C++的GetPrivateProfileString和WritePrivateProfileString操作ini配置文件

namespace APIMethod{    /*     * 姓名:谭义     * 时间:2008.5.28     * Q  Q:260511433     * MSN :[email protected]     * 邮箱:[email protected]     * 备注:如果大家对此模块还需要补充或完善修改的,请和我联系,大家一起努力.     * 注意:此模块只能获得一个键的值,如果谁能完善获得一个小节的所有键与值,请与我联系.    */ /// <summary>   

【个人使用.Net类库】(1)INI配置文件操作类

开发接口程序时,对于接口程序配置的IP地址.端口等都需要是可配置的,而在Win Api原生实现了INI文件的读写操作,因此只需要调用Win Api中的方法即可操作INI配置文件,关键代码就是如何调用Win Api中的方法,如下所示: #region 调用WinApi 原方法声明 [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key,

C#小白使用入门,数据库操作,web端文件下载,执行外部程序,操作ini文件

现况:现有程序被排在服务器的每日执行任务计划中,程序功能是下载web端的一个文件,然后塞入到数据库中. 问题:不知道什么原因,偶尔发现服务器任务执行失败情况,导致某一天的数据缺失. 需求:每隔三天检查一次数据是否存在,如果不存在,则指定日期重新下载一次. 第一步:写一个操作数据库的类 namespace DEMO2616{ public class OracleDBlink {string connStr = "User Id=LIRUPENG;Password=Lrp19961013..;Da

php.ini配置文件

php.ini配置文件: engine=On;使PHP脚本语言引擎在Apache下有效.当设置engine=Off后不能解析PHP文件. short_open_tag=Off;设置<? code ?>标志是否能被识别.设置short_open_tag=Off后不能识别在<? code ?>中的代码 . asp_tags = Off:设置<% code %>标志是否能被识别.设置asp_tags==Off;后不能识别. precision = 14:设置浮点类型数据显示位

DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

转:http://blog.csdn.net/zssureqh/article/details/8846337 背景介绍: 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档,写入数据库处理.由于医学图像的特殊性,每一个患者(即所谓的Patient)每做一次检查(即Study)都至少会产生一组图像序列(即Series),而每一组图像序列下会包含大量的dcm文件(例如做一次心脏CTA的诊断,完整的一个心脏断层扫描序列大约有200幅图像).DICOM3.0协议中对每一幅影像是按照特定的三个

[转]C#操作INI文件

在很多的程序中,我们都会看到有以.ini为后缀名的文件,这个文件可以很方便的对程序配置的一些信息进行设置和读取,比如说我们在做一个程序后台登陆的时候,需要自动登录或者是远程配置数据库连接,及保存密码设置等等(在Winform程序中),若在ASP.NET程序中有另外的解决方法,此C#操作INI文件的文章仅在winform程序中进行写入和读取操作. 为了方便起见,现在以一个简单的小实例来对C#操作INI文件进行讲解: 窗体的大致布局如下 当点击写入按钮的时候就会把文本框中输入的值写入到INI文件中,

笔记 php.ini配置文件中magic_quotes_gpc, magic_quotes_runtime的作用是什么?应该开启还是关闭?

默认情况下,PHP 指令 magic_quotes_gpc 为 on,对所有的 GET.POST 和 COOKIE 数据自动运行 addslashes().不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义.遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测. PHP magic_quotes_gpc=on的情况:我们可以不对输入和输出数据库的字符串数据作addslashes()和stripslas