WINDOWS编程学习笔记(四)


day18
******************************************************************************************
GDI绘图对象
1.画笔
	1.画笔的作用
		线的颜色、线型、线粗
		HPEN - 画笔句柄
	2.画笔的使用
		1.创建画笔
			HPEN CreatePen(
				int 	  	fnPenStyle,	 		//画笔的样式
				int 	  	nWidth,				//画笔的粗细
				COLORREF  	crColor				//画笔的颜色
			); 创建成功返回句柄
			PS_SOLID - 实心线,可以支持多个像素宽,其他线型只能支持一个像素宽
			PS_DASH  - 虚线,线宽只能是1,如果是其他值,则会回到上一次的画笔样式
		2.将画笔应用到DC中
			HGDIOBJ SelectObiect(
				HDC			hdc,		//绘图设备句柄
				HGDIOBJ		jgdiobj		//GDI绘图对象句柄,画笔句柄
			); 返回原来的GDI绘图对象句柄
			注意保存原来DC当中画笔
		3.绘图 
		4.取出DC中的画笔
			将原来的画笔,使用SelectObject函数,放入到设备DC中,就会将我们创建的画笔取出
		5.释放画笔
			BOOL DeleteObject(
				HGDIOBJ		hObject		//GDI绘图对象句柄,画笔句柄
			);
		只能删除不被DC使用的画笔,所以在释放前,必须将画笔从DC中取出。	
2.画刷
	画刷相关
		画刷   - 封闭图形的填充颜色、图案
		HBRUSH - 画刷句柄
	画刷的使用
		1.创建画刷
			CreateSolidBrush - 创建实心画刷
			CreateHatchBrush - 创建纹理画刷
		2.将画刷应用到DC中
			SelectObject
		3.绘图
		4.将画刷从DC中取出
			SelectObject
		5.删除画刷
			DeleteObject
3.封闭图形:
		在微软中,三条直线围成的三角形不属于封闭图形,不能使用画刷进行填充
		只要是用直线围起来的,即便他是封闭的,也不叫封闭图形
		

day19
****************************************************************************************************
位图
1.位图相关
	光栅图形 - 记录图像中每一点的颜色等信息
	矢量图形 - 记录图像算法、绘图指令等等
	HBITMAP  - 位图句柄
2.位图的使用
	1.在资源中添加位图资源
	2.从资源中加载位图LoadBitmap
	3.创建一个与当前DC相匹配的DC(内存DC)
	HDC CreateCompatibleDC(
		HDC hdc		//当前DC句柄,可以为NULL(使用屏幕DC)
	);	返回创建好的DC句柄
	4.将位图放入匹配的DC中 SelectObiect
	5.成像(1:1)
	BOOL  BitBlt(
		HDC   hdcDest,		//目的DC
		int	  nXDest,		//目的左上X坐标	
		int	  nYDest,		//目的左上Y坐标
		int	  nWidth,		//目的宽度
		int	  nHeight,		//目的高度
		HDC   hdcSrc,		//源DC
		int   nXSrc,		//源左上X坐标
		int   nYsrc,		//源左上Y坐标
		DWORD dwRop			//成像方法  SRCCOPY
	);
	缩放图像
	BOOL StretchBlt(
		HDC   hdcDest,			//目的DC
		int	  nXOriginDest,		//目的左上X坐标	
		int	  nYOriginDest,		//目的左上Y坐标
		int	  nWidthDest,		//目的宽度
		int	  nHeightDest,		//目的高度
		HDC   hdcSrc,			//源DC
		int   nXOriginSrc,		//源左上X坐标
		int   nYOriginsrc,		//源左上Y坐标
		int   nWidthSrc,		//源DC宽
		int   nHeightSrc,		//源DC高
		DWORD dwRop				//成像方法  SRCCOPY	
	);
	6.取出位图:SelectObiect
	7.释放位图:DeleteObject
	8.释放匹配的DC:DeleteDC
		

