MFC入门

SDK: 软件开发工具包(Software  Development Kit),一般都是一些被软件工程师用于为特定的软件包,软件框架,硬件平台,操作系统等建立应用软件的开发工具的集合。

API函数: Windows操作系统提供给应用程序编程的接口(APplication Programming Interface)。Windows应用程序API函数是通过C语言实现的,所有主要的Windows函数都在Windows.h头文件中进行了声明。

窗口:可以分为客户区和非客户区。窗口可以有一个父窗口,有父窗口的窗口称为子窗口。

句柄:在windows应用程序,窗口是通过窗口句柄(HWND)来标识。我们要对某个窗口进行操作,首先就要得到这个窗口的句柄。句柄是一个四个字节的整数。

消息与消息队列:
Windows程序设计是一种完全不同于传统的DOS方式的程序设计方法。 它是一种事件驱动方式的程序设计模式,主要是基于消息的

每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息。例如,当用户在窗口中画图的时候,按下鼠标左键,此时,操作系统会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,等待应用程序的处理。然后应用程序通过一个消息循环不断地从消息队列中取出消息,并进行响应。在这个处理过程中,操作系统也会给应用程序“发送消息”。所谓“发送消息”,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程


1)打包消息
2)加入消息队列
3)由app告诉系统怎么做,分发消息
4)然后system调用窗口过程函数

mfc入口(c语言模式):



创建mfc程序(框架模式)

1)引入头文件:include <afxwin.h>

2)在右键项目 属性>常规>MFC的使用 ,设置成在共享DLL中使用MFC

3)消息映射的使用
 
// 1.声明将在一个类中使用消息映射,把消息映射到函数(必须用在类声明中)
DECLARE_MESSAGE_MAP()

//2 定义映射入口
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
    ON_WM_LBUTTONDOWN()
    ON_WM_PAINT()
    ON_WM_CHAR()
END_MESSAGE_MAP()

//3 声明映射函数
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnPaint();
afx_msg void OnChar(UINT, UINT, UINT);

//4 实现映射函数


简单案例:

mfc.h
#include <afxwin.h> //mfc必须的头文件

//1 创建应用程序类,继承于CWinApp
class MyApp : public CWinApp
{
public:
    //虚函数,初始化应用程序实例,MFC入口函数
    virtual BOOL InitInstance();

};

//2 创建框架类(窗口类),继承于CFrameWnd
class MyFrame : public CFrameWnd
{
public:
    //构造函数,用于创建窗口
    MyFrame();

    //1 声明将在一个类中使用消息映射,把消息映射到函数(必须用在类声明中)
    DECLARE_MESSAGE_MAP()

    //3 声明映射函数
    afx_msg void OnLButtonDown(UINT, CPoint);
    afx_msg void OnPaint();
    afx_msg void OnChar(UINT, UINT, UINT);
};

mfc.cpp

#include "mfc.h"

MyApp app;// 应用程序对象,全局,有且只有一个

//初始化应用程序实例,入口函数
BOOL MyApp::InitInstance()
{
    //1 创建窗口
    MyFrame *frame = new MyFrame;

    //2 显示及更新窗口
    //CWnd::ShowWindow
    //CWnd::UpdateWindow
    frame->ShowWindow(SW_SHOWNORMAL); //SW_SHOWNORMAL普通显示样式
    frame->UpdateWindow(); //更新窗口

    //3 将frame传给全局对象
    //CWinThread::m_pMainWnd
    m_pMainWnd = frame; //保存指向应用程序的主窗口的指针

    return TRUE;
}


//2 定义映射入口
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
    ON_WM_LBUTTONDOWN()
    ON_WM_PAINT()
    ON_WM_CHAR()
END_MESSAGE_MAP()

//MyFrame构造函数,用于创建窗口
MyFrame::MyFrame()
{
    // 1 创建窗口
    //CWnd::Create
    Create(NULL, TEXT("mfctest")); //第一个参数为NULL,采用CWnd默认属性
}

//4 实现映射函数,LButtonDown事件处理
//CWnd::MessageBox
void MyFrame::OnLButtonDown(UINT, CPoint)
{
    MessageBox(TEXT("OnLButtonDown"));
}

