双缓冲显示问题(高分!)(急求!)

RedHat_net 2008-11-14 10:46:37
SIZE n_size;
GetTextExtentExPoint(hDC,_T("中"),_tcslen(_T("中")),NULL,NULL,NULL,&n_size);
n_hight = 11*n_size.cy;
MoveRect.top = 0;
MoveRect.left = 0;
MoveRect.right = 300;
MoveRect.bottom = 300;


nDC = CreateCompatibleDC(hDC);
n_map = CreateCompatibleBitmap(nDC, 300, 300);

SelectObject(nDC,&n_map);

::FillRect(nDC,&MoveRect,hbrush);

if(!g_nTimeGet->allData[DataNum].nameData.empty())
{
for(int i = 0; i<= DataNum; i++)
{

DrawText(nDC, (LPCTSTR)g_nTimeGet->UTF8ToUnicode(g_nTimeGet->allData[i].nameData).c_str(), -1, &MoveRect, DT_LEFT);

switch(g_nTimeGet->allData[i].colorType)
{
case 1:
SetTextColor(hDC, RGB(255,0,0));
break;
case 2:
SetTextColor(hDC, RGB(0,255,0));
break;
default:
break;
}
MoveRect.left = 92;
DrawText(nDC, (LPCTSTR)g_nTimeGet->UTF8ToUnicode(g_nTimeGet->allData[i].newData).c_str(), -1, &MoveRect, DT_LEFT);

MoveRect.left += 60;
wsprintf(szTextBuffer, TEXT("%s%\r\n%"), (LPCTSTR)g_nTimeGet->UTF8ToUnicode(g_nTimeGet->allData[i].changeData).c_str());
DrawText(nDC, szTextBuffer, -1, &MoveRect, DT_LEFT);


}

BitBlt(hDC, 60, 30, 300 , 300, nDC, 0, 0, SRCCOPY);
DeleteDC(nDC);
}
上面代码是我实现往屏幕上显示文字的,虽然已经画到屏幕上,可不知道为什么,只是一个点而已啊!!不知道错在哪了,改了很多次,都没行!!
希望高手指点,给高分!
...全文
245 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
RedHat_net 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 whoo 的回复:]
往上看,16楼。
[/Quote]

我改过来了!!还是一样效果啊!!!没有变化!!

我是在windows mobile系统 PPC的桌面的今日插件上实现这个功能!!本来是要实现滚动显示的,可现在连双缓冲显示都显示不出来啊!!挺着急啊!!
RedHat_net 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 biaozai06 的回复:]
引用 6 楼 lwx300 的回复:
nDC = CreateCompatibleDC(hDC);
n_map = CreateCompatibleBitmap(hDC, 300, 300); //hDC不是nDC。




经过测试,
nDC = CreateCompatibleDC(hDC);
n_map = CreateCompatibleBitmap(nDC, 300, 300);
也是可以的

个人愚见LZ的代码双缓冲部分没错,可能在显示文字时出错,尤其要注意几处DrawText
[/Quote]

我最开始的时候是用的nDC啊,和用hDC一样的效果啊,我知道,这个是在内存DC中创建一个画布,但我现在已经把字画到上面了!显示的只是一个点(背景是蓝色,显示点是红色,字体我选用的是红色);
按照你说的,如果是DrawText这个地方出了问题,那么字怎么能画上去呢??
如果是区域的问题,那么我从新看了一下程序,不应该有问题啊!!
我挺困惑啊!!
biaozai06 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lwx300 的回复:]
nDC = CreateCompatibleDC(hDC);
n_map = CreateCompatibleBitmap(hDC, 300, 300); //hDC不是nDC。


[/Quote]

经过测试,
nDC = CreateCompatibleDC(hDC);
n_map = CreateCompatibleBitmap(nDC, 300, 300);
也是可以的

个人愚见LZ的代码双缓冲部分没错,可能在显示文字时出错,尤其要注意几处DrawText
cnzdgs 2008-11-14
  • 打赏
  • 举报
回复
n_map = CreateCompatibleBitmap(nDC, 300, 300);
nDC改成hDC。
另外,SelectObject时要保留其返回值,在最后再调用SelectObject选中前面的返回值,然后再DeleteObject。
lwx300 2008-11-14
  • 打赏
  • 举报
回复
nDC = CreateCompatibleDC(hDC);
n_map = CreateCompatibleBitmap(hDC, 300, 300); //hDC不是nDC。

RedHat_net 2008-11-14
  • 打赏
  • 举报
回复
你这个例子和我的代码,双缓冲部分有什么区别吗?我觉得我也是你这么写的啊,而且区域我都是固定的!!为什么就显示一个点呢?
cabinriver 2008-11-14
  • 打赏
  • 举报
回复

void CRandomView::OnInitialUpdate()
{
CView::OnInitialUpdate();

InitialDBB();
}


//初始化内存缓冲区
void CRandomView::InitialDBB()
{
CRect rect;
GetClientRect(&rect);

if (!m_memDC.CreateCompatibleDC(NULL))
{
::PostQuitMessage(0);
}

m_memBmp.CreateCompatibleBitmap(&m_memDC, rect.Width(), rect.Height());

::SelectObject(m_memDC.GetSafeHdc(), m_memBmp);
}

//绘制点
void CRandomView::DrawCircle()
{
CDC* pDCView = this->GetDC();

CRect rect;
GetClientRect(&rect);

m_memDC.FillSolidRect(&rect, RGB(255, 255, 0));

m_memDC.TextOut(100,100,_T("123456"));

pDCView->BitBlt(0,0,rect.Width(), rect.Height(), &m_memDC, 0,0, SRCCOPY);

this->ReleaseDC(pDCView);
}

cabinriver 2008-11-14
  • 打赏
  • 举报
回复
给你一个双缓冲的小例子吧
RedHat_net 2008-11-14
  • 打赏
  • 举报
回复
为什么地方有问题啊,麻烦指出一下,我字都画到屏幕上了,可以通过文字的颜色知道,但就显示了一个点,不知道为什么啊,我把变化的区间都改成了固定的,可显示还是点,没有变化啊!
cabinriver 2008-11-14
  • 打赏
  • 举报
回复
貌似双缓冲有问题....
whoo 2008-11-14
  • 打赏
  • 举报
回复
往上看,16楼。
biaozai06 2008-11-14
  • 打赏
  • 举报
回复
“桌面大小应该是240*40”,LZ是在WINCE下做的?
RedHat_net 2008-11-14
  • 打赏
  • 举报
回复
我觉得以前用双缓冲显示图片也没这么费劲啊,就安装屏幕DC创建个内存DC,然后创建个位图,一导入就可以了!!

可现在显示文字怎么就这么费劲了呢??

大家还得多帮帮我啊!!!有兴趣的加我Q14645094(请注明 双缓冲),这个周末怎么也得搞定啊,我可怕挨经理说啊!!
xiaoxiao555 2008-11-14
  • 打赏
  • 举报
回复
up
RedHat_net 2008-11-14
  • 打赏
  • 举报
回复
我把DrawText变成一行代码

DrawText(nDC,_T("123123123"),-1, &MoveRect, DT_LEFT);

结果就是没也不显示了!
hDC = BeginPaint(hwnd, &ps);

SIZE n_size;
GetTextExtentExPoint(hDC,_T("中"),_tcslen(_T("中")),NULL,NULL,NULL,&n_size);
n_hight = 11*n_size.cy;
MoveRect.top = 0;
MoveRect.left = 0;
MoveRect.right = 300;
MoveRect.bottom = 300;

nDC = CreateCompatibleDC(mDC);
n_map = CreateCompatibleBitmap(nDC, 300, 300);

SelectObject(nDC,n_map);
DrawText(nDC, _T("123123123"), -1, &MoveRect, DT_LEFT);
BitBlt(hDC, 60, 30, 300 , 300, nDC, 0, 0, SRCCOPY);
这样写完后,运行结果是什么都不显示了,对了,另外说一句,我桌面大小应该是240*40这么大啊,但我估计不应该有影响啊!!因为我BITBLT下面起始坐标是在这个范围内的
whoo 2008-11-14
  • 打赏
  • 举报
回复
SelectObject 参数错误。

应该是SelectObject(nDC, n_map);

而不是 &n_map.

[Quote]
nDC = CreateCompatibleDC(hDC);
n_map = CreateCompatibleBitmap(nDC, 300, 300);

SelectObject(nDC,&n_map);
[/Quote]
cabinriver 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 RedHat_net 的回复:]
CreateCompatibleBitmap
函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。
函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
参数:
hdc: 设备环境句柄。
nWidth:指定位图的宽度,单位为像素。
nHeight:指定位图的高度,单位为像素。
后面的两个参数是指定创建位图的大小!!这个我设成300,应该可以看到啊!!

DrawText中真的有内容,因为没有内容的话,因为我在里面显示…
[/Quote]

先不要显示那么复杂的;
先显示些简单的测试一下,那看看是显示的问题,还是其它的问题;
然后再由简单到复杂
RedHat_net 2008-11-14
  • 打赏
  • 举报
回复
CreateCompatibleBitmap
  函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。
  函数原型:HBITMAP CreateCompatibleBitmap(HDC hdc,int nWidth,int nHeight);
  参数:
  hdc: 设备环境句柄。
  nWidth:指定位图的宽度,单位为像素。
  nHeight:指定位图的高度,单位为像素。
后面的两个参数是指定创建位图的大小!!这个我设成300,应该可以看到啊!!

DrawText中真的有内容,因为没有内容的话,因为我在里面显示的数据,比如数据大于100,我用红色显示,小于100,我用黄色显示,数据是每5秒钟变一次的,结果显示在区域内的那个点的颜色也是变化的!!我试过将BitBlt(hDC, 60, 30, 300 , 300, nDC, 0, 0, SRCCOPY); 这句去掉,这样在区域内就没有了那个点,这说明,我要写的字已经画在了内存DC上了,可现在就是显示区域的问题啊!!

scq2099yt 2008-11-14
  • 打赏
  • 举报
回复
DrawText中的字符串是否真的有内容?
dreamcs 2008-11-14
  • 打赏
  • 举报
回复
nDC = CreateCompatibleDC(hDC);
n_map = CreateCompatibleBitmap(nDC, 300, 300);

这样写,你创建的位图只有一个像素的大小,这是API默认的。可以调整位图的大小,但我记不清了。
你可以看看《windows程序设计》位图操作的章节。
你可以将SelectObject(nDC,&n_map); 注释起来试试。

加载更多回复(2)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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