001字符串与数字的互相转换,错误处理,消息泵机制,以及回调函数,注册窗口基本流程
1.一个简单的警告框
int APIENTRY wWinMain(
HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPTSTR lpCmd,
int nCmd
){
//一个简单的警告框
TCHAR buf3[] = TEXT("15pb");
MessageBox(0, buf3, TEXT("25期"), 0);
参数,(第二个内容,第三个标题)
2.字符串与数字的互相转换
- 字符串转数字
方法一
char buf[50] = "9527";
int a = atoi(buf);
方法二
char buf[50] = "9527";
int b = 0;
sscanf_s(buf, "%d", &b);
这里需要头文件stdio.h 参数:转换目标地址,转换格式,存储位置
- 数字转字符串
<wiz_code_mirror>
int num = 123987;
double fnum = 63.5;
char buf1[200] = {};
sprintf_s(buf1, 200, "%d", num);
参数(保存目的地地址,缓存区大小,转换对象的格式,转换对象)
其本质是字符拼接
总结:
字符串转数字 用sscanf_s(转换目标地址,转换格式,存储位置) 谁 怎么转 转给谁
数字转字符串 用sprintf_s(保存目的地,缓存区大小,转换对象的格式,转换对象) 谁 保存(缓存区大小) 另一个的数字
3.错误处理
windows下每一个线程都有一块区域能够存储错误码,可以使用SetLastError()这个API设置一个数值,
每一个API函数在退出之前都会调用这个函数,给此API一个错误码,
我们在API结束后,调用GetLastError()得到错误码
查找错误码的方法
1. VS 工具 -- 错误查找
2. 使用FormatMessage函数,由错误码得到错误字符串
3. 在VS监视栏中输入"err,hr" (逗号)
自定义错误
SetLastError给自己函数定义错误码
总结:
想要知道一个函数的调用结果,在函数调用完毕之后,立即使用GetLastError函数。否则错误码可能被其他API覆盖
4.消息泵机制,以及回调函数
MSG msg = {};
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetMessage(); 从应用程序消息队列取走一条消息
TranslateMessage(); 作用是将虚拟键转换为字符消息,字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage读出
DispatchMessage(); 该函数调度一个消息给窗口程序,通常调度从GetMessage取得消息
回调函数模型
LRESULT CALLBACK WindowProc(
HWND hwnd; //窗口句柄
UINT umessage; //消息ID
WPARAM wParam; //消息参数1
LPARAM lParam; //消息参数2
)
这里需注意,返回值类型为 LRESULT 因为回调函数返回值必然是调用DefWindowProc函数来处理,所有回调函数返回值不能为0
LRESULT本质就是 long 长整形 。
DefWindowProc(); 此函数返回值即是上面回调函数的返回值,本函数作用,它将窗口不处理的消息默认传递给系统做默认处理,此函数在 回调函数中必不可少
5.注册窗口
LRESULT CALLBACK wProc(
HWND hWND,
UINT Message,
WPARAM wparam,
LPARAM lparam
){
return DefWindowProc(hWND, Message, wparam, lparam);
}
int APIENTRY wWinMain(
HINSTANCE hInstance,
HINSTANCE hPreInstance,
LPTSTR lpCmd,
int nCmd
)
{
//注册窗口
//设计窗口类
WNDCLASSW wnd;
wnd.lpfnWndProc = wProc; //这步最为关键,需要指定回调函数是谁
wnd.lpszClassName = L"第一个窗"; //这步也关键,需指明窗口类名,上两步必不可少
wnd.style = CS_HREDRAW | CS_VREDRAW;
wnd.cbClsExtra = 0; //分派给窗口类的扩展的字节数
wnd.cbWndExtra = 0; //分派给窗口实例的扩展的字节数
wnd.hInstance = hInstance; //实例句柄
wnd.hIcon = 0; //图标
wnd.hCursor = 0;
wnd.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); //背景颜色
wnd.lpszMenuName = 0;
//注册窗口类
RegisterClass(&wnd); //正如书上所说,你开店,需要到工商局注册,这步作用也类似
//将刚才设计好的窗口类,传地址进来
//创建窗口
HWND hWND = CreateWindow(
L"第一个窗",
L"我叫内容",
WS_OVERLAPPEDWINDOW,
0, 0, 400, 600,
0,
0,
hInstance,
0
);
//显示刷新窗口
ShowWindow(hWND, SW_SHOW);
UpdateWindow(hWND);
//建立消息泵
MSG msg = {};
while (GetMessage(&msg,0,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
整体思路(套路)
1.先设计一个窗口类
2.在注册窗口类
3.创建窗口
4.显示刷新窗口
5.建立消息泵,循环接受处理消息(前提要将回调函数写好)