【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”

本系列博文几乎没有难啃的“专业术语”,尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一。(由于本人也是由于项目需要,所以才来查阅相关资料,文中出现的错误欢迎指出,共同进步!谢谢!

读本系列博文的读者必须具备以下的知识储备:

  • C/C++语言基础语法及了解面向对象概念

窗口在 Windows 中指一个矩形区域,一般情况下这个区域是用户与应用程序交互的枢纽;上一小节使用 MessageBox 创建的简单窗口也是与用户交互的一个窗口,该窗口的功能有限,只能够简单的展示一些想要表达的信息,想创建一个能表达更多信息的窗口,可以使用 CreateWindow 函数创建。

开始创建

创建 Windows 桌面应用程序需要 windows.h,在头部引入 windows.h 头文件。

#include <windows.h> 

WinMain

在C语言中,每个C语言程序都有一个入口函数,在Windows桌面程序中,这个入口函数是 WinMain ,具体声明如下:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);

在程序中,紧接着在头部文件后,我们使用 WinMain作为程序的入口函数:

#include <windows.h> 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {}

写好入口函数后,必须要使用 RegisterClassEx 注册一个新的窗口类型,再使用 CreateWindow 进行创建。

WNDCLASSEX

在注册新窗口前,我们可以使用一个 WNDCLASSEX 结构用来描述创建的Windows,这是窗口类;微软开发中心对WNDCLASSEXA的描述:“Contains window class information. It is used with the RegisterClassEx and GetClassInfoEx functions.”;WNDCLASSEXA 是包含窗口信息的结构。语法如下:

typedef struct tagWNDCLASSEXA {UINT      cbSize;UINT      style;WNDPROC   lpfnWndProc;int       cbClsExtra;int       cbWndExtra;HINSTANCE hInstance;HICON     hIcon;HCURSOR   hCursor;HBRUSH    hbrBackground;LPCSTR    lpszMenuName;LPCSTR    lpszClassName;HICON     hIconSm;
} WNDCLASSEXA, *PWNDCLASSEXA, *NPWNDCLASSEXA, *LPWNDCLASSEXA;

结构成员:

  • cbSize 窗口的大小:为 WNDCLASSEX 这个结构的字节数大小,赋值为 sizeof(WNDCLASSEX)
  • style 窗口的风格:为该窗口的样式,取值为 CS_HREDRAW | CS_VREDRAW
  • lpfnWndProc 窗口处理指针:为指向窗体的的过程函数,为指针,使用 WndProc 处理应用程序在发生事件时从 Windows 接收的消息,以下将会讲解 WndProc
  • cbClsExtra 窗口类结构后的附加字节数,一般为0
  • cbWndExtra 窗口事例后的附加字数,一般为0
  • hInstance 当前实例句柄,直接把WinMain参数 hInstance(表示当前实例句柄) 赋值给 hInstance 即可
  • hIcon 图标的句柄,暂时赋值为NULL
  • hCursor 光标的句柄:使用 LoadCursor 加载光标,以下讲解语法
  • lpszClassName: 类别名称的指针赋值为static TCHAR szWindowClass[] = _T("CSDN @1_bit");
  • hIconSm: 窗口类关联的小图标,使用 LoadIcon函数加载,不过在文档中提示,这个函数已过时,可以使用 LoadImage 函数加载,本篇使用的是 LoadIconLoadImage 后面再做补充;LoadIcon 函数语法将会在以下讲解
  • hbrBackground 背景画刷的句柄,将会在以下给出设置的值参考
  • lpszMenuName 指向菜单资源名的指针,为NULL即可

代码实现如下:

	WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));wcex.hCursor = LoadCursor(NULL, IDC_CROSS);wcex.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION);wcex.lpszMenuName = NULL;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION));

——————————————————————————————————

WNDCLASSEX hbrBackground

值参考:
在这里插入图片描述
——————————————————————————————————

LoadCursor

LoadCursor 返回类型为 HCURSOR:的语法如下:

HCURSOR LoadCursorW(HINSTANCE hInstance,LPCWSTR   lpCursorName
);

参数说明:

  • hInstance :可赋值当前实例
  • lpCursorName:要加载的游标资源的名称

在微软的参考文档中说明,lpCursorName 的可设置为以下值:
在这里插入图片描述
——————————————————————————————————

lpfnWndProc

lpfnWndProc 为接收窗口处理的指针,使用 WndProc 处理应用程序在发生事件时从 Windows 接收的消息。在微软的文档中写道:“WndProc 是每个 Windows 桌面应用程序必须的窗口过程功能。 此函数通常命名为WndProc,但您可以随心所欲地命名它。 例如,如果用户在应用程序中选择"确定"按钮,Windows 会向您发送消息,您可以在WndProc函数内编写代码,执行任何适当的操作。 这称为处理事件。 您只处理与应用程序相关的事件。WndProc 具有以下语法”;如下:。

LRESULT CALLBACK WndProc(_In_ HWND   hWnd,_In_ UINT   message,_In_ WPARAM wParam,_In_ LPARAM lParam
);

那我们在程序中声明也如此声明,那么定义如下(使用微软文档示例):

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;TCHAR greeting[] = _T("Hello, 我是CSDN 1_bit 博客主页:https://me.csdn.net/A757291228 ");switch (message){case WM_PAINT:hdc = BeginPaint(hWnd, &ps);TextOut(hdc,5, 5,greeting, _tcslen(greeting));EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);break;}return 0;
}

在以上 WndProc 的实现中,使用了 switch 语句,在 switch 中判断了 WM_PAINT 消息;WM_PAINT 消息为绘制主窗体,在文档中写到:

要处理的一条重要信息是WM_PAINT消息。 当必须更新其显示WM_PAINT窗口的一部分时,应用程序将接收消息。
当用户在窗口前面移动窗口,然后再次将其移开时,可能会发生此事件。 您的应用程序不知道这些事件何时发生。 只有 Windows
知道,因此它会通过消息WM_PAINT通知你的应用。 首次显示窗口时,必须更新所有窗口。 要处理 WM_PAINT 消息,首先应调用
BeginPaint,然后处理所有的逻辑以在窗口中布局文本、按钮和其他控件,然后调用 EndPaint。

——————————————————————————————————

BeginPaint

BeginPaint 的语法为:

HDC BeginPaint(HWND          hWnd,LPPAINTSTRUCT lpPaint
);

参数说明:

  • HWND:处理要重绘的窗口
  • lpPaint:接收绘制的接收绘画信息的 **PAINTSTRUCT**结构的指针

——————————————————————————————————

EndPaint

该调用EndPaint函数标记指定窗口画的结束。每次调用BeginPaint函数都需要此函数,但是仅在绘制完成之后。

语法:

BOOL EndPaint(HWND              hWnd,const PAINTSTRUCT *lpPaint
);

参数说明:

  • hWnd:处理的窗口
  • lpPaint:指向PAINTSTRUCT结构的指针

——————————————————————————————————

PostQuitMessage

向系统指示线程已请求终止(退出)。通常用于响应WM_DESTROY消息。

语法:

void PostQuitMessage(int nExitCode
);

参数说明:

  • nExitCode:应用程序退出代码。此值用作WM_QUIT消息的wParam参数。

——————————————————————————————————

DefWindowProc

调用默认窗口过程以为应用程序未处理的任何窗口消息提供默认处理。此功能确保处理所有消息。DefWindowProc用窗口过程接收到的相同参数调用。

语法:

LRESULT LRESULT DefWindowProcA(HWND   hWnd,UINT   Msg,WPARAM wParam,LPARAM lParam
);

参数说明:

  • hWnd:窗口句柄
  • Msg:消息
  • wParam:附加消息
  • lParam:附加消息信息

——————————————————————————————————

TextOut

所述的TextOut函数在指定位置写入的字符串,利用当前选择的字体,背景颜色和文本颜色。

语法:

BOOL TextOutW(HDC     hdc,int     x,int     y,LPCWSTR lpString,int     c
);

参数说明:

  • hdc:上下文句柄
  • x,y:对齐字符串的x,y坐标
  • lpString:字符串指针,指向字符串
  • c:字符串长度

——————————————————————————————————

HDC

引用文档解释:

HDC代码中是设备上下文的句柄,这是 Windows 用于使应用程序与图形子系统通信的数据结构。

WM_DESTROY

销毁窗口时发送。从窗口中删除窗口后,它将被发送到销毁窗口的窗口过程。
此消息首先发送到被销毁的窗口,然后发送到被销毁的子窗口(如果有)。在处理消息期间,可以假定所有子窗口仍然存在。

WM_DESTROY 在 WndProc 函数中使用

——————————————————————————————————

补充

WM_CREATE

当应用程序通过调用CreateWindowEx或CreateWindow函数请求创建窗口时发送。(在函数返回之前发送消息。)在创建窗口之后,但在该窗口变为可见之前,新窗口的窗口过程会收到此消息。

——————————————————————————————————

RegisterClassEx

之后注册该窗口,使用 RegisterClassEx:

RegisterClassEx(&wcex);

注册后使用 CreateWindow 进行注册的窗口创建语法如下:

HWND  CreateWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hInstance, PVOID lpParam 
);

参数说明:

  • lpClassName:应用程序窗体名
  • lpWindowName:标题名
  • DWORD dwStyle:窗口类型风格
  • x,y:初始位置(x,y)
  • nWidth, nHeight:初始尺寸
  • hWndParent,:窗体父级,可为NULL
  • hMenu,:菜单栏,可为NULL
  • hInstance:当前实例
  • lpParam:应用程序使用,可为NULL

创建窗体:

HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1000, 1000, NULL, NULL, hInstance, NULL);

应用窗体名为 szWindowClass

static TCHAR szWindowClass[] = _T("win32 Demo");

应用窗体名为 szTitle

static TCHAR szTitle[] = _T("This Win32");

窗体风格类型为:WS_OVERLAPPEDWINDOW
初始位置为:CW_USEDEFAULT,默认左上角出现
尺寸为:1000, 1000
父级及菜单栏都为:NULL
hInstance为:当前实例 hInstance
lpParam应用程序使用为:NULL

代码如下:

#include <windows.h> 
#include <tchar.h> static TCHAR szWindowClass[] = _T("CSDN @1_bit");
static TCHAR szTitle[] = _T("Win32 桌面应用程序");
HINSTANCE hInst;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));wcex.hCursor = LoadCursor(NULL, IDC_CROSS);wcex.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION);wcex.lpszMenuName = NULL;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION));RegisterClassEx(&wcex);hInst = hInstance;HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;TCHAR greeting[] = _T("Hello, 我是CSDN 1_bit 博客主页:https://me.csdn.net/A757291228 ");switch (message){case WM_PAINT:hdc = BeginPaint(hWnd, &ps);TextOut(hdc,5, 5,greeting, _tcslen(greeting));EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);break;}return 0;
}

——————————————————————————————————

ShowWindow

完成以上代码后,还需使用 ShowWindow 让Windows窗体指定如何显示,代码如下:

ShowWindow(hWnd, nCmdShow);

语法:

BOOL ShowWindow(HWND hWnd,int  nCmdShow
);

参数说明:

  • hWnd:窗口句柄
  • nCmdShow:窗口的显示方式

nCmdShow 参考:
在这里插入图片描述
——————————————————————————————————

UpdateWindow

使用 UpdateWindow 发送 WM_PAINT 消息,更新指定窗口。
语法:

BOOL UpdateWindow(HWND hWnd
);

参数:

  • hWnd:窗口句柄

整体代码如下:

#include <windows.h> 
#include <tchar.h> static TCHAR szWindowClass[] = _T("CSDN @1_bit");
static TCHAR szTitle[] = _T("Win32 桌面应用程序");
HINSTANCE hInst;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));wcex.hCursor = LoadCursor(NULL, IDC_CROSS);wcex.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION);wcex.lpszMenuName = NULL;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION));RegisterClassEx(&wcex);hInst = hInstance;HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);return 0;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;TCHAR greeting[] = _T("Hello, 我是CSDN 1_bit 博客主页:https://me.csdn.net/A757291228 ");switch (message){case WM_PAINT:hdc = BeginPaint(hWnd, &ps);TextOut(hdc,5, 5,greeting, _tcslen(greeting));EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);break;}return 0;
}

运行程序,发现出现了一闪而过的窗口,这个很像刚学习C语言的时候,没有加上停止;那我们就循环侦听 Windows 发送的消息即可:

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{TranslateMessage(&msg);DispatchMessage(&msg);
}return (int) msg.wParam;

——————————————————————————————————

GetMessage

GetMessage

从调用线程的消息队列中检索消息。该函数分派传入的已发送消息,直到已发布的消息可供检索为止。

语法:

BOOL GetMessage(LPMSG lpMsg,HWND  hWnd,UINT  wMsgFilterMin,UINT  wMsgFilterMax
);

参数说明:

  • lpMsg:指向
    MSG
    结构的指针,该结构从线程的消息队列接收消息信息。
  • hWnd:获取消息的的窗口句柄,文档中解释到:“如果hWnd为NULL,则GetMessage检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中hwnd值为NULL的消息(请参阅MSG结构)。因此,如果hWnd为NULL,则将同时处理窗口消息和线程消息。
  • wMsgFilterMin,wMsgFilterMax:要检索的最低、最高消息值的整数值“**
  • wMsgFilterMin 和 wMsgFilterMax 都为零,则 GetMessage 返回所有可用消息**”

——————————————————————————————————

完整代码

#include <windows.h> 
#include <tchar.h> static TCHAR szWindowClass[] = _T("CSDN @1_bit");
static TCHAR szTitle[] = _T("Win32 桌面应用程序");
HINSTANCE hInst;LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));wcex.hCursor = LoadCursor(NULL, IDC_CROSS);wcex.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION);wcex.lpszMenuName = NULL;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(NULL, MAKEINTRESOURCE(IDI_INFORMATION));RegisterClassEx(&wcex);hInst = hInstance;HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return (int)msg.wParam;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{PAINTSTRUCT ps;HDC hdc;TCHAR greeting[] = _T("Hello, 我是CSDN 1_bit 博客主页:https://me.csdn.net/A757291228 ");switch (message){case WM_PAINT:hdc = BeginPaint(hWnd, &ps);TextOut(hdc,5, 5,greeting, _tcslen(greeting));EndPaint(hWnd, &ps);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);break;}return 0;
}

运行结果如下:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一行命令 优化上传速度

本文来自 fir.im 首席吉祥物 TraWor. 最近许多用户反映上传速度慢的一塌糊涂&#xff0c;七牛的上传带宽我想肯定是没问题的&#xff0c;那原因不必多想就剩下 DNS 了。 即便本地网络再快&#xff0c;DNS 服务器给了一个很远的服务器地址也没办法很快的上传。 在终端运行这一行…

go 服务器 源码,LollipopGo开源游戏服务器框架--global服务器源码

大家好&#xff0c;我是彬哥&#xff0c;本节给大家讲下LollipopGov1.0.20190102版本游戏服务器globla服务器&#xff0c;抛砖引玉了&#xff0c;主要是针对Go语言游戏服务器Global服务器处理。package mainimport ("LollipopGo/LollipopGo/conf""LollipopGo/Lo…

ArcGIS导入Sketchup模型

