📄 chokanmgr.cpp
字号:
int i;
char* pszWork;
char* pszNext;
char szAdd[64];
if( NULL != m_pszCurKouho ){
delete [] m_pszCurKouho;
m_pszCurKouho = NULL;
}
if( m_nCurKouhoIdx >= m_nKouhoNum ){
return;
}
strcpy( szAdd, "" );
// sprintf( szAdd, " (%d/%d)", m_nCurKouhoIdx + 1, m_nKouhoNum );
pszWork = m_pcmemKouho->GetPtr();
for( i = 0; i <= m_nCurKouhoIdx; ++i ){
pszNext = strstr( pszWork, pszCR );
if( NULL == pszNext ){
return;
}
if( i == m_nCurKouhoIdx ){
pszWork += m_cmemCurWord.GetLength();
m_pszCurKouho = new char[pszNext - pszWork + 1 + lstrlen( szAdd )];
memcpy( m_pszCurKouho, pszWork, pszNext - pszWork );
m_pszCurKouho[pszNext - pszWork] = '\0';
strcat( m_pszCurKouho, szAdd );
::MoveWindow( m_hWnd,
m_poWin.x - m_nColmWidth/*+ m_cmemCurWord.GetLength() * m_nColmWidth*/,
m_poWin.y + m_nWinHeight,
// m_nColmWidth * lstrlen(m_pszCurKouho) + 2,
// m_nWinHeight + 2 + 8,
220,
180,
TRUE
);
OnSize( 0, 0 );
return;
}
pszWork = pszNext + lstrlen( pszCR );
}
return;
}
#endif
BOOL CHokanMgr::OnInitDialog( HWND hwndDlg, WPARAM wParam, LPARAM lParam )
{
m_hWnd = hwndDlg;
/* 基底クラスメンバ */
//- CreateSizeBox();
return CDialog::OnInitDialog( hwndDlg, wParam, lParam );
}
BOOL CHokanMgr::OnDestroy( void )
{
/* 基底クラスメンバ */
CreateSizeBox();
return CDialog::OnDestroy();
}
BOOL CHokanMgr::OnSize( WPARAM wParam, LPARAM lParam )
{
/* 基底クラスメンバ */
CDialog::OnSize( wParam, lParam );
int Controls[] = {
IDC_LIST_WORDS
};
int nControls = sizeof( Controls ) / sizeof( Controls[0] );
int fwSizeType;
int nWidth;
int nHeight;
int i;
int nWork;
RECT rc;
HWND hwndCtrl;
POINT po;
RECT rcDlg;
fwSizeType = wParam; // resizing flag
::GetClientRect( m_hWnd, &rcDlg );
nWidth = rcDlg.right - rcDlg.left; // width of client area
nHeight = rcDlg.bottom - rcDlg.top; // height of client area
// 2001/06/18 Start by asa-o: サイズ変更後の位置を保存
m_poWin.x = rcDlg.left - 4;
m_poWin.y = rcDlg.top - 3;
::ClientToScreen(m_hWnd,&m_poWin);
// 2001/06/18 End
nWork = 48;
for ( i = 0; i < nControls; ++i ){
hwndCtrl = ::GetDlgItem( m_hWnd, Controls[i] );
::GetWindowRect( hwndCtrl, &rc );
po.x = rc.left;
po.y = rc.top;
::ScreenToClient( m_hWnd, &po );
rc.left = po.x;
rc.top = po.y;
po.x = rc.right;
po.y = rc.bottom;
::ScreenToClient( m_hWnd, &po );
rc.right = po.x;
rc.bottom = po.y;
if( Controls[i] == IDC_LIST_WORDS ){
::SetWindowPos(
hwndCtrl,
NULL,
rc.left,
rc.top,
nWidth - rc.left * 2,
nHeight - rc.top * 2/* - 20*/,
SWP_NOOWNERZORDER | SWP_NOZORDER
);
}
}
// 2001/06/18 asa-o:
ShowTip(); // 補完ウィンドウで選択中の単語にキーワードヘルプを表示
return TRUE;
}
BOOL CHokanMgr::OnBnClicked( int wID )
{
switch( wID ){
case IDCANCEL:
// CloseDialog( 0 );
Hide();
return TRUE;
case IDOK:
// CloseDialog( 0 );
/* 補完実行 */
DoHokan( VK_RETURN );
return TRUE;
}
return FALSE;
return 0;
}
BOOL CHokanMgr::OnKeyDown( WPARAM wParam, LPARAM lParam )
{
int nVKey;
nVKey = (int) wParam; // virtual-key code
// lKeyData = lParam; // key data
switch( nVKey ){
case VK_HOME:
case VK_END:
case VK_UP:
case VK_DOWN:
case VK_PRIOR:
case VK_NEXT:
return 1;
}
return 0;
}
BOOL CHokanMgr::OnCbnSelChange( HWND hwndCtl, int wID )
{
// 2001/06/18 asa-o:
ShowTip(); // 補完ウィンドウで選択中の単語にキーワードヘルプを表示
return TRUE;
}
BOOL CHokanMgr::OnLbnDblclk( int wID )
{
/* 補完実行 */
DoHokan( 0 );
return TRUE;
}
BOOL CHokanMgr::OnKillFocus( WPARAM wParam, LPARAM lParam )
{
// Hide();
return TRUE;
}
/* 補完実行 */
BOOL CHokanMgr::DoHokan( int nVKey )
{
#ifdef _DEBUG
MYTRACE( "CHokanMgr::DoHokan( nVKey==%xh )\n", nVKey );
#endif
/* 補完候補決定キー */
if( VK_RETURN == nVKey && FALSE == m_pShareData->m_Common.m_bHokanKey_RETURN ) return FALSE;/* VK_RETURN 補完決定キーが有効/無効 */
if( VK_TAB == nVKey && FALSE == m_pShareData->m_Common.m_bHokanKey_TAB ) return FALSE;/* VK_TAB 補完決定キーが有効/無効 */
if( VK_RIGHT == nVKey && FALSE == m_pShareData->m_Common.m_bHokanKey_RIGHT ) return FALSE;/* VK_RIGHT 補完決定キーが有効/無効 */
#if 0
if( VK_SPACE == nVKey && FALSE == m_pShareData->m_Common.m_bHokanKey_SPACE ) return FALSE;/* VK_SPACE 補完決定キーが有効/無効 */
#endif
HWND hwndList;
int nItem;
char szLabel[1024];
CEditView* pcEditView;
hwndList = ::GetDlgItem( m_hWnd, IDC_LIST_WORDS );
nItem = ::SendMessage( hwndList, LB_GETCURSEL, 0, 0 );
if( LB_ERR == nItem ){
return FALSE;
}
::SendMessage( hwndList, LB_GETTEXT, nItem, (LPARAM)szLabel );
#if 0
/* スペースで候補決定の場合はスペースをつける */
if( VK_SPACE == nVKey ){
strcat( szLabel, " " );
}
#endif
// pszWork += m_cmemCurWord.GetLength();
/* テキストを貼り付け */
pcEditView = (CEditView*)m_lParam;
// Apr. 28, 2000 genta
pcEditView->HandleCommand( F_WordDeleteToStart, FALSE, 0, 0, 0, 0 );
pcEditView->HandleCommand( F_INSTEXT, TRUE, (LPARAM)(szLabel), TRUE, 0, 0 );
// Until here
// pcEditView->HandleCommand( F_INSTEXT, TRUE, (LPARAM)(szLabel + m_cmemCurWord.GetLength()), TRUE, 0, 0 );
Hide();
m_pShareData->m_Common.m_bUseHokan = FALSE; // 補完したら
return TRUE;
}
/*
戻り値が -2 の場合は、アプリケーションは項目の選択を完了し、
リスト ボックスでそれ以上の動作が必要でないことを示します。
戻り値が -1 の場合は、リスト ボックスがキーストロークに応じて
デフォルトの動作を実行することを示します。
戻り値が 0 以上の場合は、その値はリスト ボックスの項目の 0 を
基準としたインデックスを意味し、リスト ボックスがその項目での
キーストロークに応じてデフォルトの動作を実行することを示します。
*/
// int CHokanMgr::OnVKeyToItem( WPARAM wParam, LPARAM lParam )
// {
// return KeyProc( wParam, lParam );
// }
/*
戻り値が -2 の場合は、アプリケーションは項目の選択を完了し、
リスト ボックスでそれ以上の動作が必要でないことを示します。
戻り値が -1 の場合は、リスト ボックスがキーストロークに応じて
デフォルトの動作を実行することを示します。
戻り値が 0 以上の場合は、その値はリスト ボックスの項目の 0 を
基準としたインデックスを意味し、リスト ボックスがその項目での
キーストロークに応じてデフォルトの動作を実行することを示します。
*/
// int CHokanMgr::OnCharToItem( WPARAM wParam, LPARAM lParam )
// {
// WORD vkey;
// WORD nCaretPos;
// LPARAM hwndLB;
// vkey = LOWORD(wParam); // virtual-key code
// nCaretPos = HIWORD(wParam); // caret position
// hwndLB = lParam; // handle to list box
// // switch( vkey ){
// // }
//
// MYTRACE( "CHokanMgr::OnCharToItem vkey=%xh\n", vkey );
// return -1;
// }
int CHokanMgr::KeyProc( WPARAM wParam, LPARAM lParam )
{
WORD vkey;
WORD nCaretPos;
LPARAM hwndLB;
vkey = LOWORD(wParam); // virtual-key code
nCaretPos = HIWORD(wParam); // caret position
hwndLB = lParam; // handle to list box
// MYTRACE( "CHokanMgr::OnVKeyToItem vkey=%xh\n", vkey );
switch( vkey ){
case VK_HOME:
case VK_END:
case VK_UP:
case VK_DOWN:
case VK_PRIOR:
case VK_NEXT:
/* リストボックスのデフォルトの動作をさせる */
return -1;
case VK_RETURN:
case VK_TAB:
case VK_RIGHT:
#if 0
case VK_SPACE:
#endif
/* 補完実行 */
if( DoHokan( vkey ) ){
return -1;
}else{
return -2;
}
case VK_ESCAPE:
case VK_LEFT:
m_pShareData->m_Common.m_bUseHokan = FALSE;
return -2;
}
return -2;
}
//BOOL CHokanMgr::OnNextDlgCtl( WPARAM wParam, LPARAM lParam )
//{
// /* 補完実行 */
// DoHokan();
// return 0;
//}
// 2001/06/18 Start by asa-o: 補完ウィンドウで選択中の単語にキーワードヘルプを表示
void CHokanMgr::ShowTip()
{
INT nItem,
nTopItem,
nItemHeight;
CHAR szLabel[1024];
POINT point;
CEditView* pcEditView;
HWND hwndCtrl;
RECT rcHokanWin;
hwndCtrl = ::GetDlgItem( m_hWnd, IDC_LIST_WORDS );
nItem = ::SendMessage( hwndCtrl, LB_GETCURSEL, 0, 0 );
if( LB_ERR == nItem ) return ;
::SendMessage( hwndCtrl, LB_GETTEXT, nItem, (LPARAM)szLabel ); // 選択中の単語を取得
pcEditView = (CEditView*)m_lParam;
// すでに辞書Tipが表示されていたら
if( pcEditView->m_dwTipTimer == 0 )
{
// 辞書Tipを消す
pcEditView -> m_cTipWnd.Hide();
pcEditView -> m_dwTipTimer = ::GetTickCount();
}
// 表示する位置を決定
nTopItem = ::SendMessage(hwndCtrl,LB_GETTOPINDEX,0,0);
nItemHeight = ::SendMessage( hwndCtrl, LB_GETITEMHEIGHT, 0, 0 );
point.x = m_poWin.x + m_nWidth;
point.y = m_poWin.y + 4 + (nItem - nTopItem) * nItemHeight;
// 2001/06/19 asa-o 選択中の単語が補完ウィンドウに表示されているなら辞書Tipを表示
if( point.y > m_poWin.y && point.y < m_poWin.y + m_nHeight )
{
::SetRect( &rcHokanWin , m_poWin.x, m_poWin.y, m_poWin.x + m_nWidth, m_poWin.y + m_nHeight );
if( !pcEditView -> ShowKeywordHelp( point,szLabel, &rcHokanWin ) )
pcEditView -> m_dwTipTimer = ::GetTickCount(); // 表示するべきキーワードヘルプが無い
}
}
// 2001/06/18 End
//@@@ 2002.01.18 add start
const DWORD p_helpids[] = {
0, 0
};
LPVOID CHokanMgr::GetHelpIdTable(void)
{
return (LPVOID)p_helpids;
}
//@@@ 2002.01.18 add end
/*[EOF]*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -