DJYGUI系列文章七:GDD窗口系统

目录

1 窗口分类及关系

2 窗口的客户区与非客户区

3 坐标系统

4 窗口句柄与窗口ID的作用与区别

5 窗口的关闭、销毁、退出过程

6 API说明

6.1 ScreenToClient: 屏幕坐标转换为客户区坐标

6.2 ClientToScreen: 客户区坐标转换为屏幕坐标

6.3 ScreenToWindow:屏幕坐标转换为窗口坐标

6.4 WindowToScreen: 窗口坐标转换为屏幕坐标

​​​​​​​6.5 GetDesktopWindow: 获得桌面窗口句柄

​​​​​​​6.6 GetWindowRect: 获得窗口矩形

​​​​​​​6.7 GetClientRect: 获得窗口客户区矩形

​​​​​​​6.8 GetClientRectToScreen: 取窗口客户区矩形的屏幕坐标

​​​​​​​6.9 GetWindowDC: 获得窗口绘图上下文

6.10 GetDC:获得窗口客户区绘图上下文

6.11 ReleaseDC: 释放一个绘图上下文

6.12 BeginPaint: 开始绘图

6.13 EndPaint: 结束绘图

6.15 DestroyWindow: 销毁窗口

6.16 MoveWindow: 移动窗口位置

6.18 IsWindowVisible: 判断窗口是否可见

6.19 InvalidateWindow: 设置窗口为无效状态

6.20 ShowWindow: 设置窗口为显示或隐藏状态

6.21 EnableWindow: 设置窗口为使能或禁止状态

6.22 GetParent: 获得父窗口句柄

6.23 GetWindow: 获得与指定窗口有特定关系的窗口句柄

6.24 GetDlgItem: 获得窗口中指定ID的子窗口的句柄

6.25 SetWindowText:设置窗口文字

​​​​​​​6.26 GetWindowText:获得窗口文字

​​​​​​​6.27 GetWindowFromPoint: 获得指定屏幕坐标位置所在的窗口

​​​​​​​6.28 SetFocusWindow:设置当前焦点窗口

6.29 GetFocusWindow:获得当前焦点窗口

​​​​​​​6.30 IsFocusWindow:判断指定窗口是否为当前焦点窗口

​​​​​​​6.31 DefWindowProc: 系统默认的窗口消息处理函数


1 窗口分类及关系

        GDD中窗口分为三大类:桌面窗口、主窗口、控件。

        桌面窗口是整个系统唯一的一个全局根窗口,它在系统启动时,由系统自动创建,如果用户要对桌面窗口进行操作,可以先通过GetDesktopWindow获得桌面窗口句柄。可以使用相应的窗口API函数集对其进行操作。

        主窗口由用户创建,是用户图形窗口程序必须创建的第一个窗口。是所有控件的载体,也负责整个用户窗口程序的消息事件收集与派发。

        控件是在主窗口创建之后,由用户创建。控件不是必须的,一个窗口系统必须至少有一个主窗口,而控件则是用户按实际应用情况,是否使用;控件和主窗口一样,都是使用CreateWindow函数来创建它,与创建主窗口不同的是:当需要创建的窗口为控件时,必须指定该窗口为WS_CHILD风格,需要指明控件所属的父窗口,以及为每个控件指定一个同级窗口中的唯一ID,具体请参考CreateWindow: 创建窗口。GDD提供了一些常用标准控件给用户使用,如按钮、复选框、单选框等。

        三种不同类型窗口示例如图 2-1所示:

图 2-1GDD三种窗口示意图

2 窗口的客户区与非客户区

        窗口区域分为客户区与非客户区两部分。在一个窗口中,标题栏,边框就是窗口的非客户区,中间区域称为客户区。它们的关系如图 2-2所示:

 2-2 客户区示意图

3 坐标系统

        GDD的所有坐标都是像素数坐标,有三种坐标系统,相互之间是可以转换的,这三种坐标系统分别是:屏幕坐标,窗口坐标,客户坐标。

        屏幕坐标以屏幕左上角为坐标原点,水平方向为X值,垂直方向为Y值构成坐标系。

        窗口坐标以窗口左上角为坐标原点,水平方向为X值,垂直方向为Y值构成坐标系。

        客户坐标以窗口客户区左上角为坐标原点,水平方向为X值、垂直方向为Y值构成坐标系。

三种坐标关系示意图 2-3如下:

 图 2-3 GDD三种坐标示意图

​​​​​​​​​​​​​​

4 窗口句柄与窗口ID的作用与区别

        在窗口程序中,用户会经常和窗口句柄,窗口ID打交道,窗口句柄是由系统自动分配的,无需用户干预,对窗口操作访问,都只能通过句柄进行;而窗口ID,是在创建窗口时,由用户指定的一个任意32位数,一般用于对同级窗口(兄弟窗口)间的标识区分,同级窗口间,它们的ID需由用户创建窗口时保证唯一性,对于不同父窗口下的子窗口,它们的ID是可以重复的;例如一个窗口A和窗口B,它们都可以创建一个指定ID为1的子窗口,这是合法的,另外补充一点,窗口ID是针对来标识子窗口的,因此,桌面窗口及所有主窗口是没有ID标识的概念的,当用户创建一个主窗口时,系统会忽略CreateWindow函数的ID参数值,具体请参数 CreateWindow 函数。

5 窗口的关闭、销毁、退出过程

        这个步骤流程如下:

        1.发送MSG_CLOSE消息,该消息可以由系统产生(比如用户点击窗口的” ×” 按钮,也可以是用户主动发送MSG_CLOSE消息(使用SendMessage函数)。

        2.用户在窗口过程函数中响应MSG_CLOSE消息,在这一步中,用户还能决定是否继续真正关闭和销毁窗口,如果不需要,则直接丛该消息响应过程中返回,否则,用户需调用DestroyWindow函数来继续销毁窗口。

        3.响应MSG_DESTROY消息,该消息是由DestroyWindow函数产生的,到了这里,窗口关闭、销毁已经是“无可挽回”的地步,用户可以在这里做一些资源释放工作,如果销毁的是主窗口,用户必须要在MSG_DESTROY消息响应过程中调用PostQuitMessage函数,如果是子窗口,则不需要调用,子窗口关闭、销毁过程也至此结束。

        4.如果是主窗口,由于在MSG_DESTROY中调用了PostQuitMessage函数,该函数会产生一条MSG_QUIT消息,当主窗口消息循环中的GetMessage函数获得到MSG_QUIT消息时,会在该函数返回前销毁主窗口,并返回FALSE,如是,整个窗口消息循环至此结束。

6 API说明

6.1 ScreenToClient: 屏幕坐标转换为客户区坐标

BOOL ScreenToClient(HWND hwnd,POINT *pt,s32 count);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

pt: 需要转换的坐标点,该参数兼作为转换的输入和输出参数。

count: 需要转换的坐标点数量。

返回值:

TRUE:成功; FALSE:失败。

说明:

如果函数返回失败,原因可能是窗口句柄无效,参数pt指针为NULL;另外,该函数不关心需要转换的坐标是否在窗口可视范围内。

​​​​​​​6.2 ClientToScreen: 客户区坐标转换为屏幕坐标

BOOL ClientToScreen(HWND hwnd, POINT *pt, s32 count);

头文件:

gdd.h

参数:

Hwnd: 窗口句柄。

pt: 需要转换的坐标点,该参数兼作为转换的输入和输出参数。

count: 需要转换的坐标点数量。

返回值:

TRUE:成功; FALSE:失败。

说明:

如果函数返回失败,原因可能是窗口句柄无效,参数pt指针为NULL;另外,该函数不处理需要转换的坐标是否在窗口可视范围内。

​​​​​​​6.3 ScreenToWindow:屏幕坐标转换为窗口坐标

BOOL ScreenToWindow(HWND hwnd,POINT *pt,s32 count);

头文件:

gdd.h

参数:

hwnd: 窗口句柄.

pt: 需要转换的坐标点,该参数兼作为转换的输入和输出参数。

count: 需要转换的坐标点数量。

返回值:

TRUE:成功; FALSE: 失败。

说明:

如果函数返回失败,原因可能是窗口句柄无效,参数pt指针为NULL;另外,该函数不处理需要转换的坐标是否在窗口可视范围内。

​​​​​​​6.4 WindowToScreen: 窗口坐标转换为屏幕坐标

BOOL WindowToScreen(HWND hwnd,POINT *pt,s32 count);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

pt: 需要转换的坐标点,该参数兼作为转换的输入和输出参数。

count: 需要转换的坐标点数量。

返回值:

TRUE:成功; FALSE:失败。

说明:

如果函数返回失败,原因可能是窗口句柄无效,参数pt指针为NULL;另外,该函数不处理需要转换的坐标是否在窗口可视范围内。

​​​​​​​6.5 GetDesktopWindow: 获得桌面窗口句柄

HWND GetDesktopWindow(void);

头文件:

gdd.h

参数: 无。

返回:

桌面窗口句柄。

​​​​​​​6.6 GetWindowRect: 获得窗口矩形

BOOL GetWindowRect(HWND hwnd,RECT *prc);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

prc: 矩形缓冲区。

返回值:

TRUE:成功; FALSE:失败。

说明:

该函数获得窗口边界在屏幕上的矩形位置,以屏幕坐标表示。

​​​​​​​6.7 GetClientRect: 获得窗口客户区矩形

BOOL GetClientRect(HWND hwnd,RECT *prc);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

prc: 矩形缓冲区。

返回值:

TRUE:成功; FALSE:失败。

说明:

该函数获得窗口客户区矩形,以客户区坐标表示,所以获得的矩形左上角坐标恒为0,0;矩形右下角坐标所指示的为客户区宽度和高度。

​​​​​​​6.8 GetClientRectToScreen: 取窗口客户区矩形的屏幕坐标

BOOL GetClientRectToScreen(HWND hwnd,RECT *prc);

头文件:

gdd.h

参数:

hwnd: 窗口坐标。

prc: 矩形缓冲区。

返回值:

TRUE:成功; FALSE:失败。

说明:

该函数获得窗口客户区边界在屏幕上的矩形位置,以屏幕坐标表示。

​​​​​​​6.9 GetWindowDC: 获得窗口绘图上下文

HDC GetWindowDC(HWND hwnd);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

返回值:

窗口绘图上下文句柄。

说明:

该函数获得的绘图上下文,可以在整个窗口范围内(非客户区+客户区)绘图。绘图上下文的原点坐标(0,0)为窗口边界最左上角,在结束绘图后,需调用ReleaseDC来释放该绘图上下文。

6.10 GetDC:获得窗口客户区绘图上下文

HDC GetDC(HWND hwnd);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

返回值:

窗口客户区绘图上下文句柄。

说明:

该函数获得的绘图上下文,只能在窗口客户区范围内绘图,绘图上下的原点坐标(0,0)为窗口客户区边界最左上角,在结束绘图后,需调用 ReleaseDC 来释放该绘图上下文。

6.11 ReleaseDC: 释放一个绘图上下文

BOOL ReleaseDC(HWND hwnd,HDC hdc);

头文件:

gdd.h

参数::

hwnd: 绘图上下文所属的窗口句柄。

hdc: 需要释放的绘图上下文句柄。

返回值:

TRUE:成功; FALSE:失败。

说明:

该函数只能释放由 GetWindowDC,GetDC 所返回的绘图上下文句柄。

6.12 BeginPaint: 开始绘图

HDC BeginPaint(HWND hwnd);

头文件:

gdd.h

参数:

hwnd: 需要开始绘图的窗口句柄。

返回值:

绘图上下文句柄。

说明:

该函数只在窗口过程函数的 MSG_PAINT 消息中使用,指示客户区开始绘图;该函数返回的绘图上下文句柄,只能在窗口客户区范围内绘图, 原点坐标(0,0)为窗口客户区边界最左上角, 在结束绘图后,需调用 EndPaint 来释放该绘图上下文。

6.13 EndPaint: 结束绘图

BOOL EndPaint(HWND hwnd,HDC hdc);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

hdc: 需要结束绘图的绘图上下文句柄。

返回值:

TRUE:成功; FALSE:失败。

说明:

该函数只在窗口过程函数的 MSG_PAINT 消息中与 BeginPaint 成对使用,指示绘图结束并释放由BeginPaint所返回的绘图上下文句柄。

6.14 CreateWindow: 创建窗口

HWND CreateWindow(WNDPROC *pfWinProc,LPCWSTR Text,u32 Style,

s32 x, s32 y, s32 w, s32 h,HWND hParent,u32 WinId,const void *pdata);

头文件:

gdd.h

参数:

pfWinProc: 窗口过程函数地址。

Text: 窗口标题文字。

Style: 窗口风格属性标记,高16位为窗口公共风格属性标记,所有窗口适用;低16位窗口私有的风格属性标记,代表窗口的私有行为或外观,对于不同类型的窗口,私有风格属性值所代表的含义,仅作用于本身,不可以用于其它不同类型的窗口;不管是公共还是私有风格属性,系统都定义了相关的宏常量供用户使用,对于窗口公共风格属性,可以是以下值的组合:

WS_CHILD: 设定该标志,则创建为子窗口/控件;

WS_VISIBLE: 设定该标志,则窗口为可见的;

WS_DISABLE: 设定该标志,刚窗口为禁止状态,将不会响应外部的输入消息,如键盘,鼠标消息等等;

WS_BORDER: 设定该标志,则窗口会包含并显示外边框;

WS_DLGFRAME: 设定该标志,则窗口会包含并显示内边框;

WS_CAPTION: 设定该标志,刚窗口会包含并显示标题栏;

私有风格属性有以下定义,详情见gdd.h。

// 按钮风格

BS_TYPE_MASK        类型掩码;

BS_NORMAL           常规按钮;

BS_HOLD            自锁按钮;

BS_RADIO            单选按钮;

BS_SURFACE_MASK     外观掩码;

BS_NICE             美观风格;

BS_SIMPLE           简朴风格;

BS_FLAT             平面风格;

BS_PUSHED           按钮按下;

// 复选框风格

CBS_SELECTED        复选框选中。

x,y,w,h: 指示窗口的位置和大小,位置是相对于该窗口所属的父窗口的客户区偏移量,即使用的是客户区坐标表示。大小表示窗口的水平和垂直方向所占的像素数量。

hParent: 父窗口句柄,如果是创建主窗口(没有指定WS_CHILD属性),该参数设为NULL。

WinId: 用户指定的窗口ID,如果是主窗口,该参数会被忽略; 如果是同一级子窗口,则需要为每个指定为不同ID,如果指定了一个已有的同级窗口ID,该函数将创建窗口失败,返回NULL。

pData: 用户自定义的窗口私有数据,该参数会传入窗口过程的MSG_CREATE消息的param1中,如果不需要窗口私有数据,可以将该参数设为NULL。

返回值:

新创建的窗口句柄;如果创建失败,该函数返回NULL。

6.15 DestroyWindow: 销毁窗口

void DestroyWindow(HWND hwnd);

头文件:

gdd.h

参数:

hwnd: 需要销毁的窗口句柄。

说明:

该函数用来销毁一个窗口,除了销毁窗口本身,也会销毁窗口所属的所有子窗口和定时器,如果用户不调用该函数来销毁所创建的子窗口,当主窗口退出时,也会自行销毁所有子窗口和定时器,如果所销毁的窗口是焦点窗口,那么它所在的父窗口的焦点窗口对象会被设为NULL。

6.16 MoveWindow: 移动窗口位置

BOOL MoveWindow(HWND hwnd,s32 x, s32 y);

头文件:

gdd.h

参数:

hwnd: 需要移动的窗口句柄。

x,y: 移动后,新的坐标位置。

返回值:

TRUE:成功; FALSE:失败。

说明:

该函数使用的坐标是相对于父窗口的客户区位置,即父窗口的客户区坐标。如果移动一个窗口并超出它所属的父窗口客户区范围,那么,超出的部分是会被裁剪的(不可见).如图2-4所示:

 图2-54窗口裁剪示意图

6.17 OffsetWindow: 偏移窗口位置

BOOL OffsetWindow(HWND hwnd,int dx,int dy);

头文件:

gdd.h

参数:

hwnd: 需要偏移的窗口句柄。

dx,dy: 水平,垂直方向的偏移量。

返回值:

TRUE:成功; FALSE:失败。

说明:

当dx为负数时,窗口向左偏移,否则向右偏移;当dy为负数时,窗口向上偏移,否则向下偏移。

6.18 IsWindowVisible: 判断窗口是否可见

BOOL IsWindowVisible(HWND hwnd);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

返回值:

TRUE:窗口可见; FALSE:窗口不可见。

说明:

如果一个窗口为不可见,那么它所属的所以子窗口也都为不可见,即便子窗口设置了WS_VISIBLE标记。更多的内容,请参考ShowWindow函数说明。

6.19 InvalidateWindow: 设置窗口为无效状态

BOOL InvalidateWindow(HWND hwnd,BOOL bErase);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

bErase:是否重绘窗口背景。

返回值:

TRUE:成功; FALSE:失败。

说明:

设置窗口为无效状态,即意味着窗口需要进行重绘,该函数会给指定的窗口产生一条异步方式的窗口绘制消息:MSG_PAINT,MSG_PAINT是属于低优先级处理的消息,只有当其它消息处理完成后(MSG_TIMER除外,这个优先级更低),才会处理窗口绘制操作,如果系统因繁忙导致前面的绘制消息未能及时处理,系统将对后续重复的同一个窗口的多个绘制消息合并为一个,以减少系统负担,以过滤掉不必要的多余的绘制过程。当bErase参数为TRUE时,窗口过程将会在执行MSG_PAINT前,发送一条MSG_ERASEBKGND消息,用于窗口背景重绘,用户可以在窗口过程函数中,响应MSG_ERASEBKGND消息来实现窗口背景的绘制工作。

6.20 ShowWindow: 设置窗口为显示或隐藏状态

BOOL ShowWindow(HWND hwnd,BOOL bShow);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

bShow: 显示标记,当为TRUE时,设置窗口为显示状态(可见状态);为FALSE时,将设置窗口为隐藏状态。

返回值:

TRUE: 成功; FALSE:失败。

说明:

该函数为设置窗口是否显示或隐藏,即设置或清除窗口的WS_VISIBLE标记,需要注意的是:如果该窗口所属的父窗口为隐藏状态(不可见),那么它的所有子窗口都不会被显示,即便子窗口设置为显示状态(WS_VISIBLE);改变父窗口的显示状态标志时,并不会改变它所属的子窗口显示状态标志。例如,假设起先一个父窗口A和它的一个子窗口B都为隐藏状态(不可见,无WS_VISIBLE标记),这时,如果将父窗口设置为显示状态(可见,设置了WS_VISIBLE标记),那么此时,它的子窗口B仍然不会显示出来。总结来说,一个窗口真正可见,除了窗口本身具备可见属性(WS_VISIBLE)之外,还必须它的所有上级父窗口同时都具备可见属性。

6.21 EnableWindow: 设置窗口为使能或禁止状态

BOOL EnableWindow(HWND hwnd,BOOL bEnable);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

bEnable: 标记状态,当为TRUE时,设置窗口为使能状态;为FALSE时,设置窗口为禁止状态。

返回值:

TRUE:成功; FALSE:失败。

说明:

该函数为设置窗口是否使能或禁止,即设置或清除窗口的WS_DISABLE标记,当窗口为禁止状态(设置了WS_DISABLE标记)时,它将不能接收到外部输入事件产生的消息,如键盘,鼠标/触摸屏产生的消息,但如果用户通过SendMessage/PostMessage函数强制向窗口发送这类消息,窗口是可以正常接收到的;一个窗口只有当他的上级所有父窗口及窗口本身都使能时,该窗口才真正允许接收到外部输入事件产生的消息,这种关系与ShowWindow函数类似。需要注意的是禁止状态的窗口是可见的并且能绘制。

6.22 GetParent: 获得父窗口句柄

HWND GetParent(HWND hwnd);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

返回值:

父窗口句柄。

6.23 GetWindow: 获得与指定窗口有特定关系的窗口句柄

HWND GetWindow(HWND hwnd,int nCmd);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

nCmd: 说明指定窗口与要获得句柄的窗口之间的关系,该参数值可以是下列之一:

GW_CHILD: 获得z序顶端的子窗口。

GW_HWNDPREV: 获得z序上一个同级窗口。

GW_HWNDNEXT: 获得z序下一个同级窗口。

GW_HWNDFIRST: 获得z序顶层的同级窗口。

GW_HWNDLAST: 获得z序底层的同级窗口。

返回值:

特定关系的窗口句柄。

6.24 GetDlgItem: 获得窗口中指定ID的子窗口的句柄

HWND GetDlgItem(HWND hwnd,u32 id);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

id: 所属子窗口ID。

返回值:

子窗口句柄。

6.25 SetWindowText:设置窗口文字

void SetWindowText(HWND hwnd,const char *text,s32 max_len);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

text:需要设置的字符串内容。

max_len:最大字符串字节长度,如果该值是负数,则使用整个字符串实际字节长度;如果该值小于实际的字符串字节长度,且大于0,则字符串多余的部分将会被截断;如果该值大于实际的字符串字节长度,则按实际的字符串长度来处理。

返回值:

无。

​​​​​​​6.26 GetWindowText:获得窗口文字

char* GetWindowText(HWND hwnd,char *text,s32 max_len);

头文件:

gdd.h

参数:

hwnd: 窗口句柄。

text:输出的字符串缓冲区。

max_len:最大字符串字节长度,如果该值是负数,则使用窗口整个字符串实际字节长度;如果该值小于实际的字符串字节长度,且大于0,则字符串多余的部分将会被截断;如果该值大于窗口实际的字符串字节长度,则按实际的字符串长度来处理。

返回值:

字符串指针。

​​​​​​​6.27 GetWindowFromPoint: 获得指定屏幕坐标位置所在的窗口

HWND GetWindowFromPoint(POINT *pt);

头文件:

gdd.h

参数:

pt: 坐标位置点参数,该坐标值使用屏幕坐标。

返回值:

坐标所在的窗口句柄。

说明:

在多级窗口丛属关系中,该函数返回的窗口句柄,将会是坐标所在位置的最低级别的窗口。

​​​​​​​6.28 SetFocusWindow:设置当前焦点窗口

HWND SetFocusWindow(HWND hwnd);

头文件:

gdd.h

参数:

hwnd: 新的焦点窗口句柄,如果该值为NULL,则会清除当前焦点窗口。

返回值:

旧的焦点窗口句柄,如果当前无焦点窗口,返回NULL。

说明:

调用该函数时,新的焦点窗口,将会收到MSG_SETFOCUS消息,旧的焦点窗口,将会收到MSG_KILLFOCUS消息。当一个窗口设为当前焦点窗口时,才能收到键盘产生的消息:MSG_KEY_DOWN及MSG_KEY_UP。

6.29 GetFocusWindow:获得当前焦点窗口

HWND SetFocusWindow(HWND hwnd);

头文件:

gdd.h

参数:

无。

返回值:

当前焦点窗口句柄,如果当前无焦点窗口,返回NULL。

​​​​​​​6.30 IsFocusWindow:判断指定窗口是否为当前焦点窗口

BOOL IsFocusWindow(HWND hwnd);

头文件:

gdd.h

参数:

无。

返回值:

TURE:指定的窗口是当前焦点窗口;FALSE:指定的窗口不是当前焦点窗口。

​​​​​​​6.31 DefWindowProc: 系统默认的窗口消息处理函数

u32 DefWindowProc(MSG *pMsg);

头文件:

gdd.h

参数:

pMsg: 需要处理的消息。

返回值:

消息处理结果。

说明:

在窗口过程中函数中,对于用户不感兴趣的消息,需调用该函数,交由系统默认处理。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值