MFC开发之制作一个登录页面

先来看看效果图:
MFC开发之制作一个登录页面X

开始的步骤 新建MFC工程->选择基于对话框程序->默认就行了,然后开始正式的开发步骤
1.设置窗口的背景图片
在OnInitDialog()函数中加入这句代码就行:
CDialogEx::SetBackgroundImage(IDB_BITMAP6);//添加背景图片
其中 BITMAP6 为导入的位图(Bitmap)资源的ID
2.去掉对话框的边框:
在OnInitDialog()函数中加入以下代码
DWORD dwStyle = GetStyle();//获取旧样式
DWORD dwNewStyle = WS_OVERLAPPED | WS_VISIBLE | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
dwNewStyle &= dwStyle;//按位与将旧样式去掉
SetWindowLong(m_hWnd, GWL_STYLE, dwNewStyle);//设置成新的样式
DWORD dwExStyle = GetExStyle();//获取旧扩展样式
DWORD dwNewExStyle = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR;
dwNewExStyle &= dwExStyle;//按位与将旧扩展样式去掉
SetWindowLong(m_hWnd, GWL_EXSTYLE, dwNewExStyle);//设置新的扩展样式
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE |SWP_FRAM ECHANGED);//告诉
3.添加其他控件
其中包括3个静态文本控件,设置第三个的ID为IDC_STATIC1,区别于第一 第二的控件,接下来要操作其相应鼠标的焦点。添加2个Edit Contral控件 接受登录账号和密码 添加2个按钮,登录的退出
4.图片按钮的制作
将生成的按钮覆盖图片在上面,,当鼠标移动到按钮上面时,高亮图片(换一副一样的不过更亮的图片)首先在资源视图给2个按钮添加变量,分别声明为m_btn,m_BtnClose,在OnInitDialog()函数添加以下代码
HBITMAP hBmp = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP3));
m_Btn.SetBitmap(hBmp);
HBITMAP hBmp2 = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP5));
m_BtnClose.SetBitmap(hBmp2);
其中的BITMAP3于BITMAP5位导入的位图(bmp文件)资源ID
这样在创建窗体的时候按钮就初始化为2张图片,接着实现当鼠标焦点在按钮上面时按钮上面的图片更新。在C...Dlg类添加消息WM_SETCURSOR在消息响应函数OnSetCursor中添加代码:
if (pWnd == GetDlgItem(IDC_BUTTON2))
{
flag = false;
HBITMAP hBmp = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP2));
m_Btn.SetBitmap(hBmp);
SetCursor(LoadCursor(NULL, IDC_HAND));
return TRUE;
}
else
{
HBITMAP hBmp = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP3));//回到开始的图片
m_Btn.SetBitmap(hBmp);
}if (pWnd == GetDlgItem(IDC_BUTTON1))//鼠标焦点在按钮1
{
HBITMAP hBmp2 = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP4));//更新图片
m_BtnClose.SetBitmap(hBmp2);
SetCursor(LoadCursor(NULL, IDC_HAND));
return TRUE;
}
else
{
HBITMAP hBmp2 = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP5));
m_BtnClose.SetBitmap(hBmp2);
}
return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
5.右侧的“忘记密码”静态文本的实现
初始化时该文本的颜色为红色,当鼠标移动到该控件的时候,则会在下面添加一条下划线,离开则下划线消失
在OnInitDialog()中初始化控件的字体,IDC_STATIC1为控件的ID
GetDlgItem(IDC_STATIC1)->SetWindowText(L'忘记密码?');
设置字体的颜色 添加WM_CtlColor消息 在OnCtlColor消息响应函数中添加代码
if (IDC_STATIC1 == pWnd->GetDlgCtrlID())//判断发出消息的空间是否是该静态文本框
{
pDC->SetTextColor(RGB(255, 0, 0));//设置文本颜色为红色
}
捕获鼠标焦点消息 在第四步的WM_SETCURSOR消息响应函数OnSetCursor中添加代码:
if (pWnd->GetDlgCtrlID() == (IDC_STATIC1))
{
flag = true;
SetCursor(LoadCursor(NULL, IDC_HAND));
GetDlgItem(IDC_STATIC1)->SetWindowText(L'__________');
return TRUE;
}
if (flag == true){
flag = false;
CString str('忘记密码?');
CStatic*pStatic = (CStatic *)GetDlgItem(IDC_STATIC1);
ChgStaticText(pStatic, str);
}
其中的flag是一个bool型变量用来判断鼠标的焦点是否在控件区域内
ChgStaticText是一个函数 用来向控件插入文本,如果直接用SetWindowText函数,则文本会重叠,不会实现覆盖,而此函数由于调用InvalidateRect函数,使得控件的工作区重绘,实现了覆盖
void CChatAppTestDlg::ChgStaticText(CStatic *cTxt, const CString sContect)
{
cTxt->SetWindowText(sContect);
// 重绘 文本控件
CRect rect;
cTxt->GetWindowRect(&rect); // 只局部刷新
CWnd *pParent = cTxt->GetParent();
if (pParent)
{
pParent->ScreenToClient(&rect); // 把屏幕坐标转换为窗口坐标
pParent->InvalidateRect(&rect); // 更新矩形区域(重绘)
}
}
到此,一个小小的登录界面接开发完成了,接下来,实现登录后的界面。
展开阅读全文

没有更多推荐了,返回首页