勤能补拙,Expter

成都游戏Coder,记录游戏开发过程的笔记和心得!

利用Win32消息来解决MyGui中文完整输入

date:  3/23/2011

介绍:
    利用Win32 来处理MyGui 3.0.1的中文输入。

实现:
    配置还是参考网上的配置,主要再加中文字体.
   如下:
□ 更改配置文件MyGUI3.0\Media\MyGUI_Media下

☆ core_font.xml添加

<Resource type="ResourceTrueTypeFont" name="font_Simhei">
        
<Property key="Source" value="simhei.ttf"/>
        
<Property key="Size" value="19"/>
        
<Property key="Resolution" value="50"/>
        
<Property key="Antialias" value="false"/>
        
<Property key="SpaceWidth" value="4"/>
        
<Property key="TabWidth" value="8"/>
        
<Property key="CursorWidth" value="2"/>
        
<Property key="Distance" value="6"/>
        
<Property key="OffsetHeight" value="0"/>
        
<Codes>
            
<Code range="33 126"/>
            
<Code range="19969 40869"/>
            
<Code hide="128"/>
            
<Code hide="1026 1039"/>
            
<Code hide="1104"/>
        
</Codes>
    
</Resource>

☆ simhei.ttf要从系统目录下的Fonts拷贝到当前目录。

☆ core_settings.xml中将默认字体改成

    
<MyGUI type="Font">
        
<Property key="Default" value="font_Simhei"/>
    
</MyGUI> 


     运行Demo解决方案:   solution_directx。

       给BaseManager添加Win32消息响应函数void ProcIO(UINT messgae, WPARAM wParam, LPARAM lParam ).
      
case WM_CHAR:
        
case WM_KEYDOWN:
        
case WM_KEYUP:
            
{
                
base::BaseManager *baseManager = (base::BaseManager*)GetWindowLongPtr(hWnd, GWL_USERDATA);

                
if ( baseManager )
                    baseManager
->ProcIO( uMsg , wParam , lParam );
                
break;
            }

   ProcIO主要是对
   WM_CHAR                                   字符响应
   WM_KEYDOWN/WM_KEYUP  按键响应

   在处理字符响应的时候需要区分输入法状态和非输入法状态的字符响应。
case WM_CHAR:
            
{
                
if ( ImmIsIME( GetKeyboardLayout(0) ))
                    ProcChar( wParam , lParam );
                
else
                
{                     
                    MyGUI::InputManager::getInstance().injectKeyPress(MyGUI::KeyCode::Enum(scan_code), code_point);
                }
;
            }

            
break;

ProcChar函数主要处理中文。因为汉字为8个字节会响应WM_CHAR2次。需要进行组合一次。
WM_KEYDOWN:主要处理一些Widget字符输入。同时还可以做全局键盘信息监控(快捷键).

判断一个Widget是否可以进行字符输入:
\MyGUIEngine\include\MyGUI_InputManager.cpp
bool     InputManager::isKeyInputCapture()
    
{
        
if!mWidgetKeyFocus ) return false;

        std::
string  strName = mWidgetKeyFocus->getTypeName();
        
if ( strName == "ComboBox" ||
            strName 
== "Edit" ||
            strName 
== "Message" ||
            strName 
== "List")
        
{
            
return true;
        }

        
return false;
    }

由于采用Win32键盘消息,应该屏蔽自带OIS的。
Input\OIS\InputManager.cpp
void InputManager::captureInput()
 
{
  
if (mMouse) mMouse->capture();
  
//mKeyboard->capture();
 }

在Demo中监控按键消息( DemoKeeper功能是UIManager )。
void DemoKeeper::injectKeyPress(MyGUI::KeyCode _key, MyGUI::Char _text)
    
{
        
if (_key == MyGUI::KeyCode::Grave)
        
{
            mConsole
->setVisible(!mConsole->isVisible());
            
return;
        }
  
        
else if (_key == MyGUI::KeyCode::F2 )
        
{
            MyGUI::Message::createMessageBox(
"Message""Info""Press F2 ", MyGUI::MessageBoxStyle::Ok | MyGUI::MessageBoxStyle::IconInfo);
            
return;
        }

        
else if (_key == MyGUI::KeyCode::F3 )
        
{
            MyGUI::Message::createMessageBox(
"Message""Info""Press F3 ", MyGUI::MessageBoxStyle::Ok | MyGUI::MessageBoxStyle::IconInfo);
            
return;
        }


        
base::BaseManager::injectKeyPress(_key, _text);
    }


最后附上源码解决方案:
/Files/expter/MyGuiDemo.rar

图片:

posted on 2011-03-23 15:20 expter 阅读(3830) 评论(3)  编辑 收藏 引用 所属分类: 工作笔记生活笔记算法与数据结构Visual C++ 笔记MyGui

评论

# re: 利用Win32消息来解决MyGui中文完整输入 2011-04-06 21:03 浮华后的惨怛

问师兄个问题:就是MyGUI官网上提交的Bug#50:
OgrePlatform use wireframe mode if last material use it
师兄怎么解决的?

  回复  更多评论   

# re: 利用Win32消息来解决MyGui中文完整输入 2011-04-09 22:41 expter

@浮华后的惨怛
还没有注意此问题呢。。  回复  更多评论   

# re: 利用Win32消息来解决MyGui中文完整输入 2011-07-22 16:06 jjqcat

能否共享一下完整的文件,可能是个人修改不全,还是出现多余空格

谢谢  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理