一、新建工程
基于对话框
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);