有关MiniGUI虚拟键盘实现的代码

来源:互联网 发布:用友软件培训中心 编辑:程序博客网 时间:2024/05/17 02:31

 

ime.h文件

#ifndef _H_IME_
#define _H_IME_

#define IDC_NovaSKB1   (MY_USR_NUM*2+0)
#define IDC_NovaSKB2   (MY_USR_NUM*2+1)
#define IDC_NovaSKB3   (MY_USR_NUM*2+2)
#define IDC_NovaSKB4   (MY_USR_NUM*2+3)
#define IDC_NovaSKB5   (MY_USR_NUM*2+4)

#define ITEM_NUM1 14 // coolbar 第一行的数量

#define ITEM_NUM2 14 // coolbar 第2行的数量

#define ITEM_NUM3    12 // coolbar 第3行的数量

#define ITEM_NUM4 12 // coolbar 第4行的数量

#define ITEM_NUM5 8 //coolbar 第5行的数量

#define SKB_WIDTH   (405)
#define SKB_HIGH   (22)
#define SKB_START_X (240)
#define SKB_START_Y (278)

static WNDPROC old_novaskb_proc; //old proc 函数指针
static WNDPROC old_ime_proc;    //old ime proc

//关闭屏幕键盘
#ifndef MSG_CLOSE_SCREEN_KB
#define MSG_CLOSE_SCREEN_KB (MSG_USER+100)
#endif


//打开屏幕键盘
#ifndef MSG_OPEN_SCREEN_KB 
#define MSG_OPEN_SCREEN_KB   (MSG_USER+101)
#endif
/************************************************************************************************************************************************************************************************
************************************************************************************************************************************************************************************************
*******************************************************************************************************************************************************************************************/

//输入法头文件定义部分

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

 


/************************************************************************************************************************************************************************************************
输入法第一行定义
*******************************************************************************************************************************************************************************************/

static const char* caption1[] =

{

   " ` ", " 1 ", " 2 ", " 3 ", " 4 ", " 5 "," 6 ", " 7 ", " 8 ", " 9 ", " 0 ", " - ", " = ", " <- "

};

 

static const int SCANCODE1[] =

{

SCANCODE_GRAVE, SCANCODE_1, SCANCODE_2, SCANCODE_3, SCANCODE_4,

SCANCODE_5, SCANCODE_6, SCANCODE_7, SCANCODE_8, SCANCODE_9,

SCANCODE_0, SCANCODE_MINUS, SCANCODE_EQUAL, SCANCODE_BACKSPACE

};

/************************************************************************************************************************************************************************************************
输入法第二行定义
*******************************************************************************************************************************************************************************************/

static const char* caption2[] =

{

   "Tab", " q ", " w ", " e ", " r ", " t "," y ", " u ", " i ", " o ", " p ", " [ ", " ] ", " // "

};

 

static const int SCANCODE2[] =

{

SCANCODE_TAB, SCANCODE_Q, SCANCODE_W, SCANCODE_E, SCANCODE_R,

SCANCODE_T, SCANCODE_Y, SCANCODE_U, SCANCODE_I, SCANCODE_O,

SCANCODE_P, SCANCODE_BRACKET_LEFT, SCANCODE_BRACKET_RIGHT, SCANCODE_BACKSLASH

};

/************************************************************************************************************************************************************************************************
输入法第三行定义
*******************************************************************************************************************************************************************************************/

static const char* caption3[] =

{

   "Shift ", " a ", " s ", " d ", " f ", " g "," h ", " j ", " k ", " l ", " ; ", " ' "

};

static const int SCANCODE3[] =

{

SCANCODE_LEFTSHIFT, SCANCODE_A, SCANCODE_S, SCANCODE_D, SCANCODE_F,

SCANCODE_G, SCANCODE_H, SCANCODE_J, SCANCODE_K, SCANCODE_L,

SCANCODE_SEMICOLON, SCANCODE_APOSTROPHE

};

 

/************************************************************************************************************************************************************************************************
输入法第四行定义
*******************************************************************************************************************************************************************************************/

static const char* caption4[] =

{

   "Ctrl    ", " z ", " x ", " c ", " v ", " b "," n ", " m ", " , ", " . ", " / ", "Enter "

};

static const int SCANCODE4[] =

{

SCANCODE_LEFTCONTROL, SCANCODE_Z, SCANCODE_X, SCANCODE_C, SCANCODE_V,

SCANCODE_B, SCANCODE_N, SCANCODE_M, SCANCODE_COMMA, SCANCODE_PERIOD,

SCANCODE_SLASH, SCANCODE_ENTER

};