day20
**************************************************************************************************
1.文字的绘制
	1.TextOut - 将文字绘制在指定坐标位置
	int DrawText(
		HDC		 hDC,		//DC句柄
		LPCTSTR	 lpString,	//字符串
		int 	 nCount,	//字符数量
		LPRECT   lpRect,	//绘制文字的矩形框
		UINT     uFormat	//绘制的方式			
	);
		绘制的模式:
			DT_LEFT		 --- 文字靠左
			DT_TOP		 --- 文字靠上
			DT_BOTTOM    --- 文字底部显示
			DT_CENTER    --- 文字居中
			DT_VCENTER   --- 文字垂直居中
			DT_SINGLELINE--- 单行显示
			DT_WORDBREAK --- 多行显示
			DT_NOCLIP    --- 打破矩形限制,多行显示
			
		1.DT_VCENTER / DT_BOTTOM 只适用于 DT_SINGLELINE  
		2.DT_VCENTER / DT_BOTTOM 和	DT_WORDBREAK冲突
	2.文字颜色和背景
	文字颜色:SetTextColor
	文字背景色:SetBkColor
	文字背景模式:SetBkMode(OPAQUE/TRANSPARENT)   可是设置文字的背景为透明的
2.字体相关
	window常用的字体为TrueType格式的字体文件
	字体名 - 表示字体类型
	HFONT  - 字体句柄
	1.字体的使用
	HFONT CreateFont(
		int 	nHeight,				//字体高度
		int 	nWidth,					//字体宽度
		int 	nEscapement,			//字符串倾斜角度
		int 	nOrientation,			//字符旋转角度
		int 	fnWeight,				//字体的粗细
		DWORD	fdwItalic,				//斜体
		DWORD	fdwUnderline,			//字符下划线
		DWORD	fdwStrikeOut,			//删除线
		DWORD	fdwCharSet,				//字符集
		DWORD	fdwOutputPrecision,		//输出精度
		DWORD	fdwClipPrecision,		//剪切精度
		DWORD	fdwQuality,				//输出质量
		DWORD	fdwPitchAndFamily,		//匹配字体
		LPCTSTR	lpszFace				//字体颜色
	);
	2.应用字体到DC   SelectObject
	3.绘制文字  	 DrawText/TextOut
	4.取出字体       SelectObject
	5.删除字体		 DeleteObject
	
	
day21
**********************************************************************************************
windows内核开发
1.对话框
	核心简介
		普通窗口:自定义函数调用缺省函数
		WndProc(...){
			...
			DefWindowProc(...);
		}
		对话框窗口:缺省函数 调用 自定义函数 
		缺省函数(...){
			...
			自定义函数(...);
		}
	1.对话框的分类
		模式对话框	  --- 当对话框显示时,会禁止其他窗口和用户交互操作
		无模式对话框  --- 在对话框显示后,其他窗口仍然可以和用户交互操作
	2.对话框基本使用
		1.对话框窗口处理函数
		2.注册窗口类
		3.创建对话框
		4.对话框的关闭
	3.对话框窗口处理函数(并非真正的对话框窗口处理函数)
		INT CALLBACK DialogProc(
			HWND	  hwndDlg,		//窗口句柄
			UINT 	  uMsg,			//消息ID
			WPARAM	  wParam,		//消息参数
			LPARAM    lParam   		//消息参数
		);
		返回TRUE  -- 缺省处理函数不需要处理
		返回FALSE -- 交给缺省处理函数处理
		不需要调用缺省对话框窗口处理函数
	4.创建模式对话框
		INT DialogBox(
			HINSTANCE  	hInstance,		//应用程序实例句柄
			LPCTSTR		lpTemplate,		//对话框资源ID
			HWND		hWndParent,		//对话框父窗口
			DLGPROC     lpDialogFunc	//自定义函数
		);
		DialogBox是一个阻塞函数,只有当对话框关闭后,才会返回,继续执行后续的代码。
		返回值通过EndDialog设置。
	5.对话框的关闭
		BOOL EndDialog(
			HWND	  hDlg,		//关闭的对话框窗口句柄
			INT_PTR	  nResult	//关闭的返回值
		);
		关闭模式对话框,只能使用EndDialog,不能使用DestroyWindow等函数
		nResult是DialogBox函数退出时的返回值
		
		为什么不能使用DestroyWindow?
		因为DestroyWindow只能完成EndDialog的第一个功能,即只能完成销毁对话框的功能
		
		EndDialog的两个功能:
			1.销毁对话框
			2.解除DialogBox的绑定
			
	6.对话框的消息
		WM_INITDIALOG - 对话框创建之后显示之前,通知对话框窗口处理函数,
						可以完成自己的初始化相关的操作
	7.无模式对话框
		1.创建对话框
			HWND CreateDialog(
				HINSTANCE  	hInstance,		//应用程序实例句柄
				LPCTSTR		lpTemplate,		//对话框资源ID
				HWND		hWndParent,		//对话框父窗口
				DLGPROC     lpDialogFunc	//自定义函数
			);
			非阻塞函数,创建成功返回窗口句柄,需要使用ShowWindow函数显示对话框
		2.对话框的关闭
			关闭时使用DestroyWindow销毁窗口,不能使用EndDialog关闭对话框
			

