MFC單檔案實驗(SDI/登錄/圖片)
- 一、新建MFC單檔案
- 二、新建選單
- 三、初始化View
- 四、Login模塊
- 五、PhotoS/H模塊
- 六、給Login添加動態背景
- 七、修改密碼模塊
- 八、注冊模塊
一、新建MFC單檔案

在VS(這里是VS2017)中新建MFC專案->選擇單個檔案,選擇MFC標準,點擊完成,單檔案專案就新建好了,
二、新建選單

在資源視圖的主選單中新插入圖片中的Login/PhotoS/H等選單鍵,

右鍵選單鍵,分別添加事件處理程式如上圖 command 型別,放在 Doc 中,
三、初始化View
先在類 xxDoc.h 的 public 中定義如下變數
public:
CString m_name, m_num, m_pw, m_sex,m_text;//姓名學號等
int m_show;//圖片
int m_flag;//判斷是否登錄

再在 xxDoc.cpp 中對 m_text 初始化,如上圖,

最后,在xxView.cpp的OnDraw()函式中將pDC的注釋解除,并添加上圖紅方框中的代碼,
運行查看結果:

四、Login模塊

新插入對話框,并完成以上操作,
右鍵對話框,給Login對話框新建類 login.h ,
在類 login.h 的 public 中添加以下變數:
CString name1, num1, pw1, sex1;
在xxDoc.cpp中添加頭檔案 #include “login.h” ,將Login對話框與Doc關聯,
雙擊男和女按鈕,自動創建按鈕函式,并在男按鈕函式中添加:
sex1 = "男";
女按鈕函式中添加:
sex1 = "女";
雙擊確定按鈕,自動創建OK函式,在函式中添加代碼如下:
void login::OnBnClickedOk()
{
// TODO: 在此添加控制元件通知處理程式代碼
GetDlgItemText(IDC_EDIT1, name1);
GetDlgItemText(IDC_EDIT2, num1);
GetDlgItemText(IDC_EDIT3, pw1);
if (sex1 == L"" || name1 == L"" || num1 == L"")
{
MessageBox(L"please input all information!");
return;
}
if (name1 == L"1"&&num1 == L"1" && pw1 == L"1")
CDialog::OnOK();
else
MessageBox(L"error name or number!");
}
這里我定義的姓名學號密碼都是1,
在OnExceLogin()中添加代碼如下:
void CTestDoc::OnExceLogin()
{
// TODO: 在此添加命令處理程式代碼
login ldlg;
if(ldlg.DoModal()==IDOK)
{
m_name = ldlg.name1;
m_num = ldlg.num1;
m_sex = ldlg.sex1;
m_pw = ldlg.pw1;
m_flag = 1;
UpdateAllViews(NULL);
}
}
Login功能就已經完成了,接下來,將登錄的資料傳輸給View,在 View.cpp 的 OnDraw()函式中添加如下代碼:
if(pDoc->m_flag==1)
{
CString temp;
str = pDoc->m_name;
temp.Format(L"姓名:%s", str);
sizeText = pDC->GetTextExtent(str);
pDC->TextOut(10, sizeText.cy , temp);
temp;
str = pDoc->m_num;
temp.Format(L"學號:%s", str);
sizeText = pDC->GetTextExtent(str);
pDC->TextOut(10, sizeText.cy * 2, temp);
temp;
str = pDoc->m_sex;
temp.Format(L"性別:%s", str);
sizeText = pDC->GetTextExtent(str);
pDC->TextOut(10, sizeText.cy * 3, temp);
}
運行效果:

這就是登錄成功的效果,
五、PhotoS/H模塊

在xx.rc右鍵,匯入bitmap資源,如上圖,
和m_text一樣,在Doc中初始化m_show,
m_show=-1;
在Doc.cpp的OnExecPhoto()中添加代碼如下:
void CsdiDoc::OnExecPhoto()
{
// TODO: 在此添加命令處理程式代碼
if (m_flag!=1)
{
AfxMessageBox(L"please login!");
}
else
m_show=-m_show;
UpdateAllViews(NULL);
}
在View.cpp的OnDrow()下的
if (pDoc->m_flag == 1)
{
}中添加代碼,如下:
if (pDoc->m_flag == 1)
{
if (pDoc->m_show == 1) {
CDC dc;
dc.CreateCompatibleDC(pDC);
CBitmap bmp;
bmp.LoadBitmapW(IDB_BITMAP2);//這是bmp圖片的ID
BITMAP info;
bmp.GetBitmap(&info);
dc.SelectObject(bmp);
pDC->BitBlt(10, sizeText.cy * 5, info.bmWidth, info.bmHeight, &dc, 0, 0, SRCCOPY);
}
}
運行效果:

登錄后,點擊PhotoS/H選單鍵,可以顯示或隱藏圖片,
到此為止,實驗就完成了,下面是一些拓展模塊,
六、給Login添加動態背景
參考我的另一篇博客,鏈接: MFC對話框動態背景.
七、修改密碼模塊
因為要給它添加修改密碼和注冊功能,所以有多個帳號,且在不同的對話框,這里就需要用到全域變數了,
在主檔案的類xx.h中定義全域變數
CString num[5], pw[5];
int n;

新添加修改密碼對話框如上圖,并新建類 changepw.h ,
在 changepw.h 的 public 中添加變數
CString pw2,pw3;
雙擊確定,自動創建OK函式,
在OK函式中添加代碼如下:
GetDlgItemText(IDC_EDIT1, pw2);
GetDlgItemText(IDC_EDIT2, pw3);
if (pw2 == L"" || pw3 == L"")
{
MessageBox(L"please input all information!");
return;
}
if (pw2 != pw3)
{
MessageBox(L"兩次輸入不一致!");
return;
}
else
{
theApp.pw[1] = pw3;
MessageBox(L"修改成功!");
CDialog::OnOK();
}
并在之前Login對話框中判斷登錄的條件改成:
if (name1 == L"1"&&num1 == L"1" && (pw1 == L"1"||pw1==theApp.pw[1]))
在Doc.cpp中添加頭檔案 :
#include"changepw.h"
并在Doc.cpp 的 OnExceChangepw()函式中添加代碼:
void CTestDoc::OnExceChangepw()
{
// TODO: 在此添加命令處理程式代碼
changepw cdlg;
cdlg.DoModal();
}
完成,現在,你就可以修改你的密碼了(這里很簡略,沒有將密碼與全域變數關聯,所以你的新密碼和舊密碼都有效,等有空再繼續更新),
八、注冊模塊
休息中~有空就更新!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/240850.html
標籤:其他
上一篇:python爬蟲及其可視化
