OGre(1.65)+CEGUI的中文显示和中文输入,新人必看

第一次学博客,好刺激。刚学Ogre一个星期,遇到了一些难点,但经过网海的打捞终于慢慢的前行。今天遇到的中文显示和输入的问题!中文显示还好弄的,但中文输入我历经九九八十一个网页,却终究没能解决,正值吃饭之际,也不知是怎么打开的一个充满神奇的网页,里面居然又源代码,而且还是1.60版本的Ogre(我用的1.65,虽然出了1.70但是我的机子运行出了点问题。反正初学能用就好了)。内容十分相近,下载一下,稍稍阅读,震惊不已。Application的cpp里面就两行就“解决”了!感慨万分之余,怕以后和我一样的新人在受此折磨,决定于今晚11点告诉大家我捞得的解决方案,另外附带源代码!好了,就铺垫这么多,下来让我们看看如何实现中文显示和中文输入吧!惊心动魄哦!

一:中文显示

     1:首先拷贝C:/WINDOWS/Fonts目录下面的一个字体文件(例如simhei.ttf)到你OgreSDK/medias/fonts目录下(例如D:/Orge/OgreSDK/media/fonts),随便打开一个.font文件(记事本或写字板打开方式),复制里面的格式,自己创建一个.font文件,拷贝进去(例如:<?xml version="1.0" ?>
<Font Name="Chinese" Filename="simhei.ttf" Type="FreeType" Size="12" NativeHorzRes="800" NativeVertRes="600" AutoScaled="true"/>)保存起来,名字最好和FontName里面一样(其实没太大需要,如果你理解的话)。

    2:修改OgreSDK/media/gui下面的文件TaharezLookSkin.scheme的内容,方法,记事本打开。看到四五六行的那写字体文件的列举了吗?对,你只需要将自己的字体文件列举上就可以了。在这三行之间任意插入一行,按照那些列举的方法,例如(<Font Name="Chinese" Filename="chinese.font" />),再保存就好。

   3:再修改你程序里面的CEGUI::System*指针对象设置的默认字体。方法:在createScene里面有一条语句:mGUISystem->setDefaultFont((CEGUI::utf8*)"Chinese");(这里默认你用OgreApplicationWizard创建的带有CEGUI附带选项的工程,如果你是自己一点一点加的话,那就自己照吧。不过建议用OgreApplicationWizard工具,新手省事。),然后你可以在你程序中使用中文了。不过setText等里面的参数要稍加加工。参数为:(CEGUI::utf8*)Ogre::UTFString(L"中文退出").asUTF8_c_str(),不过网上还有好几种方法。我用的是另一种,不过都一样了。

 

二:中文显示(网上有很多方法,有消息钩,还有修改头文件的。消息钩我原本不知道什么意思,但后来看得多了,也大体明白了一点。但我的程序还是不行。而且新手都不太懂怎么安排代码。所以我给新手一个绝佳的方法。我觉得只要你编过程序就可以实现中文输入。)

    1:把CEGUICHSSupport.hpp和CEGUICHSSupport.cpp(你可以根据我后面发的代码自己创建)加到你的工程里面(别说你不会,例如右击源文件点添加现有项),让后再你程序的cpp里面加上#include "CEGUICHSSupport.hpp",而且要在项目属性/c/c++里面的附加目录项,新建选择CEGUICHSSupport.hpp和CEGUICHSSupport.cpp所在目录。

    2:然后你在TutorialApplication1FrameListener类里面的bool keyPressed( const OIS::KeyEvent &arg )函数里面把它原来自带的CEGUI::System::getSingleton().injectKeyDown( arg.key );以及CEGUI::System::getSingleton().injectChar( arg.text );删除或者注释,替换成

if( !CEGUICHSSupport::IsLocked() )
  {
   CEGUI::System::getSingleton().injectKeyDown( arg.key );
  }  

  //下面这句,处理中文
  CEGUICHSSupport::injectChar(  mWindow ,  (CEGUI::utf32)arg.text );

并确定你的程序使用多字节编码。Unicode会出现乱码!

Ok!大功告成。随便找个编辑框试一试吧!