day22
*****************************************************************************************************
静态库
1.静态库的特点
	1.运行不存在 只能编译链接
	2.静态库源码会被连接到调用程序中
	3.目标程序的归档
2.相关知识
	1. .lib文件是源码文件
	2.源码文件是二进制文件
	3.源文件是C/C++文件
	4.在window平台中用C语言去调用函数的话,不需要函数的声明、头文件等等
	  C++则需要声明和头文件等等
C语言的静态库
3.C语言静态库的创建
	1.创建一个静态库项目
	2.添加库程序,源文件使用C文件
4.C静态库的使用
	库路径设置:可以使用pragma关键字设置
	#pragma comment(lib,"../xxx.lib")
	尽量使用相对路径,因为程序可能放在其他的计算机上去运行
	如果xxx.lib放在系统目录下,则不需要使用pragma说明
C++语言的静态库
5.C++静态库的创建
	1.创建一个静态库项目
	2.添加库程序,源文件使用CPP文件
6.C++静态库的使用
	库路径设置:可以使用pragma关键字设置
	#pragma comment(lib,"../xxx.lib")
7.用C语言做静态库与C++语言做静态库没什么太大差别
8.在C++环境下调用C语言编写的函数时,为了编译换名的问题,使用extern “C”声明调用的函数



day23
*****************************************************************************************
动态库
1.动态库的特点
	1.运行时独立存在
	2.源码不会连接到执行程序
	3.使用时加载(使用动态库必须使动态库执行)
2.与静态库的比较
	1.由于静态库是将代码嵌入到使用程序中的,多个程序运行时,会有多份代码,所以代码体积会增大。
	  动态库的代码只需要存在一份,其他程序通过函数地址使用,所以代码体积小。
	2.静态库发生变化后,新的代码需要重新链接嵌入到执行程序中。动态库发生变化后,如果库中函数的
	  定义(或地址)未改变,其他使用DLL的程序不需要重新链接。
3.动态库的创建
	1.创建动态库项目
	2.添加库程序	
	3.库程序导出 - 提供给使用者库中函数等信息
		1.声明导出:使用_declspec(dllexport)导出函数
			  注意:动态库编译链接之后,也会有LIB文件,是作为动态库函数映射使用,与静态库不完全相同。
		2.模块定义文件 .def
			例如:LIBRARY DLLFunc	//库
				  EXPORTS			//库导出表
					DLL_Mul  @1		//导出的函数
	4.链接器只能到.lib文件中抓编号和.dll文件名,不能到.dll文件中抓取
4.动态库的使用
	1.隐式链接(操作系统负责使动态库执行)
		1.头文件和函数原型
			可以再函数原型的声明前,增加_declspec(dllimport)
		2.导入动态库的LIB文件
		3.在程序中使用函数
		4.隐式链接的情况,dll文件可以存放的路径:
			1.与执行文件中同一个目录下
			2.当前工作目录
			3.windows目录
			4.windows/system32目录
			5.windows/system 
			6.环境变量PATH指定目录
	2.显示链接(程序员自己负责使动态库执行)
		1.定义函数指针类型 typedef
		2.加载动态库
			HMODULE LoadLibrary(
				LPCTSTR lpFileName		//动态库文件名或全路径
			); 返回DLL的实例句柄(HINSTANCE)
		3.获取函数地址
			FARPROC GetProcAddress()
				HMODULE	hModule,		//DLL句柄
				LPCTSTR lpProcName		//函数名称
			;
		4.使用函数
		5.卸载动态库
			BOOL FreeLibrary(
				HMODULE hModule			//DLL的实例句柄
			);
5.动态库中封装类
	1.在类名称前增加_declspec(dllexport)定义,例如:
		class _declspec(dllexport) CMath{
			...
		};
	2.通常使用预编译开关切换类的导入与导出,例如: 
		#ifdef  DLLCLASS_EXPORTS 
		#define EXT_CLASS _declspec(dllexport)	//DLL  
		#else
		#define EXT_CLASS _declspec(dllimport)	//使用者
		#endif
		class 	EXT_CLASS CMath{
			...
		};










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值