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{
...
};
WINDOWS编程学习笔记(四)
最新推荐文章于 2024-09-19 20:37:55 发布