700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 用MFC做漂亮界面之登录界面

用MFC做漂亮界面之登录界面

时间:2020-03-16 00:47:41

相关推荐

用MFC做漂亮界面之登录界面

转自:/u011711997/article/details/79375710

前段时间由于工作原因,一直没有更新博客,今天,继续讲解如何用MFC做漂亮界面,前几次我们讲了如何美化窗口背景,如何美化标题,如何美化按钮,今天我们用以前学过的知识来一起做一个登录界面,这个登录界面的效果图如下:

分析

当我们看到这个界面的时候,先不要忙着去做,先要分析一下哪些是代码做的,哪些不是代码做的,这样就可以减少工作量。大家试试看,分析一下哪些是留在背景上的,不需要我们去做?没错,一共有5个部分是留在背景上的,分别如下:

第一个是老虎,这个不用多说。

第二个是账号,因为这个是美术字,加了特效,代码没法实现。

第三个是密码,同上。

第四个是账号输入框,因为这个框的边框加了特效,所以要留下。

第五个是密码输入框,同上。

美化窗口背景

创建一个对话框项目,命名为LoginTigger,去掉取消按钮和确定按钮,并且修改对话框的Border为None,然后在函数OnInitDialog中修改窗口尺寸为背景图片尺寸。具体如下:

