博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C++建立一个窗口
阅读量:4481 次
发布时间:2019-06-08

本文共 3851 字,大约阅读时间需要 12 分钟。

      如何用C++建立一个窗口,对于一个新手来说还是比较复杂的,今天就简单给大家介绍如何在空项目下建立一个窗口:

#include "windows.h"//6、处理消息(窗口过程)    //CALLBACK代表__stdcall参数传递顺序  从右往左依次入栈,并且在函数返回前自动清空堆栈内容LRESULT CALLBACK WindowProc(    HWND hwnd,              //消息所属窗口句柄    UINT uMsg,               //具体消息名称,WM_XXX    WPARAM wparam,           //键盘附加消息    LPARAM lparam                //鼠标附加消息){    switch (uMsg)    {    case WM_CLOSE:        DestroyWindow(hwnd);                //触发WM_DESTROY        break;    case WM_DESTROY:        PostQuitMessage(0);                  //发送退出消息        break;    case WM_LBUTTONDOWN:                      //鼠标左键按下消息    {        int xPos;        int yPos;        xPos = LOWORD(lparam);        yPos = HIWORD(lparam);        //打印操作,通常同MessageBox        TCHAR buf[1024];        wsprintf(buf, TEXT("x=%d,y=%d"), xPos, yPos);        //所属窗口、显示内容、标题内容、关联按键类型        MessageBox(hwnd, buf, TEXT("鼠标按下"), MB_OK);        break;    }    case WM_KEYDOWN:       //键盘消息        MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘消息"), MB_OK);        break;    case WM_PAINT:     //绘图    {        PAINTSTRUCT ps;             //绘图结构体        HDC hdc = BeginPaint(hwnd, &ps);        //绘制文字        TextOut(hdc, 100, 100, TEXT("helloworld"), strlen("helloworld"));        EndPaint(hwnd, &ps);        break;    }    default:        break;    }    //默认方式处理    return DefWindowProc(hwnd, uMsg, wparam, lparam);}int WINAPI WinMain(    HINSTANCE hInstance,           //应用程序实例句柄    HINSTANCE hPrevInstance,       //前一个应用程序实例句柄,在win32环境下基本值NULL,不起作用    LPSTR lpCmdLine,             //char *argv[]  命令行参数数组    int nShowCmd)                //窗口显示命令,最大化最小化{    //实现底层窗口  6步骤    //1、设计窗口类    //2、注册窗口类    //3、创建窗口类    //4、显示和更新窗口    //5、通过循环取消息    //6、处理消息(窗口过程)            //1、设计窗口    WNDCLASS wc;    wc.cbClsExtra = 0;//类额外的内存,通常为零    wc.cbWndExtra = 0;//窗口额外的内存,通常为零    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景    wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标,如果第一个参数为NULL,代表使用系统提供的默认光标    wc.hIcon = LoadIcon(NULL, IDI_WARNING);    wc.hInstance = hInstance;//当前实例句柄,WinMain函数中形参即可    wc.lpfnWndProc = WindowProc;//窗口过程函数,回调函数,名称可以随便起    wc.lpszClassName = TEXT("WINDOW");//指定窗口类名    wc.lpszMenuName = NULL;//菜单名,没有填NULL    wc.style = 0;//0代表默认风格    //2、注册窗口类    RegisterClass(&wc);    //3、创建窗口    /*    lpClassName,    //类名    lpWindowName,    //窗口名    dwStyle,        //显示风格  WS_OVERLAPPEDWINDOW    x, y,\    //创建窗口的起始坐标  CW_USEDEFAULT    nWidth,nHeight,    //创建窗口默认宽高    hWndParent,        //父窗口,NULL    hMenu,       菜单  NULL    hInstance,    实例句柄,hInstance    lpParam       其他参数   NULL    */    HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("TEXT WINDOW"), 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;               //消息名称   WM_XXXXX(WINDOW MESSAGE)    WPARAM      wParam;                //附加消息    键盘    LPARAM      lParam;                //附加消息    鼠标左右键    DWORD       time;                  //消息产生时间,    POINT       pt;                    //附加消息   鼠标   x,y坐标    */    MSG msg;    while(1)    {        /*        参数        _Out_ LPMSG lpMsg,               消息结构体        _In_opt_ HWND hWnd,            NULL  捕获所有窗口消息        _In_ UINT wMsgFilterMin,            过滤最小消息数量        _In_ UINT wMsgFilterMax             过滤最大消息数量       都写0代表捕获所有消息        */        if (GetMessage(&msg, NULL,0,0) == FALSE)        {            break;        }        TranslateMessage(&msg);        DispatchMessage(&msg);    }    return 0;}

由上面的代码及注释可以清楚的看到,创建一个窗口共有6步:

       1、设计窗口类

       2、注册窗口类
       3、创建窗口类
       4、显示和更新窗口
       5、通过循环取消息
       6、处理消息(窗口过程)

同时还介绍了窗口处理的事件,包括关闭窗口WM_CLOSE,鼠标左键按下消息WM_LBUTTONDOWN,键盘消息WM_KEYDOWN,绘图消息WM_PAINT,以及这些消息实现的一些细节!!

转载于:https://www.cnblogs.com/zhengxunjie/p/10712840.html

你可能感兴趣的文章
多态的理解
查看>>
AspNet Core 发布到Linux系统和发布IIS 注意项
查看>>
Windows添加.NET Framework 3.0 NetFx3 失败 - 状态为:0x800f0950
查看>>
隐藏显示终端的光标(shell echo,linux c printf)
查看>>
SQL Server 存储过程
查看>>
JSP 标准标签库(JSTL)(JSP Standard Tag Library)
查看>>
导入项目遇到的问题: Some projects cannot be imported because they already exist in the workspace....
查看>>
华为:字符集合
查看>>
window10 家庭版 添加Hyper-V虚拟机
查看>>
1020. 月饼 (25)
查看>>
《小学生四则运算出题软件》个人项目总结
查看>>
QFTP走了以后QNetworkAccessManager出现了
查看>>
flex 中embed 的用法
查看>>
安装vuecli和使用elememtUi
查看>>
Windows 8 开发31日-第06日-搜索合约
查看>>
数据库SQL SELECT查询的工作原理
查看>>
获取屏幕分辨率
查看>>
李开复:我对年轻人是分享经验 不是要当导师
查看>>
reportng优化
查看>>
游戏运营技术之---->运用箱线图分析PCU和DAU(一)
查看>>