c++ mfc BitBlt 绘图

本文详细介绍了Windows绘图API中的几个关键函数,包括如何通过LoadBitmap加载位图资源,并利用BitBlt进行位图的绘制转移,同时展示了如何使用SelectObject函数选择绘图对象。这些函数在图形用户界面开发中起着重要作用。

1.运行结果 

2.关键代码

//主窗口DC
HDC whShowPointDlgDC;
HDC whMemShowPoint1;

// CMFCApplication19Dlg 消息处理程序

BOOL CMFCApplication19Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 系统生成的代码这里未体现。。。。。。。。。。。。。

	// TODO: 在此添加额外的初始化代码
	//标志点
	HBITMAP nBitMapShowPoint;

	//取得界面DC
	whShowPointDlgDC = (HDC)::GetDC(this->m_hWnd);

	//标志点
	nBitMapShowPoint = LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP4));
	whMemShowPoint1 = ::CreateCompatibleDC(whShowPointDlgDC);
	::SelectObject(whMemShowPoint1, nBitMapShowPoint);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

 

void CMFCApplication19Dlg::OnBnClickedButton1()
{
	BitBlt(whShowPointDlgDC, 48, 60, 18, 18, whMemShowPoint1, 352, 70, SRCCOPY);//绿色	
}

3. api说明

3.1.Bitblt()

Bitblt作用将某一内存块的数据传送到另一内存块,前一内存块被称为"源",后一内存块被称为"目标"图象程序开发者使用Blit的函数在内存中将某页面上的一幅位图经过一定的变换转移到另一个页面上。

CDC::BitBlt

BOOL BitBlt(CDC* hDestDC , int x, int y, int nWidth, int nHeight, CDC* hSrcDC , int xSrc, int ySrc, DWORD dwRop );

hDestDC As Long, //目标设备环境的句柄
x As Long, //目标设备环境的矩形区域的左上角的x坐标
y As Long, //目标设备环境的矩形区域的左上角的y坐标
nWidth As Long, //目标设备环境的矩形区域的宽度值
nHeight As Long, //目标设备环境的矩形区域的高度值
hSrcDC As Long, //源设备环境的句柄
xSrc As Long, //源设备环境的矩形区域的左上角的x坐标
ySrc As Long, //源设备环境的矩形区域的左上角的y坐标
dwRop As Long, //光栅操作符

3.2. LoadBitmap()    

原型 HBITMAP LoadBitmap(HINSTANCE hInstance, LPCTSTR lpBitmapName); hlnstance:指向模块实例的句柄。该模块的可执行文件包含了要加载的位图。 lpBitmapName:指向字符串(以NULL结束)批指针。该字符串包含了要加载的位图资源名称。另外一种方式就是该参数可以由低位字是资源标识符、高位字为0位形式组成。可以使用宏MAKEINTRESOURCE来创建这个参数值。 返回值:如果函数执行成功,则返回值是指向指定位图的句柄。如果函数执行失败,那么返回值是NULL。

3.3. MAKEINTRESOURCE ()

MAKEINTRESOURCE是一个资源名转换的宏, VC的定义是(winuser.h):
 

#define MAKEINTRESOURCEA(i) (LPSTR)((ULONG_PTR)((WORD)(i))) 

#define MAKEINTRESOURCEW(i) (LPWSTR)((ULONG_PTR)((WORD)(i))) 

#ifdef UNICODE #define MAKEINTRESOURCE MAKEINTRESOURCEW

#else 

#define MAKEINTRESOURCE MAKEINTRESOURCEA 

#endif // !UNICODE

这个宏是把一个数字类型转换成指针类型的宏,它不存在释放的问题. 用这个宏的主要原因是有的资源是用序号定义的,而不是字符串.所以要把数字转换成字符串指针,然后再传递给LoadResource之类的函数,这样才加载了资源. 要释放资源(用LoadResource加载的)可以调用FreeResource函数把LoadResource返回的指针传递给FreeResource. MAKEINTRESOURCE 的作用: 是把一个"数字形ID",转化为"字符串".但是执行前后,输入的数据的内容和长度是不变的!它只不过就是C语言里面"强制类型转换"而已.

请看 Winuser.h 代码:

#define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i))) 
  #define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i))) 
  #ifdef UNICODE 
  #define MAKEINTRESOURCE MAKEINTRESOURCEW 
  #else 
  #define MAKEINTRESOURCE MAKEINTRESOURCEA 
  #endif // !UNICODE 
  现在,再来归纳它的用法.就用FindResource来说明.(这个函数与MFC的AfxFindResourceHandle) 
  HRSRC FindResource( 
  HMODULE hModule, // module handle 
  LPCTSTR lpName, // resource name 
  LPCTSTR lpType // resource type 
  ); 

就是lpName参数需要使用MAKEINTRESOURCE ,因为它需要LPCTSTR类型的参数输入.那么,情况就很清楚了.凡涉及"资源"的API或者MFC类,在参数类型为LPCTSTR时,就应该使用 MAKEINTRESOURCE.这是针对"资源名字"为"数字类型"时的情况.

3.4. SelectObject ()

把一个对象(位图、画笔、画刷等)选入指定的设备描述表。新的对象代替同一类型的老对象。

HGDIOBJ  SelectObject(  HDC  hdc,  // handle to DC  HGDIOBJ  hgdiobj  // handle to object );

hdc 设备描述表句柄(要载入的设备描述表句柄)

hgdiobj 选择要载入的对象的句柄

4 关于资源和关系说明

5.资源文件附加步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值