我在做一个图形实时显示的程序,对话框编程!
由于事先并不知道数据有多少,绘完后,前面绘的图形可能在控件外而丢失
因此想加一个Scroll控件,拖动它可以查看前面的图形!
我现在的想法是:利用内存DC建立一个较大的CBitmap
将所有曲线绘在CBitmap上,然后根据滑块位置,选择Bitmap的位置,BltBit到dc上
注意下,使用的是对话框编程,不是单文档,不能用CScrollView;
这个想法能实现吗?不能的话有其它的实现方法吗? CDC m_MemDCMask;
CBitmap m_BitmapMask;
m_MemDCMask.CreateCompatibleDC(GetDC());//创建内存dc
m_BitmapMask.CreateCompatibleBitmap(&m_MemDCMask,100,100);
m_MemDCMask.SelectObject(&m_BitmapMask); 程序能编译通过,但一运行就Error
好像是传给CreateCompatibleDC()的pDC的问题
CPaintDC dc(this);
m_MemDCMask.CreateCompatibleDC(&dc);也不行
改了其它很多方法,用NULL就可以
但好像此时只能画黑白图
郁闷了好几天了,求高手解答啊!!
由于事先并不知道数据有多少,绘完后,前面绘的图形可能在控件外而丢失
因此想加一个Scroll控件,拖动它可以查看前面的图形!
我现在的想法是:利用内存DC建立一个较大的CBitmap
将所有曲线绘在CBitmap上,然后根据滑块位置,选择Bitmap的位置,BltBit到dc上
注意下,使用的是对话框编程,不是单文档,不能用CScrollView;
这个想法能实现吗?不能的话有其它的实现方法吗? CDC m_MemDCMask;
CBitmap m_BitmapMask;
m_MemDCMask.CreateCompatibleDC(GetDC());//创建内存dc
m_BitmapMask.CreateCompatibleBitmap(&m_MemDCMask,100,100);
m_MemDCMask.SelectObject(&m_BitmapMask); 程序能编译通过,但一运行就Error
好像是传给CreateCompatibleDC()的pDC的问题
CPaintDC dc(this);
m_MemDCMask.CreateCompatibleDC(&dc);也不行
改了其它很多方法,用NULL就可以
但好像此时只能画黑白图
郁闷了好几天了,求高手解答啊!!
...OnInitDialog()
{
CClientDC dc(this);
m_BitmapMask.CreateCompatibleBitmap( &dc, 100, 100 );
m_MemDCMask.CreateCompatibleDC( &dc );
我觉得这个方法不可取 不知道数据具体有多少可以使用CArray类来保存数据(具体就不说了,就是变长数组,Google一下就知道了) 在Dialog上可以添加ScrollBar 来查看以前的数据 但是并不需要建立很大的CBitMap 要知道 你的对话框窗体有多大 你就最多能看到多大的
图形 即使在内存中建立了比较大的CBitMap也只能显示部分。当使用ScrollBar来滚动显示区域的时候 只要根据ScrollBar的位置在你当前Dialog的可见区域中显示出所要的绘图就行了。另外你创建内存DC的地方出错最可能的原因就是楼上所说的窗口创建前没法GetDC
在我前面说的方法中也少不了内存绘图 不过是在移动ScrollBar的时候为了防止图像闪烁。
static HDC g_hdc=GetDC(...);
static HDC g_hdcMem[MAX_NUM];
static int g_index;RecvThreadProc()
{
int bpp;
int width,height;
RGBQUAD* colortable;
BYTE* bits;
HBITMAP hbm;
BITMAPINFO* bmi;//
//create hbm & bmi
//
g_hdcMem[g_index] = SetDIBits(hbm,bmi,bits);//
//send redraw message to WndProc
//
}WndProc()
{
case WM_SCROLL:
// get g_hdcMem[index]
BitBlts();
}
存成变长数组,每次都重新画,开销是不是很大啊?
毕竟要实现图形的流动
没用CArray
Thank you!