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)容還不錯,歡迎將生活随笔 推薦給好友。