[cpp] view plain copyBOOLCLoginTiggerDlg::OnInitDialog(){CDialogEx::OnInitDialog();//将“关于...”菜单项添加到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){BOOLbNameValid;CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码//这个是我们自己加的MoveWindow(0,0,300,400);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}

然后,编译代码,效果如下:

下面我们显示背景图片到窗口中,就完成了美化背景,首先在我们的对话框的头文件中增加一个CBrush变量,变量名是m_bkBrush,它代表我们的背景图片,在OnInitDialog中加载背景图片Tigger.png,具体如下:

[cpp] view plain copyBOOLCLoginTiggerDlg::OnInitDialog(){CDialogEx::OnInitDialog();//将“关于...”菜单项添加到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){BOOLbNameValid;CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码//这个是我们自己加的MoveWindow(0,0,300,400);//加载背景图片CStringstrBmpPath=_T(".\\res\\Tigger.png");CImageimg;img.Load(strBmpPath);CBitmapbmpTmp;bmpTmp.Attach(img.Detach());m_bkBrush.CreatePatternBrush(&bmpTmp);returnTRUE;}

然后添加WM_CTLCOLOR响应函数,不懂得可以翻阅一下前面的文章,具体如下:

[cpp] view plain copyHBRUSHCLoginTiggerDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialogEx::OnCtlColor(pDC,pWnd,nCtlColor);//TODO:在此更改DC的任何特性//TODO:如果默认的不是所需画笔,则返回另一个画笔if(pWnd==this){returnm_bkBrush;}returnhbr;}

编译,运行效果如下:

至此,美化背景完成,是不是很简单。

添加标题

我们首先创建一个CCaption类,继承自CStatic,然后添加成员函数HBRUSH CtlColor(CDC* pDC, UINT nCtlColor),不懂得可以翻阅前面的文章,具体如下:

[cpp] view plain copyHBRUSHCCaption::CtlColor(CDC*pDC,UINT/*nCtlColor*/){CFontfont;LOGFONTlf;if(!pDC)returnNULL;//创建一个空画刷,返回这个画刷可以让静态控件的背景透明HBRUSHhr=(HBRUSH)GetStockObject(NULL_BRUSH);//让文字的背景透明pDC->SetBkMode(TRANSPARENT);//设置文字的颜色为白色pDC->SetTextColor(RGB(255,255,255));::ZeroMemory(&lf,sizeof(lf));//设置逻辑字体的高度lf.lfHeight=24;//设置逻辑字体为粗体字lf.lfWeight=FW_BOLD;//设置字体为宋体::lstrcpy(lf.lfFaceName,_T("宋体"));//用逻辑字体创建一个CFont对象font.CreateFontIndirect(&lf);//应用字体pDC->SelectObject(&font);returnhr;}

然后再添加一个成员函数,控制这个标题的显示位置和范围,具体如下:

[cpp] view plain copyvoidCCaption::Init(intnX,intnY,intnW,intnH){MoveWindow(nX,nY,nW,nH);}

然后,在对话框上添加一个静态控件,ID为IDC_STATIC_CAPTION,并且为它定义一个控件变量,命名为m_staticCap,再然后,修改它的类型为CCaption,并在OnInitDialog中设置标题的位置和范围,具体代码如下:

[cpp] view plain copyBOOLCLoginTiggerDlg::OnInitDialog(){CDialogEx::OnInitDialog();//将“关于...”菜单项添加到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){BOOLbNameValid;CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码//这个是我们自己加的MoveWindow(0,0,300,400);//加载背景图片CStringstrBmpPath=_T(".\\res\\Tigger.png");CImageimg;img.Load(strBmpPath);CBitmapbmpTmp;bmpTmp.Attach(img.Detach());m_bkBrush.CreatePatternBrush(&bmpTmp);//调整标题位置m_staticCap.Init(4,8,105,30);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}

编译程序,显示效果如下:

根据前面的学习,相信肯定有同学会说,还没有加窗口移动,对,别着急,现在就加,具体代码如下:

[cpp] view plain copyLRESULTCLoginTiggerDlg::OnNcHitTest(CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值LRESULTret=CDialogEx::OnNcHitTest(point);return(ret==HTCLIENT)?HTCAPTION:ret;} 不懂得,可以看一下前面的文章,这里就不做过多介绍了。

添加关闭按钮

关闭按钮一共有三张图片分别对应正常,按下,悬浮(鼠标移动在上面的时候),具体如下:

首先我们需要为对话框添加一个关闭按钮的控件,命名为IDC_BUTTON_CLOSE,然后设置为Owner Draw,并添加一个控件变量,命名为m_btnClose,然后定义一个美化的按钮类,继承自CButton,命名为CMyButton,具体代码如下:

MyButton.h内容如下:

[cpp] view plain copy#pragmaonce//CMyButtonclassCMyButton:publicCButton{DECLARE_DYNAMIC(CMyButton)public:CMyButton();virtual~CMyButton();protected://正常状态图像路径CStringm_strNormalImgPath;//按下状态图像路径CStringm_strPressImgPath;//悬浮状态图像路径CStringm_strFloatImgPath;//正常状态图像CImagem_imgNormal;//按下状态图像CImagem_imgPress;//悬浮状态图像CImagem_imgFloat;//窗口背景图片CImagem_BkImg;public://设置按钮图片路径voidSetImagePath(CStringstrNoramlImgPath,CStringstrPressImgPath,CStringstrFloatImgPath);//初始化按钮,主要是调整按钮的位置,处理透明色boolInitMyButton(intnX/*左上角X坐标*/,intnY/*左上角Y坐标*/,intnW/*图像宽*/,intnH/*图像高*/,boolbIsPng/*是否是PNG图片*/);//自绘制函数voidDrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct);//初始化窗口背景voidSetBkImg(CStringstrBkImg);protected://光标是否在窗口内BOOLm_bIsInWnd;DECLARE_MESSAGE_MAP()public:afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);afx_msgvoidOnMouseHover(UINTnFlags,CPointpoint);afx_msgvoidOnMouseLeave();};

MyButton.cpp内容如下:

[cpp] view plain copy//MyButton.cpp:实现文件//#include"stdafx.h"#include"LoginTigger.h"#include"MyButton.h"//CMyButtonIMPLEMENT_DYNAMIC(CMyButton,CButton)CMyButton::CMyButton(){m_bIsInWnd=FALSE;}CMyButton::~CMyButton(){}BEGIN_MESSAGE_MAP(CMyButton,CButton)ON_WM_MOUSEMOVE()ON_WM_MOUSEHOVER()ON_WM_MOUSELEAVE()END_MESSAGE_MAP()//CMyButton消息处理程序//设置按钮图片路径voidCMyButton::SetImagePath(CStringstrNoramlImgPath,CStringstrPressImgPath,CStringstrFloatImgPath){m_strNormalImgPath=strNoramlImgPath;m_strPressImgPath=strPressImgPath;m_strFloatImgPath=strFloatImgPath;}voidCMyButton::SetBkImg(CStringstrBkImg){if(strBkImg.IsEmpty())return;m_BkImg.Load(strBkImg);}//初始化按钮,主要是调整按钮的位置,处理透明色boolCMyButton::InitMyButton(intnX/*左上角X坐标*/,intnY/*左上角Y坐标*/,intnW/*图像宽*/,intnH/*图像高*/,boolbIsPng/*是否是PNG图片*/){HRESULThr=0;if(m_strNormalImgPath.IsEmpty())returnfalse;if(m_strPressImgPath.IsEmpty())returnfalse;if(m_strFloatImgPath.IsEmpty())returnfalse;hr=m_imgNormal.Load(m_strNormalImgPath);inta=GetLastError();if(FAILED(hr))returnfalse;hr=m_imgPress.Load(m_strPressImgPath);if(FAILED(hr))returnfalse;hr=m_imgFloat.Load(m_strFloatImgPath);if(FAILED(hr))returnfalse;if(bIsPng){if(m_imgNormal.GetBPP()==32){inti=0;intj=0;for(i=0;i<m_imgNormal.GetWidth();i++){for(j=0;j<m_imgNormal.GetHeight();j++){byte*pbyte=(byte*)m_imgNormal.GetPixelAddress(i,j);pbyte[0]=pbyte[0]*pbyte[3]/255;pbyte[1]=pbyte[1]*pbyte[3]/255;pbyte[2]=pbyte[2]*pbyte[3]/255;}}}if(m_imgPress.GetBPP()==32){inti=0;intj=0;for(i=0;i<m_imgPress.GetWidth();i++){for(j=0;j<m_imgPress.GetHeight();j++){byte*pbyte=(byte*)m_imgPress.GetPixelAddress(i,j);pbyte[0]=pbyte[0]*pbyte[3]/255;pbyte[1]=pbyte[1]*pbyte[3]/255;pbyte[2]=pbyte[2]*pbyte[3]/255;}}}if(m_imgFloat.GetBPP()==32){inti=0;intj=0;for(i=0;i<m_imgFloat.GetWidth();i++){for(j=0;j<m_imgFloat.GetHeight();j++){byte*pbyte=(byte*)m_imgFloat.GetPixelAddress(i,j);pbyte[0]=pbyte[0]*pbyte[3]/255;pbyte[1]=pbyte[1]*pbyte[3]/255;pbyte[2]=pbyte[2]*pbyte[3]/255;}}}}MoveWindow(nX,nY,nW,nH);returntrue;}//自绘制函数voidCMyButton::DrawItem(LPDRAWITEMSTRUCTlpDrawItemStruct){if(!lpDrawItemStruct)return;HDChMemDC;HBITMAPbmpMem;HGDIOBJhOldObj;bmpMem=CreateCompatibleBitmap(lpDrawItemStruct->hDC,lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top);if(!bmpMem)return;hMemDC=CreateCompatibleDC(lpDrawItemStruct->hDC);if(!hMemDC){if(bmpMem){::DeleteObject(bmpMem);bmpMem=NULL;}return;}hOldObj=::SelectObject(hMemDC,bmpMem);intnW=lpDrawItemStruct->rcItem.right-lpDrawItemStruct->rcItem.left;intnH=lpDrawItemStruct->rcItem.bottom-lpDrawItemStruct->rcItem.top;RECTrectTmp={0};rectTmp=lpDrawItemStruct->rcItem;MapWindowPoints(GetParent(),&rectTmp);if(m_BkImg.IsNull()==false)m_BkImg.Draw(hMemDC,0,0,rectTmp.right-rectTmp.left,rectTmp.bottom-rectTmp.top,rectTmp.left,rectTmp.top,rectTmp.right-rectTmp.left,rectTmp.bottom-rectTmp.top);if(lpDrawItemStruct->itemState&ODS_SELECTED){//按钮被选择m_imgPress.AlphaBlend(hMemDC,0,0,nW,nH,0,0,nW,nH);}else{//默认状态m_imgNormal.AlphaBlend(hMemDC,0,0,nW,nH,0,0,nW,nH);}::BitBlt(lpDrawItemStruct->hDC,0,0,nW,nH,hMemDC,0,0,SRCCOPY);SelectObject(hMemDC,hOldObj);if(bmpMem){::DeleteObject(bmpMem);bmpMem=NULL;}if(hMemDC){::DeleteDC(hMemDC);hMemDC=NULL;}return;}voidCMyButton::OnMouseMove(UINTnFlags,CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值CButton::OnMouseMove(nFlags,point);if(!m_bIsInWnd){TRACKMOUSEEVENTtme;tme.cbSize=sizeof(TRACKMOUSEEVENT);tme.dwFlags=TME_HOVER|TME_LEAVE;tme.dwHoverTime=10;tme.hwndTrack=m_hWnd;_TrackMouseEvent(&tme);m_bIsInWnd=TRUE;}}voidCMyButton::OnMouseHover(UINTnFlags,CPointpoint){//TODO:在此添加消息处理程序代码和/或调用默认值HDChMemDC;HBITMAPbmpMem;HGDIOBJhOldObj;HDChDC=::GetDC(GetSafeHwnd());CRectrcItem;GetClientRect(&rcItem);if(hDC){bmpMem=CreateCompatibleBitmap(hDC,rcItem.Width(),rcItem.Height());if(!bmpMem){::ReleaseDC(GetSafeHwnd(),hDC);return;}hMemDC=CreateCompatibleDC(hDC);if(!hMemDC){if(bmpMem){::DeleteObject(bmpMem);bmpMem=NULL;}::ReleaseDC(GetSafeHwnd(),hDC);return;}hOldObj=::SelectObject(hMemDC,bmpMem);RECTrectTmp={0};rectTmp=rcItem;MapWindowPoints(GetParent(),&rectTmp);if(m_BkImg.IsNull()==false)m_BkImg.Draw(hMemDC,0,0,rectTmp.right-rectTmp.left,rectTmp.bottom-rectTmp.top,rectTmp.left,rectTmp.top,rectTmp.right-rectTmp.left,rectTmp.bottom-rectTmp.top);intnW=rcItem.right-rcItem.left;intnH=rcItem.bottom-rcItem.top;m_imgFloat.AlphaBlend(hMemDC,0,0,nW,nH,0,0,nW,nH);::BitBlt(hDC,0,0,nW,nH,hMemDC,0,0,SRCCOPY);SelectObject(hMemDC,hOldObj);if(bmpMem){::DeleteObject(bmpMem);bmpMem=NULL;}if(hMemDC){::DeleteDC(hMemDC);hMemDC=NULL;}::ReleaseDC(GetSafeHwnd(),hDC);}CButton::OnMouseHover(nFlags,point);}voidCMyButton::OnMouseLeave(){//TODO:在此添加消息处理程序代码和/或调用默认值CButton::OnMouseLeave();InvalidateRect(NULL);m_bIsInWnd=FALSE;}

不懂的同学可以看一下前面的文章,编译程序,运行效果如下:

上面的图片显示了关闭按钮的三种状态效果,即正常,悬浮,按下。

添加账号和密码输入框

首先添加一个编辑框,命名为IDC_EDIT_NAME,设置边框属性为False,为它添加一个控件变量,命名为m_editName,然后为它设置一个字体需求,宋体,24点,具体代码如下:

[cpp] view plain copyBOOLCLoginTiggerDlg::OnInitDialog(){CDialogEx::OnInitDialog();//将“关于...”菜单项添加到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){BOOLbNameValid;CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码//这个是我们自己加的MoveWindow(0,0,300,400);//加载背景图片CStringstrBmpPath=_T(".\\res\\Tigger.png");CImageimg;img.Load(strBmpPath);CBitmapbmpTmp;bmpTmp.Attach(img.Detach());m_bkBrush.CreatePatternBrush(&bmpTmp);//调整标题位置m_staticCap.Init(4,8,105,30);//关闭按钮设置m_btnClose.SetImagePath(_T("./res/TigerCloseNormal.png"),_T("./res/TigerClosePress.png"),_T("./res/TigerCloseFloat.png"));m_btnClose.InitMyButton(271,8,20,20,true);//调整光标的位置适中m_editName.MoveWindow(82,261+4,200,31-4);CFont*pFont=m_editName.GetFont();LOGFONTlf;if(pFont){pFont->GetLogFont(&lf);lf.lfHeight=24;//改变字体高度_tcscpy(lf.lfFaceName,_T("宋体"));//改变字体名称m_fontEdit.CreateFontIndirect(&lf);m_editName.SetFont(&m_fontEdit);}returnTRUE;//除非将焦点设置到控件,否则返回TRUE}

然后修改控件字体的颜色,具体代码如下:

[cpp] view plain copyHBRUSHCLoginTiggerDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialogEx::OnCtlColor(pDC,pWnd,nCtlColor);//TODO:在此更改DC的任何特性if(pWnd==this){returnm_bkBrush;}//TODO:如果默认的不是所需画笔,则返回另一个画笔//输入账号if(pWnd==&m_editName){CFontfont;LOGFONTlf;if(!pDC)returnNULL;//创建一个空画刷,返回这个画刷可以让静态控件的背景透明HBRUSHhr=(HBRUSH)GetStockObject(NULL_BRUSH);//让文字的背景透明pDC->SetBkMode(TRANSPARENT);//设置文字的颜色为白色pDC->SetTextColor(RGB(200,200,200));}returnhbr;}

编译程序,运行效果如下:

密码输入框的制作与账号输入框相同,唯一不同的地方就是设置Password属性为真,密码输入框的ID为IDC_EDIT_PWD,为其添加一个控件变量m_editPwd,然后调整它的位置,并设置字体,具体代码如下:

[cpp] view plain copyBOOLCLoginTiggerDlg::OnInitDialog(){CDialogEx::OnInitDialog();//将“关于...”菜单项添加到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){BOOLbNameValid;CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码//这个是我们自己加的MoveWindow(0,0,300,400);//加载背景图片CStringstrBmpPath=_T(".\\res\\Tigger.png");CImageimg;img.Load(strBmpPath);CBitmapbmpTmp;bmpTmp.Attach(img.Detach());m_bkBrush.CreatePatternBrush(&bmpTmp);//调整标题位置m_staticCap.Init(4,8,105,30);//关闭按钮设置m_btnClose.SetImagePath(_T("./res/TigerCloseNormal.png"),_T("./res/TigerClosePress.png"),_T("./res/TigerCloseFloat.png"));m_btnClose.InitMyButton(271,8,20,20,true);//账号输入框//调整光标的位置适中m_editName.MoveWindow(82,261+4,200,31-4);CFont*pFont=m_editName.GetFont();LOGFONTlf;if(pFont){pFont->GetLogFont(&lf);lf.lfHeight=24;//改变字体高度_tcscpy(lf.lfFaceName,_T("宋体"));//改变字体名称m_fontEdit.CreateFontIndirect(&lf);m_editName.SetFont(&m_fontEdit);}//密码输入框m_editPwd.MoveWindow(82,308,200,25);m_editPwd.SetFont(&m_fontEdit);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}

为其设置字体颜色,具体代码与账号输入框一样,具体代码如下:

[cpp] view plain copyHBRUSHCLoginTiggerDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor){HBRUSHhbr=CDialogEx::OnCtlColor(pDC,pWnd,nCtlColor);//TODO:在此更改DC的任何特性if(pWnd==this){returnm_bkBrush;}//TODO:如果默认的不是所需画笔,则返回另一个画笔//输入账号if(pWnd==&m_editName){CFontfont;LOGFONTlf;if(!pDC)returnNULL;//创建一个空画刷,返回这个画刷可以让静态控件的背景透明HBRUSHhr=(HBRUSH)GetStockObject(NULL_BRUSH);//让文字的背景透明pDC->SetBkMode(TRANSPARENT);//设置文字的颜色为白色pDC->SetTextColor(RGB(200,200,200));}//输入密码if(pWnd==&m_editPwd){CFontfont;LOGFONTlf;if(!pDC)returnNULL;//创建一个空画刷,返回这个画刷可以让静态控件的背景透明HBRUSHhr=(HBRUSH)GetStockObject(NULL_BRUSH);//让文字的背景透明pDC->SetBkMode(TRANSPARENT);//设置文字的颜色为白色pDC->SetTextColor(RGB(200,200,200));}returnhbr;}

编译程序,运行效果如下:

添加登录和注册按钮

登录按钮和注册按钮与关闭按钮的代码一样,所以我们只需要使用CMyButton类就可以,唯一需要调整的就是它们的图片不一样,所以这里我们只说说不同的地方,首先添加两个按钮控件,ID分别为IDC_BUTTON_LOGIN和IDC_BUTTON_REG,分别为它们添加两个控件变量m_btnLogin和m_btnReg,然后修改它们的控件类型为CMyButton,最后在OnInitDialog中初始化它们的位置和图片,具体代码如下:

[cpp] view plain copyBOOLCLoginTiggerDlg::OnInitDialog(){CDialogEx::OnInitDialog();//将“关于...”菜单项添加到系统菜单中。//IDM_ABOUTBOX必须在系统命令范围内。ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX<0xF000);CMenu*pSysMenu=GetSystemMenu(FALSE);if(pSysMenu!=NULL){BOOLbNameValid;CStringstrAboutMenu;bNameValid=strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if(!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);}}//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码//这个是我们自己加的MoveWindow(0,0,300,400);//加载背景图片CStringstrBmpPath=_T(".\\res\\Tigger.png");CImageimg;img.Load(strBmpPath);CBitmapbmpTmp;bmpTmp.Attach(img.Detach());m_bkBrush.CreatePatternBrush(&bmpTmp);//调整标题位置m_staticCap.Init(4,8,105,30);//关闭按钮设置m_btnClose.SetImagePath(_T("./res/TigerCloseNormal.png"),_T("./res/TigerClosePress.png"),_T("./res/TigerCloseFloat.png"));m_btnClose.InitMyButton(271,8,20,20,true);//登录和注册按钮设置m_btnLogin.SetImagePath(_T("./res/tigerLoginNormal.png"),_T("./res/tigerLoginPress.png"),_T("./res/TigerLoginFloat.png"));m_btnLogin.InitMyButton(23,355,115,35,true);m_btnReg.SetImagePath(_T("./res/tigerRegisterNormal.png"),_T("./res/tigerRegisterPress.png"),_T("./res/TigerRegisterFloat.png"));m_btnReg.InitMyButton(167,355,115,35,true);m_btnLogin.SetBkImg(strBmpPath);m_btnReg.SetBkImg(strBmpPath);//账号输入框//调整光标的位置适中m_editName.MoveWindow(82,261+4,200,31-4);CFont*pFont=m_editName.GetFont();LOGFONTlf;if(pFont){pFont->GetLogFont(&lf);lf.lfHeight=24;//改变字体高度_tcscpy(lf.lfFaceName,_T("宋体"));//改变字体名称m_fontEdit.CreateFontIndirect(&lf);m_editName.SetFont(&m_fontEdit);}//密码输入框m_editPwd.MoveWindow(82,308,200,25);m_editPwd.SetFont(&m_fontEdit);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}

编译程序,运行效果如下:

至此我们的登录界面就做完了,有不懂得地方可以翻阅一下前面的文章,需要下载源码的同学,可以从下面的地址下载:

/download/u011711997/10261765

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。