海阔天空-wide-area

海阔天空,随心所欲,有什么,说什么,Linux,VC,Network Programming

星期五, 十月 21, 2005

VisualC++:利用API函数直接读写ini文件

利用API函数直接读写ini文件

利用API函数直接读写ini文件

我们可利用API函数直接读写ini文件。

㈠ 读ini文件中的项值

① 读整数值:

UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT
nDefault,LPCSTR lpFileName);

lpAppName为段名,lpKeyName为项名,nDefault为找不到该项时返回的默认值,
lpFileName为ini文件名

返回值:若成功,返回指定项后的整数值,若该项不存在,返回nDefault的值

如:读取RAV.ini文件中[INSTALLED]段的FWBASE2K项的值

int FwbBase2K = ::GetPrivateProfileInt("INSTALLED", "FWBASE2K", 0,
"RAV.ini");

如果[INSTALLED]段的FWBASE2K项存在,则FwbBase2K的值为读出的值,若不存在,
则为函数调用中指定的0。

② 读字符串:

DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR
lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR
lpFileName);

lpAppName为段名,lpKeyName为项名,lpDefault为找不到该项时返回的默认值,
lpReturnedString指向接收结果的字符串缓冲区,nSize为缓冲区长度,
lpFileName为ini文件名

执行结果:若成功,lpReturnedString指示的串中为读出的项值,若该项不存在,
lpReturnedString中为lpDefault的值

如:读取RAV.ini文件中[Skin]段的Path项的值

CString PathName; //接收串的变量

::GetPrivateProfileString("Skin", "Path", "",
PathName.GetBuffer(MAX_PATH), MAX_PATH, "RAV.ini");

PathName.ReleaseBuffer(); //释放多余空间

MAX_PATH为系统预定义的常数,其值可能是255。

㈡ 把数据写入ini文件

写入时没有写入整数的函数,只有写入字符串的函数

BOOL WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR
lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);

lpAppName为段名,lpKeyName为项名,lpString为写入的字符串,lpFileName为
ini文件名

返回值:若成功,返回true,否则返回false

若写入时,该ini文件不存在,则这个函数会自动建立这个文件,并建立相应的段
和项。

如:把RAV.ini文件中[INSTALLED]段的FWBASE2K项的值设置为2,由于这是整数,
应先转换为字符串后再写入

CString str;

str.Format("%d", 2); //把写入的整数转换为字符串

::WritePrivateProfileString( "INSTALLED", "FWBASE2K", str, "RAV.ini" );
//写入ini文件

注意:实际应用中,ini文件名应采用绝对路径名,否则可能找不到要读写的ini文件。

VisualC++:用一个消息处理函数来处理一批消息

用一个消息处理函数来处理一批消息

有时我们可能想用一个消息处理函数来处理一批消息。这时类向导就无能为力了。
我们必须手工加入消息映射来完成这种工作。可用如下方法实现:

  首先在处理该消息所在类的实现文件(亦即.CPP)中加入的消息映射入口:

   ...

  BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

   file://{{AFX_MSG_MAP(CMyApp)

   ...

   file://}}AFX_MSG_MAP

   ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, OnDoSomething)

  END_MESSAGE_MAP( )

  ...

粗体标志的语句是我们加入的语句(以后约定我们加入的语句均用粗体标志).其中
我们使用了宏ON_COMMAND_RANGE来实现从命令消息 ID_MYCMD_ONE到 ID_MYCMD_TEN
都由OnDoSomthing一个消息函数处理.注意.ID_MYCMD_ONE到 ID_MYCMD_TEN的ID值
一定要连续.且ID_MYCMD_ONE值一般较小.

  完成上述工作之后我们还需要在该类的头文件(亦即.H)中加入消息处理函数的
申明:

  // Generated message-map functions

  protected:

  file://{{AFX_MSG(CMyApp)

  ...

  file://}}AFX_MSG

  afx_msg void OnDoSomething( UINT nID );

  DECLARE_MESSAGE_MAP()

  由于这不是VC类向导加入的函数申明,所以放在了//}}AFX_MSG之外.

  注意这个消息处理函数有一个UINT类型参数.而处理单一命令的消息处理函数
一般是没有参数(除更新用户接口对象状态命令消息处理函数).这个参数的主要作
用是提供用户选择的命令的ID值.

  最后要做的工作就是在该类的实现文件中实现该消息处理函数. 同样,有时我
们也想使用一个消息处理函数处理一批更新用户接口对象状态命令消息.方法同上:

  首先在.CPP文件中加入语句如下:

   ...

   BEGIN_MESSAGE_MAP(CMyApp, CWinApp)

    file://{{AFX_MSG_MAP(CMyApp)

     ...

    file://}}AFX_MSG_MAP

    ON_UPDATE_COMMAND_UI_RANGE (ID_MYCMD_ONE, ID_MYCMD_TEN,
OnUpdateSomething)

   END_MESSAGE_MAP( )

    ...

  在该类的头文件(亦即.H)中加入消息处理函数的申明:

   // Generated message-map functions

   protected:

   file://{{AFX_MSG(CMyApp)

   ...

   file://}}AFX_MSG

   afx_msg void OnUpdateSomething( CcmdUI * pcmdui );

   DECLARE_MESSAGE_MAP()

请各位注意了,仔细的读者已经注意到这里的消息处理函数并未像命令消息处理函
数需要一个额外的UINT类型的参数.原因在于pcmdui中已包含了此信息.所以不再需
要这个参数了.最后不要忘了完成函数体!

有时我们可能需要为一组控件处理相同的WM_NOTIFY消息.这时需要使用
ON_NOTIFY_RANGE而不是ON_NOTIFY.当你使用 ON_NOTIFY_RANGE时,你需要指定控件
的ID范围.其消息映射入口及函数原型如下:

   ON_NOTIFY_RANGE( wNotifyCode, id, idLast, memberFxn )

    参数说明:

     wNotifyCode:消息通知码.比如:LVN_KEYDOWN,

     id: 第一控件的标识ID。

     idLast:最后一个控件的标识ID。(标识值一定要连续)

     memberFxn: 消息处理函数。

    成员函数必须有如下原型申明:

    afx_msg void memberFxn( UINT id, NMHDR * pNotifyStruct, LRESULT *
result );

    其中id的表示发送通知消息的控件标识ID

在Visual C++下修改菜单显示

在Visual C++下修改菜单显示

//修改最近文件菜单
void CMruFile::SetMruMenu()
{
CMenu *pMenu = AfxGetMainWnd()->GetMenu(); //主菜单指针
CMenu *pFileMenu = pMenu->GetSubMenu(0); //“文件”菜单指针
CMenu *pMruMenu = pFileMenu->GetSubMenu(5); //“最近文件”菜单指针
pMruMenu->RemoveMenu( ID_MRU1, MF_BYCOMMAND ); //删除各菜单项
pMruMenu->RemoveMenu( ID_MRU2, MF_BYCOMMAND );
pMruMenu->RemoveMenu( ID_MRU3, MF_BYCOMMAND );
pMruMenu->RemoveMenu( ID_MRU4, MF_BYCOMMAND );
if( m_CurNum>0 ) //重新插入各菜单项
pMruMenu->InsertMenu( ID_MRU_CLR, MF_BYCOMMAND,
ID_MRU1, m_PathName[0] );
if( m_CurNum>1 )
pMruMenu->InsertMenu( ID_MRU_CLR, MF_BYCOMMAND,
ID_MRU2, m_PathName[1] );
if( m_CurNum>2 )
pMruMenu->InsertMenu( ID_MRU_CLR, MF_BYCOMMAND,
ID_MRU3, m_PathName[2] );
if( m_CurNum>3 )
pMruMenu->InsertMenu( ID_MRU_CLR, MF_BYCOMMAND,
ID_MRU4, m_PathName[3] );
}

星期二, 十月 18, 2005

Program:IE的代理服务器设置

注册表:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet
Settings]
"ProxyEnable"=dword:00000001
"ProxyServer"="socks=210.45.66.24:3082;http=;https=;ftp=;gopher=;" 或
"210.45.66.24"
"ProxyOverride"="202.38.64.*;*.ustc.edu.cn;<local>"

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main]
"Start Page"="about:blank"
"Window Title"="Microsoft Internet Explorer"