#include <tchar.h>
include <mmsystem.h> //导入声音的文件库
#pragma comment (lib,"Winmm.lib") //导入声音的链接库
程序分为逻辑部分 显示部分(windows)
win32是基于已有的框架的,所以入口函数只有一个
window是基于C,C++,又想有自己所特有的数据类型,所以在C,C++的类型基础上做出了重定义
1、去区别C语言,没有顾名思义
2、封装信息
特性:
1、如果没有讲过,先转定义看这个类型
2、大写H开头,在win32里面讲句柄
3、P,LP开头,在win32里面表示指针
4、windows里面数据类型全是大写,但同时windows是基于C,C++开发的,所以兼容C,C++的数据类型
#include <windows.h>
int WinMain(_In_ HINSTANCE hInstance, //应用程序实例句柄
_In_opt_ HINSTANCE hPrevInstance, //父应用程序实例句柄(现在的版本基本不用,所以为null)
_In_ LPSTR lpCmdLine, //命令行参数
_In_ int nShowCmd)//窗口显示方式
{
MessageBox
MessageBoxA(0, "Hello world!", 0, 0);
MessageBoxA(0, lpCmdLine, 0, 0);
消息盒子 返回值的值是根据类型而变化的
if (IDOK ==
MessageBoxA(nullptr,//窗口句柄,这个消息盒子是基于哪个窗口弹出的
"abc",//消息盒子的文本内容
"1234",//消息盒子的标题
MB_OKCANCEL | MB_ICONWARNING))//消息盒子的类型
MessageBox(0, 0, 00, 0);
MessageBox返回值
0:对话框建立失败
IDOK = 1 :按确认按钮
IDCANCEL = 2:按取消按钮
IDYES = 6:按的是按钮
IDABOUT = 3:按异常终止按钮
IDRETRY = 4:按重试按钮
IDIGNORE = 5:按忽略按钮
IDNO = 7:按否按钮
字符集: 字符编码 ascii
unicode 宽字节字符集
‘a’=>97
程序中两个字符集的表现:
多字节
char c = 'a';//多字节的字符存储
char *pc = "ab中cd";//多字节字符串的描述
pc = &c;
int m = strlen(pc);
宽字节
typedef unsigned short wchar_t
wchar_t wc = 'a';//宽字节的字符存储
wchar_t *pwc = L"abcd";//宽字节的字符串的描述
m = wcslen(pwc); //wcslen会报错
wchar_t *pwc = &wc;
通配字符集的表现
TCHAR tc = 'a';
TCHAR *ptc = _T("abcd");//_T()带参宏会自动匹配多字节还是宽字节
_tcslen(ptc);
小结
1、可以不管项目中使用的字符集,可以自行设定用固定的类型去表现字符或字符串,char或wchar_t
2、可以统一使用字符的通配类型
在windows里面所有涉及字符串操作的函数,也都有2个函数
音乐播放器
int WinMain(_In_ HINSTANCE hInstance, //应用程序实例句柄
_In_opt_ HINSTANCE hPrevInstance, //父应用程序实例句柄(现在的版本基本不用,所以为null)
_In_ LPSTR lpCmdLine, //命令行参数
_In_ int nShowCmd)//窗口显示方式
{
wav格式音乐播放
PlaySound(_T("Hotel California 加州旅店 - Eagles 老鹰乐队.wav"),//路径文件名,一般用相对路径
nullptr,//应用程序实例句柄
SND_LOOP | SND_FILENAME | SND_ASYNC);//文件操作模式
SND_LOOP 循环 SND_FILENAME 指定文件名 SND_ASYNC 异步
//mp3格式音乐的播放
mciSendString(_T("open 金志文-中国姑娘.mp3 alias abc"),//命令字符串,open打开一个*.mp3的文件,alias取了一个叫abc的外号
nullptr,//接收信息的缓冲区,null表示不接受信息
0,//第二个参数的内存大小(缓冲区大小)
nullptr);//回调函数的窗口句柄
mciSendString(_T("play abc"), 0, 0, 0);
MessageBox(0, 0, 0, 0);
return 0;
}``
一.Windows四大模块程序
1.1控制台程序
没有自己的窗口,dos-显示或者运行程序,入口mian()
1.2窗口程序
有自己的窗口,win32,mfc,qt,入口WinMain
1.3动态库
后缀dll,不可以单独运行,直接注入到可执行程序中
入口函数DllMain,不是必须.
1.4静态库
以lib为后缀的程序,只用来存储代码和数据.
执行程序直接赋值代码,没有入口函数
二.编译链接流程
2.1编辑器
用来写编写代码的软件,可记事本程序,或其他可编辑的软件
2.2编译器
Cl.exe把代码翻译成目标文件obj,(cl.exe 源文件名)-产生obj
2.3链接器
link.exe –把obj文件和lib或dll文件链接成exe文件
(link.exe obj的文件名 lib库名)
运行: 执行exe程序
2.4资源编辑器
rc.exe 资源文件名 (资源包括图片图标 光标 菜单)
三.第一个win32应用程序
四.编码方式
4.1从windowsNT开始,windows完全使用unicode来构建,所以核心函数(创建窗口,显示文本,字符串处理)都提供了unicode版本.
4.2 在window中,函数通常有两个版本,一个带w(wide)结尾和带A(ASNI)结尾的;例如CreateWindowExA(….)和CreateWindowExW(…),通常情况,我们只接使用CreateWindowEx就可以,如果是unicode编码方式会有一个UNICODE的宏,会直接根据条件编译调用后缀是W版本的
4.3. windows API函数(openFile ,winExec等)只兼容于ANSI,不兼容unicode编码,所以需要转换成unicode效率低下并且转换是有可能有bug,所以用Createprocess和createfile替换,
4.4. ANSI中字符串处理 Strlen(…)
Unicode中字符串处理 Wcslen(…)
兼容版本字符串处理函数 _tcslen();
4.5unicode编码方式是两个字节代表一个字符,需要在字符串前加L,或者加_T(字符串)----兼容版本, sizeof(L“TANZHOU”) = 16,
4.6. 运行安全检查:添加头文件StrSafe.h
Scanf 警告不安全,可能会操作一块布可以操作的内存.导致内存错误,所以微软重新提供_s的安全版本.
4.7. 修改unicode编码方式截图如下
五.杂碎知识
5.1 messagebox详解
Int MessageBox(HWND hWnd,//窗口句柄
LPCSTR lpTt,//中间显示字符串
LPCSTR lpCap,//标题字符串
UINT uType);//显示类型
5.2 API概念
application programming interface 应用程序接口.微软为了方便windows的应用开发,提供给开发者的各种函数,这些函数就是windows操作系统提供给应用程序的接口
5.3 SDK概念
软件开发包.包含了API,说明文档,辅助开发工具.
5.4 头文件详解
windows.h—包含常用的windows的头文件,让开发者方便使用.
winbase.h—内核API接口的封装,kenel32.dll
winuser.h—用户界面相关接口的API封装,user32.lib
socket------ws2_32.lib 涉及到网络编程socket的库文件
5.5 音乐媒体处理
mmsystem.h—多媒体处理头文件,winmm.lib相关
PlaySound(
第一个: 播放音乐字符串,该参数可以是WAVE文件的名字,或是WAV资源的名字,或是内存中声音数据的指针,
或是在系统注册表WIN.INI中定义的系统事件声音。如果该参数为NULL则停止正在播放的声音
第二个:参数hmod是应用程序的实例句柄,除非pszSound的指向一个资源标识符(即fdwSound被定义为
SND_RESOURCE),否则必须设置为NULL。
第三个:参数fdwSound是标志的组合
SND_SYNC ---同步播放声音,在播放完后PlaySound函数才返回。
SND_ASYNC---用异步方式播放声音,PlaySound函数在开始播放后立即返回。
SND_FILENAME---pszSound参数指定了WAVE文件名。
SND_RESOURCE --pszSound参数是WAVE资源的标识符,这时要用到hmod参数。
SND_PURGE---停止声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
SND_NOSTOP ----PlaySound不打断原来的声音播出并立即返回FALSE。
SND_LOOP---重复播放声音,必须与SND_ASYNC标志一块使用。
利用MCI 接口实现播放任意格式声音
1.#include <mmsystem.h> //导入声音头文件库
2.#pragma comment(lib,“winmm.lib”)//导入声音的链接库
然后直接用mciSendString函数即可
1.mciSendString(“open C:/123.mp3” , NULL, 0, 0);
2.mciSendString("play C:/123.mp3 “, NULL, 0, 0);
3.mciSendString(“close movie”,buf,sizeof(buf),NULL);
4.
5.LPCTSTR lpszCommand, // 指向以null结尾的命令字符串:”命令 设备[ 参数]”
6.LPTSTR lpszReturnString,// 指向接收返回信息的缓冲区,为NULL时不返回信息
7.UINT cchReturn, // 上述缓冲区的大小
8.HANDLE hwndCallback // 在命令串中含notify时,它指定一个回调窗口的句柄
9.// 一般为NULL
10.);
11.如:mciSendString(L"open sample.wav type waveaudio alias wave”, NULL, 0, NULL);