⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btnime.cpp

📁 手机上的韩文输入法 saenaru20031212.zip
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* imported from the skkime and modified by wkpark */
#if !defined (NO_TSF)
/*    LanguageBar 偺乽擖椡曽幃丠乿??儞傪巌傞丅
 */
#include "windows.h"
#include "tchar.h"
#include "immdev.h"

extern "C" {
#include "saenaru.h"
#include "resource.h"
}
/*    Platform SDK 偵埶懚偡傞晹暘丅Platform SDK 偵 include path
 *    傪捠偡偺偑椙偄偺偐斲偐丅弌棃傟偽 DDK 偵偙傟傜偺 header 傪
 *    搉偟偰偔傟傞偲椙偄偺偩偑丅
 */
#include "c:\Program Files\Microsoft SDK\include\msctf.h"
#include "olectl.h"
#if !defined (TARGET_WIN2K)
#include "c:\Program Files\Microsoft SDK\include\uxtheme.h"
#endif
#include "tsf.h"

#define LANGBAR_ITEM_DESC    L"臂艰/涝仿扁 汲沥" // max 32 chars!
#define SAENARU_LANGBARITEMSINK_COOKIE    0x0fab0fac

static void  _Menu_Help (UINT);
static void  _Menu_Property (UINT);
static void  _Menu_Reconversion (UINT);
static void  _Menu_ToggleShowKeyboard (UINT);
static void  _Menu_ToggleDvorak (UINT);
static void  _Menu_ToggleOnTheSpot (UINT);
static void  _Menu_SelectKeyboard (UINT);
static DWORD _MenuItem_GetNormalFlag (UINT);
static DWORD _MenuItem_GetKeyboardFlag (UINT);
static DWORD _MenuItem_GetToggleKeyboardFlag (UINT);
static DWORD _MenuItem_GetToggleDvorakFlag (UINT);
static DWORD _MenuItem_GetToggleOnTheSpotFlag (UINT);
static DWORD _UserKeyboardMenu_GetKeyboardFlag (UINT);

typedef struct {
    const WCHAR* pchDesc;
    DWORD        (*pfnGetFlag)(UINT);
    void         (*pfnHandler)(UINT);
} TSFLBMENUINFOEX;

static const TSFLBMENUINFOEX c_rgMenuItems[] = {
//  { L"档框富(&H)",   _MenuItem_GetNormalFlag, _Menu_Help },
    { L"券版汲沥(&R)", _MenuItem_GetNormalFlag, _Menu_Property },
//  { L"犁汲沥(&C)",   _MenuItem_GetNormalFlag, _Menu_Reconversion },
    { NULL, NULL, NULL },
    { L"靛焊遏(&V)",   _MenuItem_GetToggleDvorakFlag,   _Menu_ToggleDvorak },
    { L"窜绢窜困 祈笼(&W)", _MenuItem_GetToggleOnTheSpotFlag,_Menu_ToggleOnTheSpot },
    { NULL, NULL, NULL },
    { L"虐焊靛 焊扁",  _MenuItem_GetToggleKeyboardFlag, _Menu_ToggleShowKeyboard },
    { NULL, NULL, NULL },
    { L"秒家", NULL, NULL }
};

typedef struct {
    const WCHAR* pchDesc;
    DWORD        dwFlag;
} TSFLBKEYBOARDINFOEX;

static const TSFLBKEYBOARDINFOEX c_rgKeyboardItems[]= {
    { L"滴国侥(&2)",        NULL },
    { L"技国侥(&3)",        NULL },
    { L"技国侥390(&9)",     NULL },
    { L"货滴国(&D)",        NULL },
    { L"货技国(&S)",        NULL },
    { L"救付怕(&A)",        NULL },
    { L"技国侥 鉴酒贰(&N)", NULL },
    { L"荤侩磊 磊魄(&U)",   TF_LBMENUF_SUBMENU },
};

enum {
    MENU_ITEM_INDEX_CANCEL        = -1,
    //MENU_ITEM_INDEX_HELP,
    MENU_ITEM_INDEX_PROPERTY,
    //MENU_ITEM_INDEX_RECONVRESION,
    MENU_ITEM_INDEX_OLD2BUL = 2,
    MENU_ITEM_INDEX_OLD3BUL,
    MENU_ITEM_INDEX_3FIN,
};

/*    乧??儞偺悢偩偗 class 偑昁梫偩偲峫偊傞偺偑椙偝偦偆偩丅
 *    屻偐傜捛壛偟側偄偲偄偗側偄偐側丅
 */
