精华内容
下载资源
问答
  • windows的窗口是一个什么
    千次阅读
    2021-05-19 12:04:43

    还在为自己写的黑框框程序而烦扰吗?想不想写一个想windows窗口程序?

    很简单,只要有C语言的基础。经过简单的学习,就能投入windows的怀抱了!!!:)

    第一步,建立一个win32工程:

    我使用的是Code::Blocks.首先要建立一个win32工程。Flie->New->Project 如下图:

    0818b9ca8b590ca3270a3433284dd417.png

    CODEBLOCKS 创建win32工程

    选择上面的win32 GUI PROJECT.后面按照它的提示一步一步做下去就可以了。

    PS:有可能你使用的不是Code::Blocks。而是VC,那也是一样的,首先也要建立一个win32 Applacation工程。

    工程建立好了,打开工程,找到里面的 main.cpp 文件。然后编译一下就可以看到你第一个窗口程序了:

    0818b9ca8b590ca3270a3433284dd417.png

    win32简单窗口程序

    是不是很兴奋,终于创建了自己的第一个窗口程序?不过在这里我们好像什么都没做,只是按照编译器一步步走下去的。

    换句话说,我们的程序什么也没有做!!!

    这的确不是一个好消息,我们应该让它做点什么。至少像以前一样,输出一个 “Hellow world”。

    不过在windows下我们可没有printf函数。那么该怎么办呢?

    别担心,windows向屏幕输出的函数有很多,像TextOut()。不过这次我们还不准备使用,因为这牵涉到了

    HDC的一些知识。如果要将HDC的话,还要牵出N多windows编程的只是,那超出了本文的范围..... : )

    我们在安装软件,如果安装失败会出现一个对话框提示你安装失败。这是怎么实现的呢?

    这使用的是一个叫MessageBox的函数,详细的介绍在这里:MessageBox(NULL,TEXT("HI"),TEXT("Hellow World"),MB_OK);效果图:

    0818b9ca8b590ca3270a3433284dd417.png

    MESSAGEBOX 效果

    怎么样?神奇吧!大笨兔第一次用这个函数的时候特别激动,终于有一个不是黑黑的框框了。

    还有这个函数的TEXT("HI"),其中TEXT是一个宏,是为了支持多字符环境设置的,如果单是输出英文

    也可以不加宏,但中文的话最好是加上。第四个参数MB_OK设置弹出来的对话框有一个“确定”按钮。

    至于其他的样式还有很多,大家都去试试。

    说着说着好像刚开始建立的工程还有里面的代码没说到啊,那是处理整个程序的窗口消息和绘制的。

    这里面也牵涉了大量的windows编程的知识,如果大家有兴趣,可以买一本《windows程序设计》看看。

    里面讲的很详细。

    这篇文章就是大笨兔在写多了黑框框程序觉得特别没劲,后来发现了messagebox这一个函数,

    第一次接触windows编程。才发现自己没必要担心。程序重要的不是外表,而是对程序的把握,只要真的把黑框框

    程序写好了。要转到图形界面很容易...

    好了,不多说了。继续做我的俄罗斯方块去。如果这篇文章对你有用,那我很开心。如果你觉得没什么用,

    就当看看吧。 : )

    0818b9ca8b590ca3270a3433284dd417.png

    win32简单窗口程序

    更多相关内容
  • 这些系统都是由一个窗口组成的?那么,什么是窗口呢?举个简单的例子,比如双击我的电脑之后,就打开了一个窗口,如下图所示。下面,就让我们一起来学习关于电脑窗口的相关知识吧。1、窗口的组成1)边框和工作区 每...

    现在,很多的操作系统都是视窗操作系统,比如:Windows、linux、iOS等。这些系统都是由一个个窗口组成的?那么,什么是窗口呢?举个简单的例子,比如双击我的电脑之后,就打开了一个窗口,如下图所示。下面,就让我们一起来学习关于电脑窗口的相关知识吧。

    86282b1e5b82695e2e87d9d9cc5d6ff8.png

    1、窗口的组成

    1)边框和工作区 每个窗口都有四个边,将鼠标移到边上,指针会变成双箭头

    16d89af9b3715245bc831d58766d06a7.png,这时拖动就可以改变窗口的大小,中间就是工作区;

    2)标题栏 每个窗口最上面都有一个蓝色的长条,这是窗口的标题,称作标题栏,在标题栏的左边是窗口的名称,最右边是三个按钮图标

    311941b3681c8b0a3f5d1361b67eb4fd.gif

    从图标上可以看出,第一个是最小化,中间是最大化,第三个就是关闭了,将鼠标移到标题栏上,然后拖动标题栏可以移动这个窗口;

    47fa9cfe672e9179cfe9498ef8970dc8.gif

    3)菜单栏 在标题栏的下方是菜单栏,每个菜单都有一个文字名称,单击一下会出来一个下拉菜单,第一个是“文件”菜单,第二个是“编辑”菜单,里面都有相关的命令,记住文件菜单里有“保存”和“另存为”命令,编辑里有“复制”和“粘贴”命令;

    f35fe7c123b1aec0b1de8825b487a136.gif

    4)工具栏 菜单栏的下方有一排按钮,它们是最常用的一些菜单命令,都是用按钮图标来表示,图标比文字更形象一些,操作也更简便,  记住后退按钮

    90a1c018a39b933004f65638489cd5c8.gif

    cc61621256a45d8215fac83bace1adf4.gif

    5)地址栏 在工具栏的下方有一个白色的长条,里面是当前的位置,长条右边有一个黑色的三角按钮

    2014070410225432.gif,单击它,可以选择其他的位置;

    d9f51899c332df37dea94e5a434baf2b.gif

    6)工作区 窗口中的空白区域就是工作区,里面可以放文件和文件夹,在“我的电脑”窗口中放的是磁盘,方形盒子形状的是逻辑硬盘,一个光盘形状的是光驱,

    不同的窗口中工作区也不同,例如在“记事本”窗口中可以输入文字,在“画图”程序窗口中可以绘画;

    7)滚动条 在窗口的右边和底边有时会出现一个长条上下是两个黑箭头,这就是滚动条,单击黑箭头或者拖动滚动条,窗口中遮挡的内容就会显现出来;

    fe806ba3d4031e6d2c62bcde55635a04.gif

    8)常见任务 在窗口左侧,显示了一些常用的操作,可以方便的切换到其他位置;

    a62ab15e299f014c69ea6184bddd7817.gif

    练习:

    1、双击“我的电脑”图标,打开“我的电脑”窗口,瞄准标题栏把它拖到右边,再移到中间,最小化窗口、最大化窗口,然后再还原;

    2、记住窗口的各个组成部分的名称和作用;

    3、打开“我的电脑”窗口中“(C:)”盘,看一下窗口中的内容,单击工具栏上的“向上”按钮,回到“我的电脑”,再打开“(D:)”盘,看一下窗口中的内容,点“向上”按钮,回到“我的电脑”;

    4、看一下地址栏中的内容,确定当前的位置,单击黑色的下拉按钮,在出现的下拉列表中单击“我的文档”文件夹,看一下窗口发生的变化,单击“后退”按钮返回原位;

    5、找一个窗口有滚动条的窗口,拖动一下滚动条,再单击上下的黑三角按钮看看有什么不同?

    结束语:窗口这个概念其实不难,几乎每个程序都是一个窗口,我们也是通过这些窗口跟操作系统进行交互的。

    展开全文
  • 一个简单的windows窗口程序

    千次阅读 2020-09-23 21:51:59
    一个简单的windows窗口程序创建一个windows窗口程序的步骤具体实现代码实现效果 创建一个windows窗口程序的步骤 定义窗口类 注册窗口类 创建窗口 更新显示窗口 建立消息循环 处理消息 具体实现代码 #include ...

    一、创建一个windows窗口程序的步骤

    • 定义窗口类
    • 注册窗口类
    • 创建窗口
    • 更新显示窗口
    • 建立消息循环
    • 处理消息

    所用环境:Visual Studio 2019

    (1)打开vs2019,选择创建新项目
    在这里插入图片描述
    (2)选择windows桌面应用程序在这里插入图片描述
    (3)输入项目名称及存储路径,点击创建
    在这里插入图片描述
    (4)如图创建完成
    在这里插入图片描述

    二、具体实现代码

    (1)找到wndproc这个函数块
    在这里插入图片描述
    (2)在switch里写入点击鼠标左键出现窗口的代码

    在这里插入图片描述
    代码如下

    case WM_LBUTTONDOWN: //点击鼠标左键
            MessageBox(hWnd, TEXT("点击了鼠标左键"), TEXT("事件"), MB_OK);//MB_OK设置一个ok按钮
            break;
    

    (3)在VM_PAINT中写入代码,实现在窗体中显示文本,例如“我的第一个windows窗口文件”
    在这里插入图片描述
    代码如下

    case WM_PAINT://绘制主窗口
            {
            PAINTSTRUCT ps; //绘图结构体
            HDC hdc = BeginPaint(hWnd, &ps); //开始绘图
            SetTextColor(hdc, RGB(0,0,0));//黑色的画笔
            TextOut(hdc, 150, 150, L"我的一个window窗口文件", strlen("我的一个window窗口文件"));
            EndPaint(hWnd, &ps);//结束绘图
            break;
            }
            break;
    

    (3)在VM_CLOSE中写入代码,实现点击关闭按钮弹出提示窗口

    在这里插入图片描述

    代码如下

    case WM_CLOSE: //关闭窗口
        {
            if (IDYES == MessageBox(hWnd, TEXT("是否退出窗口"), TEXT("关闭窗口"), MB_YESNO))//MB_OK设置一个o按钮
            {
                DestroyWindow(hWnd);//关闭窗口
            }
        }
            break;
    

    (4)程序完整代码如下

    #include "framework.h"
    #include "第一个windows窗口程序.h"
    #include <windows.h>
    
    #define MAX_LOADSTRING 100
    
    // 全局变量:
    HINSTANCE hInst;                                // 当前实例
    WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
    WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名
    
    // 此代码模块中包含的函数的前向声明:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPWSTR    lpCmdLine,
                         _In_ int       nCmdShow)
    {
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);
    
        // TODO: 在此处放置代码。
    
        // 初始化全局字符串
        LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadStringW(hInstance, IDC_WINDOWS, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);
    
        // 执行应用程序初始化:
        if (!InitInstance (hInstance, nCmdShow))
        {
            return FALSE;
        }
    
        HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWS));
    
        MSG msg;
    
        // 主消息循环:
        while (GetMessage(&msg, nullptr, 0, 0))
        {
            if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    
        return (int) msg.wParam;
    }
    
    
    
    
    ATOM MyRegisterClass(HINSTANCE hInstance)//注册窗口类
    {
        WNDCLASSEXW wcex;
    
        wcex.cbSize = sizeof(WNDCLASSEX);
    
        wcex.style          = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc    = WndProc;
        wcex.cbClsExtra     = 0;//附加信息
        wcex.cbWndExtra     = 0;
        wcex.hInstance      = hInstance;//传递给MyRegisterClass的hInstance参数值
        wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDOWS));//默认的图标
        wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);//设置光标为箭头
        wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);//默认背景
        wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_WINDOWS);
        wcex.lpszClassName  = szWindowClass;
        wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
        return RegisterClassExW(&wcex);//注册窗口类
    }
    
    
    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)//   目标: 保存实例句柄并创建主窗口
    {
       hInst = hInstance; // 将实例句柄存储在全局变量中
    
       HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       ShowWindow(hWnd, nCmdShow);//更新窗口
       UpdateWindow(hWnd);//显示窗口
    
       return TRUE;
    }
    
    
    
    
    LRESULT CALLBACK WndProc(
        HWND hWnd,//窗户句柄
        UINT message, 
        WPARAM wParam, //附加信息
        LPARAM lParam
    )//处理主窗口的消息。
    {
        switch (message)
        {
        case WM_LBUTTONDOWN: //点击鼠标左键
            MessageBox(hWnd, TEXT("点击了鼠标左键"), TEXT("事件"), MB_OK);//MB_OK设置一个ok按钮
            break;
        case WM_CLOSE: //关闭窗口
        {
            if (IDYES == MessageBox(hWnd, TEXT("是否退出窗口"), TEXT("关闭窗口"), MB_YESNO))//MB_OK设置一个o按钮
            {
                DestroyWindow(hWnd);//关闭窗口
            }
        }
            break;
        
        case WM_PAINT://绘制主窗口
            {
            PAINTSTRUCT ps; //绘图结构体
            HDC hdc = BeginPaint(hWnd, &ps); //开始绘图
            SetTextColor(hdc, RGB(0,0,0));//黑色的画笔
            TextOut(hdc, 150, 150, L"我的一个window窗口文件", strlen("我的一个window窗口文件"));
            EndPaint(hWnd, &ps);//结束绘图
            break;
            }
            break;
        case WM_DESTROY://发送退出消息并返回
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
    
    // “关于”框的消息处理程序。
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
    
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }
    
    

    三、实现效果

    运行程序
    在这里插入图片描述
    鼠标左键点击窗口
    在这里插入图片描述
    关闭窗口在这里插入图片描述

    展开全文
  • C/C++ 从零实现一个windows窗口(非常详细)

    千次阅读 多人点赞 2022-04-13 09:38:05
    主要讲解用C/C++创建一个Windows窗口的全过程,非常详细了........


    教程推荐:

    人工智能教程,点击这里查看,通俗易懂,风趣幽默

    C/C++教程,点击这里查看,以项目为主导从入门到精通

    前言

    学习完C/C++之后,最郁闷的可能就是感觉啥也干不了,怎么才能写出平常我们所使用的软件模样?

    而对于大部分人来说,最常使用的就是windows系统,所以这就需要了解windows编程,熟悉一个windows窗口的建立流程

    建立一个windows窗口的过程是非常繁琐的,真正做开发的时候,为了追求效率,一般会选用现场的框架,比如大型的QtMFC,或者小型灵巧的ATL模板库,可大大简化C/C++程序员的程序开发。

    而本文旨在了解实现一个基本windows窗口,我们需要做哪些必要步骤?以及明白当我们用别人的框架短短几行代码实现一个窗口的背后,框架为我们做了哪些工作?

    学习方法

    Windows API编程对新手来说是一件非常痛苦的事情,因为它全部用的自定义变量类型,和一些宏,以及很多函数的参数非常多,有的可能多达10个

    但这些你不需要过分关注,在VS中,你可以复制下代码后,右键具体的变量类型或函数,如WORD,然后点击速览定义,就可以看到它的实际类型,即C/C++中的如int,short char等基本数据类型
    在这里插入图片描述

    或者对于复杂的函数,如winmain等,只需要将鼠标点击到该函数名,按F1即可跳转到官方文档

    注意,这些完全不用专门去记住,因为WIndows自定义的类型太多了,你只需要知道怎样快速的查到信息即可,需要的时候直接查官方文档就可以了

    一、建立一个窗口的基本步骤

    1. 向系统注册一个窗体类
    2. 根据窗体类创建窗口
    3. 进入消息循环

    看起来很简单的,不是吗?也就三个步骤而已

    但真正让新手痛苦的是这三个步骤中所使用的大量Win API函数

    接下来就开始详细介绍具体各个步骤

    二、具体流程

    1.创建一个空的windows窗口项目

    选择windows桌面向导
    在这里插入图片描述
    随便取一个名字,根据我的经验,尽量用字母英文,别用汉字,否则以后可能会出现奇奇怪怪的错误
    在这里插入图片描述
    点击创建后,选择如下图所示的内容
    在这里插入图片描述
    点击确认即可
    在这里插入图片描述
    右键源文件,添加,新建项
    在这里插入图片描述
    创建一个.cpp文件即可,名字可自取,我习惯于用英文,防止出现不必要的意外

    这样,一个空的带窗口程序的空项目就建立完成了,但现在才刚刚开始!

    2.WinMain函数

    学到这里,相信至少对C/C++基础应该是相当熟悉的,一个最简单的C/C++程序就必须要写上main函数,否则无法编译成功,因为这是控制台程序的入口函数

    这里也一样,当你想写带界面的窗口程序,你就需要将入口函数改为WinMain

    函数原型:

    int WINAPI WinMain(
      [in] HINSTANCE hInstance, //当前应用程序的实例
      [in] HINSTANCE hPrevInstance, //这个不用管,想了解的可参考官方文档
      [in] LPSTR     lpCmdLine, //传入的命令行参数
      [in] int       nShowCmd //控制当前应用窗口如何显示
    );
    

    官方文档点这里

    前面的【in】等只是让你知道这个参数是输入还是输出的,可以直接删除掉,改下格式后,代码如下:
    在这里插入图片描述
    再次强调,不用试图去记忆,这会加重你的学习负载,直接复制即可,各个参数的含义,会在后面具体的代码中用到,用的多了,就自然而然的记住了

    3.注册窗口类

    这里主要用到API函数RegisterClass

    函数原型:

    ATOM RegisterClassA(
      [in] const WNDCLASSA *lpWndClass //填入要注册的窗口结构
    );
    

    窗口结构WNDCLASSA

    typedef struct tagWNDCLASSA {
      UINT      style;  //设置窗口格式,可参考官方文档,一般设置为水平重画与垂直重画:CS_HREDRAW | CS_VREDRAW
      WNDPROC   lpfnWndProc; //窗口的回调函数,也就是窗口接收到消息后,交给哪个函数处理
      int       cbClsExtra; //为类额外分配内存,一般为0
      int       cbWndExtra; //为窗口额外分配内存,一般为0
      HINSTANCE hInstance; //程序实例,这里就用到了WinMain函数的第一个参数hInstance
      HICON     hIcon; //设置程序图标
      HCURSOR   hCursor; //设置程序光标
      HBRUSH    hbrBackground; //设置程序背景色
      LPCSTR    lpszMenuName; //设置菜单名称
      LPCSTR    lpszClassName; //设置类名称
    } WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
    

    使用:

    #include<Windows.h>
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) {
    	WNDCLASS wndcls; //创建一个窗体类
    	wndcls.cbClsExtra = 0;//类的额外内存,默认为0即可
    	wndcls.cbWndExtra = 0;//窗口的额外内存,默认为0即可
    	wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//获取画刷句柄(将返回的HGDIOBJ进行强制类型转换)
    	wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);//设置光标
    	wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);//设置窗体左上角的图标
    	wndcls.hInstance = hInstance;//设置窗体所属的应用程序实例
    	wndcls.lpfnWndProc = NULL;//设置窗体的回调函数,暂时没写,先设置为NULL,后面补上
    	wndcls.lpszClassName = L"test";//设置窗体的类名
    	wndcls.lpszMenuName = NULL;//设置窗体的菜单,没有,填NULL
    	wndcls.style = CS_HREDRAW | CS_VREDRAW;//设置窗体风格为水平重画和垂直重画
    	RegisterClass(&wndcls);//向操作系统注册窗体
    }
    
    

    在这里插入图片描述

    在上述代码中,还用到了三个额外的API,

    GetStockObject:获取电脑自带的画刷,笔等
    LoadCursor:加载光标,也就是我们电脑屏幕上常见的箭头,十字,转圈等图形
    LoadIcon:加载图标资源

    这三个函数很简单,因为参数很少,不好理解的可能是这些参数应该怎能填?从哪里来?

    最稳妥的方法依旧是查看官方文档,虽然是英文,但现在的翻译也很强大了,相信难不倒诸位对吧(❁´◡`❁)

    比如这里用GetStockObject函数举例,进入官网,就可以看到可填参数有很多:
    在这里插入图片描述
    后面两个函数还多一个程序实例的参数,我都填的NULL,意思就是从系统默认中加载即可,我也没有自己做的图标啊ಠ_ಠ

    4.创建窗口

    这里用到的函数就可以说是一个超级函数了,参数多达11个(┬┬﹏┬┬)

    CreateWindow:创建一个窗口
    函数原型:

    void CreateWindowA(
      [in, optional]  lpClassName,//窗口类名,也就是上面注册窗口类时填的类名
      [in, optional]  lpWindowName, //窗口名,也就是窗口显示时,左上角显示的名称
      [in]            dwStyle, //窗口风格,一般填WS_OVERLAPPEDWINDOW即可,这样创建的窗口就有最大化,最小化等等等等属性。。。
      [in]            x, //窗口最开始被创建在哪里?这里填X坐标,一般默认CW_USEDEFAULT即可
      [in]            y, //窗口最开始被创建在哪里?这里填Y坐标,一般默认CW_USEDEFAULT即可
      [in]            nWidth, //窗口创建的宽度,一般默认CW_USEDEFAULT即可
      [in]            nHeight, //窗口创建的高度,一般默认CW_USEDEFAULT即可
      [in, optional]  hWndParent,//父窗口的句柄,没有,填NULL
      [in, optional]  hMenu, //菜单句柄,没有,填NULL
      [in, optional]  hInstance, //应用程序实例,这里就又用到了WinMain的第一个参数
      [in, optional]  lpParam //额外的数据,挺复杂的,咱们也不需要,填NULL就行了
    );
    

    虽然这个函数的参数巨多,但很多参数都是填默认的就可以了,所以有没有一种把它封装一下的冲动呢(●’◡’●),以后就可以填两三个参数就行了,这里我就先不谈了,可以自己尝试一下

    使用:

    	//产生一个窗体,并返回该窗体的句柄,第一个参数必须为要创建的窗体的类名,第二个参数为窗体标题名
    	HWND hwnd = CreateWindow(L"test", L"我的第一个窗口",
    		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
    		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    		NULL, NULL, hInstance, NULL);
    

    此时代码截图:
    在这里插入图片描述
    可能长的有点怪,但没办法,参数太多,一行放不下(┬┬﹏┬┬)

    此时还没有结束,因为窗口创建后默认隐藏的,所以我们还得让它显示出来:

    	ShowWindow(hwnd, SW_SHOWNORMAL);//把窗体显示出来
    	UpdateWindow(hwnd);//更新窗体
    

    这两个API函数也很简单,就一两个参数,稍微看一下文档就能明白
    ShowWindow :显示窗口的方式,我填的SW_SHOWNORMAL,即正常显示,更多可选参数看官方文档就完事了(❁´◡`❁),而前面那个hwnd就是上面创建窗口返回的窗口句柄
    UpdateWindow:就一个参数,上面创建窗口时返回的窗口句柄,作用就是给窗口发个消息,命令它马上重新画一下窗口 ╰(‵□′)╯

    此时的代码截图:
    在这里插入图片描述

    5.消息循环

    消息循环对于一个带界面的程序来说可以是最重要的一环了

    如何理解消息呢?举个简单的例子,就是当你用鼠标拖动一个窗口时,窗口为啥能跟着你的鼠标运动?就是依靠的消息。

    当你的鼠标点击窗口时,就会向对应的窗口发送鼠标点击消息,当你鼠标左键点击并移动时,就会向窗体发送鼠标点击和移动的消息

    所谓的消息其实也就是一个结构体,其中包含了消息的类型和其它相关的信息,比如鼠标点击的屏幕坐标等,这个还是老话,得参考官方文档!

    下面就开始正式介绍消息循环

    消息循环中主要用到了三个API函数:
    GetMessage:拿到消息
    TranslateMessage:翻译消息
    DispatchMessage:派发消息

    函数原型:

    BOOL GetMessage(
      [out]          LPMSG lpMsg, //拿到的消息
      [in, optional] HWND  hWnd, //拿哪个窗口的消息,一般填NULL,即拿属于该线程所有窗口的消息
      [in]           UINT  wMsgFilterMin, //过滤消息,最小值,一般填0
      [in]           UINT  wMsgFilterMax //过滤消息,最大值,一般填0,当两个均为0,则不进行过滤
    );
    
    BOOL TranslateMessage(
      [in] const MSG *lpMsg //翻译消息,如将WMWM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息
    );
    

    该函数官方文档的内容中,说道如果使用虚拟键码的话,就可不用该函数╰(°▽°)╯,所以还是得多看官方文档啊,总能有一些意外之喜
    在这里插入图片描述
    这里又说道了虚拟键码,真是越学东西越多啊(┬┬﹏┬┬)

    所谓虚拟键码,就是一个数值而已,某一个确定的数值代表你按下的某个键,比如当你按下A键,程序就会收到一个包含数值0x41的消息,这个数字其实就是字母A的ASCII码表的值,所以代码中可以直接写为’A’就可以了

    ASCII码表应该就不用过多解释了吧…

    如果不理解,还是看下面的程序吧!至少得把基本步骤记住啊!

    LRESULT DispatchMessage(
      [in] const MSG *lpMsg
    );
    

    该函数就是把消息派发给对应的窗口,因为一个程序可以有很多窗口的吧,总得让消息发送给对应的窗口,否则我点这个窗口,要么没反映----没有收到消息,要么另外一个窗口动了----发错窗口了…

    6.回调函数

    回调函数可就很重要了,因为你在窗口上所做的一切,都会以消息的形式发送给窗口,而窗口就是通过回调函数来处理这些消息的!

    回调函数格式:

    LRESULT CALLBACK WinSunProc(
    	HWND hwnd,      // 窗口句柄
    	UINT uMsg,      // 消息识别符
    	WPARAM wParam,  // 第一个消息参数
    	LPARAM lParam   // 第二个消息参数
    )
    

    这个函数的参数由系统传入,特别是后两个参数,其含义取决于收到的消息类型!

    就可以写下代码:

    LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    	switch (uMsg)//通过判断消息进行消息响应
    	{
    	default:
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题
    	}
    	return 0;
    
    

    此函数中写个switch结构是基本操作,目的就是不同消息进行不同处理

    具体系统有哪些消息呢?点这里查看

    需要注意的是DefWindowProc函数,参数就是回调函数所传入的参数,目的就是对我们不感兴趣的消息进行默认处理

    此时就可以为我们前面窗口类的回调函数参数填上此函数的名称

    此时程序结构如下:
    在这里插入图片描述
    现在,你就已经可以运行程序了!
    在这里插入图片描述
    成功出现窗口!

    左上角那个X就是前面LoadIcon加载的资源,光标是个十字就是LoadCursor函数加载的资源,可自行更改

    可能你会注意到,当你点击右上角的X时,窗口没了,但程序仍然在运行,这是因为我们没有处理窗口关闭消息

    此时应该添加对WM_CLOSE和WM_DESTROY消息的处理

    	switch (uMsg)//通过判断消息进行消息响应
    	{
    	case WM_CLOSE:
    		DestroyWindow(hwnd);//销毁窗口并发送WM_DESTROY消息,但是程序没有退出
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);//发出WM_QUIT消息,结束消息循环
    		break;
    	default:
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题
    	}
    	return 0;
    

    当你点击关闭时,会发送WM_CLOSE消息到该函数,这里再WM_COLSE的消息处理中调用了DestroyWindow函数,该函数的作用就是彻底摧毁该窗口和与该窗口相关的一切东西,并向自己发送WM_WM_DESTROY消息

    所以我们就需要处理WM_DESTROY消息,这里调用了PostQuitMessage函数,目的是发送一个退出程序的消息 WM_QUIT ,当消息循环中的GetMessage函数收到该消息时,就会返回0,继而退出while循环,进而程序结束

    此时运行程序,就可以正常退出了!

    至此,通过重重困难,你终于从0写出了一个窗口程序了!

    此时你也应该明白哪些MFC框架、Qt框架为我们做了多少事情吧( ̄y▽, ̄)╭

    最后再把完整代码贴出来供大家借鉴

    三、完整代码

    #include<Windows.h>
    LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
    	switch (uMsg)//通过判断消息进行消息响应
    	{
    	case WM_CLOSE:
    		DestroyWindow(hwnd);//销毁窗口并发送WM_DESTROY消息,但是程序没有退出
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);//发出WM_QUIT消息,结束消息循环
    		break;
    	default:
    		return DefWindowProc(hwnd, uMsg, wParam, lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题
    	}
    	return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) {
    	WNDCLASS wndcls; //创建一个窗体类
    	wndcls.cbClsExtra = 0;//类的额外内存,默认为0即可
    	wndcls.cbWndExtra = 0;//窗口的额外内存,默认为0即可
    	wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//获取画刷句柄(将返回的HGDIOBJ进行强制类型转换)
    	wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);//设置光标
    	wndcls.hIcon = LoadIcon(NULL, IDI_ERROR);//设置窗体左上角的图标
    	wndcls.hInstance = hInstance;//设置窗体所属的应用程序实例
    	wndcls.lpfnWndProc = WinSunProc;//设置窗体的回调函数,暂时没写,先设置为NULL,后面补上
    	wndcls.lpszClassName = L"test";//设置窗体的类名
    	wndcls.lpszMenuName = NULL;//设置窗体的菜单,没有,填NULL
    	wndcls.style = CS_HREDRAW | CS_VREDRAW;//设置窗体风格为水平重画和垂直重画
    	RegisterClass(&wndcls);//向操作系统注册窗体
    
    	
    	//产生一个窗体,并返回该窗体的句柄,第一个参数必须为要创建的窗体的类名,第二个参数为窗体标题名
    	HWND hwnd = CreateWindow(L"test", L"我的第一个窗口",
    		WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,
    		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    		NULL, NULL, hInstance, NULL);
    
    	ShowWindow(hwnd, SW_SHOWNORMAL);//把窗体显示出来
    	UpdateWindow(hwnd);//更新窗体
    
    	MSG msg;
    	//消息循环
    	while (GetMessage(&msg, NULL, 0, 0))//如果消息不是WM_QUIT,返回非零值;如果消息是WM_QUIT,返回零
    	{
    		TranslateMessage(&msg);//翻译消息,如把WM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息
    		DispatchMessage(&msg);//派发消息
    	}
    
    }
    
    

    四、更多

    欢迎点击下方关注我的公众号!持续更新软件、资源、以及技术文章!

    展开全文
  • windows切换窗口,取消edge窗口为多

    万次阅读 多人点赞 2021-02-08 17:09:26
    需要修改 按Alt+Tab将显示这样在切换窗口时,edge窗口就为一个 原图无法截取 设置: 1. 点击设置,找到系统,找到多任务处理 系统默认图 2. 需要修改 按Alt+Tab将显示 如图: 这样在切换窗口时,edge窗口就为一个...
  • Windows编程---使用C/C++语言创建一个窗口

    万次阅读 多人点赞 2019-01-20 20:17:42
    序言 记得刚学习C语言的时候,我还只能写出在“小黑框”里面运行的控制台程序。后来我了解到这种控制台程序属于命令行界面(CLI,Command-Line Interface),而...但是苦于课业的繁忙,我只能利用课余的时间来了解...
  • 文章目录、前言二、使用Spy++工具分析窗口三、C#通过Windows API捕获窗口,获取窗口文本四、附录:Windows窗口消息 、前言 项目是Unity开发的,上架了QQ游戏大厅,需要兼容XP系统。 QQ游戏大厅启动游戏的流程是...
  • Python对Windows程序窗口的操作

    千次阅读 多人点赞 2021-10-25 15:36:23
    hwnd = win32gui.FindWindow(lpClassName=None, lpWindowName=None) # 查找窗口,不找子窗口,返回值为0表示未找到窗口 hwnd = win32gui.FindWindowEx(hwndParent=0, hwndChildAfter=0, lpszClass=None, lpszWindow=...
  • Windows 任意窗口置顶显示

    千次阅读 2021-12-16 12:33:14
    Window TopMost Control是一款非常小巧简单的 Windows 软件,功能也只有一个——就是让任意窗口置顶显示。 官网:Window TopMost Control 网盘:https://pan.baidu.com/s/1asfduTA5tMes5kJFc9aRmQ 提取码:toqx ...
  • windows窗口置顶--Windows on Top

    千次阅读 2021-06-01 19:38:06
    在工作的时候,有时需要频繁切换窗口,而有时候需要看实时的数据请求,将窗口调小,又不好后面代码修改操作。这款工具可以随时、将任意窗口置顶、取消置顶。极大的方便工作。 工具jie'mian ...
  • Windows窗口消息大全

    热门讨论 2013-05-24 11:16:10
    Windows窗口消息大全,全不全自己看
  • python操作windows窗口获取窗口句柄

    万次阅读 多人点赞 2019-11-06 09:16:54
    对获取有影响,就会出现在本地调试正常的程序,交付使用的时候报错。查看windows所有可显示的窗口句柄及窗口名称。在Windows下获取窗口句柄时。
  • 本文不会太深,只是从模态窗口一词出发,抵达大家都熟知的一些知识为止。 本文内容开发中的模态窗口模态窗口的三特点实现模态窗口API 调用禁用主窗口阻塞代码等待操作完成进行 UI 强提醒 开发中...
  • windows切换窗口快捷键

    千次阅读 2021-04-06 11:44:19
    IDE有快捷键,windows也有快捷键(感觉也可以总感觉汇总一个),这里就是关于windows切换窗口的几个快捷键。 1 crtl + tab 这个是最常见的快捷键,优点是兼容的版本挺多的,浏览器页面切换有的也支持这个,缺点是很...
  • 选择一个窗口然后按快捷键ctrl+alt+space就能将窗口显示在最前了,对其他窗口操作它也不会消失,非常方便: 除此之外,它还有直接从列表选择窗口的功能: 参考文章:Window TopMost Control 1.0 绿色版_窗口...
  • 快速切换窗口的快捷键是什么

    千次阅读 2021-07-28 03:06:11
    快速切换窗口的快捷键是什么使用快捷键能让我们更加快捷地操作电脑,那么快速切换窗口的快捷键是什么呢?下面小编带着大家起来了解一下吧!快速切换窗口的快捷键方法、Alt+Tab快捷键切换窗口在使用Alt+Tab快捷键...
  • 最初了解Windows api编程呢,就是先创建出一个最简洁的窗口,就如我们学习C/C++时的"Helloword"一样,这是进入windows编程大门的重要一个步,下面就开始吧...  大家都知道C/C++中,程序的执行是从main()...
  • Windows如何平铺两个窗口

    千次阅读 2018-11-23 17:52:44
    1、首先要打开多个窗口,一定不能全屏 2、选中其中一个窗口按“win+向左或是向右键”(按三秒不动,直到出现透明界面),其中这个界面靠向你想要的方向;鼠标选中另一个透明界面,按enter键,则两个窗口平铺 ...
  • python操作Windows窗口程序

    万次阅读 多人点赞 2018-03-16 17:23:09
    消息是windows应用的重要部分,用来告诉窗体“发生了什么”,比如给一个按钮发送BN_CLICKED这么个消息,按钮就知道“哦,我被点了”,才能执行相应的下一步操作。说明:这个获取的就是红色区域中的项目啦,注意,...
  • WTEditor是款简单实用免费开源的可视化windows窗口标题栏文字修改工具,采用VB语言开发,主要功能就是帮助用户对windows窗体标题的字体内容进行修改,也就是可以对windows窗体标题修改操作,由于WTEditor修改后不...
  • Windows窗口程序设计中,按钮、文本编辑框等控件都作为个子窗口在WM_CREATE事件中创建的。其中按钮类button有多种类型和风格,常见的单选钮、复选钮、分组框也在此类中,见下表: 子窗口控件:按钮类button ...
  • windows切换窗口到不同屏幕的快捷键

    千次阅读 多人点赞 2020-12-19 22:33:22
    偶然按错键了,发现当前窗口漂移到另外一个屏幕上了~~~ 由此引发按键探索~ shift+windows+左/右键:将当前活动窗口漂移(闪现)到左/右边屏幕; 场景: 想快速的移动屏幕; 远程连接电脑时快速的将另外一个...
  • windows的资源管理器窗口中,其左边窗口显示的内容是“系统的文件夹树”。在“资源管理器”窗口中,左边的文件夹窗口以树形目录的形式显示文件夹,右边的文件夹内容窗口是左边窗口中所打开的文件夹中的内容。 文件...
  • Windows下打开命令窗口几种方式

    千次阅读 2021-11-24 19:50:54
    Windows下打开命令窗口几种方式 1.点击开始 --> Windows系统 -->点击击命令提示符 ,就可以运行 注意:如果以管理员身份运行,就选中命令提示符右击更多,点击以管理员身份运行 2. Windows + R 快捷键弹出...
  • 1、首先需要创建一个.bat文件。可以先新建一个记事本,然后将后缀名改为“.bat”,例如“test.bat”。 2、然后编辑内容 @echo off start cmd /k "cd/d D:\AA\service\redis &&redis-server.ex
  • Windows强制窗口最大化

    千次阅读 2021-06-03 21:20:00
    Terminus是一个好用的终端模拟器,可是有时候将它隐藏后再打开它时它并不是最大化的状态,这看着会很难受,如何让它强制最大化呢? 具体操作 使用Autohotkey将其强制最大化 #Persistent SetTimer, Max, 1000 Return ...
  • windows下置顶窗口 Topmost

    千次阅读 2021-12-15 11:19:59
    windows前置窗口方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 809,511
精华内容 323,804
热门标签
关键字:

windows的窗口是一个什么