📄 btncmd.cpp
字号:
/* imported from the skkime by wkpark */
#if !defined (NO_TSF)
/* LanguageBar 偺乽擖椡儌?僪乿??儞傪巌傞丅
*/
#include "windows.h"
#include "tchar.h"
#include "immdev.h"
#include "objbase.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 "c:\Program Files\Microsoft SDK\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
static void _Menu_ToHangul (void) ;
static void _Menu_ToHanja (void) ;
static void _Menu_ToAscII (void) ;
static void _Menu_ToCMode (DWORD fdwConversion) ;
static int _GetConversionMode (HIMC hIMC) ;
static const TSFLBMENUINFO c_rgMenuItems [] = {
{ L"茄臂", _Menu_ToHangul },
{ L"康巩", _Menu_ToAscII },
{ L"茄磊", _Menu_ToHanja },
{ NULL, NULL },
{ L"秒家", NULL }
} ;
#define SAENARU_LANGBARITEMSINK_COOKIE 0x0fab0faa
enum {
MENU_ITEM_INDEX_CANCEL = -1,
MENU_ITEM_INDEX_HANGUL = 0,
MENU_ITEM_INDEX_ASCII,
MENU_ITEM_INDEX_HANJA,
} ;
/* CModeItemButton: Conversion Mode Language Bar Item Button
*/
class CLangBarItemCModeButton : public ITfLangBarItemButton,
public ITfSource
{
public:
CLangBarItemCModeButton () ;
~CLangBarItemCModeButton () ;
// 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 ;
} ;
/*
*/
CLangBarItemCModeButton::CLangBarItemCModeButton ()
{
//DllAddRef () ;
#if 1
_tfLangBarItemInfo.clsidService = c_clsidSaenaruTextService ;
//_tfLangBarItemInfo.clsidService = CLSID_NULL ;
_tfLangBarItemInfo.guidItem = c_guidItemButtonCMode ;
_tfLangBarItemInfo.dwStyle = TF_LBI_STYLE_BTN_MENU
| TF_LBI_STYLE_SHOWNINTRAY
| TF_LBI_STYLE_HIDDENSTATUSCONTROL
#if 1
| TF_LBI_STYLE_TEXTCOLORICON
#endif
;
_tfLangBarItemInfo.ulSort = 1 ;
SafeStringCopy (_tfLangBarItemInfo.szDescription, ARRAYSIZE (_tfLangBarItemInfo.szDescription), LANGBAR_ITEM_DESC) ;
_pLangBarItemSink = NULL ;
_cRef = 1 ;
#endif
return ;
}
CLangBarItemCModeButton::~CLangBarItemCModeButton ()
{
DEBUGPRINTFEX (100, (TEXT ("CLangBarItemCModeButton::~CLangBarItemCModeButton (this:%p)\n"), this)) ;
//DllRelease () ;
return ;
}
STDAPI
CLangBarItemCModeButton::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)
CLangBarItemCModeButton::AddRef ()
{
return ++ _cRef ;
}
STDAPI_(ULONG)
CLangBarItemCModeButton::Release ()
{
LONG cr = -- _cRef ;
if (_cRef == 0) {
delete this ;
}
return cr ;
}
STDAPI
CLangBarItemCModeButton::GetInfo (
TF_LANGBARITEMINFO* pInfo)
{
DEBUGPRINTFEX (100, (TEXT ("CLangBarItemCModeButton::GetInfo (this:%p)\n"), this)) ;
if (pInfo == NULL)
return E_INVALIDARG ;
*pInfo = _tfLangBarItemInfo ;
return S_OK ;
}
STDAPI
CLangBarItemCModeButton::Show (
BOOL fShow)
{
DEBUGPRINTFEX (100, (TEXT ("CLangBarItemCModeButton::Show (BOOL:%d)\n"), fShow)) ;
return E_NOTIMPL ;
}
STDAPI
CLangBarItemCModeButton::GetStatus (
DWORD* pdwStatus)
{
DEBUGPRINTFEX (100, (TEXT ("CLangBarItemCModeButton::Show (DWORD*:%d)\n"), pdwStatus)) ;
if (pdwStatus == NULL)
return E_INVALIDARG ;
*pdwStatus = (_GetCurrentHIMC () != NULL)? 0 : TF_LBI_STATUS_DISABLED ;
return S_OK ;
}
/* Button 偺 tooltip 傪曉偡丅曉偡抣偼 SysAllocString 偵傛偭偰
* 妋曐偟偨椞堟偵彂偐傟傞昁梫偑偁傞丅偙傟傪 SysFreeString 偡
* 傞偺偼丄屇傃弌偟偨懁偺愑擟偱偁傞丅
*/
STDAPI
CLangBarItemCModeButton::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
CLangBarItemCModeButton::OnClick (
TfLBIClick click,
POINT pt,
const RECT* prcArea)
{
return S_OK ;
}
/* ITfLangBarItemButton::InitMenu
*
* 偙偺 method 偼 TF_LBI_STYLE_BTN_MENU 僗?僀儖傪帩偭偨尵岅僶?偺??儞
* 傪尵岅僶?偑??儞偵懳偟偰?帵偡傞 menu item 傪捛壛偟偰桳岠偵偡傞偨傔
* 偵屇傃弌偝傟傞丅
*/
STDAPI
CLangBarItemCModeButton::InitMenu (
ITfMenu* pMenu)
{
register HIMC hIMC ;
register int i, nCMode ;
register DWORD dwFlag ;
register LPCWSTR wstrDesc ;
register ULONG nstrDesc ;
DEBUGPRINTFEX (100, (TEXT ("CLangBarItemCModeButton::InitMenu (ITfMenu:%p)\n"), pMenu)) ;
if (pMenu == NULL)
return E_INVALIDARG ;
hIMC = _GetCurrentHIMC () ;
if (hIMC != NULL) {
/* 偲偄偆傢偗偱??儞偑墴偝傟偨帪偵?帵偝傟傞儊僯儏?偺
* 搊?傪峴偆丅
*/
nCMode = _GetConversionMode (hIMC) ;
for (i = 0 ; i < ARRAYSIZE (c_rgMenuItems) ; i ++) {
wstrDesc = c_rgMenuItems [i].pchDesc ;
if (wstrDesc != NULL) {
nstrDesc = wcslen (wstrDesc) ;
dwFlag = (i == nCMode)? TF_LBMENUF_CHECKED : 0 ;
} else {
nstrDesc = 0 ;
dwFlag = TF_LBMENUF_SEPARATOR ;
}
pMenu->AddMenuItem (i, dwFlag, NULL, NULL, wstrDesc, nstrDesc, NULL) ;
}
}
return S_OK ;
}
STDAPI
CLangBarItemCModeButton::OnMenuSelect (
UINT wID)
{
if (wID >= ARRAYSIZE (c_rgMenuItems))
return E_FAIL ;
/* NULL 偺応崌偼 Cancel 偩偲巚偆偙偲偵偡傞丅*/
if (c_rgMenuItems [wID].pfnHandler != NULL) {
c_rgMenuItems [wID].pfnHandler () ;
UpdateLanguageBar () ;
}
return S_OK ;
}
STDAPI
CLangBarItemCModeButton::GetIcon (
HICON* phIcon)
{
HIMC hIMC ;
DWORD dwConversion, dwSentence ;
register LPCTSTR str = NULL ;
DEBUGPRINTFEX (100, (TEXT ("CLangBarItemCModeButton::GetIcon(%p)\n"), phIcon)) ;
if (phIcon == NULL)
return E_INVALIDARG ;
hIMC = _GetCurrentHIMC () ;
if (hIMC == NULL)
goto Skip ;
if (ImmGetOpenStatus (hIMC)) {
if (ImmGetConversionStatus (hIMC, &dwConversion, &dwSentence)) {
if (dwConversion & IME_CMODE_FULLSHAPE){
if (dwConversion & IME_CMODE_NATIVE)
{
str = TEXT ("INDIC_HANJA") ;
} else {
str = TEXT ("INDIC_ENG") ;
}
} else {
if (dwConversion & IME_CMODE_NATIVE){
str = TEXT ("INDIC_HAN") ;
} else {
str = TEXT ("INDIC_ENG") ;
}
}
}
} else {
str = TEXT ("INDIC_ENG") ;
}
Skip:
if (str == NULL)
str = TEXT ("INDIC_ENG") ;
*phIcon = (HICON)LoadImage (hInst, str, IMAGE_ICON, 16, 16, 0);
return (*phIcon != NULL) ? S_OK : E_FAIL ;
}
STDAPI
CLangBarItemCModeButton::GetText (
BSTR* pbstrText)
{
if (pbstrText == NULL)
return E_INVALIDARG ;
*pbstrText = SysAllocString (LANGBAR_ITEM_DESC) ;
return (*pbstrText == NULL)? E_OUTOFMEMORY : S_OK ;
}
STDAPI
CLangBarItemCModeButton::AdviseSink (
REFIID riid,
IUnknown* punk,
DWORD* pdwCookie)
{
DEBUGPRINTFEX (100, (TEXT ("CLangBarItemCModeButton::AdviseSink (this:%p)\n"), this)) ;
if (!IsEqualIID (IID_ITfLangBarItemSink, riid)) {
DEBUGPRINTFEX (100, (TEXT ("CONNECT_E_CANNOTCONNECT\n"))) ;
return CONNECT_E_CANNOTCONNECT ;
}
if (_pLangBarItemSink != NULL) {
DEBUGPRINTFEX (100, (TEXT ("CONNECT_E_ADVISELIMIT\n"))) ;
return CONNECT_E_ADVISELIMIT ;
}
if (punk->QueryInterface (IID_ITfLangBarItemSink, (void **)&_pLangBarItemSink) != S_OK) {
DEBUGPRINTFEX (100, (TEXT ("E_NOINTERFACE\n"))) ;
_pLangBarItemSink = NULL ;
return E_NOINTERFACE ;
}
*pdwCookie = SAENARU_LANGBARITEMSINK_COOKIE ;
return S_OK ;
}
STDAPI
CLangBarItemCModeButton::UnadviseSink (
DWORD dwCookie)
{
if (dwCookie != SAENARU_LANGBARITEMSINK_COOKIE)
return CONNECT_E_NOCONNECTION ;
if (_pLangBarItemSink == NULL)
return CONNECT_E_NOCONNECTION ;
_pLangBarItemSink->Release () ;
_pLangBarItemSink = NULL ;
return S_OK ;
}
/*========================================================================*
* public function interface
*/
BOOL PASCAL
CreateItemButtonCMode (
register ITfLangBarItem** ppLangBarItem)
{
if (ppLangBarItem == NULL)
return FALSE ;
*ppLangBarItem = new CLangBarItemCModeButton ;
return (*ppLangBarItem != NULL) ;
}
/*========================================================================*
* private functions
*/
void
_Menu_ToHangul (void)
{
_Menu_ToCMode (IME_CMODE_NATIVE) ;
}
void
_Menu_ToHanja (void)
{
_Menu_ToCMode (IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE) ;
}
void
_Menu_ToAscII (void)
{
// XXX
register HIMC hIMC = _GetCurrentHIMC () ;
if (! hIMC)
return ;
_Menu_ToCMode (IME_CMODE_ROMAN) ;
ImmSetOpenStatus (hIMC, FALSE) ;
}
void
_Menu_ToCMode (
register DWORD fdwConversion)
{
register HIMC hIMC = _GetCurrentHIMC () ;
if (! hIMC)
return ;
if (! ImmGetOpenStatus (hIMC))
ImmSetOpenStatus (hIMC, TRUE) ;
ImmSetConversionStatus (hIMC, fdwConversion, 0) ;
return ;
}
int
_GetConversionMode (
register HIMC hIMC)
{
DWORD dwConversion, dwSentense ;
if (! hIMC)
return MENU_ITEM_INDEX_ASCII ;
if (! ImmGetOpenStatus (hIMC))
return MENU_ITEM_INDEX_ASCII ;
if (! ImmGetConversionStatus (hIMC, &dwConversion, &dwSentense))
return MENU_ITEM_INDEX_CANCEL ;
if (dwConversion & IME_CMODE_FULLSHAPE){
if (dwConversion & IME_CMODE_NATIVE){
return MENU_ITEM_INDEX_HANJA ;
} else {
return MENU_ITEM_INDEX_ASCII ;
}
} else {
if (dwConversion & IME_CMODE_NATIVE){
return MENU_ITEM_INDEX_HANGUL ;
} else {
return MENU_ITEM_INDEX_ASCII ;
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -