复习MFC之clean-温故而知新

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fallfeather/article/details/82966195

一、新建工程

基于对话框

MFC标准

二、模态

拖按钮的控件,双击进入是他的消息代码

右键那个按钮,添加DLG类COneDlg,其他默认

然后在主对话框的头文件中添加新建对话框的头

#include “OneDlg.h”

然后在按钮的消息代码中添加

COneDlg dlg;
dlg.DoModal();

三、非模态

拖按钮的控件,双击进入是他的消息代码

右键那个按钮,添加DLG类CTwoDlg,其他默认

然后在主对话框的头文件中添加新建对话框的头

#include “TwoDlg.h”

然后在按钮的消息代码中添加

CTwoDlg *dlg = new CTwoDlg;
dlg->Create(IDD_DIALOG1,this); //创建非模态对话框
dlg->ShowWindow(SW_SHOW); //显示

三、添加图片并实现两个图片的变换

1、先拖控件Picture control

改属性

type:bitmap

ID :IDC_PICTURE

IMAGE: IDB_BITMAP7

NOTIFY : TRUE

2、右键主dlg的图片添加事件处理程序,单击在主dlg

3、右键主dlg的图片添加变量m_picture

4、在主dlg.h中定义变量

public:

HBITMAP m_hBitmap7;
HBITMAP m_hBitmap8;
bool m_bChangeBmpFlag;

5、在主dlg初始化函数中添加图片变量的赋值

m_hBitmap7 = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP7));
m_hBitmap8 = ::LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP8));

6、在主dlg的构造中初始化bool变量的值

m_bChangeBmpFlag = false;

7、在点击图片的消息中添加变换图片的代码

if(m_bChangeBmpFlag == false)
m_picture.SetBitmap(m_hBitmap8);
else
m_picture.SetBitmap(m_hBitmap7);

m_bChangeBmpFlag = !m_bChangeBmpFlag;

四、添加tablectrl标签

1、拖控件tab control

2、类视图中添加类:CMyTabCtrl

继承 : CTabCtrl

3、在主dlg的头文件中添加

#include “MyTableCtrl.h”

然后后面

public:

CMyTableCtrl m_tab;

4、在源文件DoDataExchange()函数中绑定,添加代码:

DDX_Control(pDX, IDC_TAB1, m_tab);

5、在OnInitDialog()函数中添加

m_tab.InsertItem(0,L”清扫目录”);
m_tab.InsertItem(1,L”显示目录”);
m_tab.InsertItem(2,L”设置目录”);
m_tab.InsertItem(3,L”扫描删除”);
CSize size(0,30);
m_tab.SetItemSize(size);         //设置高度和宽度

6、将其写进函数里面(在MyTableCtrl的头文件和源文件)

头文件声明函数:

public:
void InitTableCtrl();

源文件实现函数

void CMyTableCtrl::InitTableCtrl()
{
this->InsertItem(0,L”清扫目录”);
this->InsertItem(1,L”显示目录”);
this->InsertItem(2,L”设置目录”);
this->InsertItem(3,L”扫描删除”);
CSize size(0,30);
this->SetItemSize(size);
}

在OnInitDialog()函数里面调用函数(主dlg的函数)

m_tab.InitTableCtrl();

五、添加标签下显示的DLG

1、添加dlg的资源

2、给对话框添加一个类:CShowDlg

3、定义类的对象

在tablectrl的头文件添加:

#include “ShowDlg.h”

定义对象:

public:
CShowDlg m_dlgShow;

4、修改dlg的属性

ID : IDD_SHOW_DLG

BORDER : NONE                     //去掉边框

STYLE : CHILD                        //出现在主DLG里面

5、初始化  (直接贴上会覆盖标签栏,需要向下移动30单位的大小)(非模态出现dlg)

m_dlgShow.Create(IDD_SHOW_DLG,this);
CRect rect;
//获取 标签 矩形框
this->GetClientRect(rect);
rect.top+=30;
rect.bottom+=30;
//把 m_dlgShow 窗口相对于 标签 向下移动30
m_dlgShow.MoveWindow(rect);

m_dlgShow.ShowWindow(SW_SHOW);

六,添加第一个按钮的功能(显示一个浏览文件夹的对话框)

在按钮事件下面添加下列代码:

wchar_t szFolderName[MAX_PATH] = {0}; //存储文件夹的名字
wchar_t szFolderPath[MAX_PATH] = {0}; //存储文件夹的路径
BROWSEINFO info;
info.hwndOwner = this->m_hWnd; //哪个窗口拥有这个对话框
info.pidlRoot = NULL; //NULL是从桌面文件夹开始浏览
info.pszDisplayName = szFolderName; //接收文件夹的名字
info.lpszTitle = L”选择一个吧!O(∩_∩)O”; //标题
info.ulFlags = NULL; //添加额外的控件
info.lpfn = NULL;
info.lParam = NULL;
info.iImage = NULL;

PCIDLIST_ABSOLUTE pa = ::SHBrowseForFolder(&info); //显示一个浏览文件夹的对话框

::SHGetPathFromIDList(pa,szFolderPath);

将其封装成一个函数

在app(头文件)上添加函数声明:

public:
static CString GetBrowseFolderSelectPath(CWnd* pWnd); //获取 浏览对话框的选择的路径

在实现里面写:

CString CMy26App::GetBrowseFolderSelectPath(CWnd* pWnd)
{
wchar_t szFolderName[MAX_PATH] = {0}; //存储文件夹的名字
wchar_t szFolderPath[MAX_PATH] = {0}; //存储文件夹的路径
BROWSEINFO info;
info.hwndOwner = pWnd->m_hWnd; //哪个窗口拥有这个对话框
info.pidlRoot = NULL; //NULL是从桌面文件夹开始浏览
info.pszDisplayName = szFolderName; //接收文件夹的名字
info.lpszTitle = L”选择一个吧!O(∩_∩)O”; //标题
info.ulFlags = NULL; //添加额外的控件
info.lpfn = NULL;
info.lParam = NULL;
info.iImage = NULL;

PCIDLIST_ABSOLUTE pa = ::SHBrowseForFolder(&info); //显示一个浏览文件夹的对话框

if(::SHGetPathFromIDList(pa,szFolderPath) == TRUE)
{
int a = 100;
if(wcscmp(szFolderPath,L” “) != 0) //获取成功了
{
return szFolderPath;
}
}
return L””;

}

在按钮事件下面调用:

void CShowDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString strPath = CMy26App::GetBrowseFolderSelectPath(this);
if(strPath != L””)
{
//在列表上插入
}
}

七、在主视图上显示添加的文件夹

1、在类视图上添加类 CShowPathListCtrl

基类CListCtrl

完成

2、在副DLG头文件添加

#include “ShowPathListCtrl.h”

public:
CShowPathListCtrl m_listctrlShowPath;

3、在源文件中绑定(DoDataExchange函数)

DDX_Control(pDX,IDC_LIST1,m_listctrlShowPath);

//IDC_LIST1是副窗口上主显示窗口的ID

4、修改副窗口上主显示窗口的属性,将图标ICON显示改为LIST列表显示

5、第一个按钮点击的消息改为

void CShowDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString strPath = CMy26App::GetBrowseFolderSelectPath(this);
if(strPath != L””)
{
//在列表上插入
m_listctrlShowPath.InsertItem(m_listctrlShowPath.GetItemCount(),strPath);
}
}

6、添加复选框

类视图showdlg右键属性->重写->OnInitDialog->添加

将实现改为

BOOL CShowDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

m_listctrlShowPath.SetExtendedStyle(LVS_EX_CHECKBOXES); //添加复选按钮
return TRUE; // return TRUE unless you set the focus to a control

}

八、实现第二个按钮和第三个按钮的功能

void CShowDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
for(int i = 0; i<m_listctrlShowPath.GetItemCount();i++)
{
//判断i 这一项是否选中
if(m_listctrlShowPath.GetCheck(i) == TRUE)
//删除这一项
m_listctrlShowPath.DeleteItem(i);
}
}

void CShowDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码

//删除所有项
m_listctrlShowPath.DeleteAllItems();

}

九、添加右键事件处理

1、ShowPathListCtrl类右键属性 添加鼠标右击事件(=NM_RCLICK)

删掉TN和下面那行

2、资源视图添加menu

第一行随便填

下面写要添加的东西

3、在头文件添加右键列表菜单

CMenu menu; //泪飙的右键菜单

4、在构造里面

menu.LoadMenu(IDR_MENU1); //加载菜单

在右击事件函数中写入

//获取光标的坐标
POINT point;
::GetCursorPos(&point);
//弹出菜单
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this);

5、在资源视图的MENU的对象中的每一个下拉栏目中添加事件处理程序

之前这些功能都写过,直接复制粘贴就成

将“m_listctrlShowPath.”改为“this->”

退出的函数中写

AfxGetMainWnd()->PostMessage(WM_CLOSE);

猜你喜欢

转载自blog.csdn.net/fallfeather/article/details/82966195