(一)Win消息机制,SDK编程基础

一,基本概念

SDK:软件开发工具包(缩写:SDK、外语全称:Software Development Kit

API:应用程序接口

WINAPI:Windows平台下的系统调用,包含 windows.h

窗口:父窗口和子窗口,客户区和非客户区

句柄:结构体变量,窗口句柄 :HWND,图标句柄:HICO,类似于文件操作符,进程控制块等

 

消息队列

消息

窗口过程函数

 

main()

WinMain()  // WINAPI  入口地址 

二,winAPI窗口程序

1.定义入口函数Win Main()

2.创建一个窗口

  a),设计窗口类 WNDCLASS (给成员变量赋值)

  b),注册窗口类

  c),显示和更新窗口

3,消息循坏

4,窗口过程函数

 

MSDN:winAPI,MFC

 

#include <Windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    )
{
    return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

// WINAPI:修饰函数,规定函数参数入栈从右往左,函数调用完毕,自动清理堆栈
// CALLBACK
int WINAPI WinMain(HINSTANCE hInstance, // 应用程序实例
    HINSTANCE hPreInstabce,// 上一个应用程序实例,不用
    LPSTR lpCmdLine, // LPSTR :typedef CHAR * LPSTR,long pointer string. 命令行参数
    int nCmdShow // 窗口显示的样式,最大化,最小化
)
{
    /*
    1,定义入口函数WinMain()
    2,创建一个窗口
          a),设计窗口类 WNDCLASS (给成员变量赋值)
        b),注册窗口类
        c),显示和更新窗口
    3,消息循环
    4,窗口过程函数
    */

    // 设计窗口类 WNDCLASS
    WNDCLASS wc;
    wc.cbClsExtra = 0;// 类的附加信息
    wc.cbWndExtra = 0;// 窗口的附加信息

    // 获取系统默认的白色画刷
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景色,必须写
    //wc.hCursor = NULL; // 使用默认
    wc.hCursor = LoadCursor(NULL, IDC_HELP); // 加载系统默认光标
    //wc.hIcon = NULL;
    wc.hIcon = LoadIcon(NULL,IDI_WARNING); // 加载系统默认图标

    wc.hInstance = hInstance; // 应用程序实例
    wc.lpfnWndProc = WindowProc; // 窗口过程函数名字,消息处理函数

    wc.lpszClassName = TEXT("abc"); // 类的名字
    wc.lpszMenuName = NULL; // 菜单的名字
    wc.style = nCmdShow; // 显示风格

    // 注册窗口类,告诉系统窗口过程函数的入口地址
    RegisterClass(&wc);

    // 创建窗口类
    HWND hWnd = CreateWindow(TEXT("abc"),
        TEXT("hello,windows"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);
    // 显示和更新窗口
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    // 消息循环
    MSG msg;
    // 如果接收到 WM_QUIT,返回 0,退出
    // 如果出错,返回 -1,不退出
    while (GetMessage(&msg, hWnd, 0, 0)) {
        // 翻译工作
        // 虚拟按键转为标准字符 WM_CHAR
        TranslateMessage(&msg);

        // 给操作系统分发消息
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

 

 

LRESULT CALLBACK WindowProc(HWND hwnd, // 窗口句柄,消息所属的窗口
    UINT uMsg,// 消息标志
    WPARAM wParam,// 附件信息
    LPARAM lParam
    )
{
    switch (uMsg)
    {
    case WM_LBUTTONDOWN:
        MessageBox(hwnd,TEXT("ABC"), TEXT("鼠标左键安下"),MB_OK);
        break;
    case WM_DESTROY:
        PostQuitMessage(2); // WM_QUIT,给主函数 return msg.wParam
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    
}

 

 

绘图

LRESULT CALLBACK WindowProc(HWND hwnd, // 窗口句柄,消息所属的窗口
    UINT uMsg,// 消息标志
    WPARAM wParam,// 附件信息
    LPARAM lParam
    )
{
    switch (uMsg)
    {
    case WM_LBUTTONDOWN:
        MessageBox(hwnd,TEXT("ABC"), TEXT("鼠标左键安下"),MB_OK);
        break;
    case WM_PAINT:
    {
        PAINTSTRUCT ps;// 绘图结构体
        HDC dc = BeginPaint(hwnd, &ps); // 开始
        WCHAR *p = L"aaaaaaa";// 转为宽字节
        TextOut(dc, 30, 30, p, wcslen(p));
        EndPaint(hwnd, &ps);
        break;
    }

    case WM_DESTROY:
        PostQuitMessage(2); // WM_QUIT,给主函数 return msg.wParam
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    
}

 

posted @ 2019-04-30 22:31  狂奔~  阅读(469)  评论(0编辑  收藏  举报