MFC(二)集成基础控件

OnCreate

控件的动态创建代码可以放在OnCreate函数中,查阅MFC文档可知对应函数
MFC文档下载地址:http://dx.198424.com/soft1/vcmfc.zip

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

CStatic【标签,图片】

#include "atlimage.h"

CRect getRect(int x, int y, int width, int height) {
	CRect r(x, y, x + width, y + height);
	return r;
}

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int labelId = 1, imageViewId = 2;
	CStatic* label = new CStatic;
	label->Create(TEXT("标签"), defaultStyle, getRect(10, 10, 40, 30), this, labelId);

	CImage image;
	image.Load(TEXT("mfc.png"));
	HBITMAP hBmp = image.Detach();

	CStatic* imageView = new CStatic;
	imageView->Create(NULL, defaultStyle | SS_BITMAP | SS_CENTERIMAGE, getRect(10, 60, 200, 100), this, imageViewId);
	imageView->SetBitmap(hBmp);

	return 1;
}

CEdit【文本框,密码框,数值框,文本区】

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int editStyle = defaultStyle | ES_AUTOHSCROLL | WS_BORDER;
	int textAreaStyle = defaultStyle | WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL;
	int textInputId = 1, passwordInputId = 2, numberInputId = 3, textAreaInputId = 4;

	CEdit* textInput = new CEdit;
	textInput->Create(editStyle, getRect(10, 10, 150, 30), this, textInputId);
	textInput->SetWindowText(TEXT("文本输入框"));

	// 密码输入框
	CEdit* passwordInput = new CEdit;
	passwordInput->Create(editStyle | ES_PASSWORD, getRect(10, 50, 150, 30), this, passwordInputId);

	// 数值输入框
	CEdit* numberInput = new CEdit;
	numberInput->Create(editStyle | ES_NUMBER, getRect(10, 90, 150, 30), this, numberInputId);

	CEdit* textAreaInput = new CEdit;
	textAreaInput->Create(textAreaStyle, getRect(10, 130, 150, 100), this, textAreaInputId);
	textAreaInput->SetWindowText(TEXT("多行文本区"));

	return 1;
}

CButton【按钮,单选按钮,多选按钮】

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int pushButtonId = 1, radioButton1Id = 2, radioButton2Id = 3, checkBox1Id = 4, checkBox2Id = 5;

	CButton* pushButton = new CButton;
	pushButton->Create(TEXT("按钮"), defaultStyle | BS_PUSHBUTTON, getRect(10, 10, 60, 30), this, pushButtonId);

	// 单选按钮, 必须设置分组, 处于同一组的按钮, 只能选中其中一个
	// 处于同一组的按钮, 首个按钮必须添加WS_GROUP风格, 它们的ID往往是连续递增的
	// 一旦添加具有WS_GROUP风格的按钮, 则代表上一组的成员已经分配完毕, 准备分配下一组的成员
	CButton* radioButton1 = new CButton;
	radioButton1->Create(TEXT("男"), defaultStyle | BS_AUTORADIOBUTTON | WS_GROUP, getRect(10, 50, 60, 30), this, radioButton1Id);
	radioButton1->SetCheck(true);
	CButton* radioButton2 = new CButton;
	radioButton2->Create(TEXT("女"), defaultStyle | BS_AUTORADIOBUTTON, getRect(70, 50, 60, 30), this, radioButton2Id);

	// 多选按钮
	CButton* checkBox1 = new CButton;
	checkBox1->Create(TEXT("A"), defaultStyle | BS_AUTOCHECKBOX | WS_GROUP, getRect(10, 90, 60, 30), this, checkBox1Id);
	checkBox1->SetCheck(true);
	CButton* checkBox2 = new CButton;
	checkBox2->Create(TEXT("B"), defaultStyle | BS_AUTOCHECKBOX, getRect(70, 90, 60, 30), this, checkBox2Id);

	return 1;
}

CComboBox【下拉列表,列表】

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int comboBoxId = 1, listBoxId = 2;

	// 下拉列表的高度值最好设大点, 不然下拉框无法显示
	CComboBox* comboBox = new CComboBox;
	comboBox->Create(defaultStyle | CBS_DROPDOWNLIST, getRect(10, 10, 100, 100), this, comboBoxId);
	comboBox->AddString(TEXT("方案1"));
	comboBox->AddString(TEXT("方案2"));
	comboBox->AddString(TEXT("方案3"));
	comboBox->AddString(TEXT("方案4"));
	comboBox->SetCurSel(0);

	// 普通列表
	CListBox* listBox = new CListBox;
	listBox->Create(defaultStyle | WS_BORDER, getRect(120, 10, 100, 100), this, listBoxId);
	listBox->AddString(TEXT("方案1"));
	listBox->AddString(TEXT("方案2"));
	listBox->AddString(TEXT("方案3"));
	listBox->AddString(TEXT("方案4"));
	listBox->SetCurSel(0);

	return 1;
}

