为什么不显示位图?(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
}
...全文
4173 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));

…….

}

……

1,bmp_in.zip
在多文档客户区中增加位图底图演示程序(59KB)
2,bmp_in2.zip
在多文档客户区中增加位图底图(27KB)
3,bitmap_ocx.zip
一个自适应大小的位图控件(3KB)
4,bitmap_ocx2.zip
一个自适应大小的位图控件演示程序(21KB)
5,dashline.zip
一个简单的虚线类(46KB)
6,rotatedc2.zip
旋转你的图形-高级内存设备描述表演示程序(49KB)
7,rotatedc.zip
旋转你的图形-高级内存设备描述表(21KB)
8,jtdraw.zip
JTDraw -- 一个绘画的例子(165KB)
9,autofont.zip
自动字体处理类(3KB)
10,colorapp.zip
CColor - 在一个类中包括了RGB和HLS设定可执行程序(10KB)
11,colorapp2.zip
CColor - 在一个类中包括了RGB和HLS设定(20KB)
12,jpeg.zip
操作JPEG的库和源程序(390KB)
13,dibimage.zip
这个例子功能强大,能够以多种方式处理位图文件,强烈推荐 COOL(112KB)
14,ssbase.zip
屏幕保护程序基类(27KB)
15,quiz_scr.zip
简单的屏幕保护程序(32KB)
16,gpslib.zip
在你的应用程序中添加对GPS(全球定位系统)的支持,提供的DLL可被其它开发软件所利用(83KB)
17,throw.zip
平抛运动演示程序(40.8k VC 作者:添翼虎)(41KB)
18,dodib.zip
处理位图的例子(112KB)
19,ampuisrc.zip
类似于WinAMP的图形界面(50KB)
20,Gray.zip
一个基于DirectX的图象灰度处理示例,可是MMX的新作了(57KB)
21,Screen.zip
一个基于DirectX的截图示例,又是MMX的新作^o^,你看懂了话都能截图了(14KB)
22,opengl1.zip
OpenGL三维图形程序设计(539kb)
23,wingrap.zip
Windows图形编程(189kb)
24,Graphics.zip
VC图形编程的一个简单工程<1450kb>
25,DIBShow.zip
设备无关位图的一个里例子<1830kb>
26,Clock.zip
一个数字时钟的图形的工程<1450kb>
27,PAINTOBJ.zip
一个类似于画图的小程序<1450kb>
28,detect.zip
用差影法检测图象(25KB)
29,maslog.zip
综合录井图(418KB)
30,mfdraw.zip
多功能绘图(175KB)
31,mftab.zip
自由表格(63KB)
32,cimage.zip
一套图像处理程序,支持JPEG、GIF和PNG三种格式(892KB)
33,thinkr30.zip
简单的电子表格程序(141KB)
34,aseasy5.zip
另一个电子表格程序(319KB)
35,free.zip
一个电子表格程序,它能从脚本中处理数据(17KB)
36,iedit32.zip
在DOS中创建或编辑WINDOWS的图标(69KB)
37,giflt150.zip
保持GIF的可视面但减小它的大小25%(50KB)
38,gds31f.zip
观看,替换和转换 GIF/JPG/PCX/TIF/IFF/LBM/DL/ HAM/BMP/RLE/TGA/MAC/WPG/CUT/ANSI/TXT/IMG/ PBM/CUT/GL/FLI/MPG, 显示极小的图象(370KB)
39,fview10.zip
观看JPEG/GIF/TARGA 文件(72KB)
40,dta22b2.zip
从TGA文件创建FLI/FLC动画(254KB)
41,dfe-104.zip
显示字体编辑器能为EGA和VGA显示器创建新字体(219KB)
42,cmorph21.zip
create morphed images with TGA/IMG/BMP/GIF/IPI/PCX files(630KB)
43,bmp2ico.zip
转换BMP文件到WINDOWS 3.X的ICO文件(22KB)
44,alch151.zip
图形转换器(359KB)
45,aaplay10.zip
Autodesk Animator's FLI player(53KB)
46,a2r103.zip
转换ANSI 屏幕到RIP格式(17KB)
47,show204.zip
GIF/PCX/JPEG 观察器(252KB)
48,bmp.zip
操纵位图的开发包(78KB)
49,draw_in.zip
在状态条里显现图(29KB)
50,cimageb.zip
读写jpg,dib文件的类。(267KB)
51,RGNC.zip
想制做超cool图形界面吗用它吧。(18KB)
52,CISBitmap.zip
这个从Cbitmap派生的位图类使你可以通过指定一种颜色把一幅位图变透明,而它的使用差不多同Cbitamp一样简单。(2KB)
53,Cdib.zip
这个类库可以实现设备无关位图的创建,显示,读入,保存,捕捉位图(6KB)
54,geotrans.zip
行程编码,JPEG压缩编码(基本系统)(32KB)
55,smooth.zip
图象的检测,模板匹配算法代码(24KB)
56,dither.zip
图象的边沿检测与提取,轮廓跟踪算法代码(24KB)
57,colorrope.zip
腐蚀,膨胀,细化算法代码(31KB)
58,morph.zip
直方图修正和彩色变换算法代码(17KB)
59,edge.zip
实现图案化和抖动技术以及bmp2txt源代码(34KB)
60,compress.zip
图象的几何变换算法(128KB)
61,tga2gif.zip
TGA文件转换为GIF文件。(14KB)
62,tooltip.zip
可以多行显示的提示条(32KB)
63,yearmonth.zip
选择年/月的控制(39KB)
64,calen32a.zip
提供日历功能的动态库, 含有演示代码(79KB)
65,mappin.zip
你可以在你的GIS(地图信息系统)中使用这些源程序,因为它演示了在地图上的图钉效果,运行这个程序你可以在View中移动一些图标(286KB)
66,storage.zip
文件存储和流化的一些类(10KB)
67,Redraw.zip
克服控制闪烁问题(1KB)

16,551

社区成员

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

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

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