MFC入门

来源:互联网 发布:淘宝开店审核多久 编辑:程序博客网 时间:2024/05/06 08:21
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 0