📄 btnime.cpp
字号:
/* 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 + -