精华内容
下载资源
问答
  • MFC 对话框背景图片

    2020-09-09 20:37:25
    为了实现美化对话框背景的效果,我们需要让我们的对话框响应WM_CTLCOLOR消息,每当我们的对话框或者它的子控件需要重绘时,我们的对话框都会收到这个消息, 因此,我们需要为对话框添加WM_CTLCOLOR的

    在windows开发当中做界面的主要技术之一就是使用MFC,通常我们看到的QQ,360,暴风影音这些漂亮的界面都可以用MFC来实现。今天我们来说一下如何用MFC美化对话框,默认情况下,对话框的背景如下:

    那么,我们如何将它的背景变成如下界面呢,而且还要保留对话框的移动功能,漂亮背景如下:

    为了实现美化对话框背景的效果,我们需要让我们的对话框响应WM_CTLCOLOR消息,每当我们的对话框或者它的子控件需要重绘时,我们的对话框都会收到这个消息,

    因此,我们需要为对话框添加WM_CTLCOLOR的消息响应函数,完成对消息的处理,WM_CTLCOLOR的响应函数定义如下:

     

     
    1. HBRUSH CMFCDialogUIDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

    2. {

    3. HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

    4.  
    5. if (pWnd == this)

    6. {

    7. return m_bkBrush;

    8. }

    9.  
    10. return hbr;

    11. }

    当我们的对话框需要重绘的时候,我们的对话框就会收到WM_CTLCOLOR消息,然后我们的对话框处理函数会调用OnCtlColor函数来处理该消息,在这个函数中,pDC代表我们要绘制的上下文环境,pWnd代表我们要绘制的窗口指针,nCtlColor代表我们要绘制的窗口类型,在函数的内部我们首先调用父类的OnCtlColor,目的是为了对该消息做默认处理,这是MFC消息响应函数的惯用写法,但是在我们这里,我们不能使用默认处理返回的画刷,所以我们需要做一个特殊的判断,如果pWnd指向的窗口地址是当前对话框,那么我们就返回m_bkBrush,这个画刷是一个图像画刷,它会在我们的对话框客户区绘制我们想让它显示的图片。下面我们看一下m_bkBrush是如何创建的,首先在我们的对话框的头文件中增加一个CBrush变量,变量名是m_bkBrush,然后在对话框的OnInitDialog中初始化它,OnInitDialog的定义如下:

     

     

     
    1. BOOL CMFCDialogUIDlg::OnInitDialog()

    2. {

    3. CDialogEx::OnInitDialog();

    4.  
    5. // 将“关于...”菜单项添加到系统菜单中。

    6.  
    7. // IDM_ABOUTBOX 必须在系统命令范围内。

    8. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

    9. ASSERT(IDM_ABOUTBOX < 0xF000);

    10.  
    11. CMenu* pSysMenu = GetSystemMenu(FALSE);

    12. if (pSysMenu != NULL)

    13. {

    14. BOOL bNameValid;

    15. CString strAboutMenu;

    16. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

    17. ASSERT(bNameValid);

    18. if (!strAboutMenu.IsEmpty())

    19. {

    20. pSysMenu->AppendMenu(MF_SEPARATOR);

    21. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

    22. }

    23. }

    24.  
    25. // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动

    26. // 执行此操作

    27. SetIcon(m_hIcon, TRUE); // 设置大图标

    28. SetIcon(m_hIcon, FALSE); // 设置小图标

    29.  
    30. // TODO: 在此添加额外的初始化代码

    31.  
    32. CString strBmpPath = _T(".\\res\\Background.png");

    33.  
    34. CImage img;

    35.  
    36. img.Load(strBmpPath);

    37.  
    38. MoveWindow(0, 0, img.GetWidth(), img.GetHeight());

    39.  
    40. CBitmap bmpTmp;

    41.  
    42. bmpTmp.Attach(img.Detach());

    43.  
    44. m_bkBrush.CreatePatternBrush(&bmpTmp);

    45.  
    46. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE

    47. }

    现在我们看一下,在OnInitDialog中,我们都做了什么,首先,我们创建了一个CString变量strBmpPath,用它指向我们的图片文件,然后我们创建了一个CImage变量img,这个变量可以方便的加载各种格式的图像文件,所以我们使用它的目的是为了方便加载png格式的文件,MoveWindow的目的是为了调整我们的对话框客户区的大小,使客户区的大小与图片的大小一致,然后我们创建了一个CBitmap类型变量bmpTmp,使用它是因为CBrush的成员函数CreatePatternBrush的参数要求输入这种类型的参数,所以必须将img转换成CBitmap,转换的方法是bmpTmp.Attach(img.Detach()),img.Detach会释放图像的句柄,并且返回这个句柄,bmpTmp使用Attach绑定img返回的图像句柄,从而完成了对象类型的转换,最后调用CreatePatternBrush,这个函数的功能是使用传递给它的图像创建一个图像画刷,然后在OnCtlColor中,使用它填充对话框的背景,程序运行效果如下:

    现在虽然程序的客户区已经变成了对话框的背景,但是对话框原来的标题栏和背景图片的标题栏重复,看起来很别扭,通过设置对话框的Border属性可以消除原来的标题栏,设置如下:

    Border:None

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

    现在的对话框背景已经和我们设想的基本一致,还有一点小瑕疵,大家仔细观察对话框的底边,左下角和右下角有多于的像素,下面我们通过代码消除它。

    在OnInitDialog尾部追加如下代码:

     

     
    1. CRgn rgnTmp;

    2. RECT rc;

    3. GetClientRect(&rc);

    4. rgnTmp.CreateRoundRectRgn(rc.left + 3, rc.top + 3, rc.right - rc.left - 3, rc.bottom-rc.top -3, 6, 6);

    5. SetWindowRgn(rgnTmp, TRUE);

    通过以上的代码可以让对话框变成一个圆角矩形,这样就可以去掉边角的点,程序最终运行效果如下:

    现在这个对话框的背景已经完全符合我们的要求,但是它现在不能拖动,因为它的标题栏是假的,所以,我们最后一个目标就是让这个窗口可以拖动,如何才能让它移动呢?

    Windows只允许我们拖动对话框的标题栏,当我们的鼠标在对话框上拖动的时候,对话框会收到一个WM_NCHITTEST消息,默认的消息处理函数会判断当前的鼠标是否在对话框的标题栏,如果在就返回HTCAPTION标志,否则就返回其它标志,当返回HTCAPTION标志的情况下,系统就会允许对话框拖动,所以我们可以欺骗windows系统,让WM_NCHITTEST的响应函数永远返回HTCAPTION标志就可以了,为对话框添加WM_NCHITTEST响应函数,代码如下:

     

     
    1. LRESULT CMFCDialogUIDlg::OnNcHitTest(CPoint point)

    2. {

    3. // TODO: 在此添加消息处理程序代码和/或调用默认值

    4. LRESULT ret = CDialogEx::OnNcHitTest(point);

    5. return (ret == HTCLIENT) ? HTCAPTION : ret;

    6. }

    重新编译代码,现在的对话框背景已经美化完成,并且这个对话框可以拖动。

    展开全文
  • MFC对话框背景图片的设置1.插入一个Bitmap的资源图片,假设资源名称为:IDC_BITMAP1(一般默认的第一个BMP文件是它,接下来的为IDC_BITMAP2,以此类推) 2.在CXXXDialog::OnPaint()中实现:void CMyDialogDlg::...

    MFC对话框背景图片的设置

    1.插入一个Bitmap的资源图片,假设资源名称为:IDC_BITMAP1(一般默认的第一个BMP文件是它,接下来的为IDC_BITMAP2,以此类推)
    2.在CXXXDialog::OnPaint()中实现:

    void CMyDialogDlg::OnPaint()
    {
        if (IsIconic())
        {
            CPaintDC dc(this); // 用于绘制的设备上下文
    
            SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
            // 使图标在工作区矩形中居中
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;
    
            // 绘制图标
            dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
            //
            // 给窗体添加背景
            //
            CPaintDC dc(this);
            CRect rc;
            GetClientRect(&rc);
            CDC dcMem;
            dcMem.CreateCompatibleDC(&dc);
            CBitmap bmpBackground;
            bmpBackground.LoadBitmap(IDB_BITMAP1);
    
            BITMAP bitmap;
            bmpBackground.GetBitmap(&bitmap);
            CBitmap* pbmpPri = dcMem.SelectObject(&bmpBackground);
            dc.StretchBlt(0,0,rc.Width(), rc.Height(), &dcMem,0,0,bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
        }
    }
    展开全文
  • MFC对话框背景图片改变代码

    热门讨论 2012-07-24 09:53:26
    主要把自己添加资源设置为MFC对话框显示背景
  • MFC 对话框背景图片设置

    千次阅读 2013-11-14 16:43:20
    图片控件 在对话框中加入Picture控件,属性页中General->Type设为Bitmap,Image中选中相关联的图片资源号。 这样就编译运行,己经可以了。 图片控件覆盖了其他控件的处理方法: 由于Picture控件是后面放上去...
    用图片控件
      在对话框中加入Picture控件,属性页中General->Type设为Bitmap,Image中选中相关联的图片资源号。
      这样就编译运行,己经可以了。
      图片控件覆盖了其他控件的处理方法:
      由于Picture控件是后面放上去的。这样它会显示在最上层,所以有些控件看不到了。有两种方法可以解决:
      (1)、选中所有控件Ctrl+A,然后取消对图片控件的选择,将其它控件剪切Ctrl+X,再粘帖 Ctrl+C,编译运行或Ctrl+T看看,是不是可以了
      (2)、在.rc文件中找到此对话框的定义,此处以例子中的一对话框为例。(用记事本打开.rc文件)
        IDD_DLG_USE_STATIC DIALOGEX 0, 0, 266, 201
        STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE |WS_CAPTION | WS_SYSMENU
        EXSTYLE WS_EX_APPWINDOW
        CAPTION "DlgUseStatic"
        FONT 9, "宋体"
        BEGIN
         CONTROL    129,IDC_STATIC,"Static",SS_BITMAP,0,0,266,201
        PUSHBUTTON     "取消",IDCANCEL,210,23,50,14
         DEFPUSHBUTTON"确定",IDOK,210,7,50,14
         LTEXT       "这是个通过图片控件来实现Dialog背景的",IDC_STATIC,13,106,156,8
       PUSHBUTTON     "方法二>>",IDC_BUTTON1,215,104,50,14
       END
       在BEGIN至END中便是各个控件的定义和先后顺序,你可以随意调整它们的顺序,这样最先的,它将会显示在最底层(即可能被其它控件覆盖)。
    展开全文
  • 设置MFC对话框背景图片

    千次阅读 2011-08-01 16:43:05
    ... 先在资源里导入你的位图,分配好ID号;...//获取对话框信息 dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY); }
     
    
    来源:http://zhidao.baidu.com/question/172230752.html?an=0&si=4
    先在资源里导入你的位图,分配好ID号;
    在OnPaint()函数中:
    if (IsIconic())
       {……}
    else
    {
           //CDialog::OnPaint();把这个注释掉,不调用基类的OnPaint()
    
           CPaintDC dc(this);
    
           CDC memdc;
           memdc.CreateCompatibleDC(&dc);//创建兼容DC
    
           CBitmap bkg;
           bkg.LoadBitmap(这里写你导入位图的ID号);//载入位图
    
           BITMAP bkginfo;
           bkg.GetBitmap(&bkginfo);//获取位图信息
    
           memdc.SelectObject(&bkg);
    
           RECT rect;
           GetWindowRect(&rect);//获取对话框信息
    
           dc.StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&memdc,0,0,bkginfo.bmWidth,bkginfo.bmHeight,SRCCOPY);
     }
    展开全文
  • 很多人都想改变对话框背景图,其实很简单,只需要一个函数就可以了,不过还是有问题的,下面讲述。  只需要响应WM_ERASEBKGND消息,然后重载OnEraseBkgnd(CDC*pDC)这个函数就可以,首先我们要添加消息响应,由于...
  • 对话框上放了个picture控件,背景图占据了对话框所有的背景,创建动态按钮的时候怎么把按钮置顶??
  • mfc 对话框背景图片上static控件设置透明后,没有透明贴图直接透到到桌面,怎么解决?
  • MFC对话框背景

    2017-07-14 22:37:15
    MFC对话框 太单调太难看,所以加点背景图会好很多,这里给出加背景图的代码。
  • 文档提供了一种如何给MFC对话框添加背景图片的方法,希望对大家有帮助
  • windows C++ 开发的二次开发平台的对话框,没有OnPaint函数,只能通过WindowResize的回调函数,通过FindWindow的方式获取到HWND进行处理,自身的Dialog类也没有提供修改对话框背景图片的方法。 void TestCmd::...
  • 首先导入位图图片,注意必须是.bmp格式,因为这里我用的bmp格式的图片当的背景。当然你可以提前将普通图片转换为.bmp格式,然后再导入。这里的对话框会根据图片大小自动调整大小 第一步:在头文件中加入: CBrush ...
  • 基于Visual Stadio 2017 MFC 对话框背景导入问题第一种方法 (失真率较高)第二种方法 (该方法的失真率比上一种方法低) 本文仅作学习使用,欢迎各位大佬补充改正。因为MFC已经过于古老,网上关于MFC的部分使用的...
  • 1.1 MFC对话框背景设置

    2015-09-07 16:42:12
    1.1.修改背景颜色 在OnPaint()函数中else后括号内添加以下代码 CRect rect;   CPaintDC dc(this);   GetClientRect(rect);   dc.FillSolidRect(rect,RGB(66,132,217));
  • 1、准备你要的背景图片(Bitmap格式),Windows自带画图工具保存的时候可以选择24位位图,将位图拷贝到项目 res文件夹下 2、资源视图中右键 导入Bitmap,在res文件夹下导入bitmap,自动生成位图ID:IDB_BITMAP1 3...
  • MFC对话框加载图片资源作为背景

    千次阅读 2018-03-27 10:36:19
    原运行效果图:=================================我是分割线===============================... // 背景添加图片2. .cpp文件OnInitDialog()中,添加// 窗口背景图片 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP3);...
  • 1.之前在网上看到乱七八糟写给对话框添加背景图片的,然后实现对话框上的子控件透明的例子,很多都行不通,特意把具体实现写到博客上,给有需要的新手或者老手参考下。 VideoSetDlg.h class CVideoSetDlg : public...
  • MFC对话框图片处理

    2014-07-10 11:38:35
    主要在MFC对话框中设置背景颜色、以及动态加载图片 、音乐、窗体贴图等解决方案
  • 1.插入一个Bitmap的资源图片,假设资源名称为:IDC_BITMAP12.在CXXXDialog::OnPaint()中实现: void CMyDialogDlg::OnPaint(){ if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_...
  • 我建立了一个对话框,给对话框添加了位图作为背景色,我有一个静态文本的窗口用来放视频,所以我把它的背景色设置为了黑色,用的语句是![图片说明]...
  • MFC 对话框背景

    2010-05-01 14:45:00
    先载入你的图片到资源,然后loadbitmap 最后用 cbrush画出来。具体过程如下:首先定义 HBRUSH m_BkBrush;1,增加消息处理函数OnCtlColor2,构造函数中m_bitmap.LoadBitmap(IDB_BITMAP1); m_brush....
  • //IDB_Bg为刚刚载入的图片对应的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0, bitmap....
  • 首先添加格式为bmp的图片 1. 使用画刷CBrush [cpp] view plaincopy void CDlg::OnPaint()  {   CPaintDC dc(this);//用于画图的设备上下文     //加载背景位图   CBitmap ...
  • MFC对话框背景贴图

    2011-07-03 15:24:32
    来自:http://hi.baidu.com/superkdc/blog/item/19641aa0c37d2b83471064be.html 对话框背景贴图 【1】 定义一个CBitmap类m_B...
  • MFC对话框修改背景颜色:在CXXXDlg::OnInitDialog()中添加: ... 效果如下:MFC对话框添加背景图片:在CXXXDlg::OnInitDialog()中添加:CDialogEx::SetBackgroundImage(IDB_BITMAP1);效果如下: MFC控件与背景保持

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,921
精华内容 1,568
关键字:

mfc对话框背景图片