MFC中的OpenGL窗口

记一次完整的RPG Maker MV游戏逆向过程(准备阶段) 前言 博主很喜欢剧情类的游戏,仙剑,古剑系列都玩过了。但依然能从一些独立小游戏里找到一些剧情很不错的游戏。独立的RPG游戏很多都是由RPG MAKER MV制作的。 本文只是作者处于兴趣所进行的尝试,无意给作者带来经济损失,也不会放出成品,仅仅是分享一种思考问题的方式。 准备 不需要特别的准备,作者将从头到尾叙述一个从零开始如何思考及查阅资料的过程 这里先列出需要用到的工具 一定的计算机知识,熟... 阅读详情

建立一个基于对话框的工程(名称:OpenGL)

并且在设置的Link里加入库opengl32.lib glu32.lib glaux.lib

为对话框添加picture control 控件,ID:IDC_RENDER

主要程序:

// OpenGLDlg.cpp : implementation file
//

#include "stdafx.h"
#include "OpenGL.h"
#include "OpenGLDlg.h"


#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

 
// Dialog Data
 //{{AFX_DATA(CAboutDlg)
 enum { IDD = IDD_ABOUTBOX };
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CAboutDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 //{{AFX_MSG(CAboutDlg)
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
 //{{AFX_DATA_INIT(CAboutDlg)
 //}}AFX_DATA_INIT

 

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CAboutDlg)
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
 //{{AFX_MSG_MAP(CAboutDlg)
  // No message handlers
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COpenGLDlg dialog

COpenGLDlg::COpenGLDlg(CWnd* pParent /*=NULL*/)
 : CDialog(COpenGLDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(COpenGLDlg)
  // NOTE: the ClassWizard will add member initialization here
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32

  PixelFormat=0;
     m_yRotate = 0;
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void COpenGLDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(COpenGLDlg)
  // NOTE: the ClassWizard will add DDX and DDV calls here
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(COpenGLDlg, CDialog)
 //{{AFX_MSG_MAP(COpenGLDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_WM_TIMER()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// COpenGLDlg message handlers

BOOL COpenGLDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 
///////////////////////OPENGL INIT/////////////////////////
  CWnd *wnd=GetDlgItem(IDC_RENDER);
    hrenderDC=::GetDC(wnd->m_hWnd);
 if(SetWindowPixelFormat(hrenderDC)==FALSE)
  return 0;
 
 if(CreateViewGLContext(hrenderDC)==FALSE)
  return 0;
 glPolygonMode(GL_FRONT,GL_FILL);
 glPolygonMode(GL_BACK,GL_FILL);
///////////////////////////////////////////

 

 glEnable(GL_TEXTURE_2D);
 glShadeModel(GL_SMOOTH);
 glViewport(0,0,259,231);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 gluPerspective(45,1,0.1,100.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glShadeModel(GL_SMOOTH);       // Enable Smooth Shading
 glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    // Black Background
 glClearDepth(1.0f);         // Depth Buffer Setup
 glEnable(GL_DEPTH_TEST);       // Enables Depth Testing
 glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
 /////////////////////////////////////////////////////////////////////////
 glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);

 SetTimer(1,10,0);

////////////////////////////////////////////////////////////////

 // TODO: Add extra initialization here
 
 return TRUE;  // return TRUE  unless you set the focus to a control
}

void COpenGLDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void COpenGLDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR COpenGLDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}

 

BOOL COpenGLDlg::SetWindowPixelFormat(HDC hDC)
{
PIXELFORMATDESCRIPTOR pixelDesc;

pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pixelDesc.nVersion = 1;

pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW |
     PFD_SUPPORT_OPENGL |
     PFD_DOUBLEBUFFER |
     PFD_TYPE_RGBA;

pixelDesc.iPixelType = PFD_TYPE_RGBA;
pixelDesc.cColorBits = 32;
pixelDesc.cRedBits = 0;
pixelDesc.cRedShift = 0;
pixelDesc.cGreenBits = 0;
pixelDesc.cGreenShift = 0;
pixelDesc.cBlueBits = 0;
pixelDesc.cBlueShift = 0;
pixelDesc.cAlphaBits = 0;
pixelDesc.cAlphaShift = 0;
pixelDesc.cAccumBits = 0;
pixelDesc.cAccumRedBits = 0;
pixelDesc.cAccumGreenBits = 0;
pixelDesc.cAccumBlueBits = 0;
pixelDesc.cAccumAlphaBits = 0;
pixelDesc.cDepthBits = 0;
pixelDesc.cStencilBits = 1;
pixelDesc.cAuxBuffers = 0;
pixelDesc.iLayerType = PFD_MAIN_PLANE;
pixelDesc.bReserved = 0;
pixelDesc.dwLayerMask = 0;
pixelDesc.dwVisibleMask = 0;
pixelDesc.dwDamageMask = 0;

PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);
if(PixelFormat==0) // Choose default
{
 PixelFormat = 1;
 if(DescribePixelFormat(hDC,PixelFormat,
  sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
 {
  return FALSE;
 }
}

if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE)

{
 return FALSE;
}

return TRUE;
}


BOOL COpenGLDlg::CreateViewGLContext(HDC hDC)
{
hrenderRC = wglCreateContext(hDC);

if(hrenderRC==NULL)
 return FALSE;

if(wglMakeCurrent(hDC,hrenderRC)==FALSE)
 return FALSE;

 

return TRUE;
}

void COpenGLDlg::RenderScene()  
{


 /////////////////////////////////////////////////
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 
 glLoadIdentity();
 glTranslatef(0.0f,0.0f,-6.0f);      // Move Left 1.5 Units And Into The Screen 6.0
 glRotated(m_yRotate, 0.0, 1.0, 0.0);
 glBegin(GL_TRIANGLES); // Drawing Using Triangles
 
  glVertex3f( 0.0f, 1.0f, 0.0f);     // Top
  glVertex3f(-1.0f,-1.0f, 0.0f);     // Bottom Left
  glVertex3f( 1.0f,-1.0f, 0.0f);     // Bottom Right
 glEnd();           // Finished Drawing The Triangle
 SwapBuffers(hrenderDC);
}

void COpenGLDlg::OnTimer(UINT nIDEvent) //实时绘制场景
{
 // TODO: Add your message handler code here and/or call default
 RenderScene();
 m_yRotate +=3;
 CDialog::OnTimer(nIDEvent);
}

 

// OpenGLDlg.h : header file
//

#if !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_)
#define AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// COpenGLDlg dialog

class COpenGLDlg : public CDialog
{
// Construction
public:
 COpenGLDlg(CWnd* pParent = NULL); // standard constructor


  BOOL SetWindowPixelFormat(HDC hDC);   //设定象素格式
 BOOL CreateViewGLContext(HDC hDC);     //View GL Context
    void RenderScene();                                //绘制场景

 HDC hrenderDC;      //DC
 HGLRC hrenderRC;  //RC
 float m_yRotate;       //转速

