如何截取并存储位图!

edrftgyh 2003-08-21 03:45:14
我己知一个位图的句柄,我现在想得到这个位图中的某一部份,即将这个位图截取一部分出来,然后要得到这个截取的位图的句柄,请问我如何实现?
...全文
161 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
edrftgyh 2003-08-22
  • 打赏
  • 举报
回复
高手快回答啊!我是要得到那个剪切了的位图的句柄!
alickguo 2003-08-22
  • 打赏
  • 举报
回复
hTemBmp=::CreateCompatibleBitmap(hTemMemDC,m_rectPreCut.Width(),m_rectPreCut.Height());

可能是创建的位图区m_rectPreCut.Width(),m_rectPreCut.Height()不够大。
所以显示的是黑色的。
要不可能是hTemMemDC 内容本身就是空的

edrftgyh 2003-08-22
  • 打赏
  • 举报
回复
救命啊!
edrftgyh 2003-08-22
  • 打赏
  • 举报
回复
没有人回答吗?高手们快帮忙啊!
edrftgyh 2003-08-21
  • 打赏
  • 举报
回复
HDC hMemDC=NULL,hTemMemDC=NULL;
HBITMAP hTemBmp=NULL,hOldBmp=NULL;
HDC hdc = ::GetDC(this->m_hWnd);
hMemDC=::CreateCompatibleDC(hdc);
::ReleaseDC(this->m_hWnd, hdc);
hTemMemDC=::CreateCompatibleDC(hMemDC);
::SelectObject(hMemDC,m_hbmpary[m_biBmpIndex]);
//m_hbmpary[m_biBmpIndex]为己知的有效的句柄。

hTemBmp=::CreateCompatibleBitmap(hTemMemDC,m_rectPreCut.Width(),m_rectPreCut.Height());
hOldBmp=(HBITMAP)::SelectObject(hTemMemDC,hTemBmp);


::StretchBlt(hTemMemDC,0,0,m_rectPreCut.Width(),m_rectPreCut.Height(),
hMemDC,m_rectPreCut.left,m_rectPreCut.top,
m_rectPreCut.Width(),m_rectPreCut.Height(),SRCCOPY);

hTemBmp=(HBITMAP)::SelectObject(hTemMemDC,hOldBmp);
//我这里得到的句柄hTemBmp却无效,显示的时候是全黑的,请问各位大侠是什么原因啊!
Sportbeuty 2003-08-21
  • 打赏
  • 举报
回复
呵呵,放在空的位图里面就好啦吧。
思危 2003-08-21
  • 打赏
  • 举报
回复
下面的一段抓屏函数,看看是否对你有帮助!!

void CSaveBitmap::SaveBitmap()
{
CString Path;
HBITMAP hBitmap = SaveBitmapCopyScreenToBitmap(m_Rect);

CFileDialog dlg(FALSE,"*.*","新图形",NULL,
"位图文件(*.bmp)|*.bmp|所有文件(*.*)|*.*||",NULL);

//not change the default dir
dlg.m_ofn.Flags |= OFN_EXPLORER|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
dlg.m_ofn.lpstrTitle = "保存图形";

if (dlg.DoModal() == IDCANCEL)
{
::DeleteObject(hBitmap);
return;
}

Path = dlg.GetPathName();

//save the bitmap
SaveBitmapToFile(hBitmap,Path.GetBuffer(Path.GetLength()));
}

//lpRect 代表选定区域
HBITMAP CSaveBitmap::SaveBitmapCopyScreenToBitmap(LPRECT lpRect)
{
// 屏幕和内存设备描述表
HDC hScrDC, hMemDC;

// 位图句柄
HBITMAP hBitmap, hOldBitmap;

// 选定区域坐标
int nX, nY, nX2, nY2;

// 位图宽度和高度
int nWidth, nHeight;

// 屏幕分辨率
int xScrn, yScrn;

// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;

//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);

//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);

// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;

// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);

//确保选定区域是可见的
if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;

nWidth = nX2 - nX;
nHeight = nY2 - nY;

// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);

// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);

//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);

// 返回位图句柄
return hBitmap;
}

