标准控件:

按钮:

响应WM_COMMAND消息,处理点击事件:

编辑框:

1 .获取编辑框中的文本 2. 设置编辑框中的文本

复选框:

  1. 获取是否被选中 2. 设置复选框为选中状态或者非选中状态

单选框:

  1. 获取哪一个被选中 2.注意分组的问题:ctrl+D编辑序号,每一组的第一个单选框,group属性设置为true,然后就分组了。

静态文本:

  1. 只是起到提示作用

静态图片:

  1. 显示图片:
    a.我们需要添加bmp格式的图片资源。
    b.我们需要拖拽一个picture控件,属性设置为bitmap
    c.给这个控件发消息,携带着位图资源的句柄。(获取控件句柄,发消息)

下拉框:
1. 添加选项 2. 获取选择的内容和序号 注意:下拉框的大小调节
image.png

通用控件:

进度条:

1 设置进度

滑块:

  1. 获取滑动到的位置:当滑动滑块的时候,WM_HSCROLL。(水平滑动)
    通过获取滑块句柄发消息的方式,能够获得位置。
    2. 设置滑块的位置

列表框:

  1. 1. 添加列:ListView_InsertColumn<br /> 2. 添加行: ListView_InsertItem<br /> 3. 设置扩展属性:ListView_SetExtendedListViewStyle<br /> 4. 处理列表框的通知消息:<br /> WM_NOTIFY lParam是结构体的指针,具体如何解析结构体,需要查询MSDN。<br /> WM_NOTIFY wParam是控件的ID,可以用于判断。<br />

磁盘相关的API函数:

GetLogicalDriveStrings:获取所有的逻辑盘符
GetDriveType:获取类型
GetDiskFreeSpace:获取磁盘空间的信息

  1. int main()
  2. {
  3. int nLen = 1;
  4. int uDriveType = 0;
  5. //1 获取所有的逻辑驱动器的盘符
  6. TCHAR buf[200] = {};
  7. TCHAR *pStr = NULL;
  8. GetLogicalDriveStrings(200, buf);
  9. pStr = buf;
  10. //注意:有一个设置语言的函数
  11. _tsetlocale(LC_ALL, _T("chs"));
  12. while (nLen!=0)
  13. {
  14. _tprintf(_T("%s "), pStr);
  15. //2 获取逻辑驱动器的类型
  16. uDriveType = GetDriveType(pStr);
  17. switch (uDriveType)
  18. {
  19. case DRIVE_FIXED:
  20. _tprintf(_T("硬盘"));
  21. break;
  22. case DRIVE_CDROM:
  23. _tprintf(_T("光驱"));
  24. break;
  25. case DRIVE_REMOTE://远程的
  26. _tprintf(_T("远程的"));
  27. break;
  28. case DRIVE_REMOVABLE://可移动的
  29. _tprintf(_T("可移动的"));
  30. break;
  31. case DRIVE_UNKNOWN://未知的
  32. _tprintf(_T("未知的"));
  33. break;
  34. break;
  35. default:
  36. break;
  37. }
  38. //3 获取磁盘的空间信息
  39. DWORD 每簇扇区数量 = 0;
  40. DWORD 扇区容量 = 0;
  41. DWORD 空闲簇总量 = 0;
  42. DWORD 全部簇总量 = 0;
  43. GetDiskFreeSpace(
  44. pStr,
  45. &每簇扇区数量, &扇区容量,
  46. &空闲簇总量, &全部簇总量
  47. );
  48. _tprintf(_T("总容量:%lfGB "), (全部簇总量/1024.0)*每簇扇区数量*扇区容量/1024/1024);
  49. _tprintf(_T("空闲容量:%lfGB"), (空闲簇总量/1024.0)*每簇扇区数量*扇区容量/1024/1024);
  50. nLen = _tcslen(pStr);
  51. pStr += nLen + 1;
  52. _tprintf(_T("\n"));
  53. }
  54. }

动态链接库:

创建一个动态链接库文件:
image.png