/************************************************************************************************************************************************************************************************
输入法第五行定义
*******************************************************************************************************************************************************************************************/

static const char* caption5[] =

{

   "Del ","English " , "Chinese ", " Space ", " | ", " | ", " -> ", " <- "

};

 

static const int SCANCODE5[] =

{

SCANCODE_REMOVE, -1, -1, SCANCODE_SPACE, SCANCODE_CURSORBLOCKDOWN,

SCANCODE_CURSORBLOCKUP, SCANCODE_CURSORBLOCKLEFT, SCANCODE_CURSORBLOCKRIGHT

};


/***********************************************************************************************************************************************************************************************
Func Name :CreateScreenKB   外部接口
Function   :创建屏幕输入法
Param    :
   hWnd :父窗口的句柄
   hWndKb:屏幕键盘窗口句柄-----5行共五个窗口句柄
Return  
     :输入法窗口的句柄
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
HWND CreateScreenKB(HWND hWnd,HWND *hWndKb);

#endif

ime.c

#ifndef _C_IME_
#define _C_IME_

#include "ime.h"

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

//输入法实现部分

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

/***********************************************************************************************************************************************************************************************
Func Name :novaskb_proc
Function   :截获MSG_MOUSEACTIVE消息,使得coolbar 窗口无法获得输入焦点
Param    :
   hWnd :父窗口的句柄
      其他的参数与一般的消息响应函数一致
Return   :原 proc的返回值
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static int novaskb_proc(HWND hWnd,int message,WPARAM wParam,LPARAM lParam)
{
if(message == MSG_MOUSEACTIVE)
   return 0;
return (*old_novaskb_proc)(hWnd,message,wParam,lParam);
}

/***********************************************************************************************************************************************************************************************
Func Name :ime_proc
Function   :
Param    :
   hWnd :父窗口的句柄
      其他的参数与一般的消息响应函数一致
Return   :原 proc的返回值
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static int ime_proc(HWND hWnd,int message,WPARAM wParam,LPARAM lParam)
{
HWND m_hWnd = hWnd;
switch(message)
{
   case MSG_MOUSEACTIVE:
    break;
   case MSG_IME_OPEN:
    {
     while( (m_hWnd = GetNextMainWindow(m_hWnd)) )
      {
       if( (strncmp( GetWindowCaption(m_hWnd) , APPLICATION_NAME ,strlen(APPLICATION_NAME)) == 0) )
       SendNotifyMessage(m_hWnd,MSG_USER,MSG_OPEN_SCREEN_KB,0);
      }
     break;
    }

   case MSG_IME_CLOSE:
    {
     while( (m_hWnd = GetNextMainWindow(m_hWnd)) )
      {
       if( (strncmp( GetWindowCaption(m_hWnd) , APPLICATION_NAME ,strlen(APPLICATION_NAME)) == 0) )
       SendNotifyMessage(m_hWnd,MSG_USER,MSG_CLOSE_SCREEN_KB,0);
      }
    
     break;
    }
}
return (*old_ime_proc)(hWnd,message,wParam,lParam);
}

 

/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb1
Function   :创建输入法的第一行
Param    :
   hWnd :父窗口的句柄
Return   :子窗口的句柄
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb1 (HWND hWnd)
{
    HWND cb;
    COOLBARITEMINFO item;
    int i;

    cb = CreateWindow (CTRL_COOLBAR,
                    "",
                    WS_CHILD | WS_VISIBLE | WS_BORDER, 
                    IDC_NovaSKB1,
                   SKB_START_X, SKB_START_Y, SKB_WIDTH, SKB_HIGH,
                    hWnd,
                    0);

    item.ItemType = TYPE_TEXTITEM;
    item.Bmp = NULL;
    item.dwAddData = 0;
    for (i = 0; i < ITEM_NUM1; i++) 
{
item.insPos = i;
item.id = i;
item.Caption = caption1[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}

/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb2
Function   :创建输入法的第2行
Param    :
   hWnd :父窗口的句柄
Return   :子窗口的句柄
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb2 (HWND hWnd)
{
    HWND cb;
    COOLBARITEMINFO item;
    int i;

    cb = CreateWindow (CTRL_COOLBAR,
                    "",
                    WS_CHILD | WS_VISIBLE | WS_BORDER, 
                    IDC_NovaSKB2,
                   SKB_START_X, SKB_START_Y+22, SKB_WIDTH, SKB_HIGH,
                    hWnd,
                    0);

    item.ItemType = TYPE_TEXTITEM;
    item.Bmp = NULL;
    item.dwAddData = 0;
    for (i = 0; i < ITEM_NUM2; i++) 
{
item.insPos = i;
item.id = i;
item.Caption = caption2[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}
/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb3
Function   :创建输入法的第3行
Param    :
   hWnd :父窗口的句柄
Return   :子窗口的句柄
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb3 (HWND hWnd)
{
    HWND cb;
    COOLBARITEMINFO item;
    int i;

    cb = CreateWindow (CTRL_COOLBAR,
                    "",
                    WS_CHILD | WS_VISIBLE | WS_BORDER, 
                    IDC_NovaSKB3,
                SKB_START_X, SKB_START_Y+22*2, SKB_WIDTH, SKB_HIGH,
                    hWnd,
                    0);

    item.ItemType = TYPE_TEXTITEM;
    item.Bmp = NULL;
    item.dwAddData = 0;
    for (i = 0; i < ITEM_NUM3; i++) 
{
item.insPos = i;
item.id = i;
item.Caption = caption3[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}
/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb4
Function   :创建输入法的第4行
Param    :
   hWnd :父窗口的句柄
Return   :子窗口的句柄
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb4 (HWND hWnd)
{
    HWND cb;
    COOLBARITEMINFO item;
    int i;

    cb = CreateWindow (CTRL_COOLBAR,
                    "",
                    WS_CHILD | WS_VISIBLE | WS_BORDER, 
                    IDC_NovaSKB4,
                SKB_START_X, SKB_START_Y+22*3, SKB_WIDTH, SKB_HIGH,
                    hWnd,
                    0);

    item.ItemType = TYPE_TEXTITEM;
    item.Bmp = NULL;
    item.dwAddData = 0;
    for (i = 0; i < ITEM_NUM4; i++) 
{
item.insPos = i;
item.id = i;
item.Caption = caption4[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}

/***********************************************************************************************************************************************************************************************
Func Name :create_novaskb5
Function   :创建输入法的第5行
Param    :
   hWnd :父窗口的句柄
Return   :子窗口的句柄
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
static HWND create_novaskb5 (HWND hWnd)
{
    HWND cb;
    COOLBARITEMINFO item;
    int i;

    cb = CreateWindow (CTRL_COOLBAR,
                    "",
                    WS_CHILD | WS_VISIBLE | WS_BORDER, 
                    IDC_NovaSKB5,
                  SKB_START_X, SKB_START_Y+22*4, SKB_WIDTH, SKB_HIGH,
                    hWnd,
                    0);

    item.ItemType = TYPE_TEXTITEM;
    item.Bmp = NULL;
    item.dwAddData = 0;
    for (i = 0; i < ITEM_NUM5; i++) 
{
item.insPos = i;
item.id = i;
item.Caption = caption5[i];
item.ItemHint = NULL;//SCANCODE1[i];
SendMessage (cb, CBM_ADDITEM, 0, (LPARAM)&item);
}
old_novaskb_proc = SetWindowCallbackProc(cb,novaskb_proc);
SetWindowCallbackProc(cb,novaskb_proc);
return cb;
}
/***********************************************************************************************************************************************************************************************
Func Name :CreateScreenKB   外部接口
Function   :创建屏幕输入法
Param    :
   hWnd :父窗口的句柄
   hWndKb:屏幕键盘窗口句柄-----5行共五个窗口句柄
Return  
   -1   :失败
   0   :success
Author   :luv.y@qq.com
***********************************************************************************************************************************************************************************************/
HWND CreateScreenKB(HWND hWnd,HWND *hWndKb)
{
HWND hIMEWnd;
if( hWnd == HWND_INVALID )
   return -1;
//加载IME引擎
hWndKb[0] = create_novaskb1(hWnd);
hWndKb[1] = create_novaskb2(hWnd);
hWndKb[2] = create_novaskb3(hWnd);
hWndKb[3] = create_novaskb4(hWnd);
hWndKb[4] = create_novaskb5(hWnd);
//屏幕键盘初始处于隐藏状态,需要的时候再用SendMessage的方式打开
//for( i = 0;i < KB_NUM;i++ )
   //if(hWndKb[i])
    //ShowWindow(hWndKb[i],SW_HIDE);

//创建 GB2312输入法入口函数
hIMEWnd = GBIMEWindow(hWnd);
old_ime_proc = SetWindowCallbackProc(hIMEWnd,ime_proc);
SetWindowCallbackProc(hIMEWnd,ime_proc);
return hIMEWnd;
}
/************************************************************************************************************************************************************************************/

#endif

 

 

2009-12-03