/////得到屏幕位图句柄以后,我们
/////可以把屏幕内容粘贴到剪贴板上.
void CSaveBitmap::SaveBitmapToClipboard(HBITMAP hBitmap,HWND hWnd)
{
//hWnd为程序窗口句柄
if (OpenClipboard(hWnd))
{
//清空剪贴板
EmptyClipboard();

SetClipboardData(CF_BITMAP, hBitmap);

//关闭剪贴板
CloseClipboard();
}
}

//我们也可以把屏幕内容以位图格式存到磁盘文件上.
//lpFileName 为位图文件名
int CSaveBitmap::SaveBitmapToFile(HBITMAP hBitmap , LPSTR lpFileName)
{
//设备描述表
HDC hDC;

//当前显示分辨率下每个像素所占字节数
int iBits;

//位图中每个像素所占字节数
WORD wBitCount;

//定义调色板大小, 位图中像素字节大小 ,
//位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0,
dwBmBitsSize,
dwDIBSize, dwWritten;

//位图属性结构
BITMAP Bitmap;

//位图文件头结构
BITMAPFILEHEADER bmfHdr;

//位图信息头结构
BITMAPINFOHEADER bi;

//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;

//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib;
HPALETTE hPal,hOldPal=NULL;

//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);

if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;

//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);

//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4*Bitmap.bmHeight ;

//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;

// 处理调色板
hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = GetDC(NULL);
hOldPal = SelectPalette(hDC, hPal, FALSE);
RealizePalette(hDC);
}

// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}

//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE)
return FALSE;

//设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;

// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);

//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);

return TRUE;
}
思危 2003-08-21
  • 打赏
  • 举报
回复
下面的一段抓屏函数,看看是否对你有帮助!!

void CSaveBitmap::SaveBitmap()
{
CString Path;
HBITMAP hBitmap = SaveBitmapCopyScreenToBitmap(m_Rect);

CFileDialog dlg(FALSE,"*.*","新图形",NULL,
"位图文件(*.bmp)|*.bmp|所有文件(*.*)|*.*||",NULL);

//not change the default dir
dlg.m_ofn.Flags |= OFN_EXPLORER|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_NOCHANGEDIR;
dlg.m_ofn.lpstrTitle = "保存图形";

if (dlg.DoModal() == IDCANCEL)
{
::DeleteObject(hBitmap);
return;
}

Path = dlg.GetPathName();

//save the bitmap
SaveBitmapToFile(hBitmap,Path.GetBuffer(Path.GetLength()));
}

//lpRect 代表选定区域
HBITMAP CSaveBitmap::SaveBitmapCopyScreenToBitmap(LPRECT lpRect)
{
// 屏幕和内存设备描述表
HDC hScrDC, hMemDC;

// 位图句柄
HBITMAP hBitmap, hOldBitmap;

// 选定区域坐标
int nX, nY, nX2, nY2;

// 位图宽度和高度
int nWidth, nHeight;

// 屏幕分辨率
int xScrn, yScrn;

// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;

//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);

//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);

// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;

// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);

//确保选定区域是可见的
if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;

nWidth = nX2 - nX;
nHeight = nY2 - nY;

// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);

// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);

// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,hScrDC, nX, nY, SRCCOPY);

//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);

// 返回位图句柄
return hBitmap;
}

/////得到屏幕位图句柄以后,我们
/////可以把屏幕内容粘贴到剪贴板上.
void CSaveBitmap::SaveBitmapToClipboard(HBITMAP hBitmap,HWND hWnd)
{
//hWnd为程序窗口句柄
if (OpenClipboard(hWnd))
{
//清空剪贴板
EmptyClipboard();

SetClipboardData(CF_BITMAP, hBitmap);

//关闭剪贴板
CloseClipboard();
}
}

