以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  [求助]C++程序注释(哪位大虾能帮忙把程序详细注释一下?)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=41655)


--  作者:catchwind
--  发布时间:12/26/2006 8:49:00 PM

--  [求助]C++程序注释(哪位大虾能帮忙把程序详细注释一下?)
CPlayListDlg::CPlayListDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CPlayListDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CPlayListDlg)
 m_dirname = _T("");
 //}}AFX_DATA_INIT
}


void CPlayListDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CPlayListDlg)
 DDX_Control(pDX, IDC_PLAYLIST, m_playlist);
 DDX_Control(pDX, IDC_FILELIST, m_fileslist);
 DDX_Text(pDX, IDC_DIR, m_dirname);
 //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPlayListDlg, CDialog)
 //{{AFX_MSG_MAP(CPlayListDlg)
 ON_BN_CLICKED(IDC_BROW, OnBrow)
 ON_BN_CLICKED(IDC_CLEAN_ALL, OnCleanAll)
 ON_BN_CLICKED(IDC_SELECT_ALL, OnSelectAll)
 ON_BN_CLICKED(IDC_TO, OnTo)
 ON_BN_CLICKED(IDC_DEL, OnDel)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPlayListDlg message handlers
static int WINAPI BrowseProc(HWND hwnd,UINT msg,LPARAM lParam,LPARAM lpData)
{
 switch( msg)
 {
  case BFFM_INITIALIZED:
   SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)"TORONTO");
   SendMessage(hwnd,BFFM_SETSELECTION,1,(LPARAM)"C:\\");
   break ;
  case BFFM_SELCHANGED:
   SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)"TORONTO");
   break ;
 }
 return FALSE ;
}

void CPlayListDlg::OnBrow()
{
 // TODO: Add your control notification handler code here
 ITEMIDLIST *m_dirs,*m_suc;
 SHGetSpecialFolderLocation(GetSafeHwnd(),CSIDL_DESKTOP,&m_dirs);
 BROWSEINFO m_info;
 m_info.hwndOwner=GetSafeHwnd();
 m_info.pidlRoot=m_dirs;
 m_info.pszDisplayName="c:\\";
 m_info.lpszTitle="请您选择目录:";
 m_info.ulFlags=0;
 m_info.lpfn=BrowseProc;
 m_info.lParam=0;
 m_info.iImage=0;
 
 m_suc=SHBrowseForFolder(&m_info);
 if(m_suc)
 {
  char m_buffer[MAX_PATH];
  if(SHGetPathFromIDList(m_suc,m_buffer)){
   m_dirname=_T(m_buffer);
   UpdateData(FALSE);
   if(m_dirname.GetAt(m_dirname.GetLength()-1)!='\\')
    m_dirname += "\\" ;
   DirToFileList(m_dirname);
   m_fileslist.EnableWindow(TRUE);
  }
 }
}

void CPlayListDlg::DirToFileList(CString m_dir)
{
 m_fileslist.ResetContent();
 if(!IsDirExist(m_dir))
  return;

 struct _finddata_t FileBlock;
 CString m_thisdir=m_dir;
 int  m_len=m_dir.GetLength();
 char * m_buffer=m_dir.GetBuffer(m_len);
 if(m_buffer[m_len-1]=='\\')
  m_thisdir+=_T("*.mp?");
 else
  m_thisdir+=_T("\\*.mp?");
 long handle=_findfirst(m_thisdir,&FileBlock);
 int  m_ret=0;
 while(handle>0 && m_ret==0)
 {
  if(!(FileBlock.attrib&_A_SUBDIR))
   m_fileslist.AddString(FileBlock.name);
  m_ret=_findnext(handle,&FileBlock);
 }
 if(m_fileslist.GetCount()>0)
  m_fileslist.SetCurSel(0);

 UpdateData(FALSE);
}

BOOL CPlayListDlg::IsDirExist(CString m_dir)
{
 if(m_dir==_T(""))
  return FALSE;

 struct _finddata_t FileBlock;
 CString m_thisdir=m_dir;
 int  m_len=m_dir.GetLength();
 char * m_buffer=m_dir.GetBuffer(m_len);
 if(m_buffer[m_len-1]=='\\')
  m_thisdir+=_T("*.*");
 else
  m_thisdir+=_T("\\*.*");
 long handle=_findfirst(m_thisdir,&FileBlock);
 if(handle>0)
  return TRUE;
 return FALSE;
}

void CPlayListDlg::OnCleanAll()
{
 // TODO: Add your control notification handler code here
 m_playlist.ResetContent();
}

void CPlayListDlg::OnSelectAll()
{
 // TODO: Add your control notification handler code here
 int count = m_fileslist.GetCount ();
 for(int i=0; i< count ; i++)
  m_fileslist.SetSel(i,TRUE);
}

void CPlayListDlg::OnTo()
{
 // TODO: Add your control notification handler code here
 int count = m_fileslist.GetCount ();
 CString str ;
 for(int i=0; i< count ; i++)
 {
  if(m_fileslist.GetSel(i)==TRUE)
  {
   m_fileslist.GetText(i,str);
   str = m_dirname+str ;
   m_playlist.AddString(str);
  }
 }
 m_playlist.EnableWindow();
}

void CPlayListDlg::OnDel()
{
 // TODO: Add your control notification handler code here
 int count = m_playlist.GetCount();
 for(int i=count; i>=0 ; i--)
  if(m_playlist.GetSel(i))
   m_playlist.DeleteString(i);
}

BOOL CPlayListDlg::OnInitDialog()
{
 CDialog::OnInitDialog();
 
 // TODO: Add extra initialization here
 LoadPlayList("PlayList.ini");
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}


--  作者:卷积内核
--  发布时间:12/27/2006 8:24:00 AM

--  
CPlayListDlg::CPlayListDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPlayListDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPlayListDlg)
m_dirname = _T("");
//}}AFX_DATA_INIT
}


void CPlayListDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPlayListDlg)
DDX_Control(pDX, IDC_PLAYLIST, m_playlist);
DDX_Control(pDX, IDC_FILELIST, m_fileslist);
DDX_Text(pDX, IDC_DIR, m_dirname);
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPlayListDlg, CDialog)
//{{AFX_MSG_MAP(CPlayListDlg)
ON_BN_CLICKED(IDC_BROW, OnBrow)//5个按钮
ON_BN_CLICKED(IDC_CLEAN_ALL, OnCleanAll)
ON_BN_CLICKED(IDC_SELECT_ALL, OnSelectAll)
ON_BN_CLICKED(IDC_TO, OnTo)
ON_BN_CLICKED(IDC_DEL, OnDel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPlayListDlg message handlers
static int WINAPI BrowseProc(HWND hwnd,UINT msg,LPARAM lParam,LPARAM lpData)
{
switch( msg)
{
  case BFFM_INITIALIZED:
   SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)"TORONTO");//打开列表目录操作
   SendMessage(hwnd,BFFM_SETSELECTION,1,(LPARAM)"C:\\");
   break ;
  case BFFM_SELCHANGED:
   SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)"TORONTO");
   break ;
}
return FALSE ;
}

void CPlayListDlg::OnBrow()
{
// TODO: Add your control notification handler code here
ITEMIDLIST *m_dirs,*m_suc;
SHGetSpecialFolderLocation(GetSafeHwnd(),CSIDL_DESKTOP,&m_dirs);//列表菜单
BROWSEINFO m_info;
m_info.hwndOwner=GetSafeHwnd();
m_info.pidlRoot=m_dirs;
m_info.pszDisplayName="c:\\";//初始化打开目录
m_info.lpszTitle="请您选择目录:";
m_info.ulFlags=0;
m_info.lpfn=BrowseProc;
m_info.lParam=0;
m_info.iImage=0;

m_suc=SHBrowseForFolder(&m_info);//打开目录对话框
if(m_suc)
{
  char m_buffer[MAX_PATH];
  if(SHGetPathFromIDList(m_suc,m_buffer)){
   m_dirname=_T(m_buffer);
   UpdateData(FALSE);
   if(m_dirname.GetAt(m_dirname.GetLength()-1)!='\\')
    m_dirname += "\\" ;
   DirToFileList(m_dirname);
   m_fileslist.EnableWindow(TRUE);
  }
}
}

void CPlayListDlg::DirToFileList(CString m_dir)
{
m_fileslist.ResetContent();
if(!IsDirExist(m_dir))
  return;

struct _finddata_t FileBlock;
CString m_thisdir=m_dir;
int  m_len=m_dir.GetLength();
char * m_buffer=m_dir.GetBuffer(m_len);
if(m_buffer[m_len-1]=='\\')
  m_thisdir+=_T("*.mp?");
else
  m_thisdir+=_T("\\*.mp?");
long handle=_findfirst(m_thisdir,&FileBlock);//更新所选择目录到对话框显示
int  m_ret=0;
while(handle>0 && m_ret==0)
{
  if(!(FileBlock.attrib&_A_SUBDIR))
   m_fileslist.AddString(FileBlock.name);
  m_ret=_findnext(handle,&FileBlock);
}
if(m_fileslist.GetCount()>0)
  m_fileslist.SetCurSel(0);

UpdateData(FALSE);
}

BOOL CPlayListDlg::IsDirExist(CString m_dir)
{
if(m_dir==_T(""))
  return FALSE;

struct _finddata_t FileBlock;
CString m_thisdir=m_dir;
int  m_len=m_dir.GetLength();
char * m_buffer=m_dir.GetBuffer(m_len);
if(m_buffer[m_len-1]=='\\')//判断目录
  m_thisdir+=_T("*.*");
else
  m_thisdir+=_T("\\*.*");
long handle=_findfirst(m_thisdir,&FileBlock);
if(handle>0)
  return TRUE;
return FALSE;
}

void CPlayListDlg::OnCleanAll()
{
// TODO: Add your control notification handler code here
m_playlist.ResetContent();//重置
}

void CPlayListDlg::OnSelectAll()
{
// TODO: Add your control notification handler code here
int count = m_fileslist.GetCount ();//全选
for(int i=0; i< count ; i++)
  m_fileslist.SetSel(i,TRUE);
}

void CPlayListDlg::OnTo()
{
// TODO: Add your control notification handler code here
int count = m_fileslist.GetCount ();
CString str ;
for(int i=0; i< count ; i++)
{
  if(m_fileslist.GetSel(i)==TRUE)//转向
  {
   m_fileslist.GetText(i,str);
   str = m_dirname+str ;
   m_playlist.AddString(str);
  }
}
m_playlist.EnableWindow();
}

void CPlayListDlg::OnDel()
{
// TODO: Add your control notification handler code here
int count = m_playlist.GetCount();//删除
for(int i=count; i>=0 ; i--)
  if(m_playlist.GetSel(i))
   m_playlist.DeleteString(i);
}

BOOL CPlayListDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// TODO: Add extra initialization here
LoadPlayList("PlayList.ini");//从ini文件初始化该程序
return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}


--  作者:catchwind
--  发布时间:12/27/2006 2:34:00 PM

--  
谢谢这为大哥了。不过小弟还有个程序段,能为小弟再详细注释一下不?
4设计程序模拟系统菜单界面主要内容和功能-----BMP图形及计算
#include "stdafx.h"
#include "TigerPlay.h"
#include "BmpSize.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/***************************************************************/
//FuncName: CBmpSize
//Class: CBmpSize
//Function: construction with the ID of bitmap
//Author: Bill Yuan
//Para:  uID  :  bitmap ID
//Return: bool
//Date:  Feb/04/1998
/***************************************************************/
CBmpSize::CBmpSize(UINT uID /*= 0*/)
{
 m_iWidth = 0;
 m_iHeight = 0;

 if (uID != 0)
  LoadBitmap(uID);
}
CBmpSize::~CBmpSize()
{
 //Delete the bitmap
 m_cBmp.DeleteObject();
 m_wndRgn.DeleteObject();
 ::DeleteObject(hBitmap);
}
BOOL CBmpSize::LoadBitmap(LPCTSTR lpszBmpFile)
{
 hBitmap=(HBITMAP)LoadImage( NULL, lpszBmpFile, IMAGE_BITMAP, 0,0,
  LR_DEFAULTCOLOR |
  LR_LOADFROMFILE |
  LR_CREATEDIBSECTION);
 if (hBitmap==NULL)
  return FALSE;
 if (m_cBmp.Attach(hBitmap)==FALSE)
  return FALSE;
 if (m_cBmp.GetBitmap(&m_sBmp)==0)
  return FALSE;
 m_iWidth = m_sBmp.bmWidth;
 m_iHeight = m_sBmp.bmHeight;
 return TRUE;
}
/***************************************************************/
//FuncName: LoadBitmap
//Class: CBmpSize
//Function: Init the class with the bitmap ID.
//   Load the bitmap to get the width and height
//Author: Bill Yuan
//Para:  uID  :  bitmap ID
//Return: bool
//Date:  Feb/04/1998
/***************************************************************/
BOOL CBmpSize::LoadBitmap(UINT uID)
{
 //Load the bitmap from the ID resource
 //Get the size of the loaded bitmap
 if ( m_cBmp.LoadBitmap(uID) &&
  m_cBmp.GetBitmap(&m_sBmp) ) {
  //Set the public value
  m_iWidth = m_sBmp.bmWidth;
  m_iHeight = m_sBmp.bmHeight;
  return TRUE;
 }
 return FALSE;
}
/***************************************************************/
//FuncName: BmpBlt
//Class: CBmpSize
//Function: blt the bitmap
//Author: Bill Yuan
//Para:  pWnd :  parent
//   xDest :  the 'x' of target.
//   yDest :  the 'y' of target.
//   iDx  :  the delta of 'x' coord, default = the width of bitmap
//   iDy  :  the delta of 'y' coord, default = the height of bitmap
//   iFromWhereX: the 'x' coord of the source to copy, default = 0
//   iFromWhereY: the 'y' coord of the source to copy, default = 0
//Return: bool
//Date:  Feb/04/1998
/***************************************************************/
BOOL CBmpSize::BmpBlt(BOOL IsPaint, CWnd *pWnd, int xDest, int yDest, int iDx, int iDy, int iFromWhereX, int iFromWhereY)
{
 CDC dcMem;
 CPaintDC dcPaint(pWnd);
 CClientDC dcClient(pWnd);

 if ( IsPaint ) {
  if( !dcMem.CreateCompatibleDC(&dcPaint) )
   return FALSE;
  dcMem.SelectObject(&m_cBmp);
  return( dcPaint.BitBlt(xDest, yDest,
  (iDx==0) ? m_iWidth : iDx,
  (iDy==0) ? m_iHeight : iDy,
  &dcMem,
  (iFromWhereX==-1) ? 0 : iFromWhereX,
  (iFromWhereY==-1) ? 0 : iFromWhereY,
  SRCCOPY) );
 } else {
  if ( !dcMem.CreateCompatibleDC(&dcClient) )
   return FALSE;
  dcMem.SelectObject(&m_cBmp);
  return( dcClient.BitBlt(xDest, yDest,
  (iDx==0) ? m_iWidth : iDx,
  (iDy==0) ? m_iHeight : iDy,
  &dcMem,
  (iFromWhereX==-1) ? 0 : iFromWhereX,
  (iFromWhereY==-1) ? 0 : iFromWhereY,
  SRCCOPY) );
 }
}
/***************************************************************/
//FuncName: MakeRegion
//Class: CBmpSize
//Function: Make region according to the bitmap
//Author: Bill Yuan
//Para:  NONE
//Return: HRGN : region
//Date:  Aug/07/1998
/***************************************************************/
CRgn& CBmpSize::MakeRegion()
{
 CRgn rgnTemp ;
 COLORREF tc,col ;
 int x, y;
 CDC cMemDC;
 cMemDC.CreateCompatibleDC(NULL);
 cMemDC.SelectObject(m_cBmp);
 m_wndRgn.CreateRectRgn(0, 0, m_iWidth, m_iHeight);
 tc = cMemDC.GetPixel(0,0);
 for(x=0; x<m_iWidth; x++)
 {
  for(y=0; y<m_iHeight ; y++)
  {
   col = cMemDC.GetPixel(x, y);
   if(col == tc)
   {
    rgnTemp.CreateRectRgn(x, y, x+1, y+1);
    m_wndRgn.CombineRgn(&m_wndRgn, &rgnTemp, RGN_XOR);
    rgnTemp.DeleteObject();
   }
  }
 }
 return m_wndRgn ;


--  作者:卷积内核
--  发布时间:12/27/2006 4:15:00 PM

--  
#include "stdafx.h"
#include "TigerPlay.h"
#include "BmpSize.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/***************************************************************/
//FuncName: CBmpSize
//Class: CBmpSize
//Function: construction with the ID of bitmap
//Author: Bill Yuan
//Para:  uID  :  bitmap ID
//Return: bool
//Date:  Feb/04/1998
/***************************************************************/
CBmpSize::CBmpSize(UINT uID /*= 0*/)
{
m_iWidth = 0;
m_iHeight = 0;

if (uID != 0)
  LoadBitmap(uID);//load位图 构造
}
CBmpSize::~CBmpSize()
{
//Delete the bitmap
m_cBmp.DeleteObject();
m_wndRgn.DeleteObject();
::DeleteObject(hBitmap);//析构
}
BOOL CBmpSize::LoadBitmap(LPCTSTR lpszBmpFile)
{
hBitmap=(HBITMAP)LoadImage( NULL, lpszBmpFile, IMAGE_BITMAP, 0,0,
  LR_DEFAULTCOLOR |
  LR_LOADFROMFILE |
  LR_CREATEDIBSECTION);
if (hBitmap==NULL)
  return FALSE;
if (m_cBmp.Attach(hBitmap)==FALSE)
  return FALSE;
if (m_cBmp.GetBitmap(&m_sBmp)==0)
  return FALSE;
m_iWidth = m_sBmp.bmWidth;
m_iHeight = m_sBmp.bmHeight;//load 位图
return TRUE;
}
/***************************************************************/
//FuncName: LoadBitmap
//Class: CBmpSize
//Function: Init the class with the bitmap ID.
//   Load the bitmap to get the width and height
//Author: Bill Yuan
//Para:  uID  :  bitmap ID
//Return: bool
//Date:  Feb/04/1998
/***************************************************************/
BOOL CBmpSize::LoadBitmap(UINT uID)//多态
{
//Load the bitmap from the ID resource
//Get the size of the loaded bitmap
if ( m_cBmp.LoadBitmap(uID) &&
  m_cBmp.GetBitmap(&m_sBmp) ) {
  //Set the public value
  m_iWidth = m_sBmp.bmWidth;
  m_iHeight = m_sBmp.bmHeight;
  return TRUE;
}
return FALSE;
}
/***************************************************************/
//FuncName: BmpBlt
//Class: CBmpSize
//Function: blt the bitmap
//Author: Bill Yuan
//Para:  pWnd :  parent
//   xDest :  the 'x' of target.
//   yDest :  the 'y' of target.
//   iDx  :  the delta of 'x' coord, default = the width of bitmap
//   iDy  :  the delta of 'y' coord, default = the height of bitmap
//   iFromWhereX: the 'x' coord of the source to copy, default = 0
//   iFromWhereY: the 'y' coord of the source to copy, default = 0
//Return: bool
//Date:  Feb/04/1998
/***************************************************************/
BOOL CBmpSize::BmpBlt(BOOL IsPaint, CWnd *pWnd, int xDest, int yDest, int iDx, int iDy, int iFromWhereX, int iFromWhereY)
{
CDC dcMem;
CPaintDC dcPaint(pWnd);
CClientDC dcClient(pWnd);

if ( IsPaint ) {
  if( !dcMem.CreateCompatibleDC(&dcPaint) )//变换位图
   return FALSE;
  dcMem.SelectObject(&m_cBmp);
  return( dcPaint.BitBlt(xDest, yDest,
  (iDx==0) ? m_iWidth : iDx,
  (iDy==0) ? m_iHeight : iDy,
  &dcMem,
  (iFromWhereX==-1) ? 0 : iFromWhereX,
  (iFromWhereY==-1) ? 0 : iFromWhereY,
  SRCCOPY) );
} else {
  if ( !dcMem.CreateCompatibleDC(&dcClient) )
   return FALSE;
  dcMem.SelectObject(&m_cBmp);
  return( dcClient.BitBlt(xDest, yDest,
  (iDx==0) ? m_iWidth : iDx,
  (iDy==0) ? m_iHeight : iDy,
  &dcMem,
  (iFromWhereX==-1) ? 0 : iFromWhereX,
  (iFromWhereY==-1) ? 0 : iFromWhereY,
  SRCCOPY) );
}
}
/***************************************************************/
//FuncName: MakeRegion
//Class: CBmpSize
//Function: Make region according to the bitmap
//Author: Bill Yuan
//Para:  NONE
//Return: HRGN : region
//Date:  Aug/07/1998
/***************************************************************/
CRgn& CBmpSize::MakeRegion()
{
CRgn rgnTemp ;
COLORREF tc,col ;
int x, y;
CDC cMemDC;
cMemDC.CreateCompatibleDC(NULL);
cMemDC.SelectObject(m_cBmp);
m_wndRgn.CreateRectRgn(0, 0, m_iWidth, m_iHeight);//变换位图尺寸
tc = cMemDC.GetPixel(0,0);
for(x=0; x<m_iWidth; x++)
{
  for(y=0; y<m_iHeight ; y++)
  {
   col = cMemDC.GetPixel(x, y);
   if(col == tc)
   {
    rgnTemp.CreateRectRgn(x, y, x+1, y+1);
    m_wndRgn.CombineRgn(&m_wndRgn, &rgnTemp, RGN_XOR);
    rgnTemp.DeleteObject();
   }
  }
}
return m_wndRgn ;


--  作者:catchwind
--  发布时间:12/27/2006 6:07:00 PM

--  
小弟现在对MFC编程C++类库的调用不是很了解。能否再详细的解释下??


[此贴子已经被作者于2006-12-27 18:54:24编辑过]

--  作者:卷积内核
--  发布时间:12/28/2006 9:44:00 AM

--  
这里没有用到什么高深的东西啊,都是普通的vc常用函数,会基本的vc这些都应该能看懂的。建议你从基本的MFC编程看起,不然没办法深入,这些不是一两句话就能学会的东西。
--  作者:一分之千
--  发布时间:12/31/2006 8:58:00 PM

--  

小弟现在对MFC编程C++类库的调用不是很了解。能否再详细的解释下??
===================================================
这个东西不是一句话两句话能看明白的,建议看看《深入浅出MFC》,对win32消息函数机制和MFC框架明白了以后应该就简单多了~


--  作者:catchwind
--  发布时间:1/13/2007 5:30:00 PM

--  
多谢大哥的指点..
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
93.750ms