日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC 操作配置文件INI的方法

發(fā)布時間:2023/12/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC 操作配置文件INI的方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.?VC中用函數(shù)讀寫ini文件的方法

???????? ini文件(即Initialization file),這種類型的文件中通常存放的是一個程序的初始化信息。ini文件由若干個節(jié)(Section)組成,每個Section由若干鍵(Key)組成,每個Key可以賦相應(yīng)的值。讀寫ini文件實際上就是讀寫某個的Section中相應(yīng)的Key的值,而這只要借助幾個函數(shù)即可完成。

一、向ini文件中寫入信息的函數(shù)
1. 把信息寫入系統(tǒng)的win.ini文件
BOOL WriteProfileString(
????? LPCTSTR lpAppName, // 節(jié)的名字,是一個以0結(jié)束的字符串
????? LPCTSTR lpKeyName, // 鍵的名字,是一個以0結(jié)束的字符串。若為NULL,則刪除整個節(jié)
????? LPCTSTR lpString?????? // 鍵的值,是一個以0結(jié)束的字符串。若為NULL,則刪除對應(yīng)的鍵
)


2. 把信息寫入自己定義的.ini文件
BOOL WritePrivateProfileString(
????? LPCTSTR lpAppName,????? // 同上
????? LPCTSTR lpKeyName,????? // 同上
????? LPCTSTR lpString,?????? // 同上
????? LPCTSTR lpFileName????? // 要寫入的文件的文件名。若該ini文件與程序在同一個目錄下,也可使用相對
??????????? //路徑,否則需要給出絕度路徑。
)

如:
::WriteProfileString("Test","id","xym");?
//在win.ini中創(chuàng)建一個Test節(jié),并在該節(jié)中創(chuàng)建一個鍵id,其值為xym

::WritePrivateProfileString("Test","id","xym","d://vc//Ex1//ex1.ini");
//在Ex1目錄下的ex1.ini中創(chuàng)建一個Test節(jié),并在該節(jié)中創(chuàng)建一個鍵id,其值為xym

//若Ex1.ini文件與讀寫該文件的程序在同一個目錄下,則上面語句也可寫為:
::WritePrivateProfileString("Test","id","xym",".//ex1.ini");

需要注意的是,C系列的語言中,轉(zhuǎn)義字符'//'表示反斜線'/'。另外,當(dāng)使用相對路徑時,//前的.號不能丟掉了。

二、從ini文件中讀取數(shù)據(jù)的函數(shù)
1、從系統(tǒng)的win.ini文件中讀取信息
(1) 讀取字符串
DWORD GetProfileString(
????? LPCTSTR lpAppName,??????????? // 節(jié)名
????? LPCTSTR lpKeyName,??????????? // 鍵名,讀取該鍵的值
????? LPCTSTR lpDefault,??????????? // 若指定的鍵不存在,該值作為讀取的默認值
????? LPTSTR lpReturnedString,????? // 一個指向緩沖區(qū)的指針,接收讀取的字符串
????? DWORD nSize?????????????????? // 指定lpReturnedString指向的緩沖區(qū)的大小
)

如:
CString str;
::GetProfileString("Test","id","Error",str.GetBuffer(20),20);

(2) 讀取整數(shù)
UINT GetProfileInt(
????? LPCTSTR lpAppName,????? // 同上
????? LPCTSTR lpKeyName,????? // 同上
????? INT nDefault??????????? // 若指定的鍵名不存在,該值作為讀取的默認值
)

如使用以下語句寫入了年齡信息:
::WriteProfileString("Test","age","25");?
//在win.ini中創(chuàng)建一個Test節(jié),并在該節(jié)中創(chuàng)建一個鍵age,其值為25

則可用以下語句讀取age鍵的值:
int age;
age=::GetProfileInt("Test","age",0);

2、從自己的ini文件中讀取信息
(1) 讀取字符串
DWORD GetPrivateProfileString(
????? LPCTSTR lpAppName,??????????? // 同1(1)
????? LPCTSTR lpKeyName,??????????? // 同1(1)
????? LPCTSTR lpDefault,??????????? // 同1(1)
????? LPTSTR lpReturnedString,????? // 同1(1)
????? DWORD nSize,????????????????? // 同1(1)
????? LPCTSTR lpFileName??????????? // 讀取信息的文件名。若該ini文件與程序在同一個目錄下,也可使用相??????
??????????? //對路徑,否則需要給出絕度路徑。
)

如:
CString str;
::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,".//ex1.ini");
或:
::GetPrivateProfileString("Test","id","Error",str.GetBuffer(20),20,"d://vc//Ex1//ex1.ini");

(2) 讀取整數(shù)

UINT GetPrivateProfileInt(
????? LPCTSTR lpAppName,????? // 同上
????? LPCTSTR lpKeyName,????? // 同上
????? INT nDefault,?????????? // 若指定的鍵名不存在,該值作為讀取的默認值
????? LPCTSTR lpFileName????? // 同上
)

如使用以下語句寫入了年齡信息:
::WritePrivateProfileString("Test","age","25",".//ex1.ini");?
//在ex1.ini中創(chuàng)建一個Test節(jié),并在該節(jié)中創(chuàng)建一個鍵age,其值為25

則可用以下語句讀取age鍵的值:
int age;
age=::GetPrivateProfileInt("Test","age",0,".//ex1.ini");

三、 刪除鍵值或節(jié)

?????? 回顧一下WriteProfileString函數(shù)的說明
BOOL WriteProfileString(
????? LPCTSTR lpAppName, // 節(jié)的名字,是一個以0結(jié)束的字符串
????? LPCTSTR lpKeyName, // 鍵的名字,是一個以0結(jié)束的字符串。若為NULL,則刪除整個節(jié)
????? LPCTSTR lpString?????? // 鍵的值,是一個以0結(jié)束的字符串。若為NULL,則刪除對應(yīng)的鍵
)

?????? 由此可見,要刪除某個節(jié),只需要將WriteProfileString第二個參數(shù)設(shè)為NULL即可。而要刪除某個鍵,則只需要將該函數(shù)的第三個參數(shù)設(shè)為 NULL即可。這是刪除系統(tǒng)的win.ini中的節(jié)或鍵,類似的,要刪除自己定義的ini文件中的節(jié)或鍵,也可做相同的操作。
?????? 如:
::WriteProfileString("Test",NULL,NULL);????? //刪除win.ini中的Test節(jié)
::WriteProfileString("Test","id",NULL);????? //刪除win.ini中的id鍵

::WritePrivateProfileString("Test",NULL,NULL,".//ex1.ini");????? //刪除ex1.ini中的Test節(jié)
::WritePrivateProfileString("Test","id",NULL,".//ex1.ini");????? //刪除ex1.ini中的id鍵

四、如何判斷一個ini文件中有多少個節(jié)
?????? 要判斷一個ini文件中有多少個節(jié),最簡單的辦法就是將所有的節(jié)名都找出來,然后統(tǒng)計節(jié)名的個數(shù)。而要將所有的節(jié)名找出來,使用GetPrivateProfileSectionNames函數(shù)就可以了,其原型如下:
DWORD GetPrivateProfileSectionNames(
????? LPTSTR lpszReturnBuffer,????? // 指向一個緩沖區(qū),用來保存返回的所有節(jié)名
????? DWORD nSize,????????????????? // 參數(shù)lpszReturnBuffer的大小
????? LPCTSTR lpFileName??????????? // 文件名,若該ini文件與程序在同一個目錄下,

??????????????????????????????????????????????? //也可使用相對路徑,否則需要給出絕度路徑
)

下面的是用來統(tǒng)計一個ini文件中共有多少個節(jié)的函數(shù),當(dāng)然,如果需要同時找到每個節(jié)中的各個鍵及其值,根據(jù)找到節(jié)名就可以很容易的得到了。


/*統(tǒng)計共有多少個節(jié)
節(jié)名的分離方法:若chSectionNames數(shù)組的第一字符是'/0'字符,則表明
有0個節(jié)。否則,從chSectionNames數(shù)組的第一個字符開始,順序往后找,
直到找到一個'/0'字符,若該字符的后繼字符不是 '/0'字符,則表明前
面的字符組成一個節(jié)名。若連續(xù)找到兩個'/0'字符,則統(tǒng)計結(jié)束*/


int CTestDlg::CalcCount(void)
{
TCHAR?????? chSectionNames[2048]={0};?????? //所有節(jié)名組成的字符數(shù)組
char * pSectionName; //保存找到的某個節(jié)名字符串的首地址
int i;?????? //i指向數(shù)組chSectionNames的某個位置,從0開始,順序后移
int j=0;????? //j用來保存下一個節(jié)名字符串的首地址相對于當(dāng)前i的位置偏移量
int count=0;????? //統(tǒng)計節(jié)的個數(shù)

//CString name;
//char id[20];
::GetPrivateProfileSectionNames(chSectionNames,2048,".//ex1.ini");???
for(i=0;i<2048;i++,j++)
{
????? if(chSectionNames[0]=='/0')
?????? break;?????? //如果第一個字符就是0,則說明ini中一個節(jié)也沒有
????? if(chSectionNames[i]=='/0')
????? {
?????? pSectionName=&chSectionNames[i-j]; //找到一個0,則說明從這個字符往前,減掉j個偏移量,
??????????? //就是一個節(jié)名的首地址

?????? j=-1;???????? //找到一個節(jié)名后,j的值要還原,以統(tǒng)計下一個節(jié)名地址的偏移量
??????????? //賦成-1是因為節(jié)名字符串的最后一個字符0是終止符,不能作為節(jié)名

??????????? //的一部分
?????? /*::GetPrivateProfileString(pSectionName,"id","Error",id,20,".//ex1.ini");
?????? name.Format("%s",id);*/???
?????? //在獲取節(jié)名的時候可以獲取該節(jié)中鍵的值,前提是我們知道該節(jié)中有哪些鍵。
???
?????? AfxMessageBox(pSectionName);????? //把找到的顯示出來

?????? if(chSectionNames[i+1]==0)
?????? {
???????? break;????? //當(dāng)兩個相鄰的字符都是0時,則所有的節(jié)名都已找到,循環(huán)終止
?????? }
????? }???
}
return count;
}

?

//

/

在VC程序中利用系統(tǒng)提供的GetPrivateProfileString及WritePrivateProfileString函數(shù)直接讀寫系統(tǒng)配置ini文件(指定目錄下的Ini文件)

假設(shè)在當(dāng)前目錄下有一個文件名為Tets.ini的文件
用于保存用戶名和密碼
文件格式如下:
[Section1]
Item1=huzhifeng
Item2=1234565

1.寫INI文件
void?CINI_File_TestDlg::OnButtonWrite()?
{
?//?TODO:?Add?your?control?notification?handler?code?here

?CString?strSection???????=?"Section1";
??CString?strSectionKey????=?"Item1";
?char?strBuff[256];
??CString?strValue???????=?_T("");
?CString?strFilePath;

?strFilePath=GetCurrentDirectory(256,strBuff);??//獲取當(dāng)前路徑
?strFilePath.Format("%s//Test.ini",strBuff);

?GetDlgItemText(IDC_EDIT_NAME,strValue);?????//獲取文本框內(nèi)容:即姓名
?WritePrivateProfileString(strSection,strSectionKey,strValue,strFilePath);??//寫入ini文件中相應(yīng)字段

?strSectionKey="Item2";
?GetDlgItemText(IDC_EDIT_PASSWORD,strValue);???//獲取文本框內(nèi)容:即密碼
?WritePrivateProfileString(strSection,strSectionKey,strValue,strFilePath);
}

2.讀INI文件內(nèi)容
void?CINI_File_TestDlg::OnButtonRead()?
{
?//?TODO:?Add?your?control?notification?handler?code?here
?CString?strSection???????=?"Section1";
??CString?strSectionKey????=?"Item1";
?char?strBuff[256];
?CString?strValue???????=?_T("");
?CString?strFilePath;

?strFilePath=GetCurrentDirectory(256,strBuff);??//獲取當(dāng)前路徑
?strFilePath.Format("%s//Test.ini",strBuff);

?GetPrivateProfileString(strSection,strSectionKey,NULL,strBuff,80,strFilePath);?//讀取ini文件中相應(yīng)字段的內(nèi)容
?strValue=strBuff;
?SetDlgItemText(IDC_EDIT_NAME,strValue);

?strSectionKey="Item2";
?GetPrivateProfileString(strSection,strSectionKey,NULL,strBuff,80,strFilePath);
?strValue=strBuff;
?SetDlgItemText(IDC_EDIT_PASSWORD,strValue);

?UpdateData(FALSE);
}