//我们也可以把屏幕内容以位图格式存到磁盘文件上.
//lpFileName 为位图文件名
int CSaveBitmap::SaveBitmapToFile(HBITMAP hBitmap , LPSTR lpFileName)
{
//设备描述表
HDC hDC;

//当前显示分辨率下每个像素所占字节数
int iBits;

//位图中每个像素所占字节数
WORD wBitCount;

//定义调色板大小, 位图中像素字节大小 ,
//位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0,
dwBmBitsSize,
dwDIBSize, dwWritten;

//位图属性结构
BITMAP Bitmap;

//位图文件头结构
BITMAPFILEHEADER bmfHdr;

//位图信息头结构
BITMAPINFOHEADER bi;

//指向位图信息头结构
LPBITMAPINFOHEADER lpbi;

//定义文件,分配内存句柄,调色板句柄
HANDLE fh, hDib;
HPALETTE hPal,hOldPal=NULL;

//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);

if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;

//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);

//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4*Bitmap.bmHeight ;

//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;

// 处理调色板
hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = GetDC(NULL);
hOldPal = SelectPalette(hDC, hPal, FALSE);
RealizePalette(hDC);
}

// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap.bmHeight,(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(LPBITMAPINFO)lpbi, DIB_RGB_COLORS);

//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}

//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);

if (fh == INVALID_HANDLE_VALUE)
return FALSE;

//设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;

// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);

//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);

return TRUE;
}
sxxny 2003-08-21
  • 打赏
  • 举报
回复
GetBitmapBits
SetBitmapBits
jack_wq 2003-08-21
  • 打赏
  • 举报
回复
生成一个新的空位图,将截取的数据天入到相应的数据区就可以了!难道楼主还向做什么?
edrftgyh 2003-08-21
  • 打赏
  • 举报
回复
高手快来啊!
vc 抓屏程序,截取当前屏幕核心代码,为了操作和显示方便,这里为其增加了一套窗体,你只需在启动程序后在窗体的空白处点击右键,即可将当前屏幕的内容截取下来,并显示在窗体中,与QQ抓图十分相似,但要像QQ截图那样细致专业,还需要添加更多的辅助功能 ================================================================================ MICROSOFT 基础类库: Test 项目概述 =============================================================================== 应用程序向导已为您创建了此 Test 应用程序。此应用程序 不仅介绍了使用 Microsoft 基础类的基本知识, 而且是编写应用程序的起点。 此文件包含组成 Test 应用程序的每个文件的内容摘要。 Test.vcproj 这是使用“应用程序向导”生成的 VC 项目的主项目文件。 它包含有关生成文件的 Visual C 版本的信息,以及 有关用“应用程序向导”所选择的平台、配置和 项目功能的信息。 Test.h 这是应用程序的主头文件。 它包含其他 项目特定的头文件(包括 Resource.h),并声明 CTestApp 应用程序类。 Test.cpp 这是包含应用程序 类 CTestApp 的主应用程序源文件。 Test.rc 这是程序使用的所有 Microsoft Windows 资源 的列表。 它包含存储在 RES 子目录中 的图标、位图和光标。 可直接在 Microsoft Visual C 中编辑此文件。 项目资源包含在 2052 中。 res\Test.ico 这是一个图标文件,用作应用程序的图标。 此 图标包含在主资源文件 Test.rc 中。 res\Test.rc2 此文件包含不由 Microsoft Visual C 编辑的资源。 应将所有不能由 资源编辑器编辑的资源放在此文件中。 ///////////////////////////////////////////////////////////////////////////// 对于主框架窗口: 项目将包含标准的 MFC 界面。 MainFrm.h, MainFrm.cpp 这些文件包含框架类 CMainFrame,该类派生自 CFrameWnd 并控制所有的 SDI 框架功能。 res\Toolbar.bmp 此位图文件用于创建工具栏的平铺图像。 初始工具栏和状态栏在 CMainFrame 类中构造。 使用资源编辑器编辑此工具栏位图,并 更新 Test.rc 中的 IDR_MAINFRAME TOOLBAR 数组以添加 工具栏按钮。 ///////////////////////////////////////////////////////////////////////////// 应用程序向导将创建一种文档类型和一个视图: TestDoc.h、TestDoc.cpp - 文档 这些文件包含 CTestDoc 类。 编辑这些文件 以添加特殊的文档数据并实现文件的保存和加载 (通过 CTestDoc::Serialize)。 TestView.h、TestView.cpp - 文档视图 这些文件包含 CTestView 类。 CTestView 对象用于查看 CTestDoc 对象。 ///////////////////////////////////////////////////////////////////////////// 其他功能: ActiveX 控件 应用程序支持使用 ActiveX 控件。 打印支持和打印预览支持 应用程序向导已生成了一些代码,通过从 MFC 库调用 CView 类中的成员函数来 处理打印、打印设置和打印预览命令。 ///////////////////////////////////////////////////////////////////////////// 其他标准文件: StdAfx.h、StdAfx.cpp 这些文件用于生成名为 Test.pch 的预编译头文件 (PCH) 和名为 StdAfx.obj 的预编译类型文件。 Resource.h 这是标准头文件,它定义新资源 ID。 Microsoft Visual C 将读取并更新此文件。 ///////////////////////////////////////////////////////////////////////////// 其他说明: 应用程序向导使用“TODO:” 来指示 应添加或自定义的源代码部分。 如果应用程序在共享 DLL 中使用 MFC,且应用程序使用的语言不是 操作系统的当前语言,则需要从 Microsoft Visual C 光盘上 Win\System 目录下将相应的本地化资源 MFC70XXX.DLL 复制到计算机的 system 或 system32 目录下, 并将其重命名为 MFCLOC.DLL。 (“XXX”代表 语言缩写。 例如,MFC70DEU.DLL 包含翻译成 德语的资源。) 如果不这样做,应用程序的某些 UI 元素 将保留为操作系统的语言。 /////////////////////////////////////////////////////////////////////////////
我将带领大家来系统学习Windows的窗口编程,包括消息、窗口、GDI绘图、游戏开发等。本课程比较基础,非常适合初学者入门,读者可以边学习边实践。具体的章节目录和课程内容如下所示:---------------------------------------------Windows游戏编程系列之1:GUI界面编程及游戏入门实战1、Windows创建第一个窗口 WinMain入口函数 5进行Windows编程的调试手法 6窗口从哪里来? 7窗口编程的步骤 7窗口编程需要的主要结构 8窗口编程需要的主要API 92、Windows的窗口过程与消息机制 如何留住窗口? 121)Windows的消息与消息循环 142)消息处理函数与常用消息 17)Windows的窗口过程函数 19 3、GDI编程之设备上下文 1)GDI的通用编程框架 222)GDI的绘图步骤 253)GDI获取设备句柄 254、GDI编程之绘制几何图形 画点、线 28颜色COLORREF 29矩形 29画圆、饼图、弦图 305、GDI编程之自定义画笔画刷画笔简介 32画刷简介 33画笔案例 33画刷案例 346、GDI编程之绘制文字 DrawText函数 35TextOut 函数 (wingdi.h) 36CreateFont函数 37绘制文本案例 377、GDI编程之绘制位图 位图简介 381)在资源中添加位图资源 392)从资源中加载位图: LoadBitmap 393)创建一个与当前DC相匹配的DC(内存DC) 394)将bitmap放入匹配的DC中:SelectObject 405)成像(1:1 比例 ) 406)取出位图 407)释放位图 418)释放匹配的DC 41绘制位图案例 41   8、Windows鼠标键盘消息 一、键盘消息 421、键盘消息 422、消息参数: 423、消息的使用: 424、键盘消息的案例代码 43二、鼠标消息 441、基本鼠标消息 442、双击消息 443、滚轮消息 454、不响应双击消息 45 9、Windows定时器消息 定时器消息介绍 47创建定时器 47关闭定时器 47定时器消息案例代码 4810、GDI游戏之跳舞动画 11、GDI游戏之走路动画 12、GDI贪吃蛇游戏实战  

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