让HGE支持中文(4) - 编辑框的实现

hge 2D游戏引擎 帮助文档 hge--完全免费2D游戏引擎 此文档是她的帮助文档 此文档花费了几个小时的整理,希望这个帮助文档能够给对2D游戏感兴趣的朋友们一些帮助! 立即下载

阅读此文章前请先确认你已经阅读以下文章:

让HGE支持中文(1) - HGE中文显示 (必需)

让HGE支持中文(2) - HGE中文输入 (必需)

让HGE支持中文(3) - HGE字符串处理 (可选)

制作要点:遵循 hgeGUI 和 hgeGUIObject 类原则,即所有控件需从 hgeGUIObject 派生。

步骤:

1. 重载 hgeGUIObject 的相关函数,具体文件尾代码。

 2. 在每一帧结束时通过 hge->Input_GetIMEEvent(&imeEvent) 进行中文和英文输入获取。

 3. 取得中文和英文后添加到字符串列表中。

4. 绘制字符串列表。

 5. 重复2-5步骤。以此循环。

代码:

 1. 头文件 <hgeedit.h>

#pragma once

#include "helpers/hgegui.h"

#include "helpers/hgevector.h"

#include "helpers/hgerect.h"

#include "helpers/hgefontcn.h"

#include <atlstr.h>


//-------------------------------------------------------------
// 描述 : 
//-------------------------------------------------------------

class tEditBox : public hgeGUIObject

{

public:

    tEditBox(HTEXTURE tex, int id, 

        float tx, float ty, float tw, float th, 

        hgeFontCN* font, int len = 0x10, float dstX = 0, float dstY = 0);



    virtual void    Update(float dt);

    virtual void    Render();

    virtual void    Leave();

    virtual void    MouseOver(bool bOver);

    virtual void    Focus(bool bFocused){    tudb_focus = bFocused, tudb_cursor = bFocused;}

    virtual bool    KeyClick(int key, int chr);

    virtual bool    MouseMove(float x, float y) { return true; }



    CString         GetString(){ return tudb_str; }

    void            SetString(CString str){ tudb_str = str; tudb_pos = tudb_str.GetLength(); reflength(); }

    void            Clear(){ SetString(""); }

    void            SetExpt(float x, float y){ tudb_ex = x, tudb_ey = y; }



private:

    bool            AddChar(char chr[3], bool isIME);

    bool            DelChar(bool front);

    void            reflength();



protected:

    DWORD           tudb_color;

    bool            tudb_focus, tudb_cursor;

    int             tudb_pos, tudb_maxlen;

    float           tudb_ex, tudb_ey, tudb_plen;

    hgeFontCN*      tudb_font;

    hgeSprite*      tudb_spr;

    CString         tudb_str;

};
 
2. 源文件 <hgeedit.cpp>
 
#include "hgeedit.h"



#include <assert.h>





//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

tEditBox::tEditBox(HTEXTURE tex, int id, float tx, float ty, float tw, float th, hgeFontCN* font, int len, float dstX, float dstY)

:hgeGUIObject(id)

{

    tudb_color = 0xFFFFFFFF;

    tudb_focus = false;

    tudb_cursor = false;

    tudb_ex = tudb_ey = 2;

    tudb_pos = 0;

    tudb_spr = 0;

    tudb_maxlen = len;

    tudb_plen = tudb_ex + 1;

    tudb_font = font;



    tudb_spr  = new hgeSprite(tex, tx, ty, tw, th);

    tguo_rect.Set(dstX, dstY, tw + dstX, th + dstY);

}

//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

void tEditBox::Update(float dt)

{

    if (!tudb_focus)

        return;



    static float lstdt = 0;

    lstdt += dt;

    if (lstdt > 0.4f)

    {

        tudb_cursor = !tudb_cursor;

        lstdt = 0;

    }

}

//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

void tEditBox::Render()

{

    tudb_spr->Render(tguo_rect.x1, tguo_rect.y1);



    tudb_font->SetColor(tudb_color);

    tudb_font->Render(tguo_rect.x1 + tudb_ex, tguo_rect.y1 + tudb_ey, tudb_str);



    if (!tudb_focus)

        return;



    if (tudb_cursor)

        hge->Gfx_RenderLine(tguo_rect.x1 + tudb_plen,

                            tguo_rect.y1 + 2, 

                            tguo_rect.x1 + tudb_plen, 

                            tguo_rect.y2 - 2, 

                            tudb_color);



    hgeIMEEvent    imeEvent;

    while (hge->Input_GetIMEEvent(&imeEvent))

        AddChar(imeEvent.value, imeEvent.isIME);

}

