day4 – CAD1 双缓冲绘图

编程入门 行业动态 更新时间:2024-10-15 10:20:18

day4 – CAD1 双缓冲绘图

day4 – CAD1 双缓冲绘图

文档的使用, GDI(graphics device interface), 对话框的使用

2.双缓冲

1) 什么时候绘制 WM_PAINT

WM_PAINT –> OnPaint –> OnDraw

2) 在哪里绘制 DC

BeginPaint/EndPaint CPaintDC 绘制区域不超过无效区

GetDC/ReleaseDC CClientDC 绘制区域为整个客户区

GetWindowDC/ReleaseDC CWindowDC 绘制区域为整个窗口

CreateCompatibleDC CDC 内存DC,绘制区域为内存

实例:屏幕截图

BitBlt – 将一个DC中的图片拷贝到另一个DC中

光栅操作

CDC dcSreen;dcSreen.CreateDC("DISPLAY", NULL, NULL, NULL);CRect rcClient;GetClientRect(&rcClient);

3) 如何绘制 – 双缓冲绘图法

响应消息:lbuttondown mousemove lbuttonup

绘制直线的api:MoveTo LineTo

鼠标移出窗口外仍然接受鼠标消息:SetCapture

不再接受窗口外的鼠标消息:ReleaseCapture

双缓冲的步骤:

  • \1. 创建内存(兼容)DC CreateCompatibleDC(pDC)
  • 2.创建兼容位图 CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height())
  • 3.将兼容位图选入内存DC SelectObject(&bmp)
  • 4.在内存DC中绘图
  • 5.将内存DC中的图片拷贝到窗口 pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &dcMem, 0, 0, SRCCOPY)

关于Cimage的截图,微软官方写的:

struct CaptureData
{
BOOL    bCaptureFullScreen;
char szCapturePath[MAX_PATH]; // no unicode path support
char szCaptureFilename[MAX_PATH];
};void WINAPI CaptureScreen(CaptureData* lpData)
{
ASSERT(lpData);
if (!lpData)
return;AFX_MANAGE_STATE(AfxGetStaticModuleState());BOOL bStat;
CImage image;
CWnd *pWnd;
CRect rect;
if (lpData->bCaptureFullScreen) {
pWnd = CWnd::GetDesktopWindow();
}
else {
pWnd = CWnd::GetActiveWindow();
}
ASSERT(pWnd);
if (pWnd == NULL)
return;CWindowDC  winDC(pWnd);
pWnd->GetWindowRect(rect);
int nBPP = winDC.GetDeviceCaps(BITSPIXEL) * winDC.GetDeviceCaps(PLANES);
if (nBPP < 24)
nBPP = 24;
bStat = image.Create(rect.Width(), rect.Height(), nBPP); //创建图像
ASSERT(bStat);
if (!bStat)
return;
CImageDC imageDC(image);  //将图像绘制到imageDC 中
::BitBlt(imageDC, 0, 0, rect.Width(), rect.Height(), winDC, 0, 0, SRCCOPY);
CString strTempName = GetTempName(CString(lpData->szCapturePath)); //保存为指定格式和路径中
HRESULT hr = image.Save(strTempName);
if (FAILED(hr)) {
TRACE("Couldn't Save File: %s, %x\n", (LPCTSTR)strTempName, hr);
return;
}
strncpy_s(lpData->szCaptureFilename, MAX_PATH, CT2A(::PathFindFileName(strTempName)), _TRUNCATE);
}
//获取文件名和路径
static CString GetTempName(CString strPath)
{
const int nMin = 0;
const int nMax = 999;
const CString strBase(_T("ScreenCap"));
static int nLastKnown = nMin;// count up sequentially to make sure we take the next available
// slot
if (strPath.Right(1) != "\\")
strPath += '\\';bool bFound = false;
CString strPathName;
while (!bFound) {
if (nLastKnown > nMax)
break;
strPathName = strPath + strBase;
strPathName.AppendFormat(_T("%03.3d.png"), nLastKnown++);
HANDLE hFile = ::CreateFile(strPathName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
::CloseHandle(hFile);
bFound = TRUE;
}
}
if (!bFound)
strPathName.Empty();
return(strPathName);
}

更多推荐

day4 – CAD1 双缓冲绘图

本文发布于:2024-03-05 17:48:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712966.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!