为什么不显示位图?(150分)

自由唐衡 2001-04-06 05:18:00
代码段如下:


class CHoverButton : public CButton
{
// Construction
public:
CHoverButton();
// Attributes
public:

// Operations
public:
void InitHoverButton(HWND hParentWnd, UINT nNormalBmpID, UINT nGetFocusBmpID);

private:
HWND m_hParentWnd;
CBitmap m_bmpNormal;
CBitmap m_bmpGetFocus;

BITMAP m_BitNormal;
BITMAP m_BitGetFocus;

CDC m_MemNormalDC;
CDC m_MemGetFocusDC;

CDC m_MemDC;


// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHoverButton)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL

// Implementation
public:
virtual ~CHoverButton();

// Generated message map functions
protected:
//{{AFX_MSG(CHoverButton)
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnSetFocus(CWnd* pOldWnd);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void OnPaint();
//}}AFX_MSG
afx_msg void OnMouseLeave(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
};





void CHoverButton::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class

CButton::PreSubclassWindow();
}

void CHoverButton::InitHoverButton(HWND hParentWnd, UINT nNormalBmpID, UINT nGetFocusBmpID,UINT nDepressBmpID,UINT nKillFocusBmpID)
{
CClientDC dc(this);

m_hParentWnd = hParentWnd;

m_bmpNormal.LoadBitmap(nNormalBmpID); //导入通常状态下的位图

m_bmpGetFocus.LoadBitmap(nGetFocusBmpID);
//导入获得焦点时的位图

m_bmpNormal.GetBitmap(&m_BitNormal);
m_bmpGetFocus.GetBitmap(&m_BitGetFocus);



}


void CHoverButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
RECT rect;
GetWindowRect(&rect);

rect.right = rect.left + m_BitNormal.bmWidth;
rect.bottom = rect.top + m_BitNormal.bmHeight;

MoveWindow(&rect);
m_MemNormalDC.CreateCompatibleDC(&dc);
m_MemGetFocusDC.CreateCompatibleDC(&dc);

m_MemDC.CreateCompatibleDC(&dc);
m_MemNormalDC.SelectObject(&m_bmpNormal);
m_MemGetFocusDC.SelectObject(&m_bmpGetFocus);

m_MemDC.SelectObject(&m_bmpNormal);
dc.BitBlt(0, 0, m_BitNormal.bmWidth, m_BitNormal.bmHeight, &m_MemDC, 0, 0, SRCCOPY);

//为什么,为什么?不能显示位图???属性我已经设置成:OwnerDraw拉
// Do not call CButton::OnPaint() for painting messages
}
...全文
4177 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
In355Hz 2001-04-07
  • 打赏
  • 举报
回复
把OwnerDraw属性去掉再试试。
Button的OwnerDraw属性是在Button需要重画时调用CButton::DrawItem函数绘制Button,不会调用到OnPaint的。
要不重载DrawItem函数也行。
ggyy 2001-04-06
  • 打赏
  • 举报
回复
care
zyoujie 2001-04-06
  • 打赏
  • 举报
回复
下面一篇文章也许对你有用:

如何在VC中改变控件的背景色

文/欧阳沐

提要:

  在VC编程中要改变控件(诸如CView, CFrameWnd, or CWnd等)的背景色可通过处理特定的消息来实现。但如果想改变按钮的颜色,就只能使用自绘制的按钮(也可以用位图按钮,此处未做说明)而不能通过OnCtlColor()改变。


正文:

  一、在一个MFC应用程序中,要改变控件的背景色可通过重载OnCtlColor()函数来实现。方法是在该函数中设置所需颜色后再返回一个画刷句柄便可重绘控件背景色。OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。常用的此类消息有:

CTLCOLOR_DLG 对话框

CTLCOLOR_EDIT 编辑框

CTLCOLOR_LISTBOX 列表框

CTLCOLOR_MSGBOX 消息框

CTLCOLOR_SCROLLBAR 滑动条

CTLCOLOR_STATIC 静态文本框、矩形等。


以下示例代码说明如何更改以上控件的背景色:

//CmyDialog.h定义

class CMyDialog : public Cdialog //派生自己的对话框类

{

……..

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CMyDialog)

afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);

…….

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};


//CmyDialog.cpp 定义

……

HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

switch (nCtlColor) {

case CTLCOLOR_EDIT:

case CTLCOLOR_MSGBOX:

case CTLCOLOR_DLG :

case CTLCOLOR_EDIT : //在此加入你想要改变背景色的控件消息

pDC->SetBkMode(TRANSPARENT);

HBRUSH B = CreateSolidBrush(COLOR); //COLOR是你想设置的颜色

return (HBRUSH) B;

default: //其他控件设置自己默认的颜色和背景刷.

return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

}}

说明:1、可分别处理以上消息以实现不同控件不同背景色。

2、此方法不适用于按纽控件。