博客没提供附件功能吗?那我上传资源吧!设为需要0资源分数。居然不能上传资源了。那直接把源码内容发给大家。大家自己创建相应的头文件和cpp文件吧。

CEGUICHSSupport.hpp:

#pragma once

#include <OgreRenderWindow.h>
#include <CEGUI.h>

class CEGUICHSSupport
{
public:
static bool injectChar( Ogre::RenderWindow* pWin, CEGUI::utf32 code_point );

public:
inline static bool IsLocked()
{
return m_bIsLock;
}

protected:
static bool MakeWChar( unsigned char code_point );
static LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

protected:
static bool m_bIsOk;
static bool m_bIsLock;
static WNDPROC m_funcOldWndProc;
};

CEGUICHSSupport.cpp:

#include "CEGUICHSSupport.hpp"

#include <Imm.h>
#pragma comment( lib, "Imm32.lib" )

#include <cassert>
#ifndef AssertEx
#define AssertEx( exp, msg ) assert( exp && msg )
#endif

bool CEGUICHSSupport::m_bIsOk = false;
bool CEGUICHSSupport::m_bIsLock = false;
WNDPROC CEGUICHSSupport::m_funcOldWndProc = NULL;

LRESULT CEGUICHSSupport::WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_IME_COMPOSITION:
{
if( lParam & GCS_COMPSTR )
{
HIMC hIMC = ImmGetContext( hWnd );
TCHAR szBuf[1280] = {0};
DWORD dwSize = ImmGetCompositionString( hIMC, GCS_COMPSTR, (void*)szBuf, 1280 );
if( dwSize != 0 )
{
m_bIsLock = true;
}
else
{
m_bIsLock = false;
}
}
}

break;

case WM_CHAR :
{
MakeWChar( (CEGUI::utf32)wParam );
}
break;
}

AssertEx( m_funcOldWndProc != NULL, "不可为空" );

return CallWindowProc( m_funcOldWndProc , hWnd , uMsg , wParam , lParam );
}

bool CEGUICHSSupport::MakeWChar( unsigned char code_point )
{
using namespace CEGUI;

static char s_tempChar[3] = "";
static wchar_t s_tempWchar[2] = L"";

static bool s_flag = false;

unsigned char uch = code_point;

if( uch >= 0x81 || s_flag )
{
if( !s_flag )
{
s_tempChar[0] = (char)uch;
s_flag = true;
return true;
}

else if( uch >= 0x40 )
{
s_tempChar[1] = (char)uch;
s_flag = false;
MultiByteToWideChar( 0, 0, s_tempChar, 2, s_tempWchar, 1);

s_tempWchar[1] = L'/0';

utf32 code = (utf32)s_tempWchar[0];

return CEGUI::System::getSingleton().injectChar( code );
}
else
{
if ( !ImmIsIME(GetKeyboardLayout(0)))
{
return CEGUI::System::getSingleton().injectChar(code_point);
}
}
}
else
{
s_flag = false;
return CEGUI::System::getSingleton().injectChar(code_point);
}

return false;
}

bool CEGUICHSSupport::injectChar( Ogre::RenderWindow* pWin, CEGUI::utf32 code_point )
{
AssertEx( pWin != NULL, "RenderWindow不能为空..." );

if( !m_bIsOk )
{
HWND hWnd = NULL;
pWin->getCustomAttribute( "WINDOW", &hWnd );

if( NULL == hWnd )
{
throw std::runtime_error( "获取系统句柄失败..." );
}

m_funcOldWndProc = (WNDPROC)::GetWindowLong( hWnd, GWL_WNDPROC );
::SetWindowLong( hWnd, GWL_WNDPROC, (LONG)WndProc );

m_bIsOk = true;

return false;
}

return true;
}

最后希望中国软件能有自己的一片天地!一起努力吧!让中国的操作系统走向世界!我:QQ103406727。志同道合者加!

时间: 2024-09-17 04:26:42

OGre(1.65)+CEGUI的中文显示和中文输入,新人必看的相关文章

让windows 2003英文版支持中文显示及中文输入的设置方法

1. control panel-->Regional and Language Options--->Language---->将"Install Files for East Asian Languages" 选项打勾: 系统提示需要插入系统安装光盘,根据提示操作.成功后返回到Regional Options选项 2.Regional Options-->Standards and Formats"下拉框中选择"Chinese (PRC)

