文章来源:http://blog.csdn.net/zjh824/article/details/6128554
- #include <pkfuncs.h>
- #define rgb565(r,g,b) (WORD)((((WORD)r&0xf8)<<8)|(((WORD)g&0xfc)<<3)|(((WORD)b&0xf8)>>3))
- void CTestDisplayDlg::OnBnClickedButton1()
- {
- // TODO: 在此添加控件通知处理程序代码
- //char *gpLCDBuf;
- //gpLCDBuf = (char*)VirtualAlloc(NULL,0x100000,MEM_RESERVE,PAGE_NOACCESS);
- //VirtualCopy(gpLCDBuf, (void *)(0x30100000/256), 0x100000, PAGE_READWRITE | PAGE_PHYSICAL | PAGE_NOCACHE);
- // memset(gpLCDBuf,0xFF,0x100000);
- // HDC m_hdcBuffer = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
- // HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
- HDC hDisplayDC = ::GetDC(m_hWnd);
- HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);
- //int a = ::GetDeviceCaps(hDisplayDC,BITSPIXEL);
- //int b = ::GetDeviceCaps(hdcTmp, BITSPIXEL);
- //int c = ::GetDeviceCaps(m_hdcBuffer, BITSPIXEL);
- HBITMAP m_hbmpBuffer;
- m_hbmpBuffer = ::CreateCompatibleBitmap(hDisplayDC, 800, 480);
- HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);
- ::SetBkMode(m_hdcBuffer, TRANSPARENT);
- ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);
- ::PatBlt(m_hdcBuffer, 0, 0, 800, 480,BLACKNESS);
- // ::Set
- for(int i=0; i<255; ++i)
- {
- HPEN hpen = ::CreatePen(PS_SOLID, 1, RGB(i,0, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer,i,0, NULL);
- ::LineTo(m_hdcBuffer, i,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer, i+256,0, NULL);
- ::LineTo(m_hdcBuffer, i+256,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer,i+512, 0, NULL);
- ::LineTo(m_hdcBuffer, i+512, 480);
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));
- //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);
- DWORD dwTime = ::GetTickCount();
- BitBlt(hDisplayDC, 0, 0,800 ,480 , m_hdcBuffer, 0, 0, SRCCOPY);
- RETAILMSG(1, (TEXT("BitBlt use tickcount is %d /r/n"), ::GetTickCount() - dwTime));
- DeleteObject(::SelectObject(m_hdcBuffer, hbmp));
- DeleteDC(m_hdcBuffer);
- // ::DeleteDC(hDisplayDC);
- ::ReleaseDC(m_hWnd, hDisplayDC);
- }
- void CTestDisplayDlg::OnBnClickedButton2()
- {
- // TODO: 在此添加控件通知处理程序代码
- // HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
- HDC hDisplayDC = ::GetDC(m_hWnd);
- HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);
- HBITMAP m_hbmpBuffer;
- LPBYTE m_lpBitmapBits;
- BITMAPINFO bmpInfo;
- ZeroMemory(&bmpInfo, sizeof(bmpInfo));
- bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmpInfo.bmiHeader.biBitCount = 16;
- bmpInfo.bmiHeader.biWidth = 800;
- bmpInfo.bmiHeader.biHeight = -480;
- bmpInfo.bmiHeader.biPlanes = 1;
- //bmpInfo.bmiHeader.biCompression = BI_BITFIELDS;
- //*(DWORD *)(&bmpInfo.bmiColors[0]) = 0xF800;
- //*(DWORD *)(&bmpInfo.bmiColors[1]) = 0x07E0;
- //*(DWORD *)(&bmpInfo.bmiColors[2]) = 0x001F;
- bmpInfo.bmiHeader.biSizeImage = 0;
- bmpInfo.bmiHeader.biXPelsPerMeter = 0;
- bmpInfo.bmiHeader.biYPelsPerMeter = 0;
- bmpInfo.bmiHeader.biClrUsed = 0;
- bmpInfo.bmiHeader.biClrImportant = 0;
- m_hbmpBuffer = ::CreateDIBSection(m_hdcBuffer, (BITMAPINFO *)&bmpInfo,
- DIB_RGB_COLORS, (void **)&m_lpBitmapBits, NULL, 0);
- HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);
- ::SetBkMode(m_hdcBuffer, TRANSPARENT);
- ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);
- ::PatBlt(hDisplayDC, 0, 0, 800, 480,BLACKNESS);
- // ::BitBlt(hDisplayDC, 0, 0, 800, 480, m_hdcBuffer, 0, 0, SRCCOPY);
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(i,0, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer,i, 0, NULL);
- ::LineTo(m_hdcBuffer, i,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer, i+256,0, NULL);
- ::LineTo(m_hdcBuffer, i+256,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer,i+512, 0, NULL);
- ::LineTo(m_hdcBuffer, i+512, 480);
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));
- //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);
- // ::BitBlt(hDisplayDC, 0, 0, 800, 480, m_hdcBuffer, 0, 0, SRCCOPY);
- DWORD dwTime = ::GetTickCount();
- ::StretchDIBits(hDisplayDC, 0, 0, 800, 480, 0, 0, 800, 480, m_lpBitmapBits, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);
- RETAILMSG(1, (TEXT("StretchDIBits use tickcount is %d /r/n"), ::GetTickCount() - dwTime));
- DeleteObject(::SelectObject(m_hdcBuffer, hbmp));
- DeleteDC(m_hdcBuffer);
- // ::DeleteDC(hDisplayDC);
- ::ReleaseDC(m_hWnd, hDisplayDC);
- }
- void CTestDisplayDlg::OnBnClickedButton4()
- {
- // HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
- HDC hDisplayDC = ::GetDC(m_hWnd);
- HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);
- HBITMAP m_hbmpBuffer;
- LPBYTE m_lpBitmapBits;
- BITMAPINFO* lpNewBmpInfo = (BITMAPINFO *) new BYTE[ ( sizeof(BITMAPINFOHEADER) + 3*sizeof(RGBQUAD) ) ];
- ZeroMemory(lpNewBmpInfo, sizeof(BITMAPINFO));
- lpNewBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- lpNewBmpInfo->bmiHeader.biBitCount = 16;
- lpNewBmpInfo->bmiHeader.biWidth = 800;
- lpNewBmpInfo->bmiHeader.biHeight = -480;
- lpNewBmpInfo->bmiHeader.biPlanes = 1;
- lpNewBmpInfo->bmiHeader.biSizeImage = 0;
- lpNewBmpInfo->bmiHeader.biXPelsPerMeter = 0;
- lpNewBmpInfo->bmiHeader.biYPelsPerMeter = 0;
- lpNewBmpInfo->bmiHeader.biClrUsed = 0;
- lpNewBmpInfo->bmiHeader.biClrImportant = 0;
- lpNewBmpInfo->bmiHeader.biCompression = BI_BITFIELDS;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[0])) = 0xF800;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[1])) = 0x07E0;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[2])) = 0x001F;
- m_hbmpBuffer = ::CreateDIBSection(m_hdcBuffer, (BITMAPINFO *)lpNewBmpInfo,
- DIB_RGB_COLORS, (void **)&m_lpBitmapBits, NULL, 0);
- HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);
- ::SetBkMode(m_hdcBuffer, TRANSPARENT);
- ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);
- ::PatBlt(hDisplayDC, 0, 0, 800, 480,BLACKNESS);
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(i,0, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer,i, 0, NULL);
- ::LineTo(m_hdcBuffer, i,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer, i+256,0, NULL);
- ::LineTo(m_hdcBuffer, i+256,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer,i+512, 0, NULL);
- ::LineTo(m_hdcBuffer, i+512, 480);
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));
- //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);
- // ::BitBlt(hDisplayDC, 0, 0, 800, 480, m_hdcBuffer, 0, 0, SRCCOPY);
- DWORD dwTime = ::GetTickCount();
- ::StretchDIBits(hDisplayDC, 0, 0, 800, 480, 0, 0, 800, 480, m_lpBitmapBits,(BITMAPINFO*)lpNewBmpInfo, DIB_RGB_COLORS, SRCCOPY);
- RETAILMSG(1, (TEXT(" 16BPP StretchDIBits use tickcount is %d /r/n"), ::GetTickCount() - dwTime));
- DeleteObject(::SelectObject(m_hdcBuffer, hbmp));
- DeleteDC(m_hdcBuffer);
- // ::DeleteDC(hDisplayDC);
- ::ReleaseDC(m_hWnd, hDisplayDC);
- delete lpNewBmpInfo;
- }
- void CTestDisplayDlg::OnBnClickedButton5()
- {
- // HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
- HDC hDisplayDC = ::GetDC(m_hWnd);
- HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);
- HBITMAP m_hbmpBuffer;
- LPBYTE m_lpBitmapBits;
- BITMAPINFO* lpNewBmpInfo = (BITMAPINFO *) new BYTE[ ( sizeof(BITMAPINFOHEADER) + 3*sizeof(RGBQUAD) ) ];
- ZeroMemory(lpNewBmpInfo, sizeof(BITMAPINFO));
- lpNewBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- lpNewBmpInfo->bmiHeader.biBitCount = 16;
- lpNewBmpInfo->bmiHeader.biWidth = 800;
- lpNewBmpInfo->bmiHeader.biHeight = -480;
- lpNewBmpInfo->bmiHeader.biPlanes = 1;
- lpNewBmpInfo->bmiHeader.biSizeImage = 0;
- lpNewBmpInfo->bmiHeader.biXPelsPerMeter = 0;
- lpNewBmpInfo->bmiHeader.biYPelsPerMeter = 0;
- lpNewBmpInfo->bmiHeader.biClrUsed = 0;
- lpNewBmpInfo->bmiHeader.biClrImportant = 0;
- lpNewBmpInfo->bmiHeader.biCompression = BI_BITFIELDS;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[0])) = 0xF800;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[1])) = 0x07E0;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[2])) = 0x001F;
- m_hbmpBuffer = ::CreateDIBSection(m_hdcBuffer, (BITMAPINFO *)lpNewBmpInfo,
- DIB_RGB_COLORS, (void **)&m_lpBitmapBits, NULL, 0);
- HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);
- ::SetBkMode(m_hdcBuffer, TRANSPARENT);
- ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);
- ::PatBlt(hDisplayDC, 0, 0, 800, 480,BLACKNESS);
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(i,0, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer,i, 0, NULL);
- ::LineTo(m_hdcBuffer, i,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer, i+256,0, NULL);
- ::LineTo(m_hdcBuffer, i+256,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- for(int i=0; i<=255; ++i)
- {
- HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer,i+512, 0, NULL);
- ::LineTo(m_hdcBuffer, i+512, 480);
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));
- //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);
- DWORD dwTime = ::GetTickCount();
- BitBlt(hDisplayDC, 0, 0,800 ,480 , m_hdcBuffer, 0, 0, SRCCOPY);
- RETAILMSG(1, (TEXT(" 16BPP BitBlt use tickcount is %d /r/n"), ::GetTickCount() - dwTime));
- DeleteObject(::SelectObject(m_hdcBuffer, hbmp));
- DeleteDC(m_hdcBuffer);
- // ::DeleteDC(hDisplayDC);
- ::ReleaseDC(m_hWnd, hDisplayDC);
- delete lpNewBmpInfo;
- }
- void CTestDisplayDlg::OnBnClickedButton3()
- {
- // TODO: 在此添加控件通知处理程序代码
- char *gpLCDBuf;
- gpLCDBuf = (char*)VirtualAlloc(NULL,0x100000,MEM_RESERVE,PAGE_NOACCESS);
- VirtualCopy(gpLCDBuf, (void *)(0x30100000/256), 0x100000, PAGE_READWRITE | PAGE_PHYSICAL | PAGE_NOCACHE);
- // memset(gpLCDBuf,0xFF,0x100000);
- // HDC m_hdcBuffer = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
- // HDC hDisplayDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
- HDC hDisplayDC = ::GetDC(m_hWnd);
- HDC m_hdcBuffer = ::CreateCompatibleDC(hDisplayDC);
- HBITMAP m_hbmpBuffer;
- LPBYTE m_lpBitmapBits;
- BITMAPINFO* lpNewBmpInfo = (BITMAPINFO *) new BYTE[ ( sizeof(BITMAPINFOHEADER) + 3*sizeof(RGBQUAD) ) ];
- // BITMAPINFO bmpInfo;
- ZeroMemory(lpNewBmpInfo, sizeof(BITMAPINFO));
- lpNewBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- lpNewBmpInfo->bmiHeader.biBitCount = 16;
- lpNewBmpInfo->bmiHeader.biWidth = 800;
- lpNewBmpInfo->bmiHeader.biHeight = -480;
- lpNewBmpInfo->bmiHeader.biPlanes = 1;
- lpNewBmpInfo->bmiHeader.biCompression = BI_BITFIELDS;
- lpNewBmpInfo->bmiHeader.biSizeImage = 0;
- lpNewBmpInfo->bmiHeader.biXPelsPerMeter = 0;
- lpNewBmpInfo->bmiHeader.biYPelsPerMeter = 0;
- lpNewBmpInfo->bmiHeader.biClrUsed = 0;
- lpNewBmpInfo->bmiHeader.biClrImportant = 0;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[0])) = 0xF800;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[1])) = 0x07E0;
- *(DWORD *)(&(lpNewBmpInfo->bmiColors[2])) = 0x001F;
- m_hbmpBuffer = ::CreateDIBSection(m_hdcBuffer, (BITMAPINFO *)lpNewBmpInfo,
- DIB_RGB_COLORS, (void **)&m_lpBitmapBits, NULL, 0);
- HBITMAP hbmp = (HBITMAP)::SelectObject(m_hdcBuffer, m_hbmpBuffer);
- ::SetBkMode(m_hdcBuffer, TRANSPARENT);
- ::SetStretchBltMode(m_hdcBuffer, COLORONCOLOR);
- // ::PatBlt(hDisplayDC, 0, 0, 800, 480,BLACKNESS);
- memset(m_lpBitmapBits, 0, 800 * 480 * 2);
- CopyMemory(gpLCDBuf, m_lpBitmapBits, 800 * 480 * 2);
- for(int i=0; i<=255; ++i)
- {
- //HPEN hpen = ::CreatePen(0, 1, RGB(i,0, 0));
- //HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- //::MoveToEx(m_hdcBuffer,i, 0, NULL);
- //::LineTo(m_hdcBuffer, i,480 );
- //::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- LPWORD lpData = (LPWORD)m_lpBitmapBits;
- for(int j=0; j<480; ++j)
- {
- *(lpData + i + 800 * j ) = rgb565(i,0,0);
- }
- }
- for(int i=0; i<=255; ++i)
- {
- LPWORD lpData = (LPWORD)m_lpBitmapBits;
- for(int j=0; j<480; ++j)
- {
- *(lpData + i+ 256 + 800 * j ) = rgb565(0,i,0);
- }
- /* HPEN hpen = ::CreatePen(0, 1, RGB(0,i, 0));
- HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- ::MoveToEx(m_hdcBuffer, i+256,0, NULL);
- ::LineTo(m_hdcBuffer, i+256,480 );
- ::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));*/
- }
- for(int i=0; i<=255; ++i)
- {
- LPWORD lpData = (LPWORD)m_lpBitmapBits;
- for(int j=0; j<480; ++j)
- {
- *(lpData + i+ 512 + 800 * j ) = rgb565(0,0,i);
- }
- //HPEN hpen = ::CreatePen(0, 1, RGB(0,0, i));
- //HPEN hOldPen = (HPEN)::SelectObject(m_hdcBuffer, hpen);
- //::MoveToEx(m_hdcBuffer,i+512, 0, NULL);
- //::LineTo(m_hdcBuffer, i+512, 480);
- //::DeleteObject(::SelectObject(m_hdcBuffer, hOldPen));
- }
- //::SetPixel(m_hdcBuffer, 0, 0, RGB(200, 0, 0));
- //*((WORD*)m_lpBitmapBits + 1) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 2) = rgb565(200, 0, 0);
- //*((WORD*)m_lpBitmapBits + 3) = rgb565(200, 0, 0);
- //for(int i = 0; i<800 * 240; ++i)
- //{
- // *tmp++ = rgb565(255, 0, 0);
- //}
- DWORD dwTime = ::GetTickCount();
- CopyMemory(gpLCDBuf, m_lpBitmapBits, 800 * 480 * 2);
- RETAILMSG(1, (TEXT("FrameBuffer use tickcount is %d /r/n"), ::GetTickCount() - dwTime));
- // ::StretchDIBits(hDisplayDC, 0, 0, 800, 480, 0, 0, 800, 480, m_lpBitmapBits,(BITMAPINFO*)lpNewBmpInfo, DIB_RGB_COLORS, SRCCOPY);
- // BitBlt(hdcTmp, 0, 0, rcWnd.Width(), rcWnd.Height(), m_hdcBuffer, 0, 0, SRCCOPY);
- // InvalidateRect(NULL);
- VirtualFree(gpLCDBuf,0,MEM_RELEASE);
- DeleteObject(::SelectObject(m_hdcBuffer, hbmp));
- DeleteDC(m_hdcBuffer);
- // ::DeleteDC(hDisplayDC);
- ::ReleaseDC(m_hWnd, hDisplayDC);
- delete lpNewBmpInfo;
- }
GDI操作过程:往窗口的DC上以红绿蓝三种颜色分别画255根渐变的竖线。如图
显示结果:
设备兼容位图DDB:BitBlt use tickcount is 13
DIB位图(格式不兼容):StretchDIBits use tickcount is 184
rgb565 DIB位图: 16BPP StretchDIBits use tickcount is 12
RGB565 DIB位图: 16BPP BitBlt use tickcount is 13
直接写屏:FrameBuffer use tickcount is 9
结论:创建DDB位图与DIB位图,在贴图时的速度是一样的。唯一区别就是如果创建的DIB位图必须要与驱动里的位图格式一样,包括BIT_MASK的格式一样,也就是驱动里为RGB565的格式,应用里创建的位图也应该是RGB565的DIB位图,否则在BITBLT时驱动里会做一个RGB的转换,导致画图速度很慢,而创建DDB位图是不存在这种问题的,在速度上是不会慢的。
全部GDI操作的时间统计结果(只包括GDI操作,创建画笔,MOVETOEX,LINETO,SelectObject,BitBlt等,不包括位图创建,DC创建等):
BitBlt use tickcount is 443
StretchDIBits use tickcount is 610
16BPP StretchDIBits use tickcount is 438
16BPP BitBlt use tickcount is 439
FrameBuffer use tickcount is 116
结论:使用GDI时,前四种情况下的速度是一样的,与位图的格式无关,只是使用BitBlt时会因为位图格式不兼容造成很大性能损失。
但是如果使用直接写屏的操作可以把简单的GDI函数调用转换为纯粹的内存赋值操作,这种操作可以省掉很多时间。实际上可以用DIB位图来进行这种操作,直接针对DIB位图的内存数据写值来实现GDI的操作。
把16BPP的BitBlt修改为直接内存写值的操作,时间结果为:
BitBlt use tickcount is 442
StretchDIBits use tickcount is 611
16BPP StretchDIBits use tickcount is 441
16BPP BitBlt use tickcount is 106
FrameBuffer use tickcount is 104
由此可见,这种情况下与直接写屏的效率是一样的,对于频繁的GDI操作绘图,重写GDI的API调用可以节省不少的时间,前提就是使用与显示驱动兼容的DIB位图,然后直接对位图数据写值。