MFC第二十六天 CRgn类简介与开发、封装CMemoryDC类并应用开发

news2024/11/18 1:26:45

文章目录

  • CRgn类简介与开发
    • CRgn类简介
    • CRgn类区域管理开发
    • CRgn类区域管理与不规则形状的选取
  • 封装CMemoryDC类并应用开发
    • CMemoryDC.h
    • 封装CMemoryDC开发游戏透明动画
      • CFlashDlg.h
      • CFlashDlg.cpp
    • 封装CMemoryDC开发游戏动画
  • 附录
    • 四大窗口CDC派生类

CRgn类简介与开发

CRgn类简介

CRgn类是MFC(Microsoft Foundation Classes)中的一个图形区域类。该类用于创建和操作图形区域,可以表示各种形状的区域,如矩形、椭圆、多边形等。

class CRgn : public CGdiObject
{
public:
	static CRgn* PASCAL FromHandle(HRGN hRgn);
	operator HRGN() const;

// 封装的特点是没有使用Overload重载函数,结构体就是XXXIndirect
	CRgn();
//创建矩形区域
	BOOL CreateRectRgn(int x1, int y1, int x2, int y2);
	BOOL CreateRectRgnIndirect(LPCRECT lpRect);
//创建圆形区域
	BOOL CreateEllipticRgn(int x1, int y1, int x2, int y2);
	BOOL CreateEllipticRgnIndirect(LPCRECT lpRect);
//多边形
	BOOL CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode);
	BOOL CreatePolyPolygonRgn(LPPOINT lpPoints, LPINT lpPolyCounts,
			int nCount, int nPolyFillMode);
//圆角矩形
	BOOL CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3);
//
	BOOL CreateFromPath(CDC* pDC);
	BOOL CreateFromData(const XFORM* lpXForm, int nCount,
		const RGNDATA* pRgnData);

// 修改矩形
	void SetRectRgn(int x1, int y1, int x2, int y2);
	void SetRectRgn(LPCRECT lpRect);
//混合
	int CombineRgn(const CRgn* pRgn1, const CRgn* pRgn2, int nCombineMode);
	int CopyRgn(const CRgn* pRgnSrc);
//判断区域完全一样
	BOOL EqualRgn(const CRgn* pRgn) const;
//判断一个点是否在区域内
	BOOL PtInRegion(int x, int y) const;
	BOOL PtInRegion(POINT point) const;
//保持形状不变偏移
	int OffsetRgn(int x, int y);
	int OffsetRgn(POINT point);
//框图
	int GetRgnBox(LPRECT lpRect) const;
	
	BOOL RectInRegion(LPCRECT lpRect) const;
	int GetRegionData(LPRGNDATA lpRgnData, int nCount) const;

// Implementation
	virtual ~CRgn();
};
CRgn类的混合功能:
int CombineRgn(    CRgn* pRgn1,    CRgn* pRgn2,    int nCombineMode  );

RGN_AND   交集
RGN_COPY   拷贝
RGN_DIFF 不同
RGN_OR   并集
RGN_XOR   异或

CRgn类区域管理开发

CRgnDlg.h

#pragma once
class CCRgnDlg : public CDialogEx
{
// 构造
	CDC m_dc;
	CRect m_rect;
}

CRgnDlg.cpp