Learning Cocos2d-x for WP8(4)——中文显示

原文:Learning Cocos2d-x for WP8(4)--中文显示 C#(wp7)兄弟篇Learning Cocos2d-x for XNA(4)--中文显示 Cocos2d-x中文显示,似乎还没有非常完美的解决方法,一切的根源还是UTF-8编码问题. 我选择了CCLabelBMFont结合位图坐标文件(.fnt)显示,CCLabelBMFont优于CCLabelTTF是因为CCLabelBMFont每次改变只改变图片坐标,而CCLabelTTF需要重新渲染. 1.修改.cpp编码方式

解决win7系统所有中文显示乱码的方法教程

  在win7系统下我们如果把语言操作系统界面语言修改为英文后,有部分用户的电脑中的英文字体将显示乱码的问题,对于出现该问题是因为中文不是Unicode语言,用户在将系统语言设置为英文后,语言设置的非Unicode设置出问题而导致的,故此我们需要将非Unicode的语言修改为中文语言即可解决这个问题,下面我们看下具体的操作教程吧! 解决win7系统所有中文显示乱码的方法教程 1.点击开始菜单图标并单击打开控制面板. 2.在区域和语言设置-管理中,选择更改显示语言. 3.选择管理标签,并点击更改系

win7系统中文显示为乱码该怎么修复

  win7 32位系统下载之后,不少用户都反应说确实用着比较方便.在具体操作的过程中,也有的用户反应出了不少的问题,比如w7系统中文显示为乱码,这时候就会耽误正常的工作.那么遇到这样的问题该怎么办呢?下面跟随小编来了解一下w7系统中文显示为乱码的修复方法吧. 1.直接单击开始菜单图标,找到控制面板并将其打开. 2.找到里面的区域和语言设置-管理选项,将显示语言进行更改. 3.接着就选中管理标签,然后单击对系统区域设置进行更改. 4.然后将内容里面的非Unicode语言修改成简体中文,这时候再输

win7英文版中文显示乱码解决

win7英文版中文显示乱码-很多软件无法安装的解决 win7英文版中文显示乱码处理方式: Control Pannel-->Clock, Language, and Region--> Administrative-->Change system locale-->Select Chinese (PRC)

jsp中文显示问号问题解决方法

 jsp中想要输出的中文被显示成问号?在eclipse-windows- preferences中搜索jsp,Encoding选项中选择 Chinese,此问题便可解决 问题: jsp中想要输出的中文被显示成"?"    解决方法 : 在eclipse-windows- preferences中 搜索jsp , Encoding选项中选择 Chinese . 这样新建的jsp文件将支持中文显示.    对已经存在的jsp文件做如下修改: 将各种编码方式都改成GB18030,如下:   

解决JSP开发Web程序中文显示三种方法

方法一:最简单也是用的最多的方法 <%@ page language="java" pageEncoding="GBK" %> 或者<%@ page contenttype="text/html;charset=gbk";>这里可以用gb2312或者gbk,只是gbk比gb2312支持跟多的字符. 这个方法用于jsp页面中的中文显示. 方法二:使用过滤器 过滤器使用主要针对表单提交,插入数据库的数据都是?号.这也是应为to

解决JSP开发Web程序中文显示的三种方法

js|web|程序|解决|显示|中文 方法一:最简单也是用的最多的方法 <%@ page language="java" pageEncoding="GBK" %> 或者<%@ page contenttype="text/html;charset=gbk";>这里可以用gb2312或者gbk,只是gbk比gb2312支持跟多的字符. 这个方法用于jsp页面中的中文显示. 方法二:使用过滤器 过滤器使用主要针对表单提交,插

解决JSP中文显示问题的几个方法

js|解决|问题|显示|中文 解决JSP中文显示问题的几个方法 总结了以下几条方法: 1.在jsp页中加入一条语句: <%@ page contentType="text/html;charset=gb2312" %>中文显示就正常了. 2.对于从网页中的文本框通过String parameter = request.getParameter("parameter");方式获得的字符串,均是8859_1的编码,如果想把它显示在网页上就必须得用parame