复健MFC
创建非Domodel() 非模态 对话框
通过菜单创建 在资源文件夹创建 Menu 项目 作为创建 模态化对话框 的基础 在此之前 决定先创建一个 CButton 来试试水
c++
void CtestView::On32771()
{
CRect rc;
rc.SetRect(0, 0, 400, 100);
Button1.Create(_T("OK!!"), BS_PUSHBUTTON| WS_VISIBLE, rc, this, 10011);
// TODO: 在此添加命令处理程序代码
}
Button1在 .h里不能作为临时变量储存在该函数里
之前学的都是什么静态程序自己加的 现在是动态了 所以 要进行 手动创建一个动态,在头文件里面的消息映射函数弄一个 TestButon()作为我的消息处理函数
c++
public :
afx_msg void TestButton1();
然后再消息映射里
c++
BEGIN_MESSAGE_MAP(CtestView, CView)
//略
ON_BN_CLICKED(10011, CtestView::TestButton1)
END_MESSAGE_MAP()
写出 函数
c++
void CtestView::TestButton1()
{
AfxMessageBox(_T("HEllo"));
}
这样就是非模态化的创建流程了 不过我没有做限制
创建微软自带的模态化对话框
刚才不是 学了如何创建按钮了吧. 接下来创建一个对话框 我先拿MFC 的颜色对话框举例
还是Menu 创建 对话框 在View 创建就行
CColorDialog 的使用
直接调用 使用DoModel即可
c++
void CtestView::On32772() //Color
{
CColorDialog ColorDlg;
ColorDlg.DoModal();
COLORREF clr = ColorDlg.GetColor();
// TODO: 在此添加命令处理程序代码
}
这不就用上了
接下来是 文件对话框
和颜色同理 就是使用 Domodal 调用 不过是CFileDialog而已
CFileDialog 的使用
他的创建和正常的不太一样 他需要添加参数
c++
explicit CFileDialog(
BOOL bOpenFileDialog, //参数,指定要创建的对话框类型。 将其设置为 TRUE 可 打开”对话框。FALSE 另存为”对话框。
LPCTSTR lpszDefExt = NULL,// 追加拓展名
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T(
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL,
DWORD dwSize = 0,
BOOL bVistaStyle = TRUE);
我选择让他 添加过滤 比如
c++
static TCHAR BASED_CODE szGL[] = _T("txt(*.txt)|*.txt|")_T("MarkDown(*.md)|*.md|")_T("*.*(*.*)|*.*||");
然后再进行 CFileDialog 调用
c++
void CtestView::WenJian()
{
static TCHAR BASED_CODE szGL[] = _T("txt(*.txt)|*.txt|")_T("MarkDown(*.md)|*.md|")_T("*.*(*.*)|*.*||");
CFileDialog FileDlg(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szGL);
FileDlg.DoModal();
auto Path = FileDlg.GetPathName();
auto File = FileDlg.GetFileName();
auto Name = FileDlg.GetFileTitle();
// TODO: 在此添加命令处理程序代码
}
这是保存
这是打开
c++
void CtestView::WenJian()
{
static TCHAR BASED_CODE szGL[] = _T("txt(*.txt)|*.txt|")_T("MarkDown(*.md)|*.md|")_T("*.*(*.*)|*.*||");
CFileDialog FileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szGL);
if (FileDlg.DoModal() == IDOK)
{
auto Path = FileDlg.GetPathName();
auto File = FileDlg.GetFileName();
auto Name = FileDlg.GetFileTitle();
}
如果IDOK 那么回显 路径 否则不显示就是这样的
公式化类工厂 复健
类工厂相当于模块化操作
c++
#include <iostream>
using namespace std;
class ClassAB
{
public:
};
class ClassA : public ClassAB
{
public:
ClassA() { cout << "HiA"<<endl; }
};
class ClassB: public ClassAB
{
public:
ClassB() { cout << "HiB" << endl; }
};
ClassAB* GetAll(int nID) {
switch (nID)
{
case 0:
return new ClassA;
break;
case 1 :
return new ClassB;
break;
}
}
int main() {
auto A = GetAll(0);
auto B = GetAll(1);
return 0;
}
非常简单的例子 我要封装 让switch 消失不见
稍微改造一下 利用多态
c++
#include <iostream>
using namespace std;
class ClassAB
{
public:
ClassAB() {}
virtual ~ClassAB() {}
};
class ClassF
{
public:
virtual ClassAB* Create() = 0;
};
class ClassA : public ClassAB
{
public:
ClassA() { cout << "HiA"<<endl; }
};
class ClassB: public ClassAB
{
public:
ClassB() { cout << "HiB" << endl; }
};
class ClassFA : public ClassF
{
public:
virtual ClassAB* Create() { return new ClassA; };
};
class ClassFB : public ClassF
{
public:
virtual ClassAB* Create() { return new ClassB; };
};
ClassAB* GetAll(ClassF* pF) {
return pF->Create();
}
int main() {
auto A = GetAll(new ClassFA);
auto B = GetAll(new ClassFB);
return 0;
}
实现子类化和工厂的实现 , ClassAB 作为父类指针 指向子类 另一个ClassF操作ClassAB不带参数版本 带参数版本 EXB讲解