BOOL CCRgnDlg::OnInitDialog(){
	CDialogEx::OnInitDialog();
	CBitmap bmp;
	bmp.LoadBitmap(IDB_LOGO);
	
	BITMAP bm;
	bmp.GetBitmap(&bm);
	m_rect.SetRect(0,0, bm.bmWidth,bm.bmHeight );
	
	m_dc.CreateCompatibleDC(NULL);
	m_dc.SelectObject(&bmp);
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
//透明 一个去掉不要的区域进行显示  透明度(半透明)
void CCRgnDlg::OnPaint(){
	CPaintDC dc(this); // 用于绘制的设备上下文	
	CRgn rgn;  //输出区域管理  
	dc.FillSolidRect(CRect(10, 10, 700, 400), RGB(0, 255, 0)); //填充了一块背景区域
	CRect rect;
	rect = m_rect;
	rect.OffsetRect(50, 0);
	
	//rgn.CreateEllipticRgn(0, 0, m_rect.right, m_rect.bottom); //圆形区域管理
	rgn.CreateEllipticRgn(rect.left,rect.top, rect.right, rect.bottom);
	dc.SelectObject(&rgn);
	//dc.BitBlt(0, 0, m_rect.right, m_rect.bottom, &m_dc, 0, 0, SRCCOPY); //对图片的空白区域操作
	dc.BitBlt(50, 0, m_rect.Width(), m_rect.Height(), &m_dc, 0, 0, SRCCOPY);
}

在这里插入图片描述

CircleRgnDlg.h

#pragma once
class CCircleRgnDlg : public CDialogEx
{
// 构造
	CDC m_dc;
	CRect m_rect;
public:
	afx_msg LRESULT OnNcHitTest(CPoint point);
};

CircleRgnDlg.cpp

BOOL CCircleRgnDlg::OnInitDialog(){
	CDialogEx::OnInitDialog();
	CBitmap bmp;
	bmp.LoadBitmap(IDB_LOGO);
	BITMAP bm;
	bmp.GetBitmap(&bm);
	m_rect.SetRect(0, 0, bm.bmWidth, bm.bmHeight);
	SetWindowPos(NULL, 0, 0, m_rect.Width(), m_rect.Height(), SWP_NOMOVE | SWP_NOZORDER);
	m_dc.CreateCompatibleDC(NULL);
	m_dc.SelectObject(&bmp);
	CRgn rgn;
	rgn.CreateEllipticRgnIndirect(m_rect);
	SetWindowRgn(rgn, FALSE);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CCircleRgnDlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	dc.BitBlt(0, 0, m_rect.right, m_rect.bottom, &m_dc, 0, 0, SRCCOPY);
}

LRESULT CCircleRgnDlg::OnNcHitTest(CPoint point)
{
	return HTCAPTION;
}

在这里插入图片描述

CRgn类区域管理与不规则形状的选取

CCircleRgnDlg.h

class CCircleRgnDlg : public CDialogEx
{
// 构造
	CDC m_dc;
	CRect m_rect;
public:
	afx_msg LRESULT OnNcHitTest(CPoint point);
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};

CCircleRgnDlg.cpp

BOOL CCircleRgnDlg::OnInitDialog(){
	CDialogEx::OnInitDialog();
	CBitmap bmp;
	bmp.LoadBitmap(IDB_LOGO);
	BITMAP bm;
	bmp.GetBitmap(&bm);
	m_rect.SetRect(0, 0, bm.bmWidth, bm.bmHeight);
	SetWindowPos(NULL, 0, 0, m_rect.Width(), m_rect.Height(), SWP_NOMOVE | SWP_NOZORDER);
	m_dc.CreateCompatibleDC(NULL);
	m_dc.SelectObject(&bmp);
	/*CRgn rgn;
	rgn.CreateEllipticRgnIndirect(m_rect);
	SetWindowRgn(rgn, FALSE);*/
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
//CRgn r, r1, r2;
//r.CreateEllipticRgn(20, 20, 500, 400);
//dc.SelectObject(&r);
//dc.BitBlt(0, 0, m_rect.right, m_rect.bottom, &m_dc, 0, 0, SRCCOPY);
//
//POINT pts[] = { {482,192},{568,302},{322,538},{123,357},{251,192},{360,320} };
//r1.CreatePolygonRgn(pts, _countof(pts), ALTERNATE);
//
//r2.CreateRectRgn(0, 0, 0, 0);
//
//r2.CombineRgn(&r, &r1, RGN_AND);
//r2.CombineRgn(&r, &r1, RGN_XOR);
//dc.SelectObject(&r2);
//dc.BitBlt(0, 0, m_rect.right, m_rect.bottom, &m_dc, 0, 0, SRCCOPY);
void CCircleRgnDlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	CRgn r,r1;
	r.CreateEllipticRgn(20, 20, 500, 400);
 
	POINT pts[] = {{482,192},{568,302},{322,538},{123,357},{251,192},{360,320}};
	r1.CreatePolygonRgn(pts, _countof(pts), ALTERNATE);
	r.CombineRgn(&r, &r1, RGN_XOR);
	dc.SelectObject(&r);

	CRect rect;
	r.GetRgnBox(rect);//框图要考虑如何恢复到之前图

	dc.BitBlt(0, 0, m_rect.right, m_rect.bottom, &m_dc, 0, 0, SRCCOPY); 
	BITMAP bm;
	dc.GetCurrentBitmap()->GetBitmap(&bm); //获取当前选中的位图对象,并将其信息存储在bm结构中。
	r.DeleteObject();
	r.CreateRectRgn(0, 0, bm.bmWidth, bm.bmHeight);
	dc.SelectObject(&r);
	dc.SelectStockObject(NULL_BRUSH); //绘制图形时使用的画刷对象设置为无画刷,即不填充图形
	dc.Rectangle(rect);
}
void CCircleRgnDlg::OnLButtonDown(UINT nFlags, CPoint point){ 
	CRgn r, r1, r2;
	r.CreateEllipticRgn(20, 20, 500, 400);

	POINT pts[] = { {482,192},{568,302},{322,538},{123,357},{251,192},{360,320} };
	r1.CreatePolygonRgn(pts, _countof(pts), ALTERNATE);
	r.CombineRgn(&r, &r1, RGN_XOR);
 
	if (r.PtInRegion(point))
	{
		AfxMessageBox(_T("你选择了"));
	}
	CDialogEx::OnLButtonDown(nFlags, point);
}

在这里插入图片描述

封装CMemoryDC类并应用开发

CMemoryDC.h

/* 内存DC类简介:
1、BOOL LoadBitmap(UINT nBitmapID,CDC* pDC = NULL)	 从资源中按照,按位图ID加载位图
2、BOOL LoadFile(LPCTSTR sFile, CDC* pDC = NULL)	从exe外部加载图片(调用LoadImage)
3、BOOL Create(int cx, int cy, CDC* pDC = NULL)		创建空白位图(默认是全黑)

4、总共有4种构造函数,包含以上3种还有空构造:
CMemoryDC(UINT nBitmapID)//从资源按照位图编号来加载
CMemoryDC(LPCTSTR sFile, CDC* pDC = NULL)//从exe外部加载
CMemoryDC(int cx, int cy, CDC* pDC=NULL)//指定高宽创建空白位图

5、void MakeRgn(CRgn& r,COLORREF col)				生成透明区域
6、int GetWidth() const		int GetHeight() const	方便地获取图片高宽:
7、透明显示:BitTrans和StrecthTrans		*/
#pragma once
#include "resource.h"
class CMemoryDC :public CDC{
	CSize m_size;
public:
	CMemoryDC();
	int GetWidth() const{
		return m_size.cx;
	}
	int GetHeight() const{
		return m_size.cy;
	}
	CSize GetSize() const	{
		return m_size;
	}
	void BitTrans(
		int nXDest,		// 目标起点X
		int nYDest,		// 目标起点Y
		int nWidthDest,	// 目标宽度
		int nHeightDest,// 目标高度
		CDC* pDC,		// 目标DC
		int nXSrc,		// 来源起点X
		int nYSrc,		// 来源起点Y
		COLORREF crTrans// 透明色
	)
	{
		CMemoryDC dcImage(nWidthDest, nHeightDest, pDC);//临时DC
		CBitmap bmpMask;
		bmpMask.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);       // 创建单色掩码位图
		CDC dcMask;//掩码DC 
		dcMask.CreateCompatibleDC(pDC);
		dcMask.SelectObject(bmpMask);
		//将载入位图的内存DC中的位图,拷贝到临时DC中
		dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, SRCCOPY);

		// 设置临时DC的透明色
		dcImage.SetBkColor(crTrans);
		//掩码DC的透明区域为白色其它区域为黑色
		dcMask.BitBlt(0, 0, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCCOPY);

		//临时DC透明区域为黑色,其它区域保持不变
		dcImage.SetBkColor(RGB(0, 0, 0));
		dcImage.SetTextColor(RGB(255, 255, 255));
		dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND);

		// 目标DC透明部分保持屏幕不变,其它部分变成黑色
		pDC->SetBkColor(RGB(255, 255, 255));
		pDC->SetTextColor(RGB(0, 0, 0));
		pDC->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND);
		pDC->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCPAINT);
	}
	void StretchTrans(
		int nXDest,			// 目标起点X
		int nYDest,			// 目标起点Y
		int nWidthDest,     // 目标宽度
		int nHeightDest,    // 目标高度
		CDC* pDC,			// 目标DC
		int nXSrc,			// 来源起点X
		int nYSrc,			// 来源起点Y
		int nWidthSrc,		// 来源宽度
		int nHeightSrc,		// 来源高度
		COLORREF crTrans	// 透明色
	)
	{
		CMemoryDC dcImage(nWidthDest, nHeightDest, pDC);//临时DC
		CBitmap bmpMask;
		// 创建单色掩码位图
		bmpMask.CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);
		CDC dcMask;
		dcMask.CreateCompatibleDC(pDC);
		dcMask.SelectObject(bmpMask);

		// 将载入位图的内存DC中的位图,拷贝到临时DC中
		if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
			dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, this, nXSrc, nYSrc, SRCCOPY);
		else
			dcImage.StretchBlt(0, 0, nWidthDest, nHeightDest,
				this, nXSrc, nYSrc, nWidthSrc, nHeightSrc, SRCCOPY);

		// 设置临时DC的透明色
		dcImage.SetBkColor(crTrans);
		//掩码DC的透明区域为白色其它区域为黑色
		dcMask.BitBlt(0, 0, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCCOPY);

		//临时DC透明区域为黑色,其它区域保持不变
		dcImage.SetBkColor(RGB(0, 0, 0));
		dcImage.SetTextColor(RGB(255, 255, 255));
		dcImage.BitBlt(0, 0, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND);

		// 目标DC透明部分保持屏幕不变,其它部分变成黑色
		pDC->SetBkColor(RGB(255, 255, 255));
		pDC->SetTextColor(RGB(0, 0, 0));
		pDC->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcMask, 0, 0, SRCAND);
		pDC->BitBlt(nXDest, nYDest, nWidthDest, nHeightDest, &dcImage, 0, 0, SRCPAINT);
	}
	BOOL Create(int cx, int cy, CDC* pDc = NULL){	//创建空位图
		if (!CreateCompatibleDC(NULL))
			return FALSE;
		CBitmap bmp;
		if (pDc)	{
			if (!bmp.CreateCompatibleBitmap(pDc, cx, cy)) {
				DeleteDC();
				return FALSE;		}}
		else{
			if (!bmp.CreateCompatibleBitmap(&CClientDC(NULL), cx, cy)){
				DeleteDC();
				return FALSE;	}}
		this->SelectObject(&bmp);
		m_size.SetSize(cx, cy);
		return TRUE;	}
	BOOL LoadFile(LPCTSTR sFile, CDC* pDC = NULL){	//加载一张exe外部位图
		HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, sFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
		if (!hBitmap)
			return FALSE;	
		if (!CreateCompatibleDC(NULL)){
			DeleteObject(hBitmap);
			return FALSE;
		}
		SelectObject(hBitmap);
		BITMAP bm;
		GetObject(hBitmap, sizeof(bm), &bm);
		m_size.SetSize(bm.bmWidth, bm.bmHeight);
		DeleteObject(hBitmap);
		return TRUE;
	}
	BOOL LoadBitmap(UINT nBitmapID, CDC* pDC = NULL)	//加载一张资源位图
	{
		if (!CreateCompatibleDC(NULL))
			return FALSE;
		CBitmap bmp;
		if (!bmp.LoadBitmap(nBitmapID)){
			DeleteDC();
			return FALSE;
		}
		SelectObject(&bmp);
		BITMAP bm;
		bmp.GetBitmap(&bm);
		m_size.SetSize(bm.bmWidth, bm.bmHeight);
		return TRUE;
	}
	CMemoryDC(UINT nBitmapID)
	{
		LoadBitmap(nBitmapID);
	}
	CMemoryDC(LPCTSTR sFile,CDC* pDC = NULL)
	{
		LoadFile(sFile, pDC);
	}
	CMemoryDC(int cx,int cy,CDC* pDC=NULL)
	{
		Create(cx, cy, pDC);
	}
	void MakeRgn(CRgn& r, COLORREF col){
		r.CreateRectRgn(0, 0, 0, 0);
		int i = -1, cx = m_size.cx;
		int j = -1, cy = m_size.cy;
		while (++j<cy)	{
			i = -1;
			while (++i<cx){
				if (GetPixel(i, j) != col)	{
					CRgn r1;
					r1.CreateRectRgn(i, j, i + 1, j + 1); //1*1像素
					r.CombineRgn(&r, &r1, RGN_OR);
				}
			}
		}
	}};

