文章来源:blog.csdn.net/zjh824/arti…
[cpp] view plain copy
-
#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位图,然后直接对位图数据写值。
\