//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

void tEditBox::Leave()

{

    SAFE_DELETE(tudb_spr);

}

//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

void tEditBox::MouseOver(bool bOver)

{ 

    //hge->OnMouseOver(bOver, tguo_id);

}

//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

bool tEditBox::KeyClick(int key, int chr)

{

    if (!tudb_focus)

        return false;



    switch (key)

    {

    case HGEK_LEFT:

        tudb_cursor = true;

        if (tudb_pos > 1)

            tudb_pos -= (tudb_str[tudb_pos - 1] < 0) ? 2 : 1;

        else

            tudb_pos = 0;

        reflength();

        break;

    case HGEK_RIGHT:

        tudb_cursor = true;

        if (tudb_pos < tudb_str.GetLength())

            tudb_pos += (tudb_str[tudb_pos] < 0) ? 2 : 1;

        else

            tudb_pos = tudb_str.GetLength();

        reflength();

        break;

    case HGEK_BACKSPACE:

        DelChar(true);

        break;

    case HGEK_DELETE:

        DelChar(false);

        break;

    case HGEK_HOME:

        tudb_pos = 0;

        reflength();

        break;

    case HGEK_END:

        tudb_pos = tudb_str.GetLength();

        reflength();

        break;

    };



    //hge->OnKey(key, chr, tguo_id);



    return true;

}

//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

bool tEditBox::AddChar(char chr[3], bool isIME)

{

    if (tudb_str.GetLength() >= tudb_maxlen)

        return false;



    CString    _str = tudb_str;



    if (tudb_pos == 0)

    {

        tudb_str = chr + _str;

    }

    else if (tudb_pos == _str.GetLength())

    {

        tudb_str += chr;

    }

    else

    {

        tudb_str = _str.Mid(0, tudb_pos);

        tudb_str += chr + _str.Mid(tudb_pos, _str.GetLength() - tudb_pos);

    }



    tudb_pos += isIME ? 2 : 1;



    reflength();



    return true;

}

//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

bool tEditBox::DelChar(bool front)

{

    if (tudb_str.GetLength() <= 0)

        return false;



    CString    _str = tudb_str;

    int     _len = tudb_str.GetLength();



    if (front)

    {

        if (tudb_pos <= 0)

            return false;



        int exp = _str[tudb_pos - 1] < 0 ? 2 : 1;



        if (tudb_pos == exp)

        {

            tudb_str.Delete(0, exp);

        }

        else if (tudb_pos == _len)

        {

            tudb_str.Delete(_len - exp);

        }

        else

        {

            tudb_str = _str.Mid(0, tudb_pos - exp);

            tudb_str += _str.Mid(tudb_pos, _len - tudb_pos);

        }



        tudb_pos -= exp;



        if (tudb_pos < 0)

            tudb_pos = 0;



        reflength();

    }

    else

    {

        if (tudb_pos >= _len)

            return false;



        int exp = _str[tudb_pos] < 0 ? 2 : 1;



        if (tudb_pos == 0)

        {

            tudb_str.Delete(0, exp);

        }

        else if (tudb_pos == _len - exp)

        {

            tudb_str.Delete(_len - exp);

        }

        else

        {

            tudb_str = _str.Mid(0, tudb_pos);

            tudb_str += _str.Mid(tudb_pos + exp, _len - tudb_pos - exp);

        }

    }



    return true;

}

//-------------------------------------------------------------

// 描述 : 

//-------------------------------------------------------------

void tEditBox::reflength()

{

    tudb_plen = tudb_ex + 1;

    if (!tudb_str.IsEmpty())

    {

        CString    _str = tudb_str.Mid(0, tudb_pos);

        tudb_plen += tudb_font->GetStringWidth(_str);

    }

}
 
此时可能你也会编不过。那是因为我已经将 hgeGUI 的文件中 hgeGUIObject 成员变量的名字改变过。
这里我也将 hgeGUI 的变量名发上来:
 
class hgeGUIObject

{

public:

   hgeGUIObject(int id)

        :tguo_id(id)

    {

        hge=hgeCreate(HGE_VERSION); 

        tguo_static = false;

        tguo_enable = true;

        tguo_visible = true;

    }

