001字符串与数字的互相转换,错误处理,消息泵机制,以及回调函数,注册窗口基本流程

  1.一个简单的警告框

#include <windows.h>
#include "stdio.h"
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.注册窗口
 

 
#include <windows.h>
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.建立消息泵,循环接受处理消息(前提要将回调函数写好)
 
 
 
posted @ 2018-11-20 11:14  峰中追风  阅读(360)  评论(0编辑  收藏  举报

___________________________________________________________________________________________没有白跑的路