?

概述??
???
在程序中經(jīng)常要用到設(shè)置或者其他少量數(shù)據(jù)的存盤,以便程序在下一次執(zhí)行的時候可以使用,比如說保存本次程序執(zhí)行時窗口的位置、大小、一些用戶設(shè)置的數(shù)據(jù)等等,在???Dos???下編程的時候,我們一般自己產(chǎn)生一個文件,由自己把這些數(shù)據(jù)寫到文件中,然后在下一次執(zhí)行的時候再讀出來使用。在???Win32???編程中當(dāng)然你也可以這樣干,但???Windows???已經(jīng)為我們提供了兩種方便的辦法,那就是使用注冊表或者???ini???文件(Profile)來保存少量數(shù)據(jù)。本文中先介紹一下???.ini???文件的使用。??
???
ini???文件是文本文件,中間的數(shù)據(jù)格式一般為:??
[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將用戶所作的選擇以及各種變化的系統(tǒng)信息記錄在這兩個文件中。System.ini???描述了系統(tǒng)硬件的當(dāng)前狀態(tài),Win.ini???文件則包含了Windows???系統(tǒng)運行環(huán)境的當(dāng)前配置。由于???Win.ini???文件的重要性和常用性,Win32???中有專門對???Win.ini???進行操作的???api,它們是:??
???
GetProfileInt???-???從???Win.ini???文件的某個???Section???取得一個???key???的整數(shù)值,它的原形是:??
???
GetProfileInt(????
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPCTSTR???lpKeyName,???//???指向包含???Key???名稱的字符串地址??
INT???nDefault???//???如果???Key???值沒有找到,則返回缺省的值是多少??
);????
???
如果???Key???值沒有找到的話,返回值是???nDefault???指定的缺省值,如果???Key???中的值是負數(shù),則返回???0,如果??Key???指定的是數(shù)字和字符串的混合,則返回數(shù)字部分的值,比如說???x=1234abcd,則返回???1234??
???
???
GetProfileString???-???從???Win.ini???文件的某個???Section???取得一個???key???的字符串,它的原形是:??
???
GetProfileString(??
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPCTSTR???lpKeyName,???//???指向包含???Key???名稱的字符串地址??
LPCTSTR???lpDefault,???//???如果???Key???值沒有找到,則返回缺省的字符串的地址??
LPTSTR???lpReturnedString,???//???返回字符串的緩沖區(qū)地址??
DWORD???nSize???//???緩沖區(qū)的長度??
);????
???
返回的字符串在緩沖區(qū)內(nèi),返回的???eax???值是返回的字符串的長度(不包括尾部的0)??
???
???
GetProfileSection???-???從???Win.ini???文件中讀出整個???Section???的內(nèi)容,它的原形是:??
???
GetProfileSection(??
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPTSTR???lpReturnedString,???//???返回數(shù)據(jù)的緩沖區(qū)地址??
DWORD???nSize???//???返回數(shù)據(jù)的緩沖區(qū)長度??
);????
???
???
WriteProfileSection???-???將一個整個???Section???的值???寫入???Win.ini???文件的指定???Section???中,它的原形是:??
???
WriteProfileSection(??
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPCTSTR???lpString???//???要寫入的數(shù)據(jù)的地址??
);??
???
如果???Win.ini???沒有指定的???Section,API???會新建立一個并寫入數(shù)據(jù),如果已經(jīng)存在,則先刪除原來???Seciton???中所有的???Key???值然后寫入新的。??
???
???
WriteProfileString???-???將一個???Key???值寫入???Win.ini???文件的指定???Section???中,它的原形是:??
???
WriteProfileString(????
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPCTSTR???lpKeyName,???//???指向包含???Key???名稱的字符串地址??
LPCTSTR???lpString???//???要寫的字符串地址??
);??
???
如果???Win.ini???沒有指定的???Section,API???會新建???Section,如果沒有指定的???Key???則新建一個???Key???并寫入數(shù)據(jù),如果已經(jīng)存在,則用字符串代替原來的值。????
以上的???Api???是對???Win.ini???操作的,當(dāng)然對于我們來說,用的更多的是在程序運行的目錄中建立自己的???ini???文件,如果需要對自己的???ini???文件操作,就要用到另一組???Api,這一組???api???和上面的很象,只要把上面一組的???Profile??換成???PrivateProfile(私有的)就可以了,參數(shù)中也相應(yīng)的多了一個???ini???文件名的參數(shù)。例如??GetPrivateProfileInt、GetPrivateProfileSection、WritePrivateProfileString???等等,???下面分別介紹:??
???
GetPrivateProfileInt???-???從???ini???文件的某個???Section???取得一個???key???的整數(shù)值,它的原形是:??
???
GetPrivateProfileInt(????
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPCTSTR???lpKeyName,???//???指向包含???Key???名稱的字符串地址??
INT???nDefault???//???如果???Key???值沒有找到,則返回缺省的值是多少??
LPCTSTR???lpFileName???//???ini???文件的文件名??
);????
???
中間參數(shù)和返回值的定義和???GetProfileInt???是一樣的。??
???
???
GetPrivateProfileString???-???從???ini???文件的某個???Section???取得一個???key???的字符串,它的原形是:??
???
GetPrivateProfileString(??
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPCTSTR???lpKeyName,???//???指向包含???Key???名稱的字符串地址??
LPCTSTR???lpDefault,???//???如果???Key???值沒有找到,則返回缺省的字符串的地址??
LPTSTR???lpReturnedString,???//???返回字符串的緩沖區(qū)地址??
DWORD???nSize???//???緩沖區(qū)的長度??
LPCTSTR???lpFileName???//???ini???文件的文件名????
);????
???
???
GetPrivateProfileSection???-???從???ini???文件中讀出整個???Section???的內(nèi)容,它的原形是:??
???
GetPrivateProfileSection(??
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPTSTR???lpReturnedString,???//???返回數(shù)據(jù)的緩沖區(qū)地址??
DWORD???nSize???//???返回數(shù)據(jù)的緩沖區(qū)長度??
LPCTSTR???lpFileName???//???ini???文件的文件名????
);????
???
這個???api???可以讀出整個???section???的內(nèi)容,當(dāng)你不知道???section???中有哪些???key???的時候,可以使用這個???api??將整個???section???讀出后再處理。??
???
???
GetPrivateProfileSectionNames???-???從???ini???文件中獲得???Section???的名稱,它的原形是:??
???
GetPrivateProfileSectionNames(????
LPTSTR???lpszReturnBuffer,???//???返回數(shù)據(jù)的緩沖區(qū)地址??
DWORD???nSize???//???返回數(shù)據(jù)的緩沖區(qū)長度??
LPCTSTR???lpFileName???//???ini???文件的文件名????
);??
???
如果???ini???中有兩個???Section:???[sec1]???和???[sec2],則返回的是???'sec1',0,'sec2',0,0???,當(dāng)你不知道???ini???中有哪些???section???的時候可以用這個???api???來獲取名稱??
???
???
WritePrivateProfileSection???-???將一個整個???Section???的內(nèi)容入???ini???文件的指定???Section???中,它的原形是:??
???
WritePrivateProfileSection(??
LPCTSTR???lpAppName,???//???指向包含???Section???名稱的字符串地址??
LPCTSTR???lpString???//???要寫入的數(shù)據(jù)的地址??
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???并寫入數(shù)據(jù),如果已經(jīng)存在,則用字符串代替原來的值。當(dāng)指定的???ini???也不存在的時候,API???會自動建立一個新的文件,所以使用???ini???的好處是我們不必為了保存少量的數(shù)據(jù)涉及到文件操作,就連查找文件是否存在的操作都不必要。??
???
使用要點:??
???
在我們實際使用的時候,用的最多的是???GetPrivateProfileString???和???WritePrivateProfileString,但在對自定義??ini???文件操作的時候要注意的是,如果???lpFileName???指定的文件沒有路徑的話,Api???會去???Windows???的安裝目錄去找而不會在當(dāng)前目錄找,但是每次用到???ini???函數(shù)要獲取當(dāng)前路徑顯然太麻煩了,這里有一個變通的辦法,你只要在??ini???文件名前面加上???.\???就可以了,比如說要對本目錄下的???user.ini???操作,那么文件名就是???'.\user.ini'???這樣顯然比較方便。另外,當(dāng)你要把一個???Key???清除的時候,可以使用把???lpString???指向一個空的字符串然后使用??WritePrivateProfileString。當(dāng)你要把一個???section???的全部內(nèi)容清空的時候,也不必把???key???一個個的清除,可以使用把???lpString???指向一個空的字符串然后使用???WritePrivateProfileSection。

?

VCMFC如何設(shè)置對話框背景顏色

1.

重載OnCtlColor????(CDC*????pDC,????CWnd*????pWnd,????UINT????nCtlColor),即WM_CTLCOLOR消息。??
???----????①在CExampleDlgDlg的頭文件中,添加一CBrush的成員變量:????
???class????CExampleDlgDlg????:????public????CDialog??
???{...??
???protected:??
???CBrush????m_brush;????
???...??
???};??
???----????②在OnInitDialog()函數(shù)中添加如下代碼:????
???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.

在對話框的應(yīng)用類(App)的.cpp的Initinstance()中加入代碼:??
???????????????????//加在int????nResponse=dlg.DoModal();??
???????????????????前一個RGB設(shè)置背景色,第二個設(shè)置字體顏色??
???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在對話框類中添加成員函數(shù)OnCtlCollor(),并在其中添加代碼:??
???if(nCtlColor==CTLCOLOR_DLG)??
???return????m_brushBlue;

?

MFC最小化到系統(tǒng)托盤

MFC最小化到系統(tǒng)托盤
--《VC編程知識總結(jié)》之一
????在VC++中,想實現(xiàn)將MFC最小化到系統(tǒng)托盤,需要調(diào)用NOTIFYICONDATA類,并注冊相應(yīng)的消息,以下詳細講解如何實現(xiàn):
????第一步,聲明一個NOTIFYICONDATA類,也就是NOTIFYICONDATA NotifyIcon;該句可以放在Dlg類的聲明中,作為Dlg類的一個成員;也可以放在Dlg類的實現(xiàn)中,作為全局變量來使用。
????第二步,聲明一個響應(yīng)函數(shù)afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam);用于響應(yīng)鼠標(biāo)操作。將這個函數(shù)放入Dlg類的聲明中,作為Dlg類的一個成員。
????第三步,定義消息名稱以消息號,并注冊消息,該步很重要!我就是因為沒有注冊消息,導(dǎo)致調(diào)試了很久都找不到問題所在。該步都是在Dlg.cpp(Dlg的實現(xiàn)中)中操作。定義消息名稱和消息號:#define WM_NC (WM_USER+1001),1001只是用于指定一個消息號,可以隨便指定。注冊則是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之間添加ON_MESSAGE(WM_NC,OnNotifyIcon)。
????第四步,在要將MFC最小化到系統(tǒng)托盤的函數(shù)中添加如下代碼:
????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);
????有了上面的代碼,當(dāng)程序運行到含有如上代碼的函數(shù)時就會在系統(tǒng)托盤處添加一個圖標(biāo),想隱藏主對話框,就再添加一句ShowWindow(SW_HIDE);這樣就實現(xiàn)了將MFC最小化到系統(tǒng)托盤。但還要添加點擊托盤圖標(biāo)時響應(yīng)鼠標(biāo)的函數(shù),也就是第二步中的函數(shù)OnNotifyIcon。
????第五步,OnNotifyIcon函數(shù),如下:
????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);
?????????}
????}
????以上函數(shù)寫的很簡單,因為我定義的是基于對話框的MFC,沒有添加menu,所以只是實現(xiàn)了簡單的點擊托盤圖標(biāo)就彈出主對話框。對于右鍵點擊托盤圖標(biāo)彈出小menu,然后選擇操作,最好是建立工程的時候就選擇基于菜單的MFC,這樣會容易很多,詳細的我自己還沒有研究,就不亂講了。對于上面函數(shù)中Shell_NotifyIcon(NIM_DELETE,&NotifyIcon)一句,是清除托盤圖標(biāo),在這里可以沒有,但在退出整個程序的時候一定要加上,不然程序退出了,托盤處還有一個圖標(biāo),只有鼠標(biāo)指到那里時系統(tǒng)才會發(fā)現(xiàn)是進程殘留而清除,這種做法很不好!

總結(jié)

以上是生活随笔為你收集整理的MFC 操作配置文件INI的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。