CSliderCtrl【滑动条】

#include <afxcmn.h>

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int sliderId = 1;

	CSliderCtrl* slider = new CSliderCtrl;
	slider->Create(defaultStyle | TBS_BOTH | TBS_TOOLTIPS, getRect(10, 10, 180, 50), this, sliderId);
	slider->SetRange(0, 100);
	slider->SetPos(50);

	return 1;
}

CListCtrl【表格】

#include <afxcmn.h>

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int tableViewId = 1, columnNum = 3, columnWidth = 100;

	CListCtrl* tableView = new CListCtrl;
	tableView->Create(defaultStyle | WS_BORDER | LVS_REPORT, getRect(10, 10, columnNum * columnWidth, 200), this, tableViewId);
	tableView->InsertColumn(1, TEXT("学号"), LVCFMT_CENTER, columnWidth);
	tableView->InsertColumn(2, TEXT("姓名"), LVCFMT_CENTER, columnWidth);
	tableView->InsertColumn(3, TEXT("性别"), LVCFMT_CENTER, columnWidth);

	int idx = tableView->InsertItem(0, TEXT("0"));
	tableView->SetItemText(idx, 1, TEXT("AMC"));
	tableView->SetItemText(idx, 2, TEXT("男"));

	idx = tableView->InsertItem(1, TEXT("1"));
	tableView->SetItemText(idx, 1, TEXT("QAQ"));
	tableView->SetItemText(idx, 2, TEXT("男"));

	return 1;
}

CAnimateCtrl【视频】

#include <afxcmn.h>

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	int defaultStyle = WS_CHILD | WS_VISIBLE;
	int mediaViewId = 1;

	// 只能播放简单的AVI视频, 绝大部分AVI视频都不符合要求
	// 它非常不实用, 如果想要测试它, 推荐Window Xp系统自带的clock.avi
	CAnimateCtrl* mediaView = new CAnimateCtrl;
	mediaView->Create(defaultStyle | WS_BORDER, getRect(10, 10, 300, 300), this, mediaViewId);
	mediaView->Open(TEXT("clock.avi"));
	mediaView->Play(0, -1, -1);

	return 1;
}

MessageBox【弹出对话框】

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	// 类型                按钮[返回值]
	// MB_OK               确认[IDOK]
	// MB_YESNO            是[IDYES]+否[IDNO]
	// MB_ABORTRETRYIGNORE 中止[IDABORT]+重试[IDRETRY]+忽略[IDIGNORE]
	// MB_YESNOCANCEL      是+否+取消[IDCANCEL]
	// MB_RETRYCANCEL      重试+取消
	// MB_OKCANCEL         确认+取消
	// 图标                描述
	// MB_ICONWARNING      !
	// MB_ICONASTERISK     i
	// MB_ICONQUESTION     ?
	// MB_ICONERROR        X
	int result = MessageBox(TEXT("消息内容"), TEXT("对话框标题"), MB_YESNO | MB_ICONQUESTION);

	CString str;
	str.Format("返回值: %d", result);
	MessageBox(str);

	return 1;
}

CFileDialog【文件选择&保存框】

#include <afxdlgs.h>
//#include <vector>

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	// 打开 or 保存
	BOOL open = TRUE;
	// 默认打开的文件, 有\\后缀表示文件夹
	LPCTSTR defaultFile = TEXT("D:\\Soft\\");
	// 类型说明和扩展名用|分割, 同种扩展名用;分割
	// 不同文件类型用|分割, 末尾用||指明
	LPCTSTR filter = TEXT("文本|*.txt|图片|*.bmp;*.jpg;*.png|所有文件|*.*||");
	// 如果想要打开多个文件, 可添加风格: OFN_ALLOWMULTISELECT
	CFileDialog fileDialog(open, NULL, defaultFile, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter);

	if (fileDialog.DoModal() == IDOK)
	{
		CString path = "你选择的路径是: " + fileDialog.GetPathName();
		MessageBox(path);

		// 打开多个文件, 需要使用以下代码
		//std::vector<CString> fileNames;
		//POSITION pos = fileDialog.GetStartPosition();
		//while (pos != NULL)
		//{
		//	CString strFile = fileDialog.GetNextPathName(pos);
		//	fileNames.push_back(strFile);
		//}
	}

	return 1;
}