void MyFrame::OnPaint()
{
    //绘图,文本
    CPaintDC dc(this);
    dc.TextOutW(200, 200, TEXT("OnPaint"));
}

void MyFrame::OnChar(UINT key, UINT, UINT)
{
    //获取按键
    TCHAR ch = (TCHAR)key;
    MessageBox(CString(ch));
}


字符集问题:

// TCHAR 自适应字符集转换

// L 将字符串装换文Unicode字符集
MessageBox(L"hello");

// 宏:TEXT_T自适应字符集转换
MessageBox(TEXT("hello"));

MessageBox(_T("hello"));


// 多字节字符集
char *buf = "hello";
int n = strlen(buf);

// 宽字节字符集
wchar_t &wbuf = L"hello";
n = wcslen(wbuf);


// char *与CString转换

// char* -> CString
char *buf = "hello";
MessageBox(CString(buf));

// CString -> char*
CStringA tmp;
CString str = TEXT("hello");
tmp = str;
char *buf2 = tmp.GetBuffer();


文档/视图结构体系
MFC应用程序框架结构的基石是 文档/ 视图体系结构,它定义了一种程序结构,这种结构依靠文档对象保存应用程序的数据,并依靠视图对象控制视图中显示的数据,把数据本身与它的显示分离开。
数据的存储和加载由文档类来完成,数据的显示和修改则由视类来完成。 MFC在类CDocument和CView中为稳定视图提供了基础结构。CWinApp、CFrameWnd和其他类与CDocument和CView合作,把所有的片段连在了一起。
CView类也派生于CWnd类,框架窗口是视图窗口的一个父窗口。主框架窗口(CFrameWnd)是整个应用程序外框所包括的部分,即图中粗框以内的内容,而视类窗口只是主框架中空白的地方。

创建完框架之后会有四个类:


> 添加消息处理函数: 在类视图里右键要添加类的 属性>消息,然后选取相应类的消息声明即可。

> 添加消息处理会在view这个类里


控件


> 添加控件的静态成员:右键控件,添加成员变量
> 双击控件可以添加控件处理函数,打击空间可以修改控件名


static test 控件:

> 要修改默认的id后才能添加成员变量

设置位图

    m_staticImage.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);

    HANDLE handle = LoadImage(
        AfxGetInstanceHandle(), //应用程序实例句柄
        TEXT("../1.bmp"), //bmp图片目录
        IMAGE_BITMAP, //文件类型
        200,300, //大小
        LR_LOADFROMFILE | LR_CREATEDIBSECTION //从文件加载,窗口背景不影响图片
        );

     //static 设置位图
    m_staticImage.SetBitmap((HBITMAP)handle);



关闭当前窗口:

CDlgExec::OnOK();     // 当前窗口类::OnOK();

模态对话框:

//弹出模态对话框
//1 创建对话框对象
CDlgExec dlg;

//2 以模态方式显示
dlg.DoModal();

非模态对话框:

//1 创建对话框对象,由于ShowWindow的函数是非阻塞的,所以当前函数执行完后dlg对象会释放,造成
// 对话框一闪而过, 所以要把对象添加为成员函数
//CDlgShow dlg;

//2 Create(),只能调用一次,所 以要放到初始化里面,不然第二次打开会出错
//dlg.Create( IDD_DIALOG_SHOW);     // 非模态对话框ID

//3 以非模态方式显示
dlg.ShowWindow(SW_SHOWNORMAL);

combobox:

//初始化下拉框
    //1 添加元素
    m_combo.AddString(TEXT("可乐"));
    m_combo.AddString(TEXT("雪碧"));
    m_combo.AddString(TEXT("王老吉"));

    //2 插入元素
    m_combo.InsertString(2, TEXT("加多宝"));

    //3 删除元素
    m_combo.DeleteString(3);

    //4 默认显示
    m_combo.SetCurSel(1);

//下拉框状态改变时触发
void CMy05_comboboxDlg::OnCbnSelchangeComboC()
{
    // TODO:  在此添加控件通知处理程序代码
    //显示当前元素
    int index = m_combo.GetCurSel();
    CString str;
    m_combo.GetLBText(index, str);
    MessageBox(str);
}