ArcGIS可以与Sketchup、3D Studio Max等三维软件完美进行交互。 ArcGIS可以借助 Import 3D Files 工具支持主流的三维模型导入。支持 3D Studio Max (*.3ds)、VRML and GeoVRML 2.0 (*.wrl)、SketchUp 6.0 (*.skp)、OpenFlight 15.8 (*.flt)、Collaborative Design Activity (C…

剑指offer之两个队列实现栈的问题

1 问题 两个队列实现栈的插入和获取头部元素的功能 2 分析 1&#xff09;获取头部元素的功能分析&#xff1a; 我们有2个队列&#xff0c;我们知道队列的特点的先进先出&#xff0c;而栈的特点是先进后出&#xff0c;比如我们有数据1,2,3,4,我们分别依次压入队列1&#xff0…

solr的空间查询(查询地图周围坐标)

原文网址&#xff1a;http://www.cnblogs.com/hanhuibing/articles/5680616.html 基于Solr的空间搜索 如果需要对带经纬度的数据进行检索&#xff0c;比如查找当前所在位置附近1000米的酒店&#xff0c;一种简单的方法就是&#xff1a;获取数据库中的所有酒店数据&#xff0c;…

「零门槛多语言 Python/C/C# 通用思想学习系列」第一篇:经典HelloWorld

环境说明 操作系统&#xff1a;Windows7 SP1 编辑器说明&#xff1a; Python&#xff1a;notepadC&#xff1a;devcC sharp&#xff08;C#&#xff09;&#xff1a;Visual Studio2019 注意&#xff1a; 标点&#xff1a;在编程中要使用英文的标点符号&#xff0c;必须切记数…

服务器2008 系统日志 提示打印机,介绍服务器日志出现打印机错误的解决方法

今天来聊聊一篇关于服务器日志出现打印机错误的解决方法的文章,现在就为大家来简单介绍下服务器日志出现打印机错误的解决方法,希望对各位小伙伴们有所帮助。windows2003日志提示&#xff0c;打印机 ****未知。登录之前&#xff0c;请与管理员联系&#xff0c;安装驱动程序。事…

js 错误/异常处理

为什么80%的码农都做不了架构师&#xff1f;>>> /*** 自定义错误处理*/ onerror handleError; function handleError(desc,page,line){alert("desc:"desc"\n""page:"page"\n""line:"line); } var s null; s.t…

多面体 (Multipatch)

多面体要素是一种可存储面集合的 GIS 对象,能够在数据库中将 3D 对象的边界表示为单个行。面可存储表示要素组成部分的纹理、颜色、透明度和几何信息。面中存储的几何信息可以是三角形、三角扇、三角条带或环,如下所示。 所有多面体都将…

Python turtle库实现基本剖析

有关turtle的相关使用请参考《python图形绘制库turtle中文开发文档及示例大全》 本篇文为turtle库的实现剖析&#xff0c;但不涉及 python 的 TK库。 开始 入口探寻 在turtle中&#xff0c;直走是使用 forward 或者 fd 函数&#xff1b;在本机安装好了 turtle 库后&#xf…

分享我做Dotnet9博客网站时积累的一些资料

从2019年使用WordPress搭建Dotnet9网站&#xff0c;到现在手撸代码开发&#xff0c;介绍中间使用的一些资源&#xff0c;绝无保留&#xff0c;希望对大家有用。1. 申请域名、搭建WordPress网站时间点&#xff1a;2019年11月申请Dotnet9域名&#xff0c;讲个实话&#xff0c;站长…

基于Azure Blob冷存储的数据压缩备份总结

基于上一篇的压缩算法对比分析报告&#xff0c;选择了LZ4算法的普通模式&#xff0c;其测试压缩率为28%&#xff0c;20G压缩时间为256s&#xff0c;估计1T的冷备时间为3.5h。 接下来&#xff0c;将23T的HBase历史数据进行了压缩冷备&#xff0c;压缩后大小为3.5T&#xff0c;冷…

Ubuntu使用VNC运行基于Docker的桌面系统

2019独角兽企业重金招聘Python工程师标准>>> docker-ubuntu-vnc-desktop From Docker Index docker pull dorowu/ubuntu-desktop-lxde-vnc Build yourself git clone https://github.com/fcwu/docker-ubuntu-vnc-desktop.git docker build --rm -t dorowu/ubuntu-de…

【ArcGIS风暴】ArcGIS个人数据库(.mdb)中矢量字段(如Shape_Length、Shape_Area)无法删除的解决办法

ArcGIS中,某些操作,比如空间连接(Spatial Join)结果属性表中会自动产生Shape_Length和Shape_Area字段,这些字段无法删除,如下: 即使在工具箱中的【删除字段】工具,也找不到这些字段,如图所示,给我们的数据入库工作带来了一定的困扰。 解决思路: mdb是个人数据库,基…

python thinker canvas create_arc 使用详解

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/A757291228/article/details/106739556 ———————————————— 版权声明&#xff1a;本文…

剑指offer之二叉搜索树和双向链表

1 问题 比如我们搜索二叉树如下&#xff0c;我们需要变成双向链表 2 分析 我们知道这个变成双向链接的时候是按照树的中序遍历打印的&#xff0c;我们只需要在中序遍历打印的时候操作该节点&#xff0c;我们可以用临时变量保存这个节点&#xff0c;同时我们也需要单独增加一…

text 热敏打印机_只要有想象力,打印机都能做游戏

不知道为什么&#xff0c;文本冒险游戏最近频频被人提及。这不&#xff0c;现在又出来一个基于实时打印的文本冒险游戏 —— Quest Smith。这位脑洞较大的创客名叫 Bekir Dağ &#xff0c;他用微型打印机和树莓派做出了这个手持游戏设备。关于文本冒险游戏的背景知识&#xff…

C#内建接口:IConvertible

这节来讲一个比较有意思的接口&#xff1a;IConvertible。IConvertible接口处于System.Runtime命名空间下&#xff0c;这个接口规定了一批ToXxx()方法&#xff0c;凡是实现了这个接口的方法&#xff0c;我们都可以尝试将其转换为自己想要的类型。IConvertible中有什么&#xff…

ArcGIS升级地理数据库

本博文教大家如何快速地将低版本地理数据库升级为高版本地理数据库。 方法一&#xff1a;使用“升级地理数据库”工具箱二、使用ArcCatalog地理数据库→右键→属性。三、创建不同版本的地理数据库

汉高软件服务器安装系统,如何安装了如指掌眼镜管理系统的服务器和客户端,还需要安装什么软件的?...

满意答案ven85202014.05.09采纳率&#xff1a;53% 等级&#xff1a;7已帮助&#xff1a;356人易软眼镜店管理系统它整合了整个眼镜店的收费、客户登记、验光单管理、配镜管理、财务管理和查旬报表以及库存管理一体化的管理系统。随时可以查看客户的验光单、对比&#xff0c;…