    virtual~tGUIObject() { hge->Release(); }



    virtual void    Render() = 0;

    virtual void    Update(float dt) {}



    virtual void    Enter() {}

    virtual void    Leave() {}

    virtual void    Reset() {}

    virtual bool    IsDone() { return true; }

    virtual void    Focus(bool bFocused) {}

    virtual void    MouseOver(bool bOver) {}



    virtual bool    MouseMove(float x, float y) { return false; }

    virtual bool    MouseLButton(bool bDown) { return false; }

    virtual bool    MouseRButton(bool bDown) { return false; }

    virtual bool    MouseWheel(int nNotches) { return false; }

    virtual bool    KeyClick(int key, int chr) { return false; }

    

    const int       tguo_id;

    bool            tguo_static;

    bool            tguo_enable;

    bool            tguo_visible;

    hgeRect         tguo_rect;



    hgeGUI*         tguo_gui;

    hgeGUIObject*   tguo_next;

    hgeGUIObject*   tguo_prev;



protected:

    HGE*            hge;

};
 
如果还有什么问题可以来问我,我QQ:29774874。
HGE中文显示解决.rar HGE是一套十分易用的硬件加速2D游戏引擎。它基于DX8,运行于各种Win32平台,同时支持VC,BC,MinGW多种编译环境。它使用“The zlib/libpng license”协议发布,可以自由地使用在包括商业性质的项目上 但是HGE没有提供中文显示,这个资源就是解决HGE中显示中文的。 立即下载

相关推荐

真正的HGE1.81教程中文翻译版

真正的HGE1.81教程中文翻译版 很多人下载的HGE中文教程都是HGE1.6的CHM版本。但是HGE1.81和HGE1.6版本有很多功能都有区别,所以这个资源对于正在学HGE和英文不好的游戏开发爱好者来说是一个值得收藏的东西。

让HGE支持中文(1) - HGE中文显示

 HGE是不款不错的2D引擎渲染引擎...为什么这样说呢...HGE目前没有物理,不过官方已经公布下一个版本将会有物理引擎进入.因此该版本将会是一个非常好的2D引擎代表作..期待ing...不过HGE是不支持中文的...这的确比较麻烦...有没有解决办法呢?答案是肯定的...下面我就有来讲讲怎么让HGE支持中文...我们先来搞定中文的显示,.再来搞定中文的输入.(输

showlong 专栏「C++」@ http://www.fuel4d.com 7573

HGE2D引擎+中文chm帮助文档.rar

HGE2D引擎,内含源代码,实例,以及英文帮助文档(自带,html格式),中文帮助文档(chm格式)

HGE中文解决方案hgeTTF

 这是一个比较好的解决方案,直接用字体来,不用png图片渲染。下面是下载来的hgeTTF里附带的demo(我自己稍微修改了下):Code: #include    #include    #include "hgeTTF/FontManager.h"   #include "hgeTTF/Font.h"   #include

ACMer 3277

HGE 中文帮助文档

HGE引擎 的 中文帮助文档 这个版本的绝对可看。 函数参考指南等说明文件已全部汉化,非常方便的。

Ubuntu 24.04下Loki+Alloy+Grafana日志分析系统的快速部署与实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Loki+Alloy+Grafana轻量级日志分析系统的完整流程。通过二进制安装Loki、配置Alloy采集器以及设置Grafana可视化界面,构建了一套资源消耗低、易于管理的日志解决方案,并实战演示了如何采集和分析网络设备日志,特别适合资源有限的中小团队或边缘计算场景。

tensor9flow的博客 236

HGE下汉字显示的两种解决方案

http://www.cppblog.com/bogy/archive/2007/12/05/37846.html本方案是为解决在HGE的项目中支持中文的显示。目前支持两种方案:    一、像素字体的显示;    二、矢量字体的显示。这两种字体的创建与显示由类 FontSprite 的派生类实现,所以使用时只需要使用 FontSprite 类中不同的创建函数即可创建像素字

gddsky的小空间 876

ScanNet数据集下载全攻略:从申请到解析的保姆级教程(含常见问题解决)

本文提供了ScanNet数据集从申请授权到下载、解析的完整实战指南。针对这个大规模室内RGB-D数据集,详细介绍了官方申请流程、优化下载策略、数据验证方法,并重点解决了深度图解析等常见问题,帮助三维视觉研究者高效获取和使用这一宝贵资源。

5f4d3s2a1q的博客 620

HGE的中文显示解决方案 .

最近在自己借鉴hge写一个2d游戏引擎,无意中看到中文字体的简单解决方案,先记下来备忘。 HGE本身并不支持中文的显示,因此我使用由 微妙的平衡 大神提供的解决方案. 大神提供的代码本来包含gfxfont.h和gfxfont.cpp文件,只需要将这两个文件添加到工程中即可使用. 但是我实在太懒,为了避免每次都添加两个文件到工程中去,于是我擅自将cpp的代码全部移到了.h文件中

gumingyaotangwei 的专栏 1724

Verilog——反相器

反相器代码: module inv( A, Y );//A,Y是端口 //定义端口属性 input A; output Y; //定义输入输出关系 assign Y=~A;//Y等于A的反 endmodule //inv是module的名字

weixin_41788560的博客 9501

MPU6050运动中断唤醒STM32低功耗休眠模式实战

本文详细介绍了如何使用MPU6050运动中断唤醒STM32低功耗休眠模式的实战方案。通过配置MPU6050的运动检测中断作为STM32的唤醒源,实现设备在静止时进入低功耗Stop模式,运动时快速唤醒,大幅延长电池续航。涵盖硬件连接、软件配置、参数调试等关键步骤,并提供实际应用案例和优化建议。

rgv23456789的博客 703

【HGE相关教程/翻译汇总贴】 以及源代码下载

 【教程/电子书下载:】 HGE文档中文翻译 By 微妙的平衡【推荐】 【疑难解答:】 编译 HGE 1.8 所需的 power.cpp 文件下载 Visual Studio 2005编译的C++程序在其他机器上不能运行的解决方法 Visual Studio 2005 开发环境设置(其他环境雷同) 【刚接触必看】 Visual C++ 2005编译hge lib出错的解决办法 窗口大小动态修改 去

holidiess的专栏 3115

浅谈迪杰斯特拉(Dijkstra)算法和A*算法原理及实现

迪杰斯特拉(Dijkstra)算法和A*算法的原理及实现。

Guo_Zhanyu 9600

web渗透--9--识别web应用框架

1、概述 Web框架指纹识别是信息收集过程中的一个重要任务。获悉目标框架的类型必然为测试人员带来极大的优势,如果该框架在之前就被测试过。测试人员不仅可以获得未修补版本中存在的漏洞,还可以了解此框架中特有的错误配置以及已知的文件结构。从而使指纹识别过程显得格外重要。

武天旭的博客 5101

180.在 Vue3 中使用 OpenLayers 实现多个多边形的绘制、编辑、删除与清空

【摘要】本文介绍如何在Vue3+TypeScript环境下使用OpenLayers实现多边形地图交互功能。通过Composition API封装核心逻辑,实现了多边形绘制、编辑、删除及清空等操作。关键技术包括:使用VectorLayer管理图形数据,Draw/Modify/Select交互控制,以及通过ref()管理交互状态。文中提供了完整代码示例,并解决了交互对象叠加问题,为开发GIS应用提供了基础模块。该方案支持扩展为数据库存储、后端交互等高级功能。

小彭的博客 770

游戏GUI

在过去的8年里,我经过数次失败的GUI系统设计经历,最终找到了一种算是可以的方案。这个方案使用一种类似MVC的架构。主要有以下几个大的部分: 【sprite系统】 sprite是一个从古老的游戏中一直演化过来的概念,而在这里,它代表了屏幕上的一个次元(层)中所有可见元素。 它描述了一个屏幕上的矩形,以及和其他矩形的关系。 它具有自己的更新和绘制方法。 它具有自己的各种

cbbbc 960

【雷达】一维和二维自适应波束形成(DBF))DBF附matlab代码

1 简介 数字波束形成技术是天线波束形成原理与数字信号处理技术相结合的产物,其广泛应用于阵列信号处理领域.由于电磁工作环境的恶化和大量射频干扰的存在,在极低的信干噪比(SINR)条件下进行目标检测和信息提取十分困难.对于阵列系统,往往采用自适应数字波束形成(ADBF)技术,来抑制强干扰和方向性干扰对有用信号的影响.介绍了数字波束形成器的基本原理及其DSP的实现结构.​ 2 完整代码 clc;clear all;close all;%%%%%%%%%%%%%%%%%一维DBF%%%%%%%%%%%%%

qq_59747472的博客 7267

HGE教程翻译(1)