当我们创建完D’LL工程之后,会出现一个DllMain这个函数,这个函数我们传统意义的WinMain或者main函数有非常大的不一样。
因为Dll文件,通常不会像exe文件一样,直接运行,都是提供函数给别人用的。所以并不需要入口这样的概念。
所以并非DLL的第一行被执行的代码就是DllMain。
这个函数在什么情况下会被调用呢???
a. 程序被创建
b. 程序中有线程被创建
c. 程序即将退出
d. 程序中有线程将要退出
有什么用呢??能够执行一些初始化或者资源清理的操作。
image.png

如何能够让dll导出函数,给其他人用???

导出方式有两种:

1 声明导出

.h中进行声明

  1. #pragma once
  2. extern "C" _declspec(dllexport) int Add(int a, int b);

.cpp中为函数的实现
注意:一定包含自己的头文件,否则声明了,也链接不到。

  1. #include "Dll1.h"
  2. extern "C" int Add(int a, int b)
  3. {
  4. return a + b;
  5. }
  6. int Sub(int a,int b)
  7. {
  8. return a - b;
  9. }

编译成功之后,就可以看到dll文件。
image.png

我们使用LordPe工具,可以查看一个dll的导出表,其中存储了dll文件所有的导出函数。
只有函数导出了,才能够给别的模块使用。
image.png

2 def文件导出

Dll2.cpp

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. int Fun()
  4. {
  5. printf("Hello world");
  6. return 0;
  7. }
  8. int Fun2()
  9. {
  10. printf("Hello 15pb");
  11. return 0;
  12. }
  13. int Fun1()
  14. {
  15. printf("你好 十五派");
  16. return 0;
  17. }

之后制作一个def文件
image.png

之后,设置工程属性:
image.png
编译,编译之后,我们查看lordPE中的导出表信息,发现导出成功了。
image.png

dll文件制作好了之后,如何能够使用:

两种方式:

1 隐式链接

  1. a. 包含头文件<br /> b. 载入lib文件<br /> c. 调用函数
  1. //我们想要使用dll中的函数,分两步
  2. //1 包含头文件
  3. //#include "C:\\Users\\SouLinker\\source\\repos\\TestDll_36\\Dll1\\Dll1.h"
  4. #include "..\\Dll1\\Dll1.h"
  5. //2 载入lib文件
  6. #pragma comment(lib,"..\\debug\\Dll1.lib")
  7. int main()
  8. {
  9. int nNum1 = 100;
  10. int nNum2 = 50;
  11. int nRe = Add(nNum1, nNum2);只能使用导出了的函数
  12. //Sub(nNum1, nNum2);
  13. }

2 显示链接

  1. #include <iostream>
  2. #include <Windows.h>
  3. #include <tchar.h>
  4. typedef int(* ADD)(int a, int b);
  5. ADD g_pfunAdd = NULL;
  6. int main()
  7. {
  8. int nNum1 = 100;
  9. int nNum2 = 50;
  10. //1 载入dll
  11. HMODULE hModule = LoadLibrary(_T("Dll1.dll"));
  12. //2 根据函数名得到函数地址
  13. g_pfunAdd = (ADD)GetProcAddress(hModule, "Add");
  14. //3 调用函数
  15. int nRe = g_pfunAdd(nNum1, nNum2);
  16. //4 释放
  17. FreeLibrary(hModule);
  18. }

隐式链接,会暴露dll的调用信息:

image.png

显示链接不会暴露此信息:

image.png

探讨一下动态链接库和静态链接库

dll就是动态链接库:代码数据,都不会放到exe中,而是在程序运行的时候,动态加载。
缺点就是发布程序必须一起发布,否则没有dll程序运行不了。
image.png

如果我们希望只发布exe,程序就能使用,可以使用静态链接库:
image.png
其他的声明导出,隐式链接和动态链接库的使用是一摸一样的。
编译会生成一个lib文件。
image.png
调整完之后,程序就可以在任意位置运行了。
image.png

当我们编译动态链接库的时候,生成了一个dll文件和一个lib文件。
当我们编译静态链接库的时候,生成了一个lib文件。
那么这两个lib文件有区别吗???
静态链接库的lib文件,称为对象库。其中包含了代码和数据
动态链接库的lib文件,称为导入库。其中不包含代码和数据的。仅包含一些链接信息。
导入库:2KB
image.png

对象库:163KB
image.png