MFC之底层窗口创建

来源:互联网 发布:关宁锦防线 知乎 编辑:程序博客网 时间:2024/05/29 17:50

1.MFC中底层窗口的创建主要使用以下几个步骤:

  • 1.设计窗口类
  • 2.注册窗口类
  • 3.创建窗口
  • 4.显示和更新
  • 5.通过循环来取消息
  • 6.回掉函数 处理消息(窗口过程)

2.实现效果如下:可以捕获到用户键盘、鼠标的按下事件等

这里写图片描述

3.实现代码

/* 底层窗口创建  6步骤 */#include<Windows.h> //底层实现窗口头文件#define true 1#define false 0/*    #define CALLBACK    __stdcall 代表参数的传递顺序,从右往左依次传递,并且入栈,在函数返回前,清空堆栈    WindowProc  窗口过程(回调)*/LRESULT CALLBACK WindowProc(    HWND hwnd,      //消息所属窗口句柄    UINT uMsg,      //消息类别    WPARAM wParam,  //额外参数 wParam-->键盘    LPARAM lParam   //额外参数 lParam-->鼠标){    switch (uMsg)    {    case WM_CLOSE:        //销毁窗口         /* 会触发另外一个消息WM_DESTROY ;约定所有以xxxWindow为结尾的方法,        都不会进入消息队列,而是直接执行 */        DestroyWindow(hwnd);     case WM_DESTROY:        PostQuitMessage(0); //发送一个退出消息        break;    case WM_LBUTTONUP:  //鼠标左键消息    {        int xPos = LOWORD(lParam);        int yPos = HIWORD(lParam);        TCHAR buf[1024];        memset(buf, 0x00, sizeof(buf));        wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos);        MessageBox(hwnd, buf, TEXT("鼠标左键按下!"), MB_OK);    }    case WM_KEYDOWN:    {        MessageBox(hwnd, TEXT("键盘被按下!"), TEXT("键盘被按下!"), MB_OK);        break;    }    case WM_PAINT:    {        //画图        PAINTSTRUCT paint;        HDC hdc = BeginPaint(hwnd,&paint); //开始画图        TextOut(hdc, 100, 100, TEXT("Hello World."),strlen("Hello World."));        EndPaint(hwnd, &paint);//结束画图        break;    }    default:        break;    }    return DefWindowProc(hwnd,uMsg,wParam,lParam); //返回默认处理}/*WINAPI __stdcall 代表参数的传递顺序,从右往左依次传递,并且入栈,在函数返回前,清空堆栈*/int WINAPI  WinMain(    HINSTANCE hInstance,  //应用程序的实例句柄      HINSTANCE hPrevinstance, //上一个应用程序实例,在win32环境下,    //为NULL,不起作用了    LPSTR lpCmdLine, //char *argv[] 命令行参数    int nShowCmd)    //窗口的显示、最大化、最小化、正常显示{    //1.设计窗口类    WNDCLASS winc;    winc.cbClsExtra = 0; //类的额外的内存,通常为0    winc.cbWndExtra = 0; //窗口的额外的内存,通常为0    winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景色     //加载光标,第一个参数为null,代表使用系统提供的默认的一些光标    winc.hCursor = LoadCursor(NULL,IDC_HAND);    //加载图标,第一个参数为null,代表使用系统提供的默认的一些光标    winc.hIcon = LoadIcon(NULL,IDI_WARNING);    winc.hInstance = hInstance;//应用程序实例句柄,传入WinMain中的形成即可    //窗口过程,函数名称任意,WindowsProc为一个回调函数    winc.lpfnWndProc = WindowProc;     winc.lpszClassName = TEXT("WIN"); //指定窗口类的名称    winc.lpszMenuName = NULL; //菜单名称    winc.style = 0;  //风格,0代表默认的风格    //2.注册窗口类    RegisterClass(&winc);    //3.创建窗口    /*    CreateWindowW(    lpClassName,    //类名    lpWindowName,   //窗口名称    dwStyle,        // 风格 混合 WS_OVERLAPPEDWINDOW    x,              //CW_USEDEFAULT 默认值    y,              //CW_USEDEFAULT 默认值    nWidth,         //CW_USEDEFAULT 默认值    nHeight,        //CW_USEDEFAULT 默认值    hWndParent,     //父窗口 没有写NULL    hMenu,          //菜单,没有写NULL    hInstance,      //实例句柄,WinMain函数中的形参    lpParam         //额外参数 没有写NULL    )    */    HWND hwnd = CreateWindow(        winc.lpszClassName,        TEXT("窗口"),        WS_OVERLAPPEDWINDOW,        CW_USEDEFAULT,        CW_USEDEFAULT,        CW_USEDEFAULT,        CW_USEDEFAULT,        NULL,        NULL,        hInstance,        NULL        );    //4.显示和更新    ShowWindow(hwnd, SW_SHOWNORMAL);    UpdateWindow(hwnd);    //5.通过循环来取消息     /*        消息结构体        HWND        hwnd;   //主窗口的句柄        UINT        message;//消息名称        WPARAM      wParam; //额外的参数  键盘        LPARAM      lParam; //额外参数 鼠标  (判断是左键点击还是右键点击)        DWORD       time;   //产生消息所用时间        POINT       pt;     //额外参数 鼠标   (x,y坐标信息)     */    MSG msg;    while (GetMessage(&msg, NULL, 0, 0))    {        /*            GetMessage(            LPMSG lpMsg,    消息结构体            HWND hWnd,      主窗口句柄 NULL 捕获所有窗口的消息            UINT wMsgFilterMin, 过滤消息通常为0            UINT wMsgFilterMax  过滤消息 通常为0  代表捕获所有的消息            )        */        //翻译消息        TranslateMessage(&msg);        //分发消息        DispatchMessage(&msg);          }    //6.回掉函数 处理消息(窗口过程)    /*         LRESULT CALLBACK WindowProc    */    return 0;}

4.若想了解更多,可以参考msdn文档;