首先,很多人黑MFC,我觉得这是不对的,他们老是说MFC复杂,过时。复杂暂且不说,过时我不认同,只要能做出合格的效果,最终用户才不会去管你用的MFC还是QT,MFC没有过时,它可以做出我想要的效果,而且不费劲。
小结一下最近使用MFC的经验,方便以后再使用。
新建一个win32项目,注意不是新建MFC应用程序,因为后者太大了,前者轻量级。
新建完项目后,开始添加资源文件(.rc文件),UI布局就是存放在这个.rc文件中的。
添加完资源后,可以开始添加其他UI控件,在工具箱中进行选择:
添加完控件后,开始做响应。
要注意,每添加完一个控件,会自动在.rc文件中为其生成一个ID,这个ID在后面会常用到。
其实代码的套路是比较固定的,并没有很多人说的复杂。
我在这里写的是一个客户端向服务器发送信息和图片的demo。
首先是TheClient类继承自CWinApp类
class TheClient : public CWinApp
{
public:
TheClient() {};
~TheClient() {};
//初始化
virtual BOOL InitInstance()
{
//调用父类的构造函数
CWinApp::InitInstance();
//实例化客户端窗口对象
CLIENT_FORM dlg;
//下面是注册相关,固定套路
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
return false;
}
};
下面是CLIENT_FORM类的代码,UI逻辑主要是放在这个类中的:
class CLIENT_FORM : public CDialog
{
public:
CLIENT_FORM(CWnd* pParent = NULL) : CDialog(CLIENT_FORM::IDD, pParent)
{
client = yonghu();
picFilePath = CString();
sendPicSignal = false;
};
//Dialog data, name of dialog here
enum{ IDD = IDD_DIALOG1 };
~CLIENT_FORM()
{
client.~yonghu();
}
private:
yonghu client;
CString picFilePath;
bool sendPicSignal;
protected:
virtual void DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); };
//Called right after constructor. Initialize things here
virtual BOOL OnInitDialog()
{
//SOCKET
if (client.ConnectToServer() == -1)
{
MessageBox(L"连接服务器失败", L"错误");
//exit(-1);
return false;
}
else
{
CDialog::OnInitDialog();
//pointer init
pInputMessage = (CEdit*)GetDlgItem(IDC_EDIT1);
pInputUserName = (CEdit*)GetDlgItem(IDC_EDIT_CLIENTNAME);
pSendInfoButton = (CButton*)GetDlgItem(IDOK);
pSendPicButton = (CButton*)GetDlgItem(IDSENDPIC_BUTTON);
//
pInputUserName->SetLimitText(8);//8bit
pInputMessage->SetLimitText(200);//80bit
return true;
}
}
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedSendPic();
};
注意,响应事件要在这里注册一下:
BEGIN_MESSAGE_MAP(CLIENT_FORM, CDialog)
//下面这里是按键响应注册,参数1是button的ID,参数2是回调函数名
//发送消息
ON_BN_CLICKED(IDOK, &CLIENT_FORM::OnBnClickedOk)
//发送图片
ON_BN_CLICKED(IDSENDPIC_BUTTON, &CLIENT_FORM::OnBnClickedSendPic)
END_MESSAGE_MAP()
两个类的定义和实现目前都是放在一个.h中的,上面这段代码在两个类之外,也是在同一个.h中。组织结构可以修改。