HGE 是一个硬件加速(Hardware accelerated)的 2D 游戏引擎(Game Engine),HGE 是一个富有特性的中间件,可以用于开发任何类型的 2D 游戏。它是一个完全免费的,并且开源的2D游戏引擎,底层采用Direct3D; HGE 封装性良好,以至于你仅仅需要关系游戏逻辑(Game Logic),而不需要在意 DirectX,Windows 消息循环等。 H

拥抱变化 1278

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

hge引擎应用(一)

       hge是一个功能强大的2D游戏引擎,而且用起来也是比较方便的,它的架构基础是Directx8.0,好了不再废话了,先来看看如何把hge应用到我们的项目中去吧!   首先,你要先下载hge的开发包,目前的版本是1.81,到官网去下载吧http://hge.relishgames.com/files/hge.zip,下载完成后解压,打开vs2005(c++)或vc++6.0,在工具菜

lambp314的专栏 8696

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【亲测免费】 HGE:高效、现代化的2D游戏引擎

HGE:高效、现代化的2D游戏引擎 项目介绍 HGE(Haaf's Game Engine)是一款专为2D游戏开发设计的高效引擎。自1.9版本起,HGE进行了多项重大改进,包括API调用的类型更改、内存安全性的提升、源代码的现代化改造以及类型安全性的增强。这些改进使得HGE在保持高性能的同时,更加易于使用和维护。 项目技术分析 1. API调用的类型更改 在1.9版本中,HGE将多个API调用的类...

gitblog_00198的博客 1502

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

HGE使用日志

      这些日志都是很早前陆续写的,拿出来分享经验:2006-8-15       7:30开始学习HGE引擎。       从以前的接触中知道,HGE引擎基于DX8。       创建HGE最简单程序的步骤:1.  定义HGE类型的指针,用来保存引擎指针。2.  调用 hgeCreate函数得到HGE引擎指针----这是个标准的C语言函数,从以前阅读这个引擎的部分代码

松鼠桂鱼的后花园 844

免费的游戏引擎HGE使用记

今天了解到有个HGE的2D免费游戏引擎,不由得心痒痒想看看,本来还害怕太大,下起来麻烦,结果去其官网一看,才2M多,马上就下下来。官网地址:http://hge.relishgames.com/downloads.htmlGoogle了一下,英文资料比较多,中文就几篇,找到一篇中文的tutorial来试试吧。Tutorial地址:http://www.rainstorey.com/blog/art

benny5609的专栏 3606

【HGE引擎】学习HGE遇到的若干问题及解决方式记录 Q&A

Q1: 错误 3 error LNK2019: 无法解析的外部符号 "public: __thiscall hgeSprite::hgeSprite(unsigned long,float,float,float,float)" (??0hgeSprite@@QAE@KMMMM@Z),该符号在函数 _WinMain@16 中被引用 hge_tut01.obj A1: 没有加载相关的l

走向CTO的路上... 3149

HGE系列之一 初窥门道

 HGE系列之一    初窥门道   对于游戏开发有些兴趣的朋友,尤其是那些至今都扔不下2D、如我这般的志士同仁,想必对于HGE都有所耳闻,但如果要论及深入了解与运用,那恐怕就寥寥无几人了,而对于那些压根就未有听说过HGE名号的人士,就更无论什么知晓或是精通了。而我,一个对游戏编程颇有兴致的平庸之辈,恰好在某次网上混迹期间了解到了HGE这个名词,接着也顺势了解了一些有关HGE的零星知识

tkokof1的专栏 5021

HGE简易教程

HGE基础教程第一章:初识HGEC++ 有一个理念,我记得是在我看C++ Primer学习时看到的,那就是一次代码编写,处处使用,所以,就出现了诸如DLL,LIB等便于大家使用的代码库。其思想基本就是把写好的代码打包, 然后只要在工程中链接lib或dll,就可以使用dll或者lib中写好的代码,它们的出现,为资源共享创造了空前的便利。那么,HGE也是贯彻这个思想 的一个库,它把DirectX进行封装,方便大家使用,由于直接使用DirectX需要直接接触硬件上的东西,所以不利于入门,HGE的出现,让高效图形

chjh0540237的专栏 3095
上一篇: 来预览一下我业余时间正在写的一个游戏(HGE+DX9+3DS+CN及输入+网络)[+MFC]
下一篇: 判断值是否是2的幂
ShowLong
博客等级 码龄21年 61粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值