list control:

> 将list control 属性 view 改为 report(报表模式)

//设置风格, 选中一行, 网格样式
    m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);

    //表头数组
    CString heard[] = { TEXT("姓名"), TEXT("性别"), TEXT("年龄") };

    //listCtl添加表头
    m_list.InsertColumn(0, heard[0], LVCFMT_LEFT, 50);
    m_list.InsertColumn(1, heard[1], LVCFMT_LEFT, 50);
    m_list.InsertColumn(2, heard[2], LVCFMT_LEFT, 50);


    for (int i = 0; i < 10; i++)
    {
        CString str;
        str.Format(TEXT("张三_%d"), i);

        int j = 0;
        //插入一行
        m_list.InsertItem(i, str);
        m_list.SetItemText(i, ++j, TEXT("不确定"));
        m_list.SetItemText(i, ++j, TEXT("23"));
    }


> 1. 要先把图标加载到 资源文件>ICON

//初始化TreeCtrl
    //1 加载图标
    HICON  hIcon[4];

    hIcon[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
    hIcon[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
    hIcon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
    hIcon[3] = AfxGetApp()->LoadIconW(IDI_ICON4);

    //创建图标列表 , 由于是在初始化类中,防止初始化结束图标消失,所以将imageList对象设置为成员变量
    imageList.Create(50, 50, ILC_COLOR32, 4, 4);

    //将图标加载到图标列表中
    for (int i = 0; i < 4; i++)
    {
        imageList.Add(hIcon[i]);
    }

    //将图标列表设置给树控件
    m_tree.SetImageList(&imageList, TVSIL_NORMAL);

    //插入节点
    HTREEITEM root = m_tree.InsertItem(TEXT("根节点"), 0, 0, NULL);
    HTREEITEM father = m_tree.InsertItem(TEXT("父节点"), 1, 1, root);
    HTREEITEM sun = m_tree.InsertItem(TEXT("叶子节点"), 2, 2, father);

    //默认选中节点
    m_tree.SelectItem(sun);

Edit Control:

> 解决在文本框中回车会关闭窗口的问题:选择类视图, editDlg,右键属性 > 重写 OnOK, 添加OnOK方法后,将
CDialogEx::OnOK()注释,即可。

> 将变量的值显示在控件中显示:UpdateData(FALSE);     // 必须是value类型

> 将 整个对话框中的控件中的值赋值给变量:UpdateData(TRUE);

常用属性设置:
属性
含义
Number
True只能输入数字
Password
True密码模式
Want return
True接收回车键,自动换行,只有在多行模式下,才能换行
Multiline
True多行模式
Auto VScroll
True 当垂直方向字符太多,自动出现滚动条,同时设置Vertical Scroll才有效
Vertical Scroll
True当垂直方向字符太多,自动出现滚动条,和Auto VScroll配合使用
Horizontal Scroll
True当垂直方向字符太多,自动出现滚动条,和Auto HScroll配合使用
Read Only
True 只读
常用接口:
接口
功能
CWnd::SetWindowText
设置控件内容,针对control类型
CWnd::GetWindowText
获取控件内容,针对control类型
 


TableCtrl:

> 创建项目时最后一步,将view类的基类,设置为CFromView
> 将tab的子窗口的 style设置为 Child, 然后添加类
> 将tab的子窗口的  border设置文 None, 然后添加类
> 将tab控件添加变量,基类设置为CTabSheet


主对话框类中 OnInitDialog() / OnInitialUpdate()做初始化工作
//给tab控件添加对话框
//IDD_DIALOG1为dlg1资源ID
m_tabCtrl.AddPage(TEXT("系统管理"), &dlg1, IDD_DIALOG1);

//IDD_DIALOG1为dlg2资源ID
m_tabCtrl.AddPage(TEXT("系统设置"), &dlg2, IDD_DIALOG2);

//显示tab控件
m_tabCtrl.Show();



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MFC(Microsoft Foundation Class)是微软公司开发的一套用于Windows操作系统的C++应用程序框架。入门MFC需要具备一定的C++编程基础和对Windows操作系统的了解。 CSDN(全称为中国软件开发者网站)是一个专注于IT技术交流与资源分享的平台。在CSDN上,我们可以找到很多关于MFC入门的教程和学习资源。这些资源包括入门教程、示例代码、问题解答、社区讨论等,对于初学者来说非常有帮助。 VS2010(Visual Studio 2010)是微软公司开发的集成开发环境(IDE),它提供了丰富的开发工具和功能,可以方便地使用MFC进行开发。在VS2010中,我们可以创建MFC应用程序的项目,并使用MFC提供的类和函数进行开发。VS2010提供了图形化的界面编辑器,可以方便地设计和布局应用程序的界面。 通过CSDN上的教程和资源,我们可以学习如何在VS2010中创建MFC项目,并了解MFC的基本概念和使用方法。我们可以学习如何创建窗口、处理消息、设计界面等。同时,CSDN上的社区讨论和问题解答可以帮助我们解决在学习和开发过程中遇到的问题。 总之,通过在CSDN上查找MFC入门教程和学习资源,并结合使用VS2010进行实践,我们可以初步掌握MFC的基本知识和开发技巧。这样,我们就能够开始使用MFC进行Windows应用程序的开发了。 ### 回答2: MFC(Microsoft Foundation Classes)是微软公司开发的一套以面向对象的方式封装了Windows API的C++类库,用于开发Windows桌面应用程序。CSDN(全称中国软件开发网)是国内知名的技术社区和IT资源平台,上面有大量与编程开发相关的教程、文章和问答。VS2010(Visual Studio 2010)是微软公司推出的集成开发环境,用于编写、调试和部署各种应用程序。 对于初学者来说,MFC入门可能会面临一些挑战,因为需要对C++语言和Windows操作系统的基础有一定了解才能理解MFC的原理和使用方法。在这方面,CSDN提供了很多MFC入门教程和示例代码,可以帮助初学者更轻松地掌握MFC的使用。 而VS2010作为一个集成开发环境,可以提供给开发者一站式的开发工具,包括代码编辑、调试、编译等功能。VS2010中已经集成了MFC框架,可以直接进行MFC应用程序的开发。VS2010的界面友好,操作简单,并且有着强大的代码编辑和调试功能,对于初学者来说是一个很好的选择。 总之,对于想要学习MFC开发的初学者来说,可以通过CSDN上的教程和代码示例,结合使用VS2010作为开发工具,来入门MFC开发。这样可以更加高效地学习和掌握MFC的基础知识和应用技巧,为日后的开发工作打下坚实的基础。 ### 回答3: MFC(Microsoft Foundation Classes)是微软公司提供的一套用于开发Windows桌面应用程序的类库。对于初学者来说,学习MFC可以通过多种途径,其中CSDN和Visual Studio 2010是比较常见的选择之一。 CSDN(中国软件开发网)是一个面向开发者的社区平台,上面有大量的技术博客、论坛和资源分享。对于MFC入门学习来说,CSDN是一个非常有帮助的资源。用户可以通过搜索MFC相关的博客和教程来了解基础知识和开发经验,也可以参与相关的讨论与其他开发者交流。CSDN的优势在于其庞大的用户群体和丰富的资源库,可以提供较为全面和实用的学习资料。 而Visual Studio 2010是微软提供的一种集成开发环境(IDE),它包含了开发Windows应用程序所需的各种工具和功能。对于MFC入门学习来说,Visual Studio 2010是一个非常好的选择。它支持MFC应用程序的创建、调试和部署,提供了可视化的界面设计工具和丰富的代码编辑器,使得开发过程更加高效和便捷。此外,Visual Studio 2010还提供了很多示例代码和文档,可供学习和参考。 总而言之,CSDN和Visual Studio 2010对于MFC入门学习都是非常有用的资源。CSDN可以提供丰富的博客、教程和讨论,帮助开发者理解MFC的基本概念和开发经验;而Visual Studio 2010则提供了完善的开发环境和工具,使得开发过程更加便捷和高效。通过结合两者的使用,初学者可以更好地掌握MFC开发,快速入门并提升自己的开发能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值