 int PixelFormat;

 

// Dialog Data
 //{{AFX_DATA(COpenGLDlg)
 enum { IDD = IDD_OPENGL_DIALOG };
  // NOTE: the ClassWizard will add data members here
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(COpenGLDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 HICON m_hIcon;

 // Generated message map functions
 //{{AFX_MSG(COpenGLDlg)
 virtual BOOL OnInitDialog();
 afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
 afx_msg void OnPaint();
 afx_msg HCURSOR OnQueryDragIcon();
 afx_msg void OnTimer(UINT nIDEvent);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_OPENGLDLG_H__8E962FCE_4DD3_4AE0_BA13_D93DE3FBA4A1__INCLUDED_)

 

http://www.7forever.com/rwdata/temp/opengl.rar

(注:由于超级链接地址为公司所有,所以可能会删除,如果不能下,请联系我索取)

mailto:zhucde@163.com

MFC中的OpenGL入门程序 在属性窗口中,选择“配置属性” -> “链接器” -> “输入”。在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序。在本篇文章中,我们将介绍如何在MFC应用程序中使用OpenGL进行绘图。在MFC应用程序中,我们需要创建一个绘图窗口来进行OpenGL绘图。为了在OpenGL绘图窗口中进行绘制,我们需要在窗口创建完成后进行初始化。在完成上述步骤后,我们可以运行程序并查看OpenGL绘图窗口的效果。在MFC应用程序中,我们需要处理窗口消息来响应用户的操作。函数激活该绘图窗口。 阅读详情

相关推荐

基于MFC的OpenGL绘图

我们首先配置了OpenGL环境,然后在主窗口类中添加了OpenGL的初始化和绘图函数。通过编写绘图函数中的OpenGL绘图代码,我们可以实现在应用程序窗口中绘制图形。在本文中,我们将探讨如何在基于MFC(Microsoft Foundation Class)的应用程序中使用OpenGL进行绘图。至此,我们已经完成了使用OpenGL在基于MFC的应用程序中进行绘图的设置和代码编写。现在,我们可以在主窗口类的绘图函数中编写OpenGL绘图代码。最后,在主窗口类的消息映射中,添加对绘图消息的处理。

EctProcessgroup的博客 1241

OpenGL

课程涵盖了OpenGL开发的方方面面,对开发中经常用到的开发知识点进行讲解,从实战的角度进行编码设计.第1章-环境建立第2章-基础图元第3章-三维世界第4章-纹理多彩世界第5章-显存的分配-优化第6章-场景控制第7章-光照-真实世界第8章-模型第9章-UI制作第10章-场景编辑器制作第11章-地形第12章-脚本引入-lua

RPG Maker:发布与分享你的RPG游戏

在开始游戏开发之旅前,选择合适的RPG Maker版本至关重要。RPG Maker系列提供了多种版本,包括但不限于RPG Maker VX Ace、RPG Maker MV、RPG Maker MZ等。

kkchenjj的博客 1003

MFC中初始化opengl的类3D视图

#pragma once class InitOpenGL3D { public: InitOpenGL3D(void); virtual ~InitOpenGL3D(void); public: // 在OnCreate函数中调用此函数: int InitOpenGL3D::OnCreate(LPCREATESTRUCT lpCreateStruct, CCli

1902

RPG Maker:发布与分享你的RPG游戏_2024-07-13_14-51-44.Tex

在开始游戏开发之旅前,选择合适的RPG Maker版本至关重要。RPG Maker系列提供了多种版本,包括但不限于RPG Maker VX Ace、RPG Maker MV、RPG Maker MZ等。

902

RPG Maker:RPGMaker基础界面与操作

RPG Maker 提供了一个直观的地图编辑器,允许开发者创建和编辑游戏世界。开发者可以使用预设的瓷砖集来构建游戏地图,也可以导入自定义的图像资源。地图编辑器支持多层设计,可以创建复杂的地形和环境。

kkchenjj的博客 1169

MFC中使用OpenGL

转自:http://blog.sina.com.cn/s/blog_6ccd0a1101012dy4.html 一、首先介绍Windows图像程序设计中几个重要的概念: GDI(Graphics Device Interface,图形设备接口):这是Windows API的一个库。当Windows应用程序需要显示点、线、图像、文字等内容,在显示器或打印输入这些内容时,就需要用到GDI。Window...

zhangyao7751的博客 4633

RPG Maker:角色与剧情创作教程

启动软件:安装完成后,在开始菜单或桌面上找到RPG Maker MV的图标,双击打开。主界面:RPG Maker MV的主界面分为几个主要区域:菜单栏:包含文件、编辑、视图、游戏测试等选项。工具栏:快速访问常用功能,如地图编辑、事件编辑、数据库管理等。项目管理器:显示您的游戏项目结构,包括地图、事件、角色、音乐等。编辑器:用于编辑地图、角色、事件等游戏元素。预览窗口:实时预览游戏的外观和效果。控制台:显示游戏运行时的调试信息,对于脚本编辑和错误排查非常有用。

kkchenjj的博客 733

rpg人物制作软件_RPG Maker系列最新版本《RPG制作大师MZ》上架Steam

原标题:RPG Maker系列最新版本《RPG制作大师MZ》上架SteamRPG Maker系列的最新版本《RPG制作大师MZ(RPG Maker MZ)》现已在Steam平台正式上架,据商店页面显示,该作支持简/繁中文,将于2020年夏季正式发售(Steam商城链接: RPG Maker MZ on Steam )。游戏简介隆重推出《RPG制作大师MZ》!作为 RPG Maker 系列的最新版本...

weixin_35097346的博客 1644

RPG Maker MV项目实战详解

RPG Maker MV 是一款广受欢迎的电子角色扮演游戏开发工具,它允许开发者无需编写复杂的代码即可创建自定义的2D角色扮演游戏。通过其直观的拖放界面和丰富的内置资源,它为游戏设计提供了极大的便利。JavaScript是一种被广泛使用的高级、解释型编程语言,自1995年由Netscape公司的Brendan Eich开发出来后,成为了网页交互的主流技术之一。最初的设计目的是为了实现网页中的动态效果,使之不仅仅局限于静态展示。

weixin_35755188的博客 2192

RPG游戏制作工具深度解析与实践

在当今游戏产业蓬勃发展的背景下,RPG(角色扮演游戏)因其丰富的情节、深度的角色扮演和策略性的战斗系统受到了广泛欢迎。为了帮助爱好者和专业开发者快速入门和制作RPG游戏,游戏制作工具应运而生。本章节我们将深入探讨RPG游戏制作工具的核心概念,以及它们在游戏开发中的作用和重要性。RPG Maker系列从其发布以来,一直是独立游戏开发者和爱好者的首选工具。其中,RPG Maker XP以其独特的功能和简便的操作,受到了广泛的好评。

weixin_42629522的博客 991

如何独自制作一个RPG游戏发布到STEAM

一开始Bakin会提供三种不同的游戏摄像头视角,而这并不是固定的,你可以随意的调整摄像机的位置,这为制作不同的游戏玩法创造了可能性。Bakin本身拥有非常多的可购买DLC,这些DLC都是可以使用在你的游戏里的,从图标到GUI,从道具到地图,完全以DLC去进行制作也是可以的,不过这样会缺少吸引力。他的代码需求非常的少,几乎所有基础的RPG功能都可以直接通过软件实现,有需要可以自己写插件,无代码的制作流程可以让你把重心放在美术和游戏内容上。在制作游戏之前先构思游戏主题和内容是必要的。

pdddao的博客 403

RPG制作大师完整图片教程指南

在开始使用 RPG 制作大师进行游戏开发之前,首先需要完成软件的安装与基础环境配置。本章将从安装流程入手,逐步引导开发者熟悉主界面布局,包括地图编辑器、数据库、事件编辑器等核心模块的用途与操作方式。同时,还将介绍资源库的导入与管理方法,以及如何配置游戏初始参数(如分辨率、默认角色、初始地图等),为后续开发工作奠定良好基础。通过本章学习,开发者将能够独立完成 RPG 制作大师的基础设置,并熟练使用界面中的各项功能模块。

weixin_28999139的博客 1139

rpg破解地图 怎么使用_使用RPG代理调用Web服务

几年来,RPG程序员已经能够使用wsdl2ws.sh工具发出的C存根调用Web服务。 但是,在RPG应用程序中使用C存根的过程很麻烦。 程序员需要执行以下步骤: 将C结构映射到RPG结构。 添加用于服务接口功能和操作的RPG原型。 根据WSDL文件的复杂性,第一步可能是一场噩梦。 并说您完成了上述步骤,您仍然必须处理指针并担心内存泄漏! RPG程序员很高兴。 IBM增强...

cusi77914的博客 479

AS400与RPG资源大全:掌握企业级应用开发

AS400(Application System/400),俗称iSeries,是IBM推出的中高端服务器,以其强大的事务处理能力和集成的数据库管理系统闻名。它主要服务于需要高效、稳定运行的中大型企业级应用。AS400自1988年首次推出以来,已经历多次升级和优化,从单纯的硬件平台演变为一个高度集成的系统解决方案,提供了从硬件到软件、从操作系统到数据库的全面支持。RPG语言在数据处理方面提供了丰富的数据定义指令和操作指令。RPG的数据定义指令如DCL-FIELDDCL-S菇。

weixin_34779181的博客 805

Dialog下创建 MFC OpenGL子窗口

在dialog模式下,创建 MFC OpenGL子窗口,非SDI MDI

不装任何软件:用 RPG Maker 解密工具把加密的游戏图片和音频轻松提取出来

上周帮一位做同人图的画手朋友整理素材,她买了一款用 RPG Maker MV 做的独立游戏,想把里面的几张角色立绘提取出来当绘画参考。结果打开游戏目录一看,图片文件全都变成了 `.rpgmvp` 这种奇怪后缀,双击根本打不开,音频也全是 `.rpgmvm`、`.rpgmvo`。她用搜索引擎翻了一个晚上,试了好几个所谓"神器",不是要安装一堆依赖,就是要求输入看不懂的命令行参数,最后才在朋友推荐下找

gitblog_00531的博客 160

INMP441麦克风与ESP32的I2S音频采集实战指南

本文提供了INMP441数字麦克风与ESP32开发板通过I2S接口进行高质量音频采集的完整实战指南。详细讲解了硬件连接、软件配置、数据读取及基础处理,并分享了常见的避坑技巧与性能优化建议,帮助开发者快速构建物联网音频应用。

weixin_28396629的博客 598

Godot引擎与Open RPG框架:快速构建回合制RPG的实战指南

游戏开发中,选择合适的引擎和框架是项目成功的关键。Godot作为一款开源、轻量级的游戏引擎,以其节点化场景管理和友好的脚本语言,为独立开发者提供了高效的工具链。结合专门为回合制角色扮演游戏设计的Open RPG框架,开发者可以快速搭建游戏的核心系统,如回合制战斗、角色属性和物品管理。这种组合极大地提升了从原型到成品的开发效率,让开发者能更专注于游戏内容和叙事设计。本文以Godot引擎和Open RPG框架为例,深入解析如何利用这一组合高效开发回合制RPG,涵盖从环境配置、核心模块定制到性能优化的全流程实践。

weixin_34218579的博客 302

GD32 TIMER0 PWM输出死活没波形?别忘了这个关键配置(附完整代码)

本文详细解析了GD32 TIMER0 PWM输出无波形的常见问题,特别强调了高级定时器特有的主输出使能配置。通过完整的代码示例和调试技巧,帮助开发者快速解决PWM输出问题,适用于无刷电机控制等嵌入式应用场景。

weixin_30906185的博客 397

局域网tcp通信实验

IPv4 地址 . . . . . . . . . . . . : 192.168.92.79。IPv4 地址 . . . . . . . . . . . . : 192.168.92.59。子网掩码 . . . . . . . . . . . . : 255.255.255.0。子网掩码 . . . . . . . . . . . . : 255.255.255.0。使用这篇文章的小工具。

weixin_51883798的博客 434
下一篇: Push Button背景色修改修正版(完整工程)
zhucde
博客等级 码龄24年 211粉丝 52原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值