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

利用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

图片: 利用Win32消息来解决MyGui中文完整输入_第1张图片

你可能感兴趣的:(利用Win32消息来解决MyGui中文完整输入)