问题如上,发到邮箱也行 [email protected] 谢谢咯~~我用的是 CFormView类 

解决方案 »

  1.   

    CPaintDC dc(this) ;
    this.BitBlt()
    DrawItem(LPDRAWSTRUCT lpDrawStruct)
      

  2.   

    呵呵,原理的楼上的说的差不多,我给你发了一个BUTTON例子,和对话框背景图片的原理,
    你自己改改就行了, ON_WM_ERASEBKGND()//背景色方法2,这个要加到消息影射中
      

  3.   

    在OninitDialog下   
      m_bitmapBkgnd.LoadBitmap(IDB_BITMAP_BACK);   
      GetClientRect(   &m_rRect   );   
      /////   
      BOOL   CLockTxtProDlg::OnEraseBkgnd(   CDC*   pDC   )   
      {   
              CDC   dc;   
              dc.CreateCompatibleDC(pDC);   
              CBitmap*   pOldBitmap   =   dc.SelectObject(&m_bitmapBkgnd);   
        
      pDC->BitBlt   (m_rRect.left,     
                                            m_rRect.top,     
                                            m_rRect.Width(),   
                                            m_rRect.Height(),   
                                            &dc,   
                                            0,   0,   SRCCOPY);   
        
      dc.SelectObject(pOldBitmap);   
        
      return   FALSE;   
      }   
        
      在离开时释放,如   
      OnClose()下。   
      m_bitmapBkgnd.DeleteObject();   
      

  4.   

    更改选项卡控件中选项卡的颜色十分简单,但要将属性表的颜色翻新则需要大量的工作,不下很大决心是做不到的。对于选项卡,基本思想是使控件成为所有者描述的控件,然后处理 WM_DRAWITEM。如果您使用 MFC,则可以重写虚函数 DrawItem。在 Microsoft Systems Journal1998 年 3 月发行的那一期中,我介绍了如何实现一个选项卡控件类 — CtabCtrlWithDisable,它支持禁用选项卡。作为禁用选项卡的一部分,当选项卡禁用时,CTabCtrlWithDisable 将选项卡的文本颜色变为浅灰色。本月,我从 CTabCtrlWithDisable 借用了一些代码,实现了一个新的类 — CcolorTablCtrl,它可以使您更改选项卡的颜色(请参见图 5)。要使用 CcolorTablCtrl,请在您的属性表中创建一个实例: class CMyPropSheet : public CPropertySheet {
    protected:
       CColorTabCtrl m_tabCtrl;
    };您必须在属性表的 OnInitDialog 处理程序中子类化选项卡控件(以便 MFC 可以使用它),然后将前景色和背景色设置成您喜欢的任何颜色: // in CMyPropSheet::OnInitDialog()
    HWND hWndTab = (HWND)SendMessage(PSM_GETTABCONTROL);
    m_tabCtrl.SubclassDlgItem(::GetDlgCtrlID(hWndTab), this);
    m_tabCtrl.SetColor(WHITE, RED);这里的 WHITE 和 RED 是标准的 COLORREF 值,即 RGB(255, 255, 255) 和 RGB(255,0,0)。一旦您实例化并初始化 CcolorTabCtrl,颜色选项卡控件就会完成剩下的工作(请参见图 6)。图 6 颜色选项卡控件CColorTabCtrl 重写了 SubclassDlgItem,它调用 ModifyStyle 来将风格更改为TCS_OWNERDRAWFIXED。进行重写的较好位置是在 PreSubclassWindow 中,因为不管控件是子类化还是通过 CreateWindow 创建都会调用这个函数(但由于杂志篇幅有限,我必须对代码进行压缩,因此我采用了这样的捷径)。注意,SubclassDlgItem 是一个简单的重写,而不是虚函数。为了设置颜色,SetColor 将颜色保存在两个成员变量 m_clrBackground 和 m_clrForeground 中。一旦风格设置为所有者描述的,每次需要 Windows? 绘制选项卡时,它都会发送 WM_DRAWITEM 消息。MFC 捕获这个消息并调用选项卡控件的虚函数 DrawItem,CColorTabCtrl 通过用新的颜色绘制文本来实现这个函数: // in CColorTabCtrl::DrawItem
    dc.FillSolidRect(rc, m_clrBackground);
    dc.SetBkColor(m_clrBackground);
    dc.SetTextColor(m_clrForeground);
    dc.DrawText(...);这些都非常简单,所以要了解具体实现请查看源代码。由于您可能不想只更改选项卡颜色而不更改页面颜色,所以我也实现了一个 CcolorPropertyPage,它可以让您将属性页的背景颜色改成匹配的颜色,如图 6 所示。对于属性表,更改背景颜色最简单的方式就是处理 WM_ERASEBKGND: BOOL CColorPropertyPage::OnEraseBkgnd(CDC* pDC)
    {
       CRect rc;
       GetClientRect(&rc);
       pDC->FillSolidRect(rc, m_clrBackground);
       return TRUE;
    }如果您自己试运行这段代码,您会发现有各种令人苦恼的问题。首先,如果您更改页面颜色,所有控件的背景色都会是错误的,所以还必须修正。对此,您必须处理 WM_CTLCOLOR 和 WM_ERASEBKGND。有关详细信息,可以参阅 1997 年 5 月一期中我的 MSJ 专栏。另一个问题是选项卡控件仍然使用系统 3D 颜色来绘制选项卡的边缘和圆角。唉!要修正这个问题,只能自己处理 WM_PAINT 并负责所有的绘图操作。包括画出选项卡在被选定时与其他选项卡的偏移,以便它以前景色显示。此时,您就要开始对选项卡控件进行一番彻底改造了。每个使用 Windows 的编程人员都知道,更改控件颜色无一例外都是很痛苦的事情,一旦您走上了这条路,要做的事情就似乎没有尽头了。相信很快标准颜色就会比它们原先的颜色漂亮许多,否则您会产生疑问,为什么不转为使用 .NET Framework,它要更改颜色只需简单地写成: ctl.BackColor = Color.Aquamarine;
      

  5.   

    如何给对话框添加背景画面:http://blog.csdn.net/scq2099yt/archive/2008/03/27/2223595.aspx1、把你的图包含到程序的“Bitmap资源”里,提示说该资源使用了大于256色的调色板,在VC里无法编辑等等,点确定就可以 
     
    2、定位到  void CXXXDlg::OnPaint(),在if()...else()中的else()下添加如下代码   
      else   
      {   
              //CDialog::OnPaint();//要禁止这个调用   
              CPaintDC   dc(this);   
              CRect   rect;   
              GetClientRect(&rect);   
              CDC   dcMem;   
              dcMem.CreateCompatibleDC(&dc);   
              CBitmap   bmpBackground;   
              bmpBackground.LoadBitmap(IDB_BITMAP);   
                      //IDB_BITMAP是你自己的图对应的ID   
              BITMAP   bitmap;   
              bmpBackground.GetBitmap(&bitmap);   
              CBitmap   *pbmpOld=dcMem.SelectObject(&bmpBackground);   
              dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,   
             bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);   
      }
      

  6.   

    BUTTON加背景位图,及背景颜色:http://blog.csdn.net/scq2099yt/archive/2008/03/28/2225220.aspx第一种:
    Button属性页里Style的Bitmap点上CBitmap Bitmap;
    Bitmap.LoadBitmap(IDB_BITMAP1);
    HBITMAP hBitmap=(HBITMAP)Bitmap.Detach();
    CButton *pButton=(CButton*)GetDlgItem(IDCANCEL);
    pButton->SetBitmap(hBitmap);感觉效果不是很好。因为图片不会自动拉伸。第二种:
    可以采用CButtonST控件,挺好用的,比MFC的那些封装好用。第三种:
    把button按钮属性设置为ower draw
    然后映射onDrawItem消息
    在ondraw函数内自己绘制就可以了
    void CUi6Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
    {
    if(nIDCtl == IDC_HELLO_CFAN)
    {
    //绘制按钮框架
    UINT uStyle = DFCS_BUTTONPUSH;
    //是否按下去了?
    if (lpDrawItemStruct->itemState & ODS_SELECTED)
    uStyle |= DFCS_PUSHED;
    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);
    dc.DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle);
    //输出文字
    dc.SelectObject(&m_Font);
    dc.SetTextColor(RGB(0, 0, 255));
    dc.SetBkMode(TRANSPARENT);
    CString sText;
    m_HelloCFan.GetWindowText(sText);
    dc.TextOut(lpDrawItemStruct->rcItem.left + 20, lpDrawItemStruct->rcItem.top + 20, sText);
    //是否得到焦点
    if(lpDrawItemStruct->itemState & ODS_FOCUS)
    {
    //画虚框
    CRect rtFocus = lpDrawItemStruct->rcItem;
    rtFocus.DeflateRect(3, 3);
    dc.DrawFocusRect(&rtFocus);
    }
    return;
    }
    CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
    }第四种:
     
    1,按钮属性 Onwer Drew选上,按钮ID: IDC_BUTTON1
    2,定义private变量:
    CBitmapButton m_button;
    3,在初始化里边
    m_button.LoadBitmaps(IDB_BITMAP1, IDB_BITMAP2);//IDB_BITMAP1:平时;IDB_BITMAP2:按下
    m_button.SubclassDlgItem(IDC_BUTTON1, this);
    m_button.SizeToContent(); 
     
      

  7.   

    对于这个问题,其实可以由几种不同的方法来实现,具体如下:
        方法一:调用CWinApp类的成员函数SetDialogBkColor来实现。
                    其中函数的第一个参数指定了背景颜色,第二个参数指定了文本颜色。下面的例子是将应用程序对话框设置为蓝色背景和红色文本,步骤如下:
          ① 新建一个基于Dialog的MFC AppWizard应用程序ExampleDlg。
          ② 在CExampleDlgApp ::InitInstance()中添加如下代码: BOOL CExampleDlgApp: : InitInstance ( );
                                                                                      CExampleDlgDlg dlg;
                                                                                      m_pMainWnd = &dlg;
             先于DoModal()调用,将对话框设置为蓝色背景、红色文本
                     SetDialogBkColor(RGB(0,0,255),RGB(255,0,0));
                     int nResponse = dlg.DoModal();
             编译并运行,此时对话框的背景色和文本色已发生了改变。值得注意的是:在调用DoModal()之前必须先调用SetDialogBkColor,且此方法是将改变应用程序中所有的对话框颜色,并不能针对某一个指定的对话框。
     
         方法二:重载OnPaint(),即WM_PAINT消息。有关代码如下(以上例工程为准): void CExampleDlgDlg::OnPaint() ;
                                                                                                                        if (IsIconic()...else...;
                                                                                                                        CRect rect;
                                                                                                                        CPaintDC dc(this);
                                                                                                                        GetClientRect(rect);
                                                                                                                        dc.FillSolidRect(rect,RGB(0,255,0)); //设置为绿色背景
                                                                                                                        CDialog::OnPaint();
         方法三:重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):
               ① 在CExampleDlgDlg的头文件中,添加一CBrush的成员变量: class CExampleDlgDlg : public CDialog;
                                                                                                   protected:CBrush m_brush;
               ② 在OnInitDialog()函数中添加如下代码: BOOL CExampleDlgDlg::OnInitDialog();
                                                                        m_brush.CreateSolidBrush(RGB(0, 255, 0)); // 生成一绿色刷子
               ③ 利用ClassWizard重载OnCtlColor(…),即WM_CTLCOLOR消息:
                       HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) ;
                            /*** 这里不必编写任何代码!**下行代码要注释掉*/
                       /* HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);*/
                       return m_brush; //返加绿色刷子
          方法四:还是重载OnCtlColor (CDC* pDC, CWnd* pWnd, UINT nCtlColor),即WM_CTLCOLOR消息。具体步骤如下(以上例工程为准):
                步骤①、②同上方法三中的步骤①、②。
                步骤③  利用ClassWizard重载OnCtlColor(…)(即WM_CTLCOLOR消息)时则有些不同:
                              HBRUSH CExampleDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
                              HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
                                 //在这加一条是否为对话框的判断语句
                              if(nCtlColor ==CTLCOLOR_DLG)    return m_brush;
                              return hbr;//返加绿色刷子
                  编译并运行即可。
         关于如何改变对话框背景颜色的问题,可能还有很多种不同方法可以实现,笔者在这仅举出四种常见的方法。其中方法三的编程似乎有点不太规范,方法四则要比方法三正统些,笔者这样的对比举例是为了拓宽VC编程爱好者特别是初学者的编程思路,读者可以根据实际情况选用其中的一种。