• VC++开发垃圾文件清理软件之三:程序的界面设计与实现对话框界面


    先说下哈,有人说要源代码,源代码在博文《VC++开发垃圾文件清理软件之四:程序的界面设计与实现----按钮控件界面》的最后给出下载地址供大家下载。

    对应用程序界面的设计包括两部分,一部分是对话框自身的重设计,二是对话框控件的重绘,本程序主要对按钮控件进行重绘设计。

    1. 绘制对话框的背景位图

    绘制对话框背景位图本文采用的是处理对话框的WM_PAINT消息,该消息初始化时候对对话框进行绘制,从而绘制背景位图。绘制背景位图的主要代码如下:

    CRect   rect;
        CPaintDC   dc(this);
        GetClientRect(&rect); //获取客户区    
    //设置对话框背景颜色        
    dc.FillSolidRect(rect,RGB(14,94,157));   //设置为窗口背景

    2. 在指定的区域中输出位图

    为了能够在指定的区域中输出位图,需要使用设备上下文CDC类的StretchBlt方法。由于我们需要在窗口的非客户区域绘制位图,因此需要使用CWindowDC类的StretchBlt方法, CWindowDC类派生与CDC类,它提供了在窗口非客户区域绘制位图的功能。该方法数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。输出位图的主要实现代码如下:

    CRect winRC;
        CDC* pDC=GetWindowDC();//获取窗口设备上下文
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);//创建兼容内存位图
        BITMAPINFO bmpInfo;
        CBitmap bmp;    //定义位图对象
        GetWindowRect(&winRC);
        bmp.LoadBitmap(nID);//加载位图
        bmp.GetObject(sizeof(BITMAPINFO),&bmpInfo);//获取位图信息
        int nBmpCX = bmpInfo.bmiHeader.biWidth;//获取位图宽度
        int nBmpCY = bmpInfo.bmiHeader.biHeight;//获取位图高度
        memDC.SelectObject(bmp);//选中位图对象
        pDC->StretchBlt(x,y,w,h,
            &memDC,0,0,nBmpCX,nBmpCY,SRCCOPY);//在窗口中绘制位图
        bmp.DeleteObject();//释放位图对象
    ReleaseDC(pDC);//释放DC    

    3. 对话框界面设计与绘制的实现:

    在对话框重绘的设计与实现过程中,一般需要绘制的对话框区域主要有标题部分、边框部分和客户区部分。具体的区域划分如下图所示。

    既然要对多个区域进行位图显示输出,所以我们先封装一个bmp位图显示输出函数如下:

    void CClearTmpFileDlg::DisplayBmp(int x,int y,int w,int h,int nID)
    {//nID 表示位图资源的ID
        CRect winRC;
        CDC* pDC=GetWindowDC();
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
        BITMAPINFO bmpInfo;
        CBitmap bmp;    
        GetWindowRect(&winRC);
        bmp.LoadBitmap(nID);
        bmp.GetObject(sizeof(BITMAPINFO),&bmpInfo);
        int nBmpCX = bmpInfo.bmiHeader.biWidth;
        int nBmpCY = bmpInfo.bmiHeader.biHeight;
        memDC.SelectObject(bmp);
        pDC->StretchBlt(x,y,w,h,
            &memDC,0,0,nBmpCX,nBmpCY,SRCCOPY);//在窗口中绘制位图
        bmp.DeleteObject();
        ReleaseDC(pDC);
    }

    然后就是对各个区域进行位图输出重绘。由于标题栏以及边框主要都是非客户区域绘制,因此应该在WM_NCPAINT 消息中绘制。当然得先通过添加资源的方式将所用到的bmp位图资源导入到项目中。

    在 WM_NCPAINT消息对于的 方法OnNcPaint()中调用对话框绘制方法DrawDialog()。该方法的功能就是绘制对话框各个区域的位图。主要代码如下:

    void CClearTmpFileDlg::DrawDialog()
    {//重绘对话框标题栏、边框、最小化按钮、最大化按钮和关闭按钮等界面
        m_nFrameCY = GetSystemMetrics(SM_CYFIXEDFRAME);//获取对话框边框的高度
        m_nFrameCX = GetSystemMetrics(SM_CXDLGFRAME);//获取对话边框的宽度
        if(GetStyle()&WS_BORDER)//获取对话框是否有边框
        {
            m_nBorderCY = GetSystemMetrics(SM_CYBORDER) + m_nFrameCY;
            m_nBorderCX = GetSystemMetrics(SM_CXBORDER) +m_nFrameCX; 
        }
        else
        {        
            m_nBorderCY = m_nFrameCY;
            m_nBorderCX = m_nFrameCX;
        }
        m_nTitleBarCY = GetSystemMetrics(SM_CYCAPTION) + m_nBorderCY;//计算标题栏高度
        m_nTitleBarCX =m_nBorderCX;
    
        CRect winRect,factRect;
        GetWindowRect(&winRect);
        factRect.CopyRect(CRect(0,0,winRect.Width(),winRect.Height()));
        CWindowDC windowsDC(this);//获取窗口设备上下文
        //获取整个MFC窗口的高度和宽度
        m_nWinWidth = winRect.Width();//=781
        m_nWinHeight = winRect.Height();//=459
        //绘制对话框左标题栏位图    
        DisplayBmp(0,0,100,m_nTitleBarCY,IDB_LEFTTITLE);
        //绘制对话框标题栏左端的logo图标
        DisplayBmp(3,0,26,m_nTitleBarCY,IDB_APPICON);
        //绘制对话框右标题栏位图    
        DisplayBmp(m_nWinWidth-100,0,100,m_nTitleBarCY,IDB_RIGHTTITLE);
        //绘制对话框中标题栏位图    
        DisplayBmp(100,0,m_nWinWidth-200,m_nTitleBarCY,IDB_MIDTITLE);
        //绘制对话框左边框位图
        DisplayBmp(0,m_nTitleBarCY,m_nBorderCX,m_nWinHeight-m_nBorderCY,IDB_LEFTBAR);
        //绘制对话框底边框位图
        DisplayBmp(m_nBorderCX,m_nWinHeight-m_nBorderCX,m_nWinWidth-2*m_nBorderCX,m_nBorderCX,IDB_BOTTOMBAR);
        //绘制对话框左边框位图
        DisplayBmp(m_nWinWidth-m_nBorderCX,m_nTitleBarCY,m_nBorderCX,m_nWinHeight-m_nBorderCY,IDB_RIGHTBAR);
        //给对话框绘制最小化按钮
        DisplayBmp(m_nWinWidth-26*3-5,0,26,26,IDB_MINBTN1);
        //给对话框绘制最大化按钮
        DisplayBmp(m_nWinWidth-26*2-5,0,26,26,IDB_MAXBTN1);
        //给对话框绘制关闭按钮
        DisplayBmp(m_nWinWidth-26-5,0,26,26,IDB_CLOSEBTN1);
        
        ReleaseDC(&windowsDC);
        //ReleaseDC(&memDC);
        DrawTitleBarText();//输出标题栏文本
    }

    上面代码中最后的绘制对话框标题文本的方法DrawTitleBarText(),主要是用来显示标题栏的文本,其主要代码如下:

    CString strTitle ="小蔡垃圾清理器3.0";
    CDC* pDC= GetWindowDC();
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(255,255,255));
    pDC->SetTextAlign(TA_CENTER);
    CRect rect;
    GetClientRect(&rect);
    CSize szText = pDC->GetTextExtent(strTitle);
    CFont* font,*fOldFont;
    font = new CFont;
    font->CreateFont(12,0,0,0,FW_BOLD,FALSE,FALSE,0,ANSI_CHARSET,     OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,_T("宋体"));
    fOldFont = pDC->SelectObject(font);
    pDC->TextOut(100,6.5,strTitle,18);
    pDC->SelectObject(fOldFont);
    ReleaseDC(pDC); 

    在完成对话框相应区域的位图后,并没有完成任务,还需要处理标题栏按钮的热点效果,以及按钮的单击事件。首先得处理鼠标在非客户区域移动时的事件,即WM_NCMOUSEMOVE消息,在其消息处理函数中判断当前的鼠标点是否位于标题栏的按钮区域,如果是则设置按钮的热点效果,并且记录当前的按钮状态,及鼠标点在哪个按钮上。同样的,处理对话框非客户区域的单击事件,即WM_NCLBUTTONDOWN消息,在其消息处理函数中完成单击事件操作。这部分的代码比较简单,在此不予显示。

  • 相关阅读:
    史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
    整合SPRING CLOUD云服务架构
    java虚拟机
    test面板1
    gulp的使用
    拖拽js
    dependencies与devDependencies的区别
    获取随机颜色js
    nodejs创建ejs工程
    css图片垂直居中
  • 原文地址:https://www.cnblogs.com/JczmDeveloper/p/2974772.html
Copyright © 2020-2023  润新知