最近写了个可以让文字左右滚动的CStatic类,出了点小问题!源代码如下:
BOOL CSkinStatic::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CSkinStatic::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc); memDC.SelectObject(hbmp);
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(m_NowPos, 50, "hello baby");
dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
}
void CSkinStatic::OnTimer(UINT nIDEvent)
{
m_NowPos++;
Invalidate();
CStatic::OnTimer(nIDEvent);
}
void CSkinStatic::Start()
{
SetTimer(1, 50, NULL);
HBITMAP hbmp;
hbmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(), "hello.bmp",IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
}
在这个类中我把HBITMAP hbmp定义成成员函数,而在start()中加载位图资源LoadImage(),在Onpaint()中调用hbmp,但是运行程序时在“hello baby”移动过的地方留下黑色的残影(文字是黑色的)!但是如果我将hbmp定义、加载位图函数搬到Onpaint()中的话,残影就消失了!!!
void CSkinStatic::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
HBITMAP hbmp;
hbmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(), "hello.bmp",IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
memDC.SelectObject(hbmp);
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(m_NowPos, 50, "hello baby");
dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
}到底hbmp定义为成员变量和定义为局部变量有什么区别??请高手解答!!!
BOOL CSkinStatic::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
void CSkinStatic::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc); memDC.SelectObject(hbmp);
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(m_NowPos, 50, "hello baby");
dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
}
void CSkinStatic::OnTimer(UINT nIDEvent)
{
m_NowPos++;
Invalidate();
CStatic::OnTimer(nIDEvent);
}
void CSkinStatic::Start()
{
SetTimer(1, 50, NULL);
HBITMAP hbmp;
hbmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(), "hello.bmp",IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
}
在这个类中我把HBITMAP hbmp定义成成员函数,而在start()中加载位图资源LoadImage(),在Onpaint()中调用hbmp,但是运行程序时在“hello baby”移动过的地方留下黑色的残影(文字是黑色的)!但是如果我将hbmp定义、加载位图函数搬到Onpaint()中的话,残影就消失了!!!
void CSkinStatic::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
memDC.CreateCompatibleDC(&dc);
HBITMAP hbmp;
hbmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(), "hello.bmp",IMAGE_BITMAP,0,0,
LR_LOADFROMFILE|LR_CREATEDIBSECTION);
memDC.SelectObject(hbmp);
memDC.SetBkMode(TRANSPARENT);
memDC.TextOut(m_NowPos, 50, "hello baby");
dc.BitBlt(0, 0, 100, 100, &memDC, 0, 0, SRCCOPY);
}到底hbmp定义为成员变量和定义为局部变量有什么区别??请高手解答!!!
解决方案 »
- VC 如何实现百度输入时,下拉字符匹配的提示功能
- 线程优先级问题
- VC CSocket如何去除接受到的数据中的换行字符
- 求一个设计问题,关于数据返回的问题。
- 请问怎么知道当前的程序是否已经有一个实例在运行
- 怎么回事?我用GetLogicalDriveStrings()函数却只能得到“A:\”?
- 自定义对象CMyButton的调用
- 一个在vc6.0中实现串行通信的问题,求救!
- 如何将分割窗口中控件的滚动条禁止掉??
- 一失足成千古恨!
- 在Socket连接不上远程服务器时为什么在超时时间已到时还无响应?是否是程序有问题,请各位帮忙看看……
- 请问大哥:函数SwitchtoThread(void),,是在那个头文件阿?
memDC.SelectObject(hbmp);
随后memDC.TextOut是写在hbmp上的。你的hbmp就被修改了。
当你把hbmp定义为成员变量,那么hbmp只LoadImage一次。
所以就会出现黑色的残留影像(这应该是没有擦除的文字)
如果你把 hbmp定义为局部变量,每次都LoadImage,hbmp的修改就不会被保存下来。
所以就没有残留影像。
这里关键有两点:
1 SelectObject之后对memDC的绘画是对hbmp进行的
2 局部变量和成员变量本身没有什么太大意义,关键是你的LoadImage的时机。
另外,注意你用完hbmp之后要DeleteObject(hbmp),防止资源泄漏不好意思,好像说得不太清楚
我的意思是说:hbmp还是要定义为成员变量,只加载一次位图资源,如果每次刷新都加载一次位图资源,我怕会影响重画的效率!!!!!
void CSkinStatic::OnPaint()
{
CPaintDC dc(this);
CDC memDC,memDC2;
memDC.CreateCompatibleDC(&dc);
memDC2.CreateCompatibleDC(&dc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&memDC2); memDC.SelectObject(hbmp);
memDC2.BitBlt(0,0,100,100,&memDC,0,0,SRCCOPY);
memDC2.SetBkMode(TRANSPARENT);
memDC2.TextOut(m_NowPos, 50, "hello baby");
dc.BitBlt(0, 0, 100, 100, &memDC2, 0, 0, SRCCOPY);
}
静态控件背景一片空白!!
程序没有把memDC复制到memDC2中去!!!
memDC2.SelectObject(&bmp);
另外,CreateCompatibleBitmap要加上宽度和高度参数