这段时间在研究直接写屏的方法.

此问题的起因是: 在 iMX31(WinCE 5.0)上, 屏的分辨为: 800*480. 调用 BitBlt() API 函数画一整屏的动作, 竟然需要 120ms 左右; 同样的程序, 在 Prima 上只需要 20ms 以内的时间.

直接写屏, 需要用到以下两个主要的函数: CreateDC(TEXT("DISPLAY"),......) 和 CreateDIBSection().

1) CreateDC(TEXT("DISPLAY"),......) 的用法比较简单, 参考 MSDN 就可以很容易的搞定.

2) CreateDIBSection() API 函数的使用, 花了我一些时间. 因为以前没有用过它, 所以将其使用的方法记录如下:

{ HBITMAP hDIBitmap; LPBYTE lpBitmapBits; BITMAPINFO DriectBmp;  ZeroMemory(&DriectBmp,sizeof(BITMAPINFO)); DriectBmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); DriectBmp.bmiHeader.biWidth = 800; DriectBmp.bmiHeader.biHeight = 480; DriectBmp.bmiHeader.biPlanes = 1; DriectBmp.bmiHeader.biBitCount = 16; HDC dcDirect = CreateCompatibleDC(dcBuf); // 建立 hDIBitmap, dcDirect, 和 lpBitmapBits 之间的关系. // 通过 DC 操作向 dcDirect 中写入图形数据,  //从 lpBitmapBits 中取得内存数据, 进行内存 Copy 操作, 直接写向显存. hDIBitmap = CreateDIBSection(dcDirect, (BITMAPINFO *)&DriectBmp,  DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0); if(NULL != hDIBitmap) { HGDIOBJ OldBitmap = SelectObject(dcDirect, hDIBitmap); BitBlt(dcDirect,0,0,800,480,dcBuf,0,0,SRCCOPY); CopyMemory(gpbFrameAddress,lpBitmapBits,800 * 480 * 2); SelectObject(dcDirect,OldBitmap); } 

DeleteObject(hDIBitmap); DeleteDC(dcDirect); } 

  在研究此问题的过程中, 在 CSDN 上找到一个很好的资源, 也记录在自己这里:

http://topic.csdn.net/u/20090629/09/00b25d0d-d461-47dc-88ad-0e2131a5abc7.html

并转载其中关键的代码如下:

#include "stdafx.h" #include "CopyScreen.h" #include <windows.h> #include <commctrl.h> #include"Jpeg.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCEg_hInst;// 当前实例 HWNDg_hWndMenuBar;// 菜单栏句柄 // 此代码模块中包含的函数的前向声明: ATOMMyRegisterClass(HINSTANCE, LPTSTR); BOOLInitInstance(HINSTANCE, int); LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance,    HINSTANCE hPrevInstance,    LPTSTRlpCmdLine, int   nCmdShow) { MSG msg; // 执行应用程序初始化: if (!InitInstance(hInstance, nCmdShow))  { return FALSE; } HACCEL hAccelTable; hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_COPYSCREEN)); // 主消息循环: while (GetMessage(&msg, NULL, 0, 0))  { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))  { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // //  函数: MyRegisterClass() // //  目的: 注册窗口类。 // //  注释: // ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc   = WndProc; wc.cbClsExtra= 0; wc.cbWndExtra= 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_COPYSCREEN)); wc.hCursor   = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName  = 0; wc.lpszClassName = szWindowClass; return RegisterClass(&wc); } // //   函数: InitInstance(HINSTANCE, int) // //   目的: 保存实例句柄并创建主窗口 // //   注释: // //在此函数中,我们在全局变量中保存实例句柄并 //创建和显示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; TCHAR szTitle[MAX_LOADSTRING];// 标题栏文本 TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口类名 g_hInst = hInstance; // 将实例句柄存储在全局变量中 // 在应用程序初始化期间,应调用一次 SHInitExtraControls 以初始化 // 所有设备特定控件,例如,CAPEDIT 和 SIPPREF。 SHInitExtraControls(); LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);  LoadString(hInstance, IDC_COPYSCREEN, szWindowClass, MAX_LOADSTRING); //如果它已经在运行,则将焦点置于窗口上,然后退出 hWnd = FindWindow(szWindowClass, szTitle); if (hWnd)  { // 将焦点置于最前面的子窗口 // “| 0x00000001”用于将所有附属窗口置于前台并 // 激活这些窗口。 SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001)); return 0; }  if (!MyRegisterClass(hInstance, szWindowClass)) { return FALSE; } hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } // 使用 CW_USEDEFAULT 创建主窗口时,将不会考虑菜单栏的高度(如果创建了一个 // 菜单栏)。因此,我们要在创建窗口后调整其大小 // 如果菜单栏存在 if (g_hWndMenuBar) { RECT rc; RECT rcMenuBar; GetWindowRect(hWnd, &rc); GetWindowRect(g_hWndMenuBar, &rcMenuBar); rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top); MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE); } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } HBITMAP CopyScreenToBitmap(int &nWidth,int &nHeight) { // 屏幕和内存设备描述表 HDC  hScrDC, hMemDC;   // 位图句柄 HBITMAP  hBitmap, hOldBitmap; // 屏幕分辨率 int  xScrn, yScrn;  //为屏幕创建设备描述表 hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 获得屏幕分辨率 xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); //存储屏幕的长宽 nWidth = xScrn; nHeight = yScrn; // 创建一个与屏幕设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中 BitBlt(hMemDC, 0, 0, xScrn,yScrn,hScrDC, 0, 0, SRCCOPY); //得到屏幕位图的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除  DeleteDC(hScrDC); DeleteDC(hMemDC); // 返回位图句柄 return hBitmap; } 