class CLangBarItemImeButton : public ITfLangBarItemButton,
                             public ITfSource
{
public:
    CLangBarItemImeButton ();
    ~CLangBarItemImeButton ();

    // IUnknown
    STDMETHODIMP QueryInterface (REFIID riid, void **ppvObj);
    STDMETHODIMP_(ULONG) AddRef (void);
    STDMETHODIMP_(ULONG) Release (void);
    
    // ITfLangBarItem
    STDMETHODIMP GetInfo (TF_LANGBARITEMINFO *pInfo);
    STDMETHODIMP GetStatus (DWORD *pdwStatus);
    STDMETHODIMP Show (BOOL fShow);
    STDMETHODIMP GetTooltipString (BSTR *pbstrToolTip);
    
    // ITfLangBarItemButton
    STDMETHODIMP OnClick (TfLBIClick click, POINT pt, const RECT *prcArea);
    STDMETHODIMP InitMenu (ITfMenu *pMenu);
    STDMETHODIMP OnMenuSelect (UINT wID);
    STDMETHODIMP GetIcon (HICON *phIcon);
    STDMETHODIMP GetText (BSTR *pbstrText);
    
    // ITfSource
    STDMETHODIMP AdviseSink(REFIID riid, IUnknown *punk, DWORD *pdwCookie);
    STDMETHODIMP UnadviseSink(DWORD dwCookie);

private:
    ITfLangBarItemSink* _pLangBarItemSink;
    TF_LANGBARITEMINFO  _tfLangBarItemInfo;
    LONG                _cRef;
};

CLangBarItemImeButton::CLangBarItemImeButton ()
{
    //DllAddRef ();
    _tfLangBarItemInfo.clsidService   = c_clsidSaenaruTextService;
    //_tfLangBarItemInfo.clsidService = CLSID_NULL;
    _tfLangBarItemInfo.guidItem       = c_guidItemButtonIME;
    _tfLangBarItemInfo.dwStyle        = TF_LBI_STYLE_BTN_MENU
        | TF_LBI_STYLE_SHOWNINTRAY
#if 0
        | TF_LBI_STYLE_HIDDENSTATUSCONTROL
#endif
        ;
    _tfLangBarItemInfo.ulSort = 1;
    SafeStringCopy (_tfLangBarItemInfo.szDescription, ARRAYSIZE (_tfLangBarItemInfo.szDescription), LANGBAR_ITEM_DESC);
    _pLangBarItemSink = NULL;
    _cRef             = 1;
    return;
}

CLangBarItemImeButton::~CLangBarItemImeButton ()
{
    DEBUGPRINTFEX (100, (TEXT ("CLangBarItemImeButton::~CLangBarItemImeButton (this:%p)\n"), this));
    //DllRelease ();
    return;
}

STDAPI
CLangBarItemImeButton::QueryInterface (
    REFIID riid,
    void** ppvObj)
{
    if (ppvObj == NULL)
        return E_INVALIDARG;

    *ppvObj = NULL;
    if (IsEqualIID (riid, IID_IUnknown) ||
        IsEqualIID (riid, IID_ITfLangBarItem) ||
        IsEqualIID (riid, IID_ITfLangBarItemButton)) {
        *ppvObj = (ITfLangBarItemButton *)this;
    } else if (IsEqualIID (riid, IID_ITfSource)) {
        *ppvObj = (ITfSource *)this;
    }
    if (*ppvObj != NULL) {
        AddRef ();
        return S_OK;
    }
    return E_NOINTERFACE;
}

STDAPI_(ULONG)
CLangBarItemImeButton::AddRef ()
{
    return ++_cRef;
}

STDAPI_(ULONG)
CLangBarItemImeButton::Release ()
{
    LONG cr = --_cRef;

    if (_cRef == 0) {
        delete this;
    }
    return cr;
}

STDAPI
CLangBarItemImeButton::GetInfo (
    TF_LANGBARITEMINFO* pInfo)
{
    DEBUGPRINTFEX (100, (TEXT ("CLangBarItemImeButton::GetInfo (this:%p)\n"), this));
    
    if (pInfo == NULL)
        return E_INVALIDARG;

    *pInfo = _tfLangBarItemInfo;
    return S_OK;
}

STDAPI
CLangBarItemImeButton::Show (
    BOOL fShow)
{
    DEBUGPRINTFEX (100, (TEXT ("CLangBarItemImeButton::Show (BOOL:%d)\n"), fShow));
    return E_NOTIMPL;
}

STDAPI
CLangBarItemImeButton::GetStatus (
    DWORD* pdwStatus)
{
    if (pdwStatus == NULL)
        return E_INVALIDARG;
#if 0
    *pdwStatus = (_GetCurrentHIMC () != NULL)? 0 : TF_LBI_STATUS_DISABLED;
#endif
    *pdwStatus = 0;
    return S_OK;
}

/*    Button 偺 tooltip 傪曉偡丅曉偡抣偼 SysAllocString 偵傛偭偰
 *    妋曐偟偨椞堟偵彂偐傟傞昁梫偑偁傞丅偙傟傪 SysFreeString 偡
 *    傞偺偼丄屇傃弌偟偨懁偺愑擟偱偁傞丅
 */
