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中SelectObject3.绘图4.将画刷从DC中取出SelectObject5.删除画刷DeleteObject
3.封闭图形:在微软中,三条直线围成的三角形不属于封闭图形,不能使用画刷进行填充只要是用直线围起来的,即便他是封闭的,也不叫封闭图形day19
****************************************************************************************************
位图
1.位图相关光栅图形 - 记录图像中每一点的颜色等信息矢量图形 - 记录图像算法、绘图指令等等HBITMAP - 位图句柄
2.位图的使用1.在资源中添加位图资源2.从资源中加载位图LoadBitmap3.创建一个与当前DC相匹配的DC(内存DC)HDC CreateCompatibleDC(HDC hdc //当前DC句柄,可以为NULL(使用屏幕DC)); 返回创建好的DC句柄4.将位图放入匹配的DC中 SelectObiect5.成像(1:1)BOOL BitBlt(HDC hdcDest, //目的DCint nXDest, //目的左上X坐标 int nYDest, //目的左上Y坐标int nWidth, //目的宽度int nHeight, //目的高度HDC hdcSrc, //源DCint nXSrc, //源左上X坐标int nYsrc, //源左上Y坐标DWORD dwRop //成像方法 SRCCOPY);缩放图像BOOL StretchBlt(HDC hdcDest, //目的DCint nXOriginDest, //目的左上X坐标 int nYOriginDest, //目的左上Y坐标int nWidthDest, //目的宽度int nHeightDest, //目的高度HDC hdcSrc, //源DCint nXOriginSrc, //源左上X坐标int nYOriginsrc, //源左上Y坐标int nWidthSrc, //源DC宽int nHeightSrc, //源DC高DWORD dwRop //成像方法 SRCCOPY );6.取出位图:SelectObiect7.释放位图:DeleteObject8.释放匹配的DC:DeleteDCday20
**************************************************************************************************
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 SelectObject3.绘制文字 DrawText/TextOut4.取出字体 SelectObject5.删除字体 DeleteObjectday21
**********************************************************************************************
windows内核开发
1.对话框核心简介普通窗口:自定义函数调用缺省函数WndProc(...){...DefWindowProc(...);}对话框窗口:缺省函数 调用 自定义函数 缺省函数(...){...自定义函数(...);}1.对话框的分类模式对话框 --- 当对话框显示时,会禁止其他窗口和用户交互操作无模式对话框 --- 在对话框显示后,其他窗口仍然可以和用户交互操作2.对话框基本使用1.对话框窗口处理函数2.注册窗口类3.创建对话框4.对话框的关闭3.对话框窗口处理函数(并非真正的对话框窗口处理函数)INT CALLBACK DialogProc(HWND hwndDlg, //窗口句柄UINT uMsg, //消息IDWPARAM wParam, //消息参数LPARAM lParam //消息参数);返回TRUE -- 缺省处理函数不需要处理返回FALSE -- 交给缺省处理函数处理不需要调用缺省对话框窗口处理函数4.创建模式对话框INT DialogBox(HINSTANCE hInstance, //应用程序实例句柄LPCTSTR lpTemplate, //对话框资源IDHWND 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, //对话框资源IDHWND 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.定义函数指针类型 typedef2.加载动态库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) //使用者#endifclass EXT_CLASS CMath{...};
WINDOWS编程学习笔记(四)相关推荐
- 【Windows编程学习笔记】1:实现学生信息管理系统的简易页面
本学期非常幸运能和李青老师学习使用纯C/C++实现Win32的应用程序开发.开发过程中不使用MFC,而是直接调用WindowsAPI来实现应用程序编程,这样做的好处是能够理解界面程序的实现机制,对于日 ...
- Python计算机视觉编程学习笔记 四 照相机模型与增强现实
照相机模型与增强现实 (一)针孔照相机模型 1.1 照相机模型 1.2 三维点的投影 1.3照相机矩阵的分解 1.4 计算照相机中心 (二)照相机标定 (三)以平面和标记物进行姿态估计 (四)增强现实 ...
- Windows编程学习笔记01-Windows系统概述
Windows的体系结构 Windows体系结构是分层的模块系统,主要层次有硬件抽象层HAL.内核.执行体和大量的子系统集合.前面三个都运行在保护模式下,而各子系统都在用户模式下运行.子系统又可分为环 ...
- python网络编程arp_python网络编程学习笔记(四):域名系统
一.什么是域名系统 DNS 计算机域名系统 (DNS) 是由解析器以及域名服务器组成的.当我们在上网的时候,通常输入的是网址,其实这就是一个域名,而我们计算机网络上的计算机彼此之间只能用IP地址才能相 ...
- Windows异常学习笔记(四)—— 编译器扩展SEH
Windows异常学习笔记(四)-- 编译器扩展SEH 要点回顾 编译器支持的SEH 过滤表达式 实验一:理解_try_except 实验二:_try_except 嵌套 拓展SEH结构体 scope ...
- Windows系统调用学习笔记(四)—— 系统服务表SSDT
Windows系统调用学习笔记(四)-- 系统服务表&SSDT 要点回顾 系统服务表 实验:分析 KiSystemService 与 KiFastCallEntry 共同代码 SSDT 实验: ...
- 寒江独钓windows 内核安全编程学习笔记
寒江独钓windows 内核安全编程学习笔记 本博客记录自己的学习过程,如有侵犯或者打扰请告知. 由于项目的需求,第一次接触到驱动程序.开始学习了寒江大神的的内核安全编程.小白一个,第一章就遇到了问题 ...
- Windows批处理程序编程学习笔记
Windows批处理学习笔记(基础篇) 第一章 从零开始认识批处理(what why how) 1.1 什么是Windows批处理? 批处理程序全名为 Batch file programming 是 ...
- WCF服务编程 学习笔记(1)
你或许可以使用某一技术实现某些功能,可以按着指定的要求,完成特定的功能,实现某一想要的效果,这表示你可以使用该技术,会使用该技术,但是我们不能停留在使用的层次上,还要了解它们的运行机制,可能有点深了, ...
最新文章
- ATS 5.3.0中开启最高级别的缓存调试信息
- C#发送邮件异常:根据验证过程,远程证书无效
- 3D神经接口系统可以感知和操纵“微型脑“
- php 队列取并集,PHP实现对数组简单求交集,差集,并集功能示例
- python 示例_在Python中带有示例的while关键字
- 29 WM配置-策略-出库策略2-定义“紧急FIFO”策略(Stringent FIFO)
- iPhone XR再降价:64GB到手最低仅需4149元
- zabbix小结(一)zabbix概述
- 用户体验设计和精益设计的平衡之道
- Java的GUI学习二(布局)
- Matlab信号提取、频谱分析、滤波、阈值设定、寻找极值点
- 方正平台(企业级应用的开发平台)
- PHP+实验室安全系统 毕业设计-附源码191610
- 最全官方win10系统安装教程,教你如何用u盘安装win10系统?
- CSS3之边框图片border-image
- Linux命令 --- cp与scp
- 汇编中的test和cmp指令[Z]
- 篱笆(Fenced In)
- Transform 3.1 用户手册(SPSS 的通用数据转换程序)
- Apache ab性能测试结果分析
热门文章
- 超级浏览器适合TikTok Shop使用吗?TikTok Shop群店如何管理?
- 文件时间修改器,修改文件创建时间、修改时间
- 计算机算法相关课程,计算机算法的分类
- 关于pycharm报错:Fatal Python error: Py_Initialize: unable to load the file system codec的解决
- 自定义Camera系列之:SurfaceView + Camera
- JAVA中一些术语的中英文对照
- 一起学ORBSLAM2(7)ORBSLAM中的优化问题
- 巴菲特的答卷:年净利润腰斩,百亿美元“错误”,但这些重仓股收益颇丰
- PHP获取客户端请求IP地址
- mysql MGR配置keepalived