标准控件:
按钮:
响应WM_COMMAND消息,处理点击事件:
编辑框:
1 .获取编辑框中的文本 2. 设置编辑框中的文本
复选框:
- 获取是否被选中 2. 设置复选框为选中状态或者非选中状态
单选框:
- 获取哪一个被选中 2.注意分组的问题:ctrl+D编辑序号,每一组的第一个单选框,group属性设置为true,然后就分组了。
静态文本:
- 只是起到提示作用
静态图片:
- 显示图片:
a.我们需要添加bmp格式的图片资源。
b.我们需要拖拽一个picture控件,属性设置为bitmap
c.给这个控件发消息,携带着位图资源的句柄。(获取控件句柄,发消息)
下拉框:
1. 添加选项 2. 获取选择的内容和序号 注意:下拉框的大小调节
通用控件:
进度条:
1 设置进度
滑块:
- 获取滑动到的位置:当滑动滑块的时候,WM_HSCROLL。(水平滑动)
通过获取滑块句柄发消息的方式,能够获得位置。
2. 设置滑块的位置
列表框:
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:获取磁盘空间的信息
int main()
{
int nLen = 1;
int uDriveType = 0;
//1 获取所有的逻辑驱动器的盘符
TCHAR buf[200] = {};
TCHAR *pStr = NULL;
GetLogicalDriveStrings(200, buf);
pStr = buf;
//注意:有一个设置语言的函数
_tsetlocale(LC_ALL, _T("chs"));
while (nLen!=0)
{
_tprintf(_T("%s "), pStr);
//2 获取逻辑驱动器的类型
uDriveType = GetDriveType(pStr);
switch (uDriveType)
{
case DRIVE_FIXED:
_tprintf(_T("硬盘"));
break;
case DRIVE_CDROM:
_tprintf(_T("光驱"));
break;
case DRIVE_REMOTE://远程的
_tprintf(_T("远程的"));
break;
case DRIVE_REMOVABLE://可移动的
_tprintf(_T("可移动的"));
break;
case DRIVE_UNKNOWN://未知的
_tprintf(_T("未知的"));
break;
break;
default:
break;
}
//3 获取磁盘的空间信息
DWORD 每簇扇区数量 = 0;
DWORD 扇区容量 = 0;
DWORD 空闲簇总量 = 0;
DWORD 全部簇总量 = 0;
GetDiskFreeSpace(
pStr,
&每簇扇区数量, &扇区容量,
&空闲簇总量, &全部簇总量
);
_tprintf(_T("总容量:%lfGB "), (全部簇总量/1024.0)*每簇扇区数量*扇区容量/1024/1024);
_tprintf(_T("空闲容量:%lfGB"), (空闲簇总量/1024.0)*每簇扇区数量*扇区容量/1024/1024);
nLen = _tcslen(pStr);
pStr += nLen + 1;
_tprintf(_T("\n"));
}
}
动态链接库:
创建一个动态链接库文件:
当我们创建完D’LL工程之后,会出现一个DllMain这个函数,这个函数我们传统意义的WinMain或者main函数有非常大的不一样。
因为Dll文件,通常不会像exe文件一样,直接运行,都是提供函数给别人用的。所以并不需要入口这样的概念。
所以并非DLL的第一行被执行的代码就是DllMain。
这个函数在什么情况下会被调用呢???
a. 程序被创建
b. 程序中有线程被创建
c. 程序即将退出
d. 程序中有线程将要退出
有什么用呢??能够执行一些初始化或者资源清理的操作。
如何能够让dll导出函数,给其他人用???
1 声明导出
.h中进行声明
#pragma once
extern "C" _declspec(dllexport) int Add(int a, int b);
.cpp中为函数的实现
注意:一定包含自己的头文件,否则声明了,也链接不到。
#include "Dll1.h"
extern "C" int Add(int a, int b)
{
return a + b;
}
int Sub(int a,int b)
{
return a - b;
}
编译成功之后,就可以看到dll文件。
我们使用LordPe工具,可以查看一个dll的导出表,其中存储了dll文件所有的导出函数。
只有函数导出了,才能够给别的模块使用。
2 def文件导出
Dll2.cpp
#include "stdafx.h"
#include <stdio.h>
int Fun()
{
printf("Hello world");
return 0;
}
int Fun2()
{
printf("Hello 15pb");
return 0;
}
int Fun1()
{
printf("你好 十五派");
return 0;
}
之后制作一个def文件
之后,设置工程属性:
编译,编译之后,我们查看lordPE中的导出表信息,发现导出成功了。
dll文件制作好了之后,如何能够使用:
1 隐式链接
a. 包含头文件<br /> b. 载入lib文件<br /> c. 调用函数
//我们想要使用dll中的函数,分两步
//1 包含头文件
//#include "C:\\Users\\SouLinker\\source\\repos\\TestDll_36\\Dll1\\Dll1.h"
#include "..\\Dll1\\Dll1.h"
//2 载入lib文件
#pragma comment(lib,"..\\debug\\Dll1.lib")
int main()
{
int nNum1 = 100;
int nNum2 = 50;
int nRe = Add(nNum1, nNum2);只能使用导出了的函数
//Sub(nNum1, nNum2);
}
2 显示链接
#include <iostream>
#include <Windows.h>
#include <tchar.h>
typedef int(* ADD)(int a, int b);
ADD g_pfunAdd = NULL;
int main()
{
int nNum1 = 100;
int nNum2 = 50;
//1 载入dll
HMODULE hModule = LoadLibrary(_T("Dll1.dll"));
//2 根据函数名得到函数地址
g_pfunAdd = (ADD)GetProcAddress(hModule, "Add");
//3 调用函数
int nRe = g_pfunAdd(nNum1, nNum2);
//4 释放
FreeLibrary(hModule);
}
隐式链接,会暴露dll的调用信息:
显示链接不会暴露此信息:
探讨一下动态链接库和静态链接库
dll就是动态链接库:代码数据,都不会放到exe中,而是在程序运行的时候,动态加载。
缺点就是发布程序必须一起发布,否则没有dll程序运行不了。
如果我们希望只发布exe,程序就能使用,可以使用静态链接库:
其他的声明导出,隐式链接和动态链接库的使用是一摸一样的。
编译会生成一个lib文件。
调整完之后,程序就可以在任意位置运行了。
当我们编译动态链接库的时候,生成了一个dll文件和一个lib文件。
当我们编译静态链接库的时候,生成了一个lib文件。
那么这两个lib文件有区别吗???
静态链接库的lib文件,称为对象库。其中包含了代码和数据
动态链接库的lib文件,称为导入库。其中不包含代码和数据的。仅包含一些链接信息。
导入库:2KB
对象库:163KB