STDAPI
CLangBarItemImeButton::GetTooltipString (
    BSTR* pbstrToolTip)
{
    if (pbstrToolTip == NULL)
        return E_INVALIDARG;

    *pbstrToolTip = SysAllocString (LANGBAR_ITEM_DESC);
    return (*pbstrToolTip == NULL)? E_OUTOFMEMORY : S_OK;
}

/*    ITfLangBarItemButton::OnClick
 *
 *    偙偺 method 偼儐?僓偑尵岅僶?偺 TF_LBI_STYLE_BTN_BUTTON 傑偨
 *    偼 TF_LBI_STYLE_BTN_TOGGLE 僗?僀儖傪帩偭偰偄傞??儞偺忋偱?
 *    僂僗傪僋儕僢僋偟偨帪偵屇傃弌偝傟傞丅
 *    傕偟??儞 item 偑 TF_LBI_STYLE_BTN_BUTTON 僗?僀儖傪帩偨側偄
 *    偺側傜丄偙偺 method 巊傢傟側偄丅
 *(*)
 *    崱偺忬嫷偱偼摿偵壗傕偡傞昁梫偼側偄偺偱丄S_OK 傪懄曉偡丅
 */
STDAPI
CLangBarItemImeButton::OnClick (
    TfLBIClick click,
    POINT pt,
    const RECT* prcArea)
{
    return S_OK;
}

/*    ITfLangBarItemButton::InitMenu
 *
 *    偙偺 method 偼 TF_LBI_STYLE_BTN_MENU 僗?僀儖傪帩偭偨尵岅僶?偺??儞
 *    傪尵岅僶?偑??儞偵懳偟偰?帵偡傞 menu item 傪捛壛偟偰桳岠偵偡傞偨傔
 *    偵屇傃弌偝傟傞丅
 */
STDAPI
CLangBarItemImeButton::InitMenu (
    ITfMenu* pMenu)
{
    register int     i, id;
    register DWORD   dwFlag;
    register LPCWSTR wstrDesc;
    register ULONG   nstrDesc;
    ITfMenu *pUserKeyboardMenu;
    int     idUserKeyboardMenu=0;

    DEBUGPRINTFEX (100, (TEXT ("CLangBarItemImeButton::InitMenu (ITfMenu:%p)\n"), pMenu));

    if (pMenu == NULL)
        return E_INVALIDARG;

    id = 0;
    for (i = 0; i < 2; i ++) {
        wstrDesc = c_rgMenuItems [i].pchDesc;
        if (wstrDesc != NULL) {
            nstrDesc = wcslen (wstrDesc);
            dwFlag = 0;
            if (c_rgMenuItems [i].pfnGetFlag != NULL)
                dwFlag = (c_rgMenuItems [i].pfnGetFlag)(i);
        } else {
            nstrDesc = 0;
            dwFlag = TF_LBMENUF_SEPARATOR;
        }
        pMenu->AddMenuItem (id++,
                        dwFlag, NULL, NULL, wstrDesc, nstrDesc, NULL);
    }

    // Add default Keyboard lists
    pUserKeyboardMenu=NULL;
    for (i = 0; i < ARRAYSIZE (c_rgKeyboardItems); i++)
    {
        wstrDesc = c_rgKeyboardItems [i].pchDesc;
        nstrDesc = wcslen (wstrDesc);
        dwFlag = c_rgKeyboardItems [i].dwFlag;
        if (dwFlag == NULL)
        {
            dwFlag = _MenuItem_GetKeyboardFlag(id);
            pMenu->AddMenuItem (id++,
                   dwFlag, NULL, NULL, wstrDesc, nstrDesc, NULL);
        } else {
            idUserKeyboardMenu = id;
            pMenu->AddMenuItem (id++,
                   dwFlag, NULL, NULL, wstrDesc, nstrDesc, &pUserKeyboardMenu);
        }
    }
    // add seperator
    if (i)
        pMenu->AddMenuItem (id++,
                        TF_LBMENUF_SEPARATOR , NULL, NULL, NULL, 0, NULL);

    // add extra config menus
    id=20;
    for (i = 2; i < ARRAYSIZE (c_rgMenuItems); i++)
    {
        wstrDesc = c_rgMenuItems [i].pchDesc;
        if (wstrDesc != NULL) {
            nstrDesc = wcslen (wstrDesc);
            dwFlag = (c_rgMenuItems [i].pfnGetFlag != NULL)? (c_rgMenuItems [i].pfnGetFlag)(i) : 0;
        } else {
            nstrDesc = 0;
            dwFlag = TF_LBMENUF_SEPARATOR;
        }
        pMenu->AddMenuItem (id++, dwFlag, NULL, NULL, wstrDesc, nstrDesc, NULL);
    }
    
    // addd User defined Keyboads (SubMenu)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -