mfc对话框程序如何添加背景图片以及使控件背景图片与对话框一致

本文介绍了如何在MFC对话框程序中添加背景图片,并确保控件背景与对话框一致。关键步骤包括:1)导入适合大小的BMP图片作为背景;2)在OnPaint()函数中实现背景拉伸;3)通过WM_CTRLCOLOR消息响应函数设置控件透明;4)对于ListCtrl控件,设置Owner Draw Fixed属性并子类化以自定义背景。
摘要由CSDN通过智能技术生成

首先,你需要一张适合自己对话框程序大小的bmp图片作为背景(这点很重要,否则就会有拉伸的现象),将这幅位图导入到工程中,命名为IDB_BACKGROUD。

1.在CtestDlg的OnPaint()函数中的else部分添加以下代码:

else
 {
        CPaintDC dc(this);
        CRect rc;
        GetClientRect(&rc);
        CDC dcMem;
        dcMem.CreateCompatibleDC(&dc);
        CBitmap bmpBackground;
        bmpBackground.LoadBitmap(IDB_BACKGROUD);

        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);
        CDialogEx::OnPaint();
 }

2.在CtestDlg中添加WM_CTRLCOLOR消息响应函数OnCtrlcolor()

在响应函数中添加以下代码:

if ((nCtlColor == CTLCOLOR_EDIT) && (pWnd-> GetDlgCtrlID() == IDC_EDIT_CMDDISPLAY)) //这里是仅改变编辑框的属性为透明
    {
        pDC->SetBkMode(TRANSPARENT); //设置背景透明
        pDC->SetTextColor(RGB(0,0,0)); //改变字体的颜色
        return   HBRUSH(GetStockObject(HOLLOW_BRUSH));
 }

这里是仅改变编辑框的属性为透明,这里只对以下几种控件有效:

  • CTLCOLOR_BTN   Button control
  • CTLCOLOR_DLG   Dialog box
  • CTLCOLOR_EDIT   Edit control
  • CTLCOLOR_LISTBOX   List-box control
  • CTLCOLOR_MSGBOX   Message box
  • CTLCOLOR_SCROLLBAR   Scroll-bar control
  • CTLCOLOR_STATIC   Static control

3.对于listctrl控件要改变自身背景,需要先设置listctrl控件的Owner Draw Fixed 的属性为true.指定所有者绘制.

然后子类化listctral控件为CListCtrlEx:

该类的定义如下:

class CListCtrlEx : public CListCtrl
{
// Construction
public:
    CListCtrlEx();

public:

    CPalette m_pal;//调色板
    CBitmap m_bitmap;//背景位图
    int m_cxBitmap, m_cyBitmap;//背景位图高度,宽度信息
    int m_nHighlight;//高亮方式

    BOOL SetBkImage(LPCTSTR lpszResourceName);//设置背景图片
    BOOL SetBkImage(UINT nIDResource);
    int GetColumnCount();//获取列数目
    void AdjustColumnWidth();//调整列宽

// Operations
public:

// Overrides
    // ClassWizard generated virtual function overrides
    //{ {AFX_VIRTUAL(CListCtrlEx)
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CListCtrlEx();

    // Generated message map functions
protected:
    //{ {AFX_MSG(CListCtrlEx)
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);//水平滚动
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);//垂直滚动
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);//擦除背景
    afx_msg void OnPaletteChanged(CWnd* pFocusWnd);//调色板更改
    afx_msg BOOL OnQueryNewPalette();//查询新调色板
    afx_msg BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
    //}}AFX_MSG
     virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);//画每一行
    DECLARE_MESSAGE_MAP()
};

该类的声明如下:

CListCtrlEx::CListCtrlEx()
{
   m_nHighlight=0;
}

CListCtrlEx::~CListCtrlEx()
{
}


BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值