2025-11-28 00:35:46 +09:00

461 lines
12 KiB
C++

/**************************************************************************
THIS CODE AND INFORMATION IS PROVIDED 'AS IS' WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright 2001 Microsoft Corporation. All Rights Reserved.
**************************************************************************/
/**************************************************************************
File: TSFWnd.cpp
Description: CTSFMainWnd Class Implementation
**************************************************************************/
/**************************************************************************
#include statements
**************************************************************************/
#include "TSFWnd.h"
#include "Globals.h"
/**************************************************************************
local function prototypes
**************************************************************************/
/**************************************************************************
global variables and definitions
**************************************************************************/
TCHAR g_szTSFMainClassName[] = TEXT("TSFMainWndClass");
TCHAR g_szTSFAppTitle[] = TEXT("TSF Test Application");
#define THIS_POINTER_OFFSET GWLP_USERDATA
/**************************************************************************
CTSFMainWnd::CTSFMainWnd()
**************************************************************************/
CTSFMainWnd::CTSFMainWnd(HINSTANCE hInstance)
{
m_hWnd = NULL;
m_hInst = hInstance;
m_pTSFEditWnd = NULL;
m_tfClientID = 0;
}
/**************************************************************************
CTSFMainWnd::~CTSFMainWnd()
**************************************************************************/
CTSFMainWnd::~CTSFMainWnd()
{
if(m_hWnd)
{
DestroyWindow(m_hWnd);
}
if(g_pThreadMgr)
{
g_pThreadMgr->Deactivate();
g_pThreadMgr->Release();
g_pThreadMgr = NULL;
}
}
/**************************************************************************
CTSFMainWnd::Initialize()
**************************************************************************/
BOOL CTSFMainWnd::Initialize(int nCmdShow)
{
HRESULT hr;
#if 1
hr = CoCreateInstance( CLSID_TF_ThreadMgr,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITfThreadMgr,
(void**)&g_pThreadMgr);
#else
hr = TF_CreateThreadMgr(&g_pThreadMgr);
#endif
if(SUCCEEDED(hr))
{
hr = g_pThreadMgr->Activate(&m_tfClientID);
if(SUCCEEDED(hr))
{
WNDCLASS wc;
ZeroMemory(&wc, sizeof(wc));
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = CTSFMainWnd::_WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(CTSFMainWnd*);
wc.hInstance = m_hInst;
wc.hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_MAIN_ICON));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_DESKTOP + 1);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN_MENU);
wc.lpszClassName = g_szTSFMainClassName;
if(0 != RegisterClass(&wc))
{
//create the main window
m_hWnd = CreateWindowEx( 0,
g_szTSFMainClassName,
g_szTSFAppTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
m_hInst,
(LPVOID)this);
if(NULL != m_hWnd)
{
ShowWindow(m_hWnd, nCmdShow);
UpdateWindow(m_hWnd);
return TRUE;
}
}
}
}
return FALSE;
}
/**************************************************************************
CTSFMainWnd::_CleanupEditWnd()
**************************************************************************/
void CTSFMainWnd::_CleanupEditWnd(BOOL fNuke)
{
if(NULL != m_pTSFEditWnd)
{
if(fNuke)
{
delete m_pTSFEditWnd;
}
else
{
m_pTSFEditWnd->Release();
}
m_pTSFEditWnd = NULL;
}
}
/**************************************************************************
CTSFMainWnd::_WndProc()
**************************************************************************/
LRESULT CALLBACK CTSFMainWnd::_WndProc( HWND hWnd,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
CTSFMainWnd *pThis = (CTSFMainWnd*)GetWindowLongPtr(hWnd, THIS_POINTER_OFFSET);
if((NULL == pThis) && (uMessage != WM_NCCREATE))
{
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
switch (uMessage)
{
case WM_NCCREATE:
{
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
pThis = (CTSFMainWnd*)(lpcs->lpCreateParams);
SetWindowLongPtr(hWnd, THIS_POINTER_OFFSET, (LONG_PTR)pThis);
//set the window handle
pThis->m_hWnd = hWnd;
}
break;
case WM_CREATE:
return pThis->_OnCreate();
case WM_SIZE:
return pThis->_OnSize(LOWORD(lParam), HIWORD(lParam));
case WM_DESTROY:
return pThis->_OnDestroy();
case WM_SETFOCUS:
return pThis->_OnSetFocus();
case WM_KILLFOCUS:
return pThis->_OnKillFocus();
case WM_ACTIVATE:
return pThis->_OnActivate(wParam);
case WM_INITMENUPOPUP:
return pThis->_OnInitMenuPopup(wParam, lParam);
case WM_COMMAND:
return pThis->_OnCommand( GET_WM_COMMAND_ID(wParam, lParam),
GET_WM_COMMAND_CMD(wParam, lParam),
GET_WM_COMMAND_HWND(wParam, lParam));
case WM_NCDESTROY:
pThis->m_hWnd = NULL;
break;
}
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}
/**************************************************************************
CTSFMainWnd::)OnCreate()
**************************************************************************/
LRESULT CTSFMainWnd::_OnCreate(VOID)
{
m_pTSFEditWnd = new CTSFEditWnd(m_hInst, m_hWnd);
if(!m_pTSFEditWnd)
{
return -1;
}
if(!m_pTSFEditWnd->_Initialize(g_pThreadMgr, m_tfClientID))
{
_CleanupEditWnd(TRUE);
return -1;
}
return 0;
}
/**************************************************************************
CTSFMainWnd::_OnDestroy()
**************************************************************************/
LRESULT CTSFMainWnd::_OnDestroy(VOID)
{
_CleanupEditWnd(FALSE);
PostQuitMessage(0);
return 0;
}
/**************************************************************************
CTSFMainWnd::_OnCommand()
**************************************************************************/
LRESULT CTSFMainWnd::_OnCommand(WORD wID, WORD wCmd, HWND hWnd)
{
switch(wID)
{
case IDM_EXIT:
PostMessage(m_hWnd, WM_CLOSE, 0, 0);
break;
case IDM_ABOUT:
MessageBox(m_hWnd, TEXT(""), g_szTSFAppTitle, MB_OK | MB_ICONINFORMATION);
break;
case IDM_GETPRESERVEDKEY:
m_pTSFEditWnd->_OnGetPreservedKey();
break;
case IDM_GETDISPATTR:
m_pTSFEditWnd->_GetDisplayAttributes();
break;
case IDM_GET_TEXTOWNER:
m_pTSFEditWnd->_GetTextOwner();
break;
case IDM_GET_READING:
m_pTSFEditWnd->_GetReadingText();
break;
case IDM_GET_COMPOSING:
m_pTSFEditWnd->_GetComposing();
break;
case IDM_TERMINATE_COMPOSITION:
m_pTSFEditWnd->_TerminateAllCompositions();
break;
case IDM_RECONVERT:
m_pTSFEditWnd->_Reconvert();
break;
case IDM_PLAYBACK:
m_pTSFEditWnd->_Playback();
break;
case IDM_LOAD:
{
TCHAR szFile[MAX_PATH];
if(_GetFileName(m_hWnd, szFile, MAX_PATH, TRUE))
{
m_pTSFEditWnd->_LoadFromFile(szFile);
}
}
break;
case IDM_SAVE:
{
TCHAR szFile[MAX_PATH];
if(_GetFileName(m_hWnd, szFile, MAX_PATH, FALSE))
{
m_pTSFEditWnd->_SaveToFile(szFile);
}
}
break;
case IDM_TEST:
m_pTSFEditWnd->_OnTest();
break;
}
return 0;
}
/**************************************************************************
CTSFMainWnd::_OnSetFocus()
**************************************************************************/
LRESULT CTSFMainWnd::_OnSetFocus(VOID)
{
SetFocus(m_pTSFEditWnd->_GetWindow());
return 0;
}
/**************************************************************************
CTSFMainWnd::_OnKillFocus()
**************************************************************************/
LRESULT CTSFMainWnd::_OnKillFocus(VOID)
{
return 0;
}
/**************************************************************************
CTSFMainWnd::_OnNotify()
**************************************************************************/
LRESULT CTSFMainWnd::_OnNotify(UINT, LPNMHDR)
{
return 0;
}
/**************************************************************************
CTSFMainWnd::_OnSize()
**************************************************************************/
LRESULT CTSFMainWnd::_OnSize(WORD wWidth, WORD wHeight)
{
//position the edit window to fill the client area
MoveWindow(m_pTSFEditWnd->_GetWindow(), 0, 0, wWidth, wHeight, TRUE);
return 0;
}
/**************************************************************************
CTSFMainWnd::_OnActivate()
**************************************************************************/
LRESULT CTSFMainWnd::_OnActivate(WPARAM)
{
return 0;
}
/**************************************************************************
CTSFMainWnd::_OnInitMenuPopup()
**************************************************************************/
LRESULT CTSFMainWnd::_OnInitMenuPopup(WPARAM wParam, LPARAM lParam)
{
return m_pTSFEditWnd->_OnInitMenuPopup(wParam, lParam);
}
/**************************************************************************
CTSFMainWnd::GetFileName()
**************************************************************************/
BOOL CTSFMainWnd::_GetFileName(HWND hwndOwner, LPTSTR lpszFile, ULONG uChars, BOOL fOpen)
{
OPENFILENAME ofn;
BOOL fReturn = FALSE;
*lpszFile = 0;
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwndOwner;
ofn.lpstrFilter = TEXT("TSFApp Files (*.tsf)\0*.tsf\0");
ofn.lpstrFile = lpszFile;
ofn.nMaxFile = uChars;
ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
ofn.lpstrDefExt = TEXT("tsf");
if(fOpen)
{
ofn.Flags |= OFN_FILEMUSTEXIST;
fReturn = GetOpenFileName(&ofn);
}
else
{
fReturn = GetSaveFileName(&ofn);
}
return fReturn;
}