码迷,mamicode.com
首页 > 编程语言 > 详细

C++MFC编程笔记day09 MF界面控件的使用1

时间:2014-08-14 10:58:48      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   使用   os   io   

一 MFC控件
   1 控件介绍

   1.1 静态控件包括图片、静态文本和分组框。生成的控件的ID统一是
       IDC_STATIC。很少程序中访问和操作,只是使用静态控件显示信息
   1.2 编辑框控件,控件类是CEdit,通常使用它接收用户的输入,显示
       信息给用户。
   1.3 按钮控件包括一般按钮、复选按钮和单元按钮,控件类都是CButton
       单选按钮注意,同一组的按钮Tab键顺序的编号连续(Ctrl+d  显示tab顺序),而且编号小的
       按钮设置group属性,才能在同一个对话框中,实现多个单选按钮的
       多个分组。
   1.4 组合框(下拉框),控件类是CComboBox。可以在多个选项中选择一项
       也可以输入新的选项。组合框中的数据项可以通过属性添加。
       在属性对话框的Data标签中,添加数据项时,换行是Ctrl+回车键。
       注意设置控件时,给定足够的高度。
   1.5 列表框,控件类是CListBox,支持单选和多选。
   1.6 动画控件,控件类是CAnimateCtrl。能够播放简单的帧动画。
   2 播放动画的例子
     2.1 添加打开文件按钮的消息处理函数:
       2.1.1 弹出打开文件对话框
       打开文件对话框CFileDialog类,构造函数
        CFileDialog(
        BOOL bOpenFileDialog,标识是打开还是另存为对话框
        LPCTSTR lpszDefExt = NULL,//默认的扩展名
        LPCTSTR lpszFileName = NULL,//默认的文件名称
        DWORD dwFlags//对话框的样式
        LPCTSTR lpszFilter = NULL,//设置文件类型,进行类型过滤
        CWnd* pParentWnd = NULL //父窗口,设置为NULL即可。
       );
        设置文件类型字符串格式:
        1 字符串以"||"作为结束符。
        2 每个数据项之间用"|"分割
        3 每项由两部分组成,第一部分是显示部分,第二部分设置过滤的
          后缀,这两部分也是以"|"分割。
        "视频文件(*.avi)|*.avi|所有文件(*.*)|*.*||";
       2.1.2 在编辑框中显示文件路径
        为编辑框控件绑定值类型的成员变量,将文件路径赋值给该变量
       2.1.3 在文件列表中添加文件名称
        为列表框控件绑定控件类型的变量,调用AddString()函数添加
        文件名称。
       2.1.4 播放动画文件
         为动画控件绑定控件类型的变量,调用它的Open、Play函数播放
    2.2 在列表控件中实现双击播放功能
        2.2.1 使用类向导添加列表控件的双击消息处理函数,在函数中,
             想获取选择项对应的文件路径,所以,在2.1中,列表控件
             添加文件名称,通过附加数据,同时添加了文件路径
        2.2.2 获取文件路径,实现双击播放功能。注意,对于播放功能,
             提取到Play函数中。
    2.3 设置重复播放功能
        2.3.1为复选框、组合框绑定控件类型的变量。
        2.3.2 在对话框的OnInitDialog()函数中,设置组合框控件为
              不可用。
        2.3.3 双击复选框按钮,生成消息处理函数,在函数中,根据
              复选框的Check状态,设置组件框的状态
        2.3.4 修改Play()函数,根据上述两个控件的值,设置播放的次数
    2.4 添加单选按钮播放和停止的消息处理函数,播放只需调用Play函数
        而停止,只需调用动画控件的Stop函数即可。
  3 静态控件以及单选按钮如何实现绑定操作
    3.1 静态控件需要修改ID
    3.2 单选按钮需要设置Group属性,而且每一组单选按钮绑定一个变量。
  4 组合框和列表框的常用函数
    4.1 添加数据项
        AddString
    4.2 删除数据项
        DeleteString
    4.3 查找字符串
        FindString
        如果找不到,组合框返回CB_ERR,列表框返回LB_ERR
    4.4 设置/获取数据项的附加数据
        SetItemData/GetItemData
    4.5 设置/获取当前的选择项
        SetCurSel/GetCurSel
    ...
  5 完成列表框的例子
CListBox,数值绑定计算加法运算。






一 MFC控件介绍
   1 控件介绍
   1.1 微调按钮(旋转按钮)
     通常和编辑框共同完成相关功能,使用前,设置微调按钮的属性,增加或减少,和编辑框结成伙伴关系,还可以设置对齐方式。ctrl+d显示tab顺序,编辑框和微调要相邻,微调样式,排序选择“靠右”,选择复选框“自动结伴”、“设置结伴整数”
   1.2 进度条
通常用于安装程序或者复制文件时显示完成进度。
   1.3 滑块
       可以通过属性设置刻度,用来显示一个能调节的数值功能。
   2 控件使用
     2.1 这三个控件在使用前,通常都需要设置表式的数值范围
         SetRange/GetRange
         SetRange32/GetRange32
     2.2 设置控件的步长
         CProgressCtrl::SetStep
         CSliderCtrl::SetPageSize
         CSliderCtrl::SetLineSize
         CSpinButtonCtrl::SetAccel
     2.3 设置/获取当前位置
         SetPos/GetPos




二 列表控件
   1 相关类
   CListCtrl- 父类是CWnd,控件类的一种,通常用在对话框上。
   CListView-父类是CCtrlView,视图类的一种。
             CListView=CView+CListCtrl,CListView相当于
             在CView的客户区添加了一个CListCtrl控件。调用
             CListView::GetListCtrl,得到控件。
   2 CListCtrl的使用
   2.1 设计并设置控件的图标列表(大图标和小图标)
       2.1.1 添加位图资源,设计图标列表


       2.1.2 创建CImageList
             CImageList::Create
       2.1.3 将图标列表设置到控件
             CListCtrl::SetImageList
       2.1.4 添加列
             CListCtrl::InsertColumn
       2.1.5 添加数据项
             CListCtrl::InsertItem
       2.1.6 设置列的文本
             CListCtrl::SetItemText
       2.1.7 设置/获取数据项的附加数据
             CListCtrl::SetItemData/GetItemData
       2.1.8 设置控件的背景图片
             CListCtrl::SetBkImage
             注意:调用该函数前,需要Ole库的初始化
              AfxOleInit();
             另外,通常也需将字体的背景色设置为透明

              m_wndList.SetTextBkColor(CLR_NONE);


示例1:
1、新建MFC对话框应用程序DlgCtrl。
2、可视化编辑界面控件

bubuko.com,布布扣
3、ctrl+w 绑定控件对应的成员变量

bubuko.com,布布扣
4、ctrl+w 绑定列表框项的双击事件和按钮的单击事件

bubuko.com,布布扣
5、***Dlg.cpp中的主要实现代码(部分是自动生成的)

#include "stdafx.h"
#include "DlgCtrl.h"
#include "DlgCtrlDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgCtrlDlg dialog

CDlgCtrlDlg::CDlgCtrlDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgCtrlDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgCtrlDlg)
	m_strFilePath = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDlgCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgCtrlDlg)
	DDX_Control(pDX, IDC_PLAYTIMES, m_cboPlayCount);
	DDX_Control(pDX, IDC_REPLAY, m_btnReplay);
	DDX_Control(pDX, IDC_VIDEO, m_animateVideo);
	DDX_Control(pDX, IDC_LIST_FILENAME, m_listFileName);
	DDX_Text(pDX, IDC_EDIT_FILEPATH, m_strFilePath);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDlgCtrlDlg, CDialog)
	//{{AFX_MSG_MAP(CDlgCtrlDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_OPEN_FILE, OnOpenFile)
	ON_LBN_DBLCLK(IDC_LIST_FILENAME, OnDblclkListFilename)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_REPLAY, OnReplay)
	ON_BN_CLICKED(IDC_PLAY, OnPlay)
	ON_BN_CLICKED(IDC_STOP, OnStop)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgCtrlDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here
	m_cboPlayCount.EnableWindow(FALSE);//次数不可用
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CDlgCtrlDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDlgCtrlDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDlgCtrlDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CDlgCtrlDlg::OnOpenFile()
{
	// TODO: Add your control notification handler code here
	char lpszFilter[]="视频(*.avi)|*.avi|视频(*.rmvb)|*.rmvb|所有文件(*.*)|*.*||";
	CFileDialog dlg(TRUE,NULL,NULL,
		OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		lpszFilter);
	if(IDOK!=dlg.DoModal()) return;
	//编辑框中更新文件路径
	m_strFilePath=dlg.GetPathName();
	UpdateData(FALSE);
	//列表加入文件名
	//m_listFileName.AddString(dlg.GetFileName());
	CString strName=dlg.GetFileName();
	if (LB_ERR==m_listFileName.FindString(-1,strName))
	{
		//添加文件名称
		int nIndex=m_listFileName.AddString(strName);
		CString *pPath=new CString;
		*pPath=m_strFilePath;
		//通过附加数据,保存文件路径
		m_listFileName.SetItemData(nIndex,(DWORD)pPath);

	}

	//动画控件播放动画
	play();
}

void CDlgCtrlDlg::play()
{
	int nCount=1;//保存播放的次数
    if (m_btnReplay.GetCheck())
    {
		int nSel=m_cboPlayCount.GetCurSel();
		switch(nSel)
		{
		case 0://重复播放
			nCount=-1;
			break;
		case 1://重复一次
			nCount=2;
			break;
		case 2://重复两次
			nCount=3;
			break;
		}
    }
	m_animateVideo.Open(m_strFilePath);
	m_animateVideo.Play(0,-1,nCount);
}

void CDlgCtrlDlg::OnDblclkListFilename()
{
	//获取双击时,当前的选择项
	int nSel=m_listFileName.GetCurSel();
	if (LB_ERR==nSel)return;
	//播放当前选中的文件
	CString *pPath=(CString*) m_listFileName.GetItemData(nSel);
	m_strFilePath=*pPath;
	//播放
	play();
	UpdateData(FALSE);
	AfxMessageBox(*pPath);
}

void CDlgCtrlDlg::OnClose()
{
	//字符串路径在附加数据里,关闭时要删除
	for (int i=0;i<m_listFileName.GetCount();i++)
	{
		CString *pPath=
			(CString *)m_listFileName.GetItemData(i);
		delete pPath;
	}
	CDialog::OnClose();
}

void CDlgCtrlDlg::OnReplay()
{
	// TODO: Add your control notification handler code here
	if (m_btnReplay.GetCheck())
	{
		m_cboPlayCount.EnableWindow(TRUE);
	}
	else
	{
		m_cboPlayCount.EnableWindow(FALSE);

	}
}

void CDlgCtrlDlg::OnPlay()
{
	// TODO: Add your control notification handler code here
	play();
}

void CDlgCtrlDlg::OnStop()
{
	// TODO: Add your control notification handler code here
	m_animateVideo.Stop();
}




示例2:
1、新建MFC对话框应用程序DlgCtrl2。
2、可视化编辑界面控件

bubuko.com,布布扣
3、ctrl+w 绑定控件对应的成员变量

bubuko.com,布布扣
4、ctrl+w 绑定列表框项的双击事件和按钮的单击事件

bubuko.com,布布扣
5、***Dlg.cpp中的主要实现代码(部分是自动生成的)

#include "stdafx.h"
#include "DlgCtrl2.h"
#include "DlgCtrl2Dlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgCtrl2Dlg dialog

CDlgCtrl2Dlg::CDlgCtrl2Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgCtrl2Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgCtrl2Dlg)
	m_edit_a = 0;
	m_edit_b = 0;
	m_edit_sum = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDlgCtrl2Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgCtrl2Dlg)
	DDX_Control(pDX, IDC_LIST_RIGHT, m_list_right);
	DDX_Control(pDX, IDC_LIST_LEFT, m_list_left);
	DDX_Text(pDX, IDC_EDIT_A, m_edit_a);
	DDX_Text(pDX, IDC_EDIT_B, m_edit_b);
	DDX_Text(pDX, IDC_EDIT_SUM, m_edit_sum);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDlgCtrl2Dlg, CDialog)
	//{{AFX_MSG_MAP(CDlgCtrl2Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON_EQUAL, OnButtonEqual)
	ON_BN_CLICKED(IDC_BUTTON_ToLeft, OnBUTTONToLeft)
	ON_BN_CLICKED(IDC_BUTTON_ToLeftALL, OnBUTTONToLeftALL)
	ON_BN_CLICKED(IDC_BUTTON_ToRight, OnBUTTONToRight)
	ON_BN_CLICKED(IDC_BUTTON_ToRightALL, OnBUTTONToRightALL)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgCtrl2Dlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// TODO: Add extra initialization here
	//初始化左边列表框
	m_list_left.AddString("北京");
	m_list_left.AddString("上海");
	m_list_left.AddString("广州");
	m_list_left.AddString("深圳");

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CDlgCtrl2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CDlgCtrl2Dlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CDlgCtrl2Dlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CDlgCtrl2Dlg::OnButtonEqual()
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_edit_sum=m_edit_a+m_edit_b;
	UpdateData(FALSE);
}

void CDlgCtrl2Dlg::OnBUTTONToLeft()
{
	// TODO: Add your control notification handler code here
	int sel=m_list_right.GetCurSel();
	if(sel==LB_ERR) return;
	CString str;
	m_list_right.GetText(sel,str);//获取右边值
	m_list_left.AddString(str);//添加到左边
	m_list_right.DeleteString(sel);//删除右边
}

void CDlgCtrl2Dlg::OnBUTTONToLeftALL()
{
	// TODO: Add your control notification handler code here
	CString str;
	while(m_list_right.GetCount()>0)
	{
		m_list_right.GetText(0,str);
		m_list_left.AddString(str);
		m_list_right.DeleteString(0);
	}
}

void CDlgCtrl2Dlg::OnBUTTONToRight()
{
	// TODO: Add your control notification handler code here
	//获取左边列表选择项
	int sel=m_list_left.GetCurSel();
	if(sel==LB_ERR) return;
	CString str;
	m_list_left.GetText(sel,str);//获取左边值
	m_list_right.AddString(str);//添加到右边
	m_list_left.DeleteString(sel);//删除左边
}

void CDlgCtrl2Dlg::OnBUTTONToRightALL()
{
	// TODO: Add your control notification handler code here
	CString str;
	while(m_list_left.GetCount()>0)
	{
		m_list_left.GetText(0,str);
		m_list_right.AddString(str);
		m_list_left.DeleteString(0);
	}
}




【示例代码稍后补充】


C++MFC编程笔记day09 MF界面控件的使用1,布布扣,bubuko.com

C++MFC编程笔记day09 MF界面控件的使用1

标签:des   style   blog   http   color   使用   os   io   

原文地址:http://blog.csdn.net/pukuimin1226/article/details/38553079

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!