我从CWnd派生CShowWnd类。在基于对话框的工程CMyDlg中创建CShowWnd子窗口来显示动态数据。CShowWnd中成员m_pMemDC,m_pBitmap分别为消除闪烁的内存DC和位图。
代码如下:
BOOL CShowAudio01Dlg::OnInitDialog()
{...
m_ShowWnd.Create(NULL,NULL,WS_VISIBLE|WS_CHILD,rect,this,100);
m_ShowWnd.Init();
...
}
void CShowWnd::Init()
{...
CClientDC dc(this);
GetClientRect(&rect);
m_pMemDC->CreateCompatibleDC(&dc);
m_pBitmap->CreateCompatibleBitmap(&dc,m_nWidth,m_nHeight);
...
}
void CShowWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
CBitmap *pOldBit=m_pMemDC->SelectObject(m_pBitmap);
MyDraw(m_pMemDC);
dc.BitBlt(0,0,m_nWidth,m_nHeight,m_pMemDC,m_nWidth,m_nHeight,SRCCOPY);
m_pMemDC->SelectObject(pOldBit);
// Do not call CWnd::OnPaint() for painting messages
}
void CShowWnd::MyDraw(CDC *pDC)
{
为我的画图操作;
}
该程序在Win2k中运行正常,但在Win98下运行不正常(m_ShowWnd子窗口画屏)。
我发现是内存位图m_pBitmap为桌面的内容.难道CreateCompatibleBitmap(&dc,m_nWidth,m_nHeight)不是dc中的内容吗?在Win2k下是好的。
请大虾指点迷津,本人万分感激!
代码如下:
BOOL CShowAudio01Dlg::OnInitDialog()
{...
m_ShowWnd.Create(NULL,NULL,WS_VISIBLE|WS_CHILD,rect,this,100);
m_ShowWnd.Init();
...
}
void CShowWnd::Init()
{...
CClientDC dc(this);
GetClientRect(&rect);
m_pMemDC->CreateCompatibleDC(&dc);
m_pBitmap->CreateCompatibleBitmap(&dc,m_nWidth,m_nHeight);
...
}
void CShowWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
CBitmap *pOldBit=m_pMemDC->SelectObject(m_pBitmap);
MyDraw(m_pMemDC);
dc.BitBlt(0,0,m_nWidth,m_nHeight,m_pMemDC,m_nWidth,m_nHeight,SRCCOPY);
m_pMemDC->SelectObject(pOldBit);
// Do not call CWnd::OnPaint() for painting messages
}
void CShowWnd::MyDraw(CDC *pDC)
{
为我的画图操作;
}
该程序在Win2k中运行正常,但在Win98下运行不正常(m_ShowWnd子窗口画屏)。
我发现是内存位图m_pBitmap为桌面的内容.难道CreateCompatibleBitmap(&dc,m_nWidth,m_nHeight)不是dc中的内容吗?在Win2k下是好的。
请大虾指点迷津,本人万分感激!
解决方案 »
- 图像拼接
- SDK实现的WebBrowser,vc调用js显示本地图像问题
- 多线程传参问题
- 通过GetProcAddress函数动态调用dll中的函数,是否必须通过extern "C"声明导出函数?
- winpcap中PacketSetHwFilter()怎么设置才只抓与本机有关的包?
- 一个急需要 解决的问题
- ADO数据插入问题:如果插入的文本是空的会造成异常的出现。怎么解决呢?
- 一个CListCtrl的问题???
- 高分求助!!!如何在Windows2000用VC写中断程序?
- socket大文件传输问题
- 请问和HTTP代理服务器通讯的问题(100分)
- mindependency编译的DLL不能在VB下使用?
建议将编译的obj文件全部删除重新编译一下。
为桌面内容也不奇怪
建议将编译的obj文件全部删除重新编译一下。
我已试过了,所有obj文件包括exe文件都重新编译过。但没用。
FlyingSch(BoyWithWings)
把代码完整地贴出来,另外CreateCompatibleBitmap后m_pBitmap的内容是随机的,
为桌面内容也不奇怪
代码我已经贴出来了。
CShowWnd重载了Create,但在函数体内每加其他的代码。
重载了Timer
void CShowWnd::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
InvalidateWnd();
CWnd::OnTimer(nIDEvent);
}
自定义函数
void CShowWnd::InvalidateWnd()
只是改变显示图形的坐标,就InvalidateRect(rect,FALSE);
void CShowWnd::MyDraw(CDC *pDC,int nIdex)
{
if(m_bUpOrDown[nIdex]){
//判断动态图形变化的方向。
if(m_nPrevPos[nIdex]-1<m_nGreenPos)
pDC->SelectObject(m_pGreenBrush); //根据位置选不同颜色的刷子
else if(m_nPrevPos[nIdex]-1<m_nYellowPos)
pDC->SelectObject(m_pYellowBrush); //根据位置选不同颜色的刷子
else
pDC->SelectObject(m_pRedBrush); //根据位置选不同颜色的刷子
}
else{
pDC->SelectStockObject(BLACK_BRUSH); //黑刷子抹去前一时刻的图形
}
pDC->Rectangle(CRect(m_nX[nIdex],m_nY[nIdex],m_nX[nIdex]+m_nStepX,
m_nY[nIdex]+m_nStepY)); \\绘矩形
pDC->SelectStockObject(BLACK_BRUSH);\\释放选如pDC的刷子
}
OnPaint我早已贴出来了,只是上次贴的略去了参数nIdex;原代码如下
for(int i=0;i<PORT;i++) MyDraw(m_pMemDC,i);
CreateCompatibleBitmap后m_pBitmap的内容有时不是桌面内容,它是当前窗口的内容,如当前没有窗口,就为桌面。好象是在考屏(但内容不是很清楚),但我没有涉及到元文件设备啊。
同一机器,用Win2k和Win98启动是不一样的结果,CreateCompatibleBitmap在Win98下有什么不同吗?我以前在Win98下也用过CreateCompatibleBitmap,但没有问题啊。
你的m_p*Brush是怎样创建的?
class CShowWnd : public CWnd
{
...
public:
CDC *m_pMemDC;
CBitmap *m_pBitmap;
CBrush *m_pYellowBrush,*m_pBlueBrush,*m_pRedBrush;
...
}
以上为定义。
CShowWnd::CShowWnd()
{
m_pMemDC=new CDC;
m_pBitmap=new CBitmap;
m_pGreenBrush=new CBrush;
m_pGreenBrush->CreateSolidBrush(RGB(0x00,0xFF,0x00));
m_pYellowBrush=new CBrush;
m_pYellowBrush->CreateSolidBrush(RGB(0xFF,0xFF,0x00));
m_pRedBrush=new CBrush;
m_pRedBrush->CreateSolidBrush(RGB(0xFF,0x00,0x00));
}
我是这样创建的,应该和刷子没关系。是位图的原因。
to
dc.BitBlt(0,0,m_nWidth,m_nHeight,m_pMemDC,0,0,SRCCOPY)
Win2K和Win98的内存DC有什么不同吗?
Win2K和Win98的内存DC应该是相同的,会不会调用的动态库不同,你试一下静态链接看看.
另外stdafx.h中好象也有定义不版本的地方
change
void CShowWnd::Init()
{...
CClientDC dc(this);
GetClientRect(&rect);
m_pMemDC->CreateCompatibleDC(&dc);
m_pBitmap->CreateCompatibleBitmap(&dc,m_nWidth,m_nHeight);
...
}
tovoid CShowWnd::Init()
{...
CDC *pDC=GetDC();
GetClientRect(&rect);
m_pMemDC->CreateCompatibleDC(pDC);
m_pBitmap->CreateCompatibleBitmap(pDC,m_nWidth,m_nHeight);
...
ReleaseDC(pDC);
}