封装CMemoryDC开发游戏透明动画

CFlashDlg.h

#pragma once
#include "CMemoryDC.h"
class CCFlashDlg : public CDialogEx{
	//二维动画 不停的切换7张图, x y方向不断地移动
	int m_nIndex{}; //第几张图片
	CPoint m_pos{}, m_dir{ 5,5 };//m_pos偏移位置 m_dir每次运动5,5
	enum {Fly_nCount =7}; //图片总数
	CMemoryDC m_dcBack{_T("./res/back.bmp")}; //背景图片
	CMemoryDC m_dcFlys[Fly_nCount]; //蝴蝶
	CRgn m_rs[Fly_nCount]; //取出背景颜色
	void LoadPictures();
	
public:
	afx_msg void OnTimer(UINT_PTR nIDEvent);
};

CFlashDlg.cpp

#include "pch.h"
#include "framework.h"
#include "CFlash.h"
#include "CFlashDlg.h"
#include "afxdialogex.h"
void CCFlashDlg::LoadPictures(){
	int i = -1;
	CString str;
	while (++i<_countof(m_dcFlys))
	{
		str.Format(_T("./res/%03d.bmp"), i + 1);
		m_dcFlys[i].LoadFile(str);
		m_dcFlys[i].MakeRgn(m_rs[i],0x00ff00ff);
	}
}
BOOL CCFlashDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	
	int cx = GetSystemMetrics(SM_CXSCREEN);
	int cy = GetSystemMetrics(SM_CYSCREEN);
	  
	SetWindowPos(NULL, 0, 0, cx/2, cy/2, SWP_NOZORDER);

	LoadPictures();
	SetTimer(1, 16, NULL);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CCFlashDlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	CRect rect;
	GetClientRect(rect);
	dc.SetStretchBltMode(STRETCH_HALFTONE);
	dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &m_dcBack, 0, 0, m_dcBack.GetWidth(), m_dcBack.GetHeight(), SRCCOPY);
	
	CMemoryDC mdc(200,180); //创建默认的黑色
	if (mdc.GetSafeHdc())
		dc.BitBlt(200, 150, 200, 180, &mdc, 0, 0, SRCCOPY);

	//CRgn r;
	//r.CreateRectRgn(0, 0, 0, 0); //基址
	//r.CopyRgn(m_rs+m_nIndex);  //往那个跑先复制出来 不要破坏它 形状
	//r.OffsetRgn(m_pos); //你要输出到那个位置
	//dc.SelectObject(&r);
	//dc.BitBlt(m_pos.x, m_pos.y, m_dcFlys->GetWidth(),m_dcFlys->GetHeight(), m_dcFlys + m_nIndex, 0, 0,SRCCOPY);
	auto pDC = m_dcFlys + m_nIndex; //等价于 :&m_dcFlys[m_nIndex]
	pDC->BitTrans(m_pos.x, m_pos.y, pDC->GetWidth(), pDC->GetHeight(), &dc, 0, 0, 0xff00ff);

	if (++m_nIndex >= Fly_nCount)
		m_nIndex = 0 ;

	if (m_pos.x + m_dcFlys->GetWidth() > rect.right || m_pos.x < 0)
		m_dir.x *= -1;
	if (m_pos.y + m_dcFlys->GetHeight() > rect.bottom || m_pos.y < 0)
		m_dir.y *= -1;
}
void CCFlashDlg::OnTimer(UINT_PTR nIDEvent)
{
	m_pos.Offset(m_dir);
	Invalidate(FALSE);
	CDialogEx::OnTimer(nIDEvent);
}

在这里插入图片描述

封装CMemoryDC开发游戏动画

QQDlg.h

#pragma once
#include "CMemoryDC.h"
class CQQDlg : public CDialogEx
{
	CPoint m_pos{}, m_dir{ 5,5 }; 
   
	enum { Fly_nCount = 7 }; //图片总数
 
	CMemoryDC m_dcFlys[Fly_nCount]; //蝴蝶
	CRgn m_rs[Fly_nCount];  
	int m_nIndex{ 0 };
public:
	afx_msg void OnTimer(UINT_PTR nIDEvent);
};

QQDlg.cpp

BOOL CQQDlg::OnInitDialog(){
	CDialogEx::OnInitDialog();
	int i = -1;
	while (++i < _countof(m_dcFlys)){
		m_dcFlys[i].LoadBitmap(IDB_FLY1 + i);
		m_dcFlys[i].MakeRgn(m_rs[i], 0xff00ff);
	}
	SetTimer(1, 16, NULL);
	CRgn r;
	r.CreateRectRgn(0, 0, 0, 0);
	r.CopyRgn(&m_rs[m_nIndex]);
	SetWindowRgn(r, FALSE);
	SetWindowPos(NULL, m_pos.x, m_pos.y, m_dcFlys->GetWidth(), m_dcFlys->GetHeight(), SWP_NOZORDER);
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CQQDlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文
	int cx = m_dcFlys->GetWidth();
	int cy = m_dcFlys->GetHeight();
	dc.BitBlt(0, 0, cx, cy, &m_dcFlys[m_nIndex], 0, 0, SRCCOPY);
	if (++m_nIndex >= _countof(m_dcFlys))
	{
		m_nIndex = 0;
	}
}

void CQQDlg::OnTimer(UINT_PTR nIDEvent){
	CDialogEx::OnTimer(nIDEvent);
	CRgn r;
	r.CreateRectRgn(0, 0, 0, 0);
	r.CopyRgn(&m_rs[m_nIndex]);
	SetWindowRgn(r,FALSE);	 //不这样的话到第七帧的时候就会出来阴影
	Invalidate(FALSE);
	SetWindowPos(NULL, m_pos.x, m_pos.y,0,0, SWP_NOZORDER | SWP_NOSIZE);
	m_pos.Offset(m_dir);
	int cx = GetSystemMetrics(SM_CXSCREEN);
	int cy = GetSystemMetrics(SM_CYSCREEN);
	if (m_pos.x + m_dcFlys->GetWidth() > cx || m_pos.x < 0)
		m_dir.x *= -1;
	if (m_pos.y + m_dcFlys->GetHeight() > cy || m_pos.y < 0)
		m_dir.y *= -1;		}

在这里插入图片描述

附录

四大窗口CDC派生类

CPaintDC,CClientDC,CWindowDC,CMemoryDC类
CBitmap对象创建后,默认所有像素都是黑色,0x00000000四个字节一个像素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Meta开源Llama 2免费大语言模型,媲美ChatGPT,可在线试玩

Llama 2是Llama 1模型的升级版本,引入了一系列预训练和微调 LLM,参数量范围从7B到70B (7B、13B、70B)。其预训练模型比 Llama 1模型有了显著改进,包括训练数据的总词元数增加了 40%、上下文长度更长 (4k 词元),以及利用了分组查询注意力机制来加速 70B模型的推理! 但最激动…

PSO粒子群优化算法

PSO粒子群优化算法 算法思想matlab代码python代码 算法思想 粒子群算法&#xff08;Particle Swarm Optimization&#xff09; 优点: 1&#xff09;原理比较简单&#xff0c;实现容易&#xff0c;参数少。 缺点: 1&#xff09;易早熟收敛至局部最优、迭代后期收敛速度慢的…

【逗老师的PMP学习笔记】项目的运行环境

一、影响项目运行的因素 主要分两种因素 事业环境因素&#xff08;更多的是制约和限制因素&#xff09;组织过程资产&#xff08;可以借鉴的经验和知识&#xff09; 1、细说事业环境因素&#xff08;更多的是制约和限制因素&#xff09; 资源可用性 例如包括合同和采购制约…

代码随想录算法训练营第三十三天 | Leetcode随机抽题检测

Leetcode随机抽题检测 70 爬楼梯未看解答自己编写的青春版重点题解的代码日后复习重新编写 118 杨辉三角未看解答自己编写的青春版重点题解的代码日后复习重新编写 198 打家劫舍未看解答自己编写的青春版重点题解的代码日后复习重新编写 279 完全平方数未看解答自己编写的青春版…

WPF上位机7——MySql

MySql DML语句 db操作、表操作 字段的数据类型 修改表 表的数据操作 DQL语句 数据查询和去重查询 条件查询 模糊查询 聚合查询 分组查询 排序查询 分页查询 DCL语句 函数 字符串处理函数 数值函数 日期函数 流程函数 约束 外键约束 多表查询 内连接 外连接 自连接 子查询 列…

JavaScript-DOM

目录 DOM 访问节点 节点信息 操作节点 DOM DOM&#xff1a;Document Object Model&#xff08; 文档对象模型&#xff09; 访问节点 使用 getElement系列方法访问指定节点 getElementById()、getElementsByName()、getElementsByTagName()根据层次关系访问节点 节点属性 属…

面向对象程序三大特性一:继承(超详细)

目录 1.继承基本介绍 2.继承关系中的成员访问 2.1就近原则 2.2继承关系中的构造方法 3.super和this 4.代码块和构造方法的执行顺序 4.1在没有继承关 系时的执行顺序。 4.2继承关系上的执行顺序 5.protected的 范围 6.继承的本质分析(重要) 7.final 关键字 1.继承基本…

《动手学深度学习》-64注意力机制

沐神版《动手学深度学习》学习笔记&#xff0c;记录学习过程&#xff0c;详细的内容请大家购买书籍查阅。 b站视频链接 开源教程链接 注意力机制 生物学中的注意力提示 灵长类动物的视觉系统接受了大量的感官输入&#xff0c;这些感官输入远远超出了大脑所能够完全处理的能力…

vue 标题文字字数过长超出部分用...代替 动态显示

效果: 浏览器最大化: 浏览器缩小: 代码: html: <div class"title overflow">{{item.name}}</div> <div class"content overflow">{{item.content}}</div> css: .overflow {/* 一定要加宽度 */width: 90%;/* 文字的大小 */he…

台风来袭,这份避险防御指南一定收好

台风天气的到来&#xff0c;我们必须高度警惕&#xff01;大到暴雨、雷电、雷雨大风&#xff0c;甚至短时强降水等强对流天气&#xff0c;可能给我们的生活带来严重威胁。为了确保家人安全&#xff0c;让我们共同学习一些智慧防护措施&#xff0c;做好个人安全防范。定期关注天…

C++初阶之一篇文章让你掌握vector(理解和使用)

vector&#xff08;理解和使用&#xff09; 1.什么是vector&#xff1f;2.vector的使用2.1 vector构造函数2.2 vector迭代器&#xff08;Iterators&#xff09;函数2.2.1 begin()2.2.2 end()2.2.3 rbegin()2.2.4 rend()2.2.5 cbegin()、cend()、crbegin()和crend() C11 2.3 vec…

Java类集框架(二)

目录 1.Map&#xff08;常用子类 HashMap&#xff0c;LinkedHashMap&#xff0c;HashTable&#xff0c;TreeMap&#xff09; 2.Map的输出&#xff08;Map.Entry,iterator,foreach&#xff09; 3.数据结构 - 栈&#xff08;Stack&#xff09; 4.数据结构 - 队列&#xff08;Q…

485modbus转profinet网关连三菱变频器modbus通讯触摸屏监控

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式&#xff0c;使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关&#xff0c;用户可以有效地管理和监控设备&#xff0c;从…

人工智能与物理学(软体机器人能量角度)的结合思考

前言 好久没有更新我的CSDN博客了&#xff0c;细细数下来已经有了16个月。在本科时期我主要研究嵌入式&#xff0c;研究生阶段对人工智能感兴趣&#xff0c;看了一些这方面的论文和视频&#xff0c;因此用博客记录了一下&#xff0c;后来因为要搞自己的研究方向&#xff0c;就…

使用Golang实现一套流程可配置,适用于广告、推荐系统的业务性框架——组合应用

在《使用Golang实现一套流程可配置&#xff0c;适用于广告、推荐系统的业务性框架——简单应用》中&#xff0c;我们看到了各种组合Handler的组件&#xff0c;如HandlerGroup和Layer。这些组件下面的子模块又是不同组件&#xff0c;比如LayerCenter的子组件是Layer。如果此时我…

Windows用户如何将cpolar内网穿透配置成后台服务,并开机自启动?

Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f; 文章目录 Windows用户如何将cpolar内网穿透配置成后台服务&#xff0c;并开机自启动&#xff1f;前置准备&#xff1a;VS Code下载后&#xff0c;默认安装即可VS CODE切换成中文语言 1. 将…

FSC 认证产品门户网站正式上线

【FSC 认证产品门户网站正式上线】 FSC 国际正式推出自助式服务平台——FSC认证产品门户网站。FSC 证书持有者均可通过该平台自行添加企业或组织的 FSC 认证产品&#xff0c;寻求更多商机&#xff1b;也可通过该门户申请参与亚马逊气候友好项目&#xff08;Amazon Climate-Frie…

低代码平台,让应用开发更简单!

一、前言 随着社会数字化进程的加速&#xff0c;旺盛的企业个性化需求和有限的专业开发人员供给之间的矛盾日益显著&#xff0c;业界亟需更快门槛、更高效率的开发方法和工具&#xff0c;低代码技术便应运而生。 低代码开发&#xff0c;是通过编写少量代码甚至无需代码&#xf…

作为一个老程序员,想对新人说什么?

前言 最近知乎上&#xff0c;有一位大佬邀请我回答下面这个问题&#xff0c;看到这个问题我百感交集&#xff0c;感触颇多。 在我是新人时&#xff0c;如果有前辈能够指导方向一下&#xff0c;分享一些踩坑经历&#xff0c;或许会让我少走很多弯路&#xff0c;节省更多的学习的…

Vue3文本省略(Ellipsis)

APIs 参数说明类型默认值必传maxWidth文本最大宽度number | string‘100%’falseline最大行数numberundefinedfalsetrigger展开的触发方式‘click’undefinedfalsetooltip是否启用文本提示框booleantruefalsetooltipMaxWidth提示框内容最大宽度&#xff0c;单位px&#xff0c;…