游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3256|回复: 8

怎样在游戏里输入中文

[复制链接]

47

主题

145

帖子

3602

积分

论坛元老

Rank: 8Rank: 8

积分
3602
发表于 2004-9-22 09:35:00 | 显示全部楼层 |阅读模式
各位都知道网络游戏就是互动游戏。。。
要互动就必须交流。。。
交流的方式很多,动作,说话。。。
对~就是说话,但在游戏中需要输入字。。。什么字??
汉字!!!!怎么做??需要用到哪些API??谢谢了~~
还有怎么在游戏里面条用 智能ABC ?五笔?谢谢了

29

主题

421

帖子

436

积分

中级会员

Rank: 3Rank: 3

积分
436
发表于 2004-9-22 11:22:00 | 显示全部楼层

Re: 怎样在游戏里输入中文

hays2002: 怎样在游戏里输入中文

各位都知道网络游戏就是互动游戏。。。
要互动就必须交流。。。
交流的方式很多,动作,说话。。。
对~就...


晕。
说话和输入中文有什么必然的联系吗?最好用语音,好像msn和qq的语音聊天那样。
输入中文的时候,WinMsgProc里面会有两次WM_CHAR产生,英文的话就只有一次。

18

主题

579

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2004-9-22 17:19:00 | 显示全部楼层

Re:怎样在游戏里输入中文

显示中文可以用Freetype,输入嘛,嘿嘿,没搞过这样的控件

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2004-9-22 18:03:00 | 显示全部楼层

比较麻烦啊。呵呵

代码行数估计也蛮多的了。

22

主题

209

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2004-9-23 09:07:00 | 显示全部楼层

Re: 怎样在游戏里输入中文

hays2002: 怎样在游戏里输入中文

各位都知道网络游戏就是互动游戏。。。
要互动就必须交流。。。
交流的方式很多,动作,说话。。。
对~就...



使用系统输入法



//******************************************************************//
//
// 做这个东西的时候得到了论坛上网友的热心帮助,整理之后再送给大家
// 这是个在DX程序下使用系统输入法的解决方案,可能有little bug :-)
// 不过还没发现,如果发现了,告诉我啊 jerrywang@163.net
// 程序中使用的CHK()CHKB()是为了监测内存泄漏,可以去掉,CTTFFONT
// 为显示信息用,可以用其他方法替换如 TxtOut() 等
//
//******************************************************************//

//////////////////////////////////////////////////////////////////////
//
// IM.h: CIM class (使用系统)输入法类
// 2001/4/30 Write by Jerry Wang
// 感谢大大鱼的帮助
// Need Lib: imm32.lib
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)
#define AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_

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

#define _CIM_MAXINPUTCHARNUMBER 24 //最多输入的字节数

#include "FindMe.h"

class CIM
{
private:
    CTTFFont ttffont;                    //显示信息
    LPCANDIDATELIST m_lpCandList;        //输入法候选文字列表
    LPSTR m_lpszImeInput;                //指向IME输入的文字字符串指针
    LPSTR m_lpszCurInputLanguageDesc;    //指向当前输入语言描述的指针
    char m_cCandidateList[255];          //候选文字列表缓冲区
    char m_cInput[64];                   //输入的字母

    BOOL CandidateToString( LPCANDIDATELIST lpCandidateList ); //转换候选文字列表到字符串

public:

    CIM();
    virtual ~CIM();

    LPSTR GetResultString( void );                     //取得输入的字符串

    void UpdateShow( );                                //显示输入法信息

    LPSTR GetCurInputLanguageDesc( );                  //取得应用程序当前使用语言的描述
    void ClearCandidateList( void );                   //清除输入法文字候选列表
    BOOL GetCandidateList( HWND hWnd );                //取得输入法文字候选列表
    BOOL ImeIsOpen( void );                            //输入法是否打开
    void OnChar( TCHAR ch );                           //处理WM_IME_CHAR消息
    void OnImeNotify( HWND hWnd,WPARAM wParam );       //处理WM_IME_NOTIFY消息
    void OnImeComposition( HWND hWnd, LPARAM lParam ); //处理WM_IME_COMPOSITION消息
};

#endif // !defined(AFX_IM_H__6887B165_972D_4D17_8A75_FE07930CE59C__INCLUDED_)



//*********************************************************************************************//

//////////////////////////////////////////////////////////////////////
//
// IM.cpp: CIM class (使用系统)输入法类
// 2001/4/30 Write by Jerry Wang
// 感谢大大鱼的帮助
// Need Lib: imm32.lib
//
//////////////////////////////////////////////////////////////////////

#include "imm.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CIM::CIM()
{
    m_lpszImeInput = new char[_CIM_MAXINPUTCHARNUMBER];
    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );
    *m_lpszImeInput = '\0';
    *m_cInput = '\0';

    ttffont.Create( "黑体",15,RGB(255,255,255) );
    GetCurInputLanguageDesc();
}

CIM::~CIM()
{
    ZeroMemory( m_lpszImeInput,_CIM_MAXINPUTCHARNUMBER );

    CHKB( delete m_lpszImeInput );
    if( m_lpszCurInputLanguageDesc != NULL )
        CHKB( delete m_lpszCurInputLanguageDesc );
}

void CIM::OnImeComposition(HWND hWnd, LPARAM lParam)
{
    if (lParam & GCS_RESULTSTR)
    {
        HIMC hIMC; //输入设备上下文
        DWORD dwLen;
        LPSTR lpResultStr;

        hIMC = ImmGetContext(hWnd); //取得输入上下文

        if (!hIMC)
            return;

        dwLen = ImmGetCompositionString(hIMC,GCS_RESULTSTR,NULL,0L);
        dwLen+=1;

        if(dwLen)
        {
            lpResultStr = new char[ dwLen ];

            //// 缓冲区已经满了
            if( strlen( m_lpszImeInput ) + dwLen > _CIM_MAXINPUTCHARNUMBER - 2 )
            {
                MessageBeep( 0 );
                return;
            }
            ZeroMemory( lpResultStr ,dwLen );
            if (lpResultStr)
            {
                ImmGetCompositionString(hIMC,GCS_RESULTSTR, lpResultStr,dwLen);
                strcat( m_lpszImeInput,lpResultStr );
            }
            delete lpResultStr;
        }

        ImmReleaseContext(hWnd,hIMC); //释放输入上下文
    }

}

void CIM::OnImeNotify(HWND hWnd, WPARAM wParam)
{
    DWORD dwCommand = (DWORD) wParam;
    switch( dwCommand )
    {
    case IMN_CHANGECANDIDATE:
        GetCandidateList( hWnd );
        break;

    case IMN_CLOSECANDIDATE:
        ClearCandidateList();
        break;

    case IMN_OPENCANDIDATE:
        GetCandidateList( hWnd );
        break;
    }
}

void CIM::OnChar( TCHAR ch )
{
    int len = strlen( m_lpszImeInput );

    if( ImeIsOpen() ) //输入法打开状态
    {

    }
    else //输入法关闭状态
    {
        if( ch >= 32 && ch < 128 && len < _CIM_MAXINPUTCHARNUMBER - 1 ) //输入的是英文字母
        {
            *( m_lpszImeInput + len ) = ch;
            *( m_lpszImeInput + len + 1) = '\0';
        }
    }

    if( ch == 8 ) //BackSpace字符
    {
        if( len == 0 ) //字符串长度为零
            return;

        if( len == 1 ) //只有一个字符
        {
            *m_lpszImeInput = '\0';
            return;
        }

        BYTE cc1,cc2;
        cc1 = *(m_lpszImeInput + len -1); //分离字节
        cc2 = *(m_lpszImeInput + len -2);

        if( cc1 > 0xA0 && cc2 > 0xA0 ) //中文双字节的每个字节都>0xA0
            *( m_lpszImeInput + len -2 ) = '\0';
        else //是英文字符(单字节)
            *( m_lpszImeInput + len -1 ) = '\0';
    }
}

BOOL CIM::GetCandidateList(HWND hWnd)
{
    DWORD dwSize;
    HIMC hIMC;

    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );

    if( m_lpCandList )
    {
        delete m_lpCandList;
        m_lpCandList = NULL;
    }

    if( GetKeyboardLayout(0)==0 )
    {
        return FALSE;
    }

    hIMC = ImmGetContext(hWnd); //取得输入上下文
    if(hIMC == NULL)
    {
        return FALSE;
    }

    ZeroMemory( m_cCandidateList,sizeof(m_cCandidateList) );
    if(dwSize = ImmGetCandidateList(hIMC,0x0,NULL,0))
    {
        m_lpCandList = (LPCANDIDATELIST)new char[dwSize];
        if(m_lpCandList)
        {
            ImmGetCandidateList(hIMC,0x0,m_lpCandList,dwSize);
            CandidateToString(m_lpCandList);
        }
    }

    ImmReleaseContext(hWnd,hIMC);

    return TRUE;
}

void CIM::ClearCandidateList()
{
    if(m_lpCandList)
    {
        delete m_lpCandList;
        m_lpCandList = NULL;
    }
    ZeroMemory( m_cCandidateList,sizeof( m_cCandidateList ) );
}


LPSTR CIM::GetCurInputLanguageDesc()
{
    HKL hKL = GetKeyboardLayout(0);

    if( m_lpszCurInputLanguageDesc != NULL )
        CHKB( delete m_lpszCurInputLanguageDesc ); //删除先 ^o^

    int lengh = ImmGetDescription(hKL,NULL,0); //取得描述的长度

    CHK( m_lpszCurInputLanguageDesc = new char[ lengh ] );

    if( lengh )
    {
        ImmGetDescription(hKL,m_lpszCurInputLanguageDesc,lengh);
    }
    else
    {
        strcpy( m_lpszCurInputLanguageDesc,"输入法关闭" );
    }

    return m_lpszCurInputLanguageDesc;
}

void CIM::UpdateShow()
{
    POINT pt;
    pt.y = 450;
    pt.x = 400;
    ttffont.SetSurface( DD_GetBackScreen() );
    ttffont.ShowText( m_lpszCurInputLanguageDesc,&pt,RGB( 255,255,0 )); //显示输入法描述

    pt.y = 420;
    pt.x = 20;
    ttffont.ShowText( m_cCandidateList,&pt );

    pt.y = 450;
    pt.x = 20;
    if( *m_lpszImeInput == '\0' )
        return;

    ttffont.ShowText( m_lpszImeInput,&pt,RGB( 255,255,0 )); //输入的文字
}

LPSTR CIM::GetResultString()
{
    return m_lpszImeInput;
}

BOOL CIM::CandidateToString(LPCANDIDATELIST lpCandidateList)
{
    if( !m_lpCandList )
        return FALSE;

    if( m_lpCandList->dwCount>0 )
    {
        LPDWORD lpdwOffset;

        lpdwOffset = &m_lpCandList->dwOffset[0];

        lpdwOffset += m_lpCandList->dwPageStart;

        ZeroMemory( m_lpCandList,sizeof( m_lpCandList ) );

        DWORD z=1;
        for (DWORD i = m_lpCandList->dwPageStart; (i < lpCandidateList->dwCount) && (i < m_lpCandList->dwPageStart + m_lpCandList->dwPageSize); i++)
        {
            LPSTR lpstr = (LPSTR)m_lpCandList + *lpdwOffset++;
            char buf[255];
            sprintf( buf,"%d.%s",z,lpstr );
            strcat( m_cCandidateList,buf );
            z++;
        }

        return TRUE;
    }

    return FALSE;
}

BOOL CIM::ImeIsOpen()
{
    return ImmIsIME( GetKeyboardLayout(0) );
}
 

 

http://www.gameres.com/Articles/Program/Control/systeminput.htm
[em3] [em4] [em5] [em7] [em8] [em10] [em20] [em19] [em16] [em21] [em23]

2

主题

36

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2004-9-23 15:07:00 | 显示全部楼层

Re:怎样在游戏里输入中文

请教:
我用传奇2的办法建立了一个用于聊天/对话的CChatEdit类,但是在建立ChatEditDlgProc( )编译通过后运行时出现了异常错误,怎么办?
是因为我直接用hWnd代替了CApp::CWHDXGraghiesWindow::m_hWnd的原因造成的吗?

6

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
发表于 2004-9-25 21:03:00 | 显示全部楼层

Re:怎样在游戏里输入中文

关注中

32

主题

1583

帖子

1589

积分

金牌会员

Rank: 6Rank: 6

积分
1589
发表于 2004-9-25 21:18:00 | 显示全部楼层

Re:怎样在游戏里输入中文

关注
有没有VB的代码??

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2004-9-25 21:48:00 | 显示全部楼层

Re:怎样在游戏里输入中文

好啊,我也想要这样的东西.关注
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-18 19:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表