MFC-GUI绘图相关摘要

1、获取绘图设备DC,HDC

	CWnd* cWnd = AfxGetApp()->m_pMainWnd = AfxGetMainWnd();
	HWND hWnd = cWnd->m_hWnd = cWnd->GetSafeHwnd();
	CDC * p_cdc = cWnd->GetDC();//一般获取cdc的用法,临时型的,刷新就没了
	CDC * m_cdc;m_cdc->CreateCompatibleDC(p_cdc);//缓冲区DC
	CPaintDC  cpdc(cWnd);//只能用在OnPaint方法里,只是客户区OnPaint
    CClientDC ccdc(cWnd);//绘制客户区,也是临时的,刷新就没了
	CWindowDC *wdc = (CWindowDC*)cWnd->GetWindowDC();// 绘制整个窗口OnNcPaint
	HDC hdc = p_cdc->GetSafeHdc();
	ReleaseDC(dc);// 释放获取的绘图设备,CPaintDC不需要释放,GetDC后必须ReleaseDC
	dc->DeleteDC();// 删除DC,除非你自己Create的,否则不允许你删除
	dc->Detach(); // 分离DC,而不删除,Attach后,必须Detach

2、坐标刷新相关

	// 获取绘图设备的区域
	CRect rect;
	GetWindowRect(rect);//获取整个窗口的区域
	GetClientRect(rect);// 获取客户区的区域
	// 强制刷新客户区OnPaint,带NULL,全屏刷新
	InvalidateRect();//TRUE表示背景覆盖
	Invalidate();//上面函数带NULL的效果
	// 坐标系转化
	ScreenToClient();//屏幕坐标转化成客户区
	ClientToScreen();//客户区坐标转化成屏幕
	// 选择系统GDI对象
	dc->GetStockObject(NULL_BRUSH);

3、颜色COLORREF,GetB(R|G)Value获取单通道色

	COLORREF rgb,rgba,rgbold;
	rgb    = RGB(255,0,0);			 //三原色
	rgba   = RGBA(255,0,0,0.5); 	 // 三原色+透明度
	COLORREF cr = GetSysColor(COLOR_BTNFACE);//获取系统颜色
	rgbold = SetBkColor(hdc,rgb); 	 // 设置绘图设备文字的背景色
	rgbold = p_cdc->SetBkColor(rgb); // 设置绘图设备文字的背景色
	dc->SetBkMode(TRANSPARENT); // 设置绘图设备文字的背景为无色透明
	dc->SetTextColor();// 设置文字的颜色
	dc->FillSolidRect(rect, RGB(255,0,0));//为绘图设备填充背景色

4、画笔CPen 及 HPEN

	CPen *pen = new CPen(PS_SOLID, 5, rgb);//构造画笔分别是样式,宽度,颜色
	pen->CreatePen(PS_SOLID, 5, rgb); // 创造画笔,记得DeleteObject
	pen->FromHandle(hpen);
	CPen *oldpen = p_cdc->SelectObject(pen);
	pen.DeleteObject();
	CreateFontIndirect();//把详细信息LogPen转化成CPen
	GetLogPen();//把CPen转化成LogPen,其他object也是一样

5、字体

	LOGFONT lf; // 字体结构体
	memset(&lf,0,sizeof(LOGFONT));//初始化,分配内存
	_tcscpy_s(lf.lfFaceName, LF_FACESIZE,_T("Consolas"));//设置字体类型
	lf.lfItalic = TRUE; // 斜体
	lf.lfUnderline = TRUE; // 字体下划线
	lf.lfHeight = 100; // 字体高度,单位像素
	lf.lfWidth = 50; // 字体宽度
	lf.lfWeight = FW_BOLD; // 字体的重量,加粗
	CFont ft; //字体对象
	ft.CreateFontIndirect(&lf); // 根据字体结构体创建对象
	CFont font;
	font.CreatePointFont(200, L"Consolas");//简单创建
	CFontDialog fontDlg(&lf); // 可以通过界面改变字体内容
	CFont * oldft = p_cdc->SelectObject(&ft); // 载入字体
	p_cdc->SetTextColor(fontDlg.GetColor()); // 设置字体颜色
	p_cdc->TextOutW(100,300,_T("Hello World")); // 绘制字体

6、位图CBitmap

	CBitmap bmp,bmp_oem,bmp_map,bmp_crt,bmp_cpb;
	bmp.LoadBitmapW(IDB_BITMAP1); // 加载普通位图
	bmp_oem.LoadOEMBitmap(OBM_CHECK); // 加载系统默认位图
	bmp_map.LoadMappedBitmap(IDB_BITMAP1); // 加载映射系统的位图资源
	bmp_crt.CreateBitmap(100, 200,100,200,NULL); // 创建位图
	bmp_cpb.CreateCompatibleBitmap(&ccdc,100,200); // 创建兼容绘图设备的位图

7、画刷CBrush

	CBrush bs, bs_bmp,bs_hatch,bs_sys;
	bs.CreateSolidBrush(RGB(255,0,0)); // 实心画刷
	bs_hatch.CreateHatchBrush(HS_CROSS, RGB(255, 0, 0)); // 带阴影画刷
	bs_bmp.CreatePatternBrush(&bmp); // 位图画刷
	bs_sys.CreateSysColorBrush(COLOR_WINDOW); // 系统颜色画刷
	CBrush * oldbs = dc->SelectObject(&bs_sys); // 载入画刷
	dc->Rectangle(CRect(50,50,100,200)); // 画一个矩形

8、双缓冲绘图

	CBitmap * oldbmp = m_cdc.SelectObject(&bmp_cpb);
	dc->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &m_cdc, 0, 0, SRCCOPY);
	dc->StretchBlt(rc.left, rc.top, rc.Width(), rc.Height(), &m_cdc, 0, 0,100,100, SRCCOPY);



你可能感兴趣的:(MFC-GUI绘图相关摘要)