//将截屏所得保存为16位的图片 

int Save16BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)

{ 

HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); 

HDC hOffDC=CreateCompatibleDC(hDC); 

SelectObject(hOffDC,hBitmap); 

BITMAP Bitmap; 

GetObject(hBitmap,sizeof(BITMAP),&Bitmap); 

HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, 

FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); 

if(fh == INVALID_HANDLE_VALUE ) 

return FALSE; 

BITMAPFILEHEADER bfh; 

memset(&bfh,0,sizeof(bfh)); 

bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; 

bfh.bfSize= sizeof(bfh)+2*Bitmap.bmWidth*Bitmap.bmHeight

+sizeof(BITMAPFILEHEADER); 

bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); 

DWORD dwWritten=0; 

WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); 

BITMAPINFOHEADER bih; 

memset(&bih,0,sizeof(bih)); 

bih.biSize=sizeof(bih); 

bih.biWidth=Bitmap.bmWidth; 

bih.biHeight=Bitmap.bmHeight; 

bih.biPlanes=1; 

bih.biBitCount=16; 

if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) 

{ 

return FALSE; 

} 

BITMAPINFO bitmapInfo; 

memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); 

bitmapInfo.bmiHeader=bih; 

HDC hMemDC=CreateCompatibleDC(hDC); 

BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)]; 

HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,

DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0); 

if(hDibBitmap != 0) 

{ 

::SelectObject(hMemDC,hDibBitmap); 

BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); 

WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER),

&dwWritten,NULL); 

} 

DeleteObject(hDibBitmap); 

DeleteDC(hDC); 

DeleteDC(hMemDC); 

CloseHandle(fh); 

return 1; 

} 

//将截屏所得保存为24位的图片

int Save24BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)

{ 

HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); 

HDC hOffDC=CreateCompatibleDC(hDC); 

SelectObject(hOffDC,hBitmap); 

BITMAP Bitmap; 

GetObject(hBitmap,sizeof(BITMAP),&Bitmap); 

HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, 

FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); 

if(fh == INVALID_HANDLE_VALUE ) 

return FALSE; 

BITMAPFILEHEADER bfh; 

memset(&bfh,0,sizeof(bfh)); 

bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; 

bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight

+sizeof(BITMAPFILEHEADER); 

bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); 

DWORD dwWritten=0; 

WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); 

BITMAPINFOHEADER bih; 

memset(&bih,0,sizeof(bih)); 

bih.biSize=sizeof(bih); 

bih.biWidth=Bitmap.bmWidth; 

bih.biHeight=Bitmap.bmHeight; 

bih.biPlanes=1; 

bih.biBitCount=24; 

if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) 

{ 

return FALSE; 

} 

BITMAPINFO bitmapInfo; 

memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); 

bitmapInfo.bmiHeader=bih; 

HDC hMemDC=CreateCompatibleDC(hDC); 

BYTE *m_lpBitBmp=new BYTE[3*Bitmap.bmWidth*Bitmap.bmHeight]; 

HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,

DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0); 

if(hDibBitmap != 0) 

{ 

::SelectObject(hMemDC,hDibBitmap); 

BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); 