二、通过定制来实现不同颜色按纽。

以下通过定制方形彩色按纽来说明:

第一步:派生出自己的按纽类。

//CcolorButton.h

class CColorButton : public CButton

{

DECLARE_DYNAMIC(CColorButton)

public:

CColorButton();

virtual ~CColorButton();


BOOL Attach(const UINT nID, CWnd* pParent,

const COLORREF BGColor = RGB(192, 123, 192), // 按纽的背景色

const COLORREF FGColor = RGB(1, 1, 1), // 文本颜色

);

protected:

virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); //重定义虚拟函数DrawItem

void DrawFrame(CDC *DC, CRect R); //绘制按纽框

void DrawFilledRect(CDC *DC, CRect R, COLORREF color); //填充按纽框

void DrawLine(CDC *DC, CRect EndPoints, COLORREF color);

void DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color);

void DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor);

//绘制按纽上的文本


COLORREF GetFGColor() { return m_fg; }

COLORREF GetBGColor() { return m_bg; }

private:

COLORREF m_fg, m_bg;

};

#endif


第二步:定义各函数

//CcolorButton.cpp

……

// CColorButton

IMPLEMENT_DYNAMIC(CColorButton, CButton)

CColorButton::CColorButton()

{ }

CColorButton::~CColorButton()

{

}


//定义Attach()函数

BOOL CColorButton::Attach(const UINT nID, CWnd* pParent, const COLORREF BGColor, const COLORREF FGColor)

{

if (!SubclassDlgItem(nID, pParent))

return FALSE;

m_fg = FGColor;

m_bg = BGColor;

return TRUE;

}


//重载DrawItem()

void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)

{

CDC* pDC = CDC::FromHandle(lpDIS->hDC);

UINT state = lpDIS->itemState;

CRect focusRect, btnRect;

focusRect.CopyRect(&lpDIS->rcItem); //按纽的选中虚线框

btnRect.CopyRect(&lpDIS->rcItem);


// 设置表示按纽被选中的虚线框

focusRect.left += 4;

focusRect.right -= 4;

focusRect.top += 4;

focusRect.bottom -= 4;


// 按纽标题

const int bufSize = 512;

TCHAR buffer[bufSize];

GetWindowText(buffer, bufSize);


// 绘制并标志按纽

DrawFilledRect(pDC, btnRect, GetBGColor());

DrawFrame(pDC, btnRect);

DrawButtonText(pDC, btnRect, buffer, GetFGColor());


// 如果按纽处于选中状态则在其上绘制选中虚线框

if (state & ODS_FOCUS) {

DrawFocusRect(lpDIS->hDC, (LPRECT)&focusRect);

}

}

void CColorButton::DrawFrame(CDC *DC, CRect R)

{ //绘制按纽,用户通过定制该函数可实现不同形状的按纽。

DrawLine(DC, R.left, R.top, R.right, R.top, RGB(255, 255, 255));

DrawLine(DC, R.left, R.top, R.left, R.bottom, RGB(255, 255, 255));

//以下绘制按纽的外围框线以使按纽有立体感

DrawLine(DC, R.left + 1, R.bottom - 1, R.right, R.bottom - 1, RGB(1, 1, 1));

//绘制按纽左框线和上框线

DrawLine(DC, R.right - 1, R.top + 1, R.right - 1, R.bottom, RGB(1, 1, 1));

//绘制按纽右框线和下框线

}

//用色彩填充按纽框

void CColorButton::DrawFilledRect(CDC *DC, CRect R, COLORREF color)

{

CBrush B;

B.CreateSolidBrush(color);

DC->FillRect(R, &B);

}

// DrawLine用于绘制按纽,其为多态函数

void CColorButton::DrawLine(CDC *DC, CRect EndPoints, COLORREF color)

{

……

}

void CColorButton::DrawLine(CDC *DC, long left, long top, long right, long bottom, COLORREF color)

{

……

}

//绘制按纽文本

void CColorButton::DrawButtonText(CDC *DC, CRect R, const char *Buf, COLORREF TextColor)

{

COLORREF prevColor = DC->SetTextColor(TextColor);

DC->SetBkMode(TRANSPARENT);

DC->DrawText(Buf, strlen(Buf), R, DT_CENTER|DT_VCENTER|DT_SINGLELINE);

DC->SetTextColor(prevColor);

}


第三步:引用定制类

定制任意对话框CColorDlg,在其上画一按键控件。ID为IDOK。

//CColorDlg.h

class CColorDlg : public CDialog

{

…..

// Implementation

protected:

CColorButton m_btnOK;

}


//CColorDlg.cpp

…….

BOOL CColorBtnSampleDlg::OnInitDialog()

{

CDialog::OnInitDialog();

…….

VERIFY(m_btnOK.Attach(IDOK, this, RED, BLUE, YELLOW));

…….

}

……

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