SHBrowseForFolder【文件夹选择框】

#include <shlobj.h>
#pragma comment(lib,"shell32.lib")

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	TCHAR path[MAX_PATH];
	BROWSEINFO bi;
	LPITEMIDLIST lp;

	bi.hwndOwner = NULL;
	bi.pidlRoot = NULL;
	bi.pszDisplayName = path;
	bi.lpszTitle = TEXT("请选择文件夹");
	bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
	// 如果想要定制化功能, 可以了解以下2个参数
	bi.lpfn = NULL;
	bi.lParam = NULL;

	if ((lp = SHBrowseForFolder(&bi)) != NULL && SUCCEEDED(SHGetPathFromIDList(lp, path)))
	{
		MessageBox(path);
	}
	
	return 1;
}

OnButtonClick【按钮单击事件处理】

// 用户按钮处理函数, 可查文档
// 映射入口                               函数原型 
// ON_BN_CLICKED( <id>, <memberFxn> )    afx_msg void memberFxn( ) 

// mfc.h
class MyFrame : public CFrameWnd
{
public:
	MyFrame();
	DECLARE_MESSAGE_MAP()
	afx_msg int OnCreate(LPCREATESTRUCT);
	afx_msg void OnClickByOpenButton();
};

// mfc.cpp
int IDC_OPENBUTTON = 1;

BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_BN_CLICKED(IDC_OPENBUTTON, &MyFrame::OnClickByOpenButton)
END_MESSAGE_MAP()

int MyFrame::OnCreate(LPCREATESTRUCT)
{
	CButton* openButton = new CButton;
	openButton->Create(TEXT("OPEN"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 10, 70, 40), this, IDC_OPENBUTTON);
	return 1;
}

void MyFrame::OnClickByOpenButton()
{
	MessageBox(TEXT("我点击了打开按钮"));
}

以上代码创建了一个id=1的按钮,它的单击事件处理函数是OnClickByOpenButton
函数名是可以自定义的,它的声明写到MyFrame中即可
需要注意映射入口,需要填写按钮id和对应的处理函数

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VS2013 MFC 编程基础,共有19个专题实例,作为VS2013、VC++MFC开发的基础入门资料,对初学者很有帮助!N和weet45厘序量D以量 #目度 M用啊 Mnua ca+程 WICELL 名啊 位 B日经验 进入应用程序向导,一开始会给出默认的项目配置,点击“下一步”即可 MFC应用柱序:Deme 欢使用Mc应用程序向导 鞋速 这些是当前啧自设置: 应用程序典型 送卡式多交检界面O) 无数据斥查持 合文植支持 不持复台交档 文档幔属性 可自定义某单栏和工具栏界面 数据支持 YiYuN studie200应用程序外观 节u$φ项目样式阗有资管理器画格、输出格和属性面格 用户畀击功 ·重新启管理器支持新打开文档,应用程序恢复) 亮级功能 在任一画囗中单击“完成”,接受当前设置● 生的疯 项目后请该项目的rtt文件,了解有兴项目功能和所生的文件的 上到『元础 选择“基于对话框”, 可以选择在静态库中使用,或者在共享中使用。一般选择共 亨使用就行,静态库中使用会把所有用到的集成到文件中,最终生成的文件一般可 以直接使用,但占用更大空间。 MFc应用程度肉导Demo 应周程序卖型 成用程岸类 目共 应用程序典型 ◎单个文档巴) 复合文植支持 多个植思 酒管理器) 文档板国性 □选项卡式文档0) 提支 蓝十对话① Orifice Ur 用户卿面功能 □使用对话粗q 视武样式和色①D 亳级功能 无略星的控件@ is当本机/认 生的 $个级文档①) 口启闻体式切c 团究档/视图持 C的使用 在共享L中使用c 区安全开发生命周期6〕检置c 在静态库中使用cg 资语语言) 中交傳;中国) 选择主框架样式,可以自由选择是否添加最小化框、最大化框。如果觉得没必要“关于″对 话框也可以去掉,对话框标题一般不需要更改 MFC应用序匀导:Demo 用户畀面功能 粗速 主粗样式 命任碳单/工具栏/能区 应用程序英型 框粗架① @便用经肉单 复合文植持 团使用传始停工具栏收 四量大化框 □使用器样到的工具栏 挡板国性 国量小化 O使用单仁和工具栏 量大化g 团用户定义的工具栏和②) 户卿面功 d系统单① 个性化单行为 级功能 “关于糕更 回初态栏0D 使用功能区 生欣的 口括分面口) 对话标题 于粗式 子量小化 团子最大化粗( 口子最大化② 上步口产燕 高级功能一般默认即可,但如果用不上 控件”可以去掉勾选;如果需要涉及网络 编程就把“ 套接字”选上。不过没选上也不要紧,在程序中可以自己添加部分代码 导入套接字。 MFc应用序向导Dema 高级功齬 粗速 级功能 色格: 口打印和打印Q □资富度器得窜面格② 应用程序典 自动化 合文植支持 □国性傅面临 交档板国性 口导航面格 据库支持 □标任 用户界面功糙 已L售y) 公控否单思 高级其单项显示/蒙活面格吧 幕级功能 团支持亚新理器 最近文列离上的文件数① 生邱的 □重新打开以打开的档① 口支应用程岸复0 〈上一步[下-步习□ 最后是自动生成的两个类的头文件和源文件名称,可以修改基类,但一般不用改,默认完成 就行。至此,一个基于对话框的项目就创建好了。 MFc应用序导Dmo 生兩的 生成的 应用程序典型 已E+g 合文植支特 文档吸板国性 数支持 卖名① h交件② 用户界面功糙 Damotlg h 级功能 》又件電) 山建 AmalG cpp B温 CDHamlDi aloe 当工1 d经验 jingyan.baidu.com 注意事项 合理的向导设置可以减少后续编程的麻烦 基于对话框编程:项目整体结构 当我们创建好一个项目以后,为了更快速的编程,快速找到需要修改的部分这就得熟悉 开发环境的各个模块的作用,各个模块之间的关系。 工具原料 项目整体结构 创建好一个工程,观察项目界面的布局,上面是菜单栏和工具栏,在设计界面的左 侧可以调出工具箱;右侧是属性栏、类视图、资源视图和资源管理器等;底部是一些显示错 误信息、符号查询结果、项目生成信息的栏目;最下方是状态栏,显示当前开发状态。 应南计断酒 d经验 ingyanbaidu.com 打开解决方案资源管理器,可以看到所有的头文件、源文件以及资源文件都归类排序摆放, 便于快速寻找需要打开的内容。点开头文件前面的三角号可以查看类的成员变量和函数。 解决方案资源铛理器 X 搜素解决方客资源管理器(Ctrl+) 丙解央方案"Demo"(1个项目) Demo 头文件 p画 Demo.h L DemoDlg, h +s CDemoDlg CDemo Dlg(CWnd b e unnamed enum 0005 1 DoData Exchange(CDatal 回 IDD DEMO DIALOG hIc 4. OnInitDialog0 2. OnPaint * OnQueryDraglcon0 4. On Sys Command(UINT, LPAR. p画 Resource. h stdatx. h D targeteer. h p外部依项 源文件 Demo, cpp D * DemoDlg cp + stdafxcpp 资源文件 园 Demo. ico Demo. rc B Demo. rc2 自 ReadMe tBa经验 lingyanbaidu.com 看看资源视图,资源视图包含了应用程序用到的所有资源,包括对话框资源、应用图标、菜 单、字符串、软件信息等等。 资源视图-Demo A图Demo Demo, rc 当 Dialog 国 IDD ABOUT BOX 国 IDD_DEMODIALOG d Icon B IDR MAINFRAME a String Table 回 String Table 向 Version 画 S VERSION INF Baid经驵 jingyan. baiducom 打开版本信息,可以看到自己编写的应用程序的相关信息,比如版本号、公司名称等,自己 觉得需要修改的可以依情况修改。 wwtn lgds kaner 工1 1b aeoutedx 用人系 2贴N人M L01 Ba 经验 jingyan.baidu.com 再看类视图,类视图包含了应用程序用到的所有类,包括自动生成的类以及开发者自己创建 的类。点击类名,在下方会显示该类包含的所有成员变量和函数,不同类型的函数或者变量 都有不同的符号标记。 通过类视图可以快速访问类的头文件和源文件,双击类名打开头文件,点击下方的函数可直 接跳转到对应的函数定义处 类视图 口X ⊙。·年 ≤搜素 pom映射 宏和常量 6全局函数和变量 b t CAboutDIg p CDemoApp 4t CDemoDlg 9 CDemoDlg(CWnd"pArent =NULL) o. Do Data Exchange(CDataExchange'pDX Q@, OnInit Dialog @. On Paint 6. OnQueryDraglcon0 9. OnSys Command(UINT nID, LPARAM IParam a m hIcon Baid经验 jingyanbaidu.com 属性页用来修改和査看对话框中控件(包括对话框本身)的各项属性,毎类控件的属性项都 不一样,需要根据情况修改,当然所有的属性都可以以代码形式实现,但能直接修改最好 方便快捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值