WriteFile(fh,m_lpBitBmp,3*Bitmap.bmWidth*Bitmap.bmHeight,&dwWritten,NULL); 

} 

DeleteObject(hDibBitmap); 

DeleteDC(hDC); 

DeleteDC(hMemDC); 

CloseHandle(fh); 

return 1; 

} 

/*索引颜色/颜色表  

位图常用的一种压缩方法。从位图图片中选择最有代表性的若干种颜色(通常不超过256种)

编制成颜色表,然后将图片中原有颜色用颜色表的索引来表示。 

这样原图片可以被大幅度有损压缩。适合于压缩网页图形等颜色数较少的图形, 

不适合压缩照片等色彩丰富的图形。 */ 

//将截屏所得保存为32位带颜色表的图片 

int Save32BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName)

{ 

/*若不使用颜色表,则去掉bih.biCompression=BI_BITFIELDS;这句,然后 

不设置bitmapInfo.bmiColors[0].rgbRed=255; 

bitmapInfo.bmiColors[0].rgbGreen=255; 

bitmapInfo.bmiColors[0].rgbBlue=255;*/ 

HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); 

HDC hOffDC=CreateCompatibleDC(hDC); 

SelectObject(hOffDC,hBitmap); 

BITMAP Bitmap; 

GetObject(hBitmap,sizeof(BITMAP),&Bitmap); 

HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, 

FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); 

if(fh == INVALID_HANDLE_VALUE ) 

return FALSE; 

BITMAPFILEHEADER bfh; 

memset(&bfh,0,sizeof(bfh)); 

bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; 

bfh.bfSize= sizeof(bfh)+4*Bitmap.bmWidth*Bitmap.bmHeight

+sizeof(BITMAPFILEHEADER); 

bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); 

DWORD dwWritten=0; 

WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); 

BITMAPINFOHEADER bih; 

memset(&bih,0,sizeof(bih)); 

bih.biSize=sizeof(bih); 

bih.biWidth=Bitmap.bmWidth; 

bih.biHeight=Bitmap.bmHeight; 

bih.biPlanes=1; 

bih.biBitCount=32; 

bih.biCompression=BI_BITFIELDS; 

if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) 

{ 

return FALSE; 

} 

BITMAPINFO bitmapInfo; 

memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); 

bitmapInfo.bmiHeader=bih; 

bitmapInfo.bmiColors[0].rgbRed=255; 

bitmapInfo.bmiColors[0].rgbGreen=255; 

bitmapInfo.bmiColors[0].rgbBlue=255; 

HDC hMemDC=CreateCompatibleDC(hDC); 

BYTE *m_lpBitBmp=new BYTE[4*Bitmap.bmWidth*Bitmap.bmHeight]; 

HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,

DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0); 

if(hDibBitmap != 0) 

{ 

::SelectObject(hMemDC,hDibBitmap); 

BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); 

WriteFile(fh,m_lpBitBmp,4*Bitmap.bmWidth*Bitmap.bmHeight,&dwWritten,NULL); 

} 

DeleteObject(hDibBitmap); 

DeleteDC(hDC); 

DeleteDC(hMemDC); 

CloseHandle(fh); 

return 1; 

} 

//将截屏所得保存为jpeg图片

int SaveJPEGToFile(HBITMAP hBitmap,LPCSTR lpFileName) 

{ 

HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); 

HDC hOffDC=CreateCompatibleDC(hDC); 

SelectObject(hOffDC,hBitmap); 

BITMAP Bitmap; 

GetObject(hBitmap,sizeof(BITMAP),&Bitmap); 

HANDLE fh=CreateFile((LPCWSTR)lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, 

FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); 

if(fh == INVALID_HANDLE_VALUE ) 

return FALSE; 

BITMAPFILEHEADER bfh; 

memset(&bfh,0,sizeof(bfh)); 

bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; 

bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER); 

bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); 

DWORD dwWritten=0; 

//WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); 

BITMAPINFOHEADER bih; 

memset(&bih,0,sizeof(bih)); 

bih.biSize=sizeof(bih); 

bih.biWidth=Bitmap.bmWidth; 

bih.biHeight=Bitmap.bmHeight; 

bih.biPlanes=1; 

bih.biBitCount=24; 

/*if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) 

{ 

return FALSE; 

}*/ 

BITMAPINFO bitmapInfo; 

memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); 

bitmapInfo.bmiHeader=bih; 

HDC hMemDC=CreateCompatibleDC(hDC); 

BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)]; 

HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,

DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0); 

if(hDibBitmap != 0) 

{ 

::SelectObject(hMemDC,hDibBitmap); 

BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); 

//WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER),&dwWritten,NULL);

WriteJPEGFile(lpFileName, m_lpBitBmp,Bitmap.bmWidth,Bitmap.bmHeight,TRUE, 60);

} 

DeleteObject(hDibBitmap); 

DeleteDC(hDC); 

DeleteDC(hMemDC); 

CloseHandle(fh); 

return 1; 

} 

//  函数: WndProc(HWND, UINT, WPARAM, LPARAM) 

//  目的: 处理主窗口的消息。 

//  WM_COMMAND- 处理应用程序菜单 

//  WM_PAINT- 绘制主窗口 

//  WM_DESTROY- 发送退出消息并返回 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 

{ 

int wmId, wmEvent; 

PAINTSTRUCT ps; 

HDC hdc; 

static SHACTIVATEINFO s_sai; 

int iWidth,iHeight; 

HBITMAP hBitmap; 

static int s_cxBegin; 

static int s_cyBegin; 

static int s_cxEnd; 

static int s_cyEnd; 

switch (message)  

{ 

case WM_COMMAND: 

wmId= LOWORD(wParam);  

wmEvent = HIWORD(wParam);  

// 分析菜单选择: 

switch (wmId) 

{ 

case IDM_HELP_ABOUT: 

DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About); 

break; 

case IDM_OK: 

SendMessage (hWnd, WM_CLOSE, 0, 0); 

break; 

case ID_RGB16: 

hBitmap=CopyScreenToBitmap(iWidth,iHeight); 

Save16BitmapToFile(hBitmap,TEXT("\\a.bmp")); 

break; 

case ID_RGB24: 

hBitmap=CopyScreenToBitmap(iWidth,iHeight); 

Save24BitmapToFile(hBitmap,TEXT("\\b.bmp")); 

break; 

case ID_RGB32: 

hBitmap=CopyScreenToBitmap(iWidth,iHeight); 

Save32BitmapToFile(hBitmap,TEXT("\\c.bmp")); 

break; 

case ID_JPEG: 

hBitmap=CopyScreenToBitmap(iWidth,iHeight); 

SaveJPEGToFile(hBitmap,"d.jpg"); 

break; 

default: 

return DefWindowProc(hWnd, message, wParam, lParam); 

} 

break; 

case WM_CREATE: 

SHMENUBARINFO mbi; 

memset(&mbi, 0, sizeof(SHMENUBARINFO)); 

mbi.cbSize = sizeof(SHMENUBARINFO); 

mbi.hwndParent = hWnd; 

mbi.nToolBarId = IDR_MENU; 

mbi.hInstRes   = g_hInst; 

if (!SHCreateMenuBar(&mbi))  

{ 

g_hWndMenuBar = NULL; 

} 

else 

{ 

g_hWndMenuBar = mbi.hwndMB; 

} 

// 初始化外壳程序激活信息结构 

memset(&s_sai, 0, sizeof (s_sai)); 

s_sai.cbSize = sizeof (s_sai); 

break; 

case WM_LBUTTONDOWN: 

HCURSOR  hCursor; 

hCursor=SetCursor( LoadCursor(NULL,MAKEINTRESOURCE(IDC_WAIT) ) ); 

s_cxBegin=LOWORD(lParam); 

s_cyBegin=HIWORD(lParam); 

break; 

case WM_LBUTTONUP: 

s_cxEnd=LOWORD(lParam); 

s_cyEnd=HIWORD(lParam); 

SetCursor( LoadCursor( GetModuleHandle(NULL),MAKEINTRESOURCE(IDC_ARROW) ) ); 

break; 

case WM_PAINT: 

hdc = BeginPaint(hWnd, &ps); 

// TODO: 在此添加任意绘图代码... 

EndPaint(hWnd, &ps); 

break; 

case WM_DESTROY: 

CommandBar_Destroy(g_hWndMenuBar); 

PostQuitMessage(0); 

break; 

case WM_ACTIVATE: 

// 向外壳程序通知我们的激活消息 

SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE); 

break; 

case WM_SETTINGCHANGE: 

SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai); 

break; 

default: 

return DefWindowProc(hWnd, message, wParam, lParam); 

} 

return 0; 

} 

  

WinCE5.0下直接写屏操作与函数 CreateDIBSection() 的使用(转)相关推荐

  1. Appium基础篇14-上下左右滑屏操作swipe方法

    本篇来学习webdriver.py下一个滑屏操作,这个方法叫swipe,这个方法只是手机端appium的方法,不是selenium3的方法.在介绍滑屏操作之前,你需要了解如何得到屏幕的高和宽,因为每个 ...

  2. wince程序转Linux,Qt在程序WinCE5.0下部署时“XXX不是有效的Windows CE应用程序”

    文章参看这里.这个一般是由于我们编译的Qt使用了WinCE CoreDll.dll中不存在的API导致的 我们需要使用一个工具qtverify.zip 具体下载目录在 /2012年资料/8月/14日/ ...

  3. OpenCV2.3的cvCalcHist函数有问题?255级值总为0,索性自己写一个直方图计算函数,附源码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 我在写直方图规定化的代码过程中,发现OpenCV ...

  4. WINCE5.0下SQL server compact版本更新

    ********************************LoongEmbedded************************ 作者:LoongEmbedded(kandi) 时间:201 ...

  5. WinCE5.0中应用程序如何直接写屏

    以前曾利用GAPI实现应用程序直接操作显示驱动的FrameBuffer,以提高屏幕绘图和视频播放的效率.GAPI依赖于显示驱动,必须在显示驱动中添加相应的接口才能正常使用.如果平台是我们自己定制的,在 ...

  6. WINCE5.0软件总汇(20100411更新)

    软件由购把瘾网友搜集,本人整理并上传RaySource网盘 软件分为 办公类,影音类,系统工具类,网络类,桌面美化类,娱乐游戏类五个大类共90余款 多数软件附有简短说明,但恕不奉上图片 办公类 实用软 ...

  7. 在OpenCV环境下写的灰度图像二维傅里叶换,幅值计算,频谱平移和将数值归一化到0到255区间的四个函数

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 灰度图像的二维傅里叶变换(cv_gray_fft ...

  8. android 11.0 12.0控制屏幕亮屏和灭屏操作

    在11.0 12.0的产品开发中, 需要提供亮屏和灭屏的接口在8.0以后系统对于屏幕亮灭屏做了限制,直接调用亮屏和灭屏的方法就调不到了, 接下来就来看PowerManage.java类 这个是一个电源 ...

  9. bae index.php,【微信公众平台开发】之一:入门与BAE3.0下操作

    0.资料 *<微信公众平台搭建与开发揭秘> 1.开发者模式基本功能 编辑模式比较简单,登录mp.weixin.qq.com一看就会,在此略过.若要申请自定义菜单>微信认证>30 ...

最新文章

  1. 机器学习中的三对性能度量参数
  2. 【redis】redis持久化
  3. C++ new、delete、malloc、free关键字的关系
  4. 步步深入:MySQL架构总览-gt;查询执行流程-gt;SQL解析顺序
  5. 【译】nginx关于location部分
  6. 产品经理如何利用ER图,指导原型设计?
  7. 关于整合SK框架的一些个小注意
  8. 思科修复NSA报告的Nexus 交换机DoS漏洞及其它
  9. HTML5视频播放器
  10. 论文写作过程中用到的软件、网站分享
  11. 如何通过树莓派/Python/smtp发送电子邮件
  12. 这个神器让我的 Bug 少了一半
  13. HW红队攻防基础建设—C2 IP隐匿技术
  14. 极速office(Word)文件怎么在方框里面打对勾
  15. java实现逻辑推断
  16. 昆石VOS2009/VOS3000 2.1.6.00 操作指南
  17. 全网最细MySQL数据库下载及安装教程
  18. 宝真酒业:借助用友U8cloud数智化转型,小集团也能“小而美”
  19. PHP根据汉字转换拼音
  20. 51单片机实验之流水灯和交替闪烁

热门文章

  1. 移通好闹钟微信小程序全套源码
  2. 话费直充/三网直冲/联通直充/电信直充/移动直充/系统源码
  3. CodeIgniter 合作paypal
  4. 爬虫入门二(urllib,urllib2)
  5. redis——通过redis实现服务器崩溃等数据恢复
  6. 用mycat做读写分离:基于 MySQL主从复制
  7. Oracle之ROW_NUMBER() OVER函数
  8. Shell——流程控制
  9. 【Python】类的基本写法与注释风格
  10. 【python】set集合基础与使用