|
|
/**************************************************/ /* */ /* */ /* Reference other characters */ /* (Dialog) */ /* */ /* */ /* Copyright (c) 1997-1999 Microsoft Corporation. */ /**************************************************/
#include "stdafx.h"
#include "eudcedit.h"
#include "refrdlg.h"
#include "util.h"
#define STRSAFE_LIB
#include <strsafe.h>
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__; #endif
BOOL CodeFocus; BOOL CharFocus; BOOL CompFinalized; CHOOSEFONT chf; extern LOGFONT ReffLogFont; extern LOGFONT EditLogFont; extern BOOL TitleFlag; static BOOL CALLBACK ComDlg32DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK EditCharProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); HIMC hImcCode = NULL;
BEGIN_MESSAGE_MAP(CRefrDlg, CDialog) //{{AFX_MSG_MAP(CRefrDlg)
ON_BN_CLICKED(IDC_BUTTOMFONT, OnClickedButtomfont) ON_EN_CHANGE(IDC_EDITCODE, OnChangeEditcode) ON_EN_SETFOCUS(IDC_EDITCODE, OnSetfocusEditcode) ON_EN_KILLFOCUS(IDC_EDITCODE, OnKillfocusEditcode) ON_EN_SETFOCUS(IDC_EDITCHAR, OnSetfocusEditchar) ON_EN_KILLFOCUS(IDC_EDITCHAR, OnKillfocusEditchar) ON_EN_CHANGE(IDC_EDITCHAR, OnChangeEditchar) ON_WM_DESTROY() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
LRESULT CALLBACK EditCharProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CHAR: { //
// We always delete whatever in edit window before
// proceeding to avoid multiple characters in the
// window
//
SetWindowText(hwnd, TEXT("")); CompFinalized = TRUE; break; } case WM_IME_COMPOSITION: { if (lParam & CS_INSERTCHAR) { // This is KOR ime only. We want to clear the edit
// window when the first and only the first composition
// char is entered.
//
if (CompFinalized) { SetWindowText(hwnd, TEXT("")); } CompFinalized = FALSE; } break; }
}
return(AfxWndProc(hwnd, uMsg, wParam, lParam)); }
/****************************************/ /* */ /* Default Constructor */ /* */ /****************************************/ CRefrDlg::CRefrDlg( CWnd* pParent) : CDialog(CRefrDlg::IDD, pParent) { //{{AFX_DATA_INIT(CRefrDlg)
//}}AFX_DATA_INIT
}
/****************************************/ /* */ /* MESSAGE "WM_INITDIALOG" */ /* */ /****************************************/ BOOL CRefrDlg::OnInitDialog() { CString DialogTitle; LOGFONT LogFont; CWnd *ViewWnd; CRect CharViewRect; HWND hWndCode; HWND hWndChar; HRESULT hresult;
CDialog::OnInitDialog();
// Implement "?" in this dialog.
LONG WindowStyle = GetWindowLong( this->GetSafeHwnd(), GWL_EXSTYLE); WindowStyle |= WS_EX_CONTEXTHELP; SetWindowLong( this->GetSafeHwnd(), GWL_EXSTYLE, WindowStyle);
// Set Dialog title name.
if( !TitleFlag) DialogTitle.LoadString( IDS_REFERENCE_DLGTITLE); else DialogTitle.LoadString( IDS_CALL_DLGTITLE); this->SetWindowText( DialogTitle);
// Subclass Dialog Control Item
m_CodeList.SubclassDlgItem( ID_REFERCODE, this); m_RefListFrame1.SubclassDlgItem( IDC_LISTFRAME1, this); m_RefInfoFrame.SubclassDlgItem( IDC_INFOFRAME, this); m_ColumnHeadingR.SubclassDlgItem( IDC_COLUMNHEADINGR, this); m_EditChar.SubclassDlgItem( IDC_EDITCHAR, this); hWndChar = this->GetDlgItem(IDC_EDITCHAR)->GetSafeHwnd(); if (GetWindowLongPtr(hWndChar, GWLP_WNDPROC) == (LONG_PTR)AfxWndProc) { SetWindowLongPtr(hWndChar, GWLP_WNDPROC, (LONG_PTR)EditCharProc); } hWndCode = GetDlgItem(IDC_EDITCODE)->GetSafeHwnd(); if (hWndCode && ::IsWindow(hWndCode)) { hImcCode = ImmAssociateContext(hWndCode, NULL); }
GetFont()->GetObject( sizeof(LOGFONT), &LogFont); m_CodeList.SysFFont.CreateFontIndirect( &LogFont); m_CodeList.CalcCharSize(); m_CodeList.SendMessage( WM_SETFONT, (WPARAM)m_CodeList.SysFFont.GetSafeHandle(), MAKELPARAM( TRUE, 0)); m_ColumnHeadingR.SysFFont.CreateFontIndirect( &LogFont); ViewWnd = this->GetDlgItem( IDC_EDITCHAR); ViewWnd->GetClientRect( &CharViewRect); if( CharViewRect.Width() >= CharViewRect.Height()) vHeight = CharViewRect.Height() - 10; else vHeight = CharViewRect.Width() - 10;
if( !TitleFlag){ memcpy( &m_CodeList.rLogFont, &ReffLogFont, sizeof( LOGFONT)); m_CodeList.rLogFont.lfHeight = vHeight; m_CodeList.ViewFont.CreateFontIndirect( &m_CodeList.rLogFont); if( m_CodeList.CharSize.cx >= m_CodeList.CharSize.cy) m_CodeList.rLogFont.lfHeight = m_CodeList.CharSize.cy-2; else m_CodeList.rLogFont.lfHeight = m_CodeList.CharSize.cx-2; m_CodeList.CharFont.CreateFontIndirect( &m_CodeList.rLogFont);
//*STRSAFE* lstrcpy( (TCHAR *)FontName,(const TCHAR *)m_CodeList.rLogFont.lfFaceName);
hresult = StringCchCopy((TCHAR *)FontName , ARRAYLEN(FontName), (const TCHAR *)m_CodeList.rLogFont.lfFaceName); if (!SUCCEEDED(hresult)) { return FALSE; } AdjustFontName(); this->SetDlgItemText( IDC_EDITFONT, (LPTSTR)FontName); }else{ memcpy( &m_CodeList.cLogFont, &EditLogFont, sizeof( LOGFONT)); m_CodeList.cLogFont.lfHeight = vHeight; m_CodeList.ViewFont.CreateFontIndirect( &m_CodeList.cLogFont);
if( m_CodeList.CharSize.cx >= m_CodeList.CharSize.cy) m_CodeList.cLogFont.lfHeight = m_CodeList.CharSize.cy-2; else m_CodeList.cLogFont.lfHeight = m_CodeList.CharSize.cx-2; m_CodeList.CharFont.CreateFontIndirect( &m_CodeList.cLogFont);
//*STRSAFE* lstrcpy( (TCHAR *)FontName,(const TCHAR *)m_CodeList.cLogFont.lfFaceName);
hresult = StringCchCopy((TCHAR *)FontName , ARRAYLEN(FontName), (const TCHAR *)m_CodeList.cLogFont.lfFaceName); if (!SUCCEEDED(hresult)) { return FALSE; } AdjustFontName(); this->SetDlgItemText( IDC_EDITFONT, (LPTSTR)FontName); } m_CodeList.SetCodeRange(); SetViewFont(); m_CodeList.EnableScrollBar(SB_VERT, ESB_ENABLE_BOTH); m_CodeList.Invalidate( FALSE); m_CodeList.UpdateWindow();
CodeFocus = FALSE; CharFocus = FALSE; CompFinalized=TRUE; this->SendDlgItemMessage(IDC_EDITCODE, EM_LIMITTEXT, (WPARAM)4, (LPARAM)0); this->SendDlgItemMessage(IDC_EDITCHAR, EM_LIMITTEXT, (WPARAM)1, (LPARAM)0);
return TRUE; } void CRefrDlg::OnDestroy() { if (hImcCode) { HWND hWndCode; hWndCode = GetDlgItem(IDC_EDITCODE)->GetSafeHwnd(); if (hWndCode && ::IsWindow(hWndCode)) { ImmAssociateContext(hWndCode, hImcCode); hImcCode = NULL; } } }
/****************************************/ /* */ /* Set font on ViewEdit */ /* */ /****************************************/ void CRefrDlg::SetViewFont() { HWND hWnd;
hWnd = ::GetDlgItem( this->GetSafeHwnd(), IDC_EDITCHAR); ::SendMessage( hWnd, WM_SETFONT, (WPARAM)m_CodeList.ViewFont.m_hObject, MAKELPARAM(TRUE,0)); }
/****************************************/ /* */ /* COMMAND "FONT" */ /* */ /****************************************/ void CRefrDlg::OnClickedButtomfont() { HDC hDC; HRESULT hresult;
hDC = ::GetDC( this->GetSafeHwnd()); chf.hDC = ::CreateCompatibleDC( hDC); ::ReleaseDC( this->GetSafeHwnd(), hDC); if( !TitleFlag){ m_CodeList.rLogFont.lfHeight = 40; chf.lpLogFont = &m_CodeList.rLogFont; }else{ m_CodeList.cLogFont.lfHeight = 40; chf.lpLogFont = &m_CodeList.cLogFont; } chf.lStructSize = sizeof(CHOOSEFONT); chf.hwndOwner = this->GetSafeHwnd(); chf.rgbColors = GetSysColor(COLOR_WINDOWTEXT); //COLOR_BLACK;
chf.lCustData = 0; chf.hInstance = AfxGetInstanceHandle(); chf.lpszStyle = (LPTSTR)NULL; chf.nFontType = SCREEN_FONTTYPE; chf.lpfnHook = (LPCFHOOKPROC)(FARPROC)ComDlg32DlgProc; chf.lpTemplateName = (LPTSTR)MAKEINTRESOURCE(FORMATDLGORD31); chf.Flags = CF_SCREENFONTS | CF_NOSIMULATIONS | CF_ENABLEHOOK | CF_ENABLETEMPLATE | CF_INITTOLOGFONTSTRUCT;
if( ChooseFont( &chf ) == FALSE){ ::DeleteDC( chf.hDC); return ; } ::DeleteDC( chf.hDC); m_CodeList.SetCodeRange(); m_CodeList.ResetParam(); this->SetDlgItemText( IDC_EDITCODE, TEXT("")); this->SetDlgItemText( IDC_EDITCHAR, TEXT(""));
m_CodeList.CharFont.DeleteObject(); m_CodeList.ViewFont.DeleteObject(); if( !TitleFlag){ //*STRSAFE* lstrcpy( (TCHAR *)FontName,(const TCHAR *)m_CodeList.rLogFont.lfFaceName);
hresult = StringCchCopy((TCHAR *)FontName , ARRAYLEN(FontName), (const TCHAR *)m_CodeList.rLogFont.lfFaceName); if (!SUCCEEDED(hresult)) { return ; } AdjustFontName(); this->SetDlgItemText( IDC_EDITFONT, FontName);
m_CodeList.rLogFont.lfHeight = vHeight; m_CodeList.rLogFont.lfQuality = PROOF_QUALITY; m_CodeList.ViewFont.CreateFontIndirect( &m_CodeList.rLogFont);
if( m_CodeList.CharSize.cx >= m_CodeList.CharSize.cy) m_CodeList.rLogFont.lfHeight = m_CodeList.CharSize.cy-2; else m_CodeList.rLogFont.lfHeight = m_CodeList.CharSize.cx-2; m_CodeList.CharFont.CreateFontIndirect( &m_CodeList.rLogFont); }else{ //*STRSAFE* lstrcpy(FontName, (const TCHAR *)m_CodeList.cLogFont.lfFaceName);
hresult = StringCchCopy(FontName , ARRAYLEN(FontName), (const TCHAR *)m_CodeList.cLogFont.lfFaceName); if (!SUCCEEDED(hresult)) { return ; } AdjustFontName(); this->SetDlgItemText( IDC_EDITFONT, FontName);
m_CodeList.cLogFont.lfHeight = vHeight; m_CodeList.cLogFont.lfQuality = PROOF_QUALITY; m_CodeList.ViewFont.CreateFontIndirect( &m_CodeList.cLogFont);
if( m_CodeList.CharSize.cx >= m_CodeList.CharSize.cy) m_CodeList.cLogFont.lfHeight = m_CodeList.CharSize.cy-2; else m_CodeList.cLogFont.lfHeight = m_CodeList.CharSize.cx-2; m_CodeList.CharFont.CreateFontIndirect( &m_CodeList.cLogFont); } SetViewFont(); m_CodeList.Invalidate( TRUE); m_CodeList.UpdateWindow();
CWnd *cWnd = GetDlgItem( ID_REFERCODE); GotoDlgCtrl( cWnd);
return; }
/****************************************/ /* */ /* Adjust Font Name */ /* */ /****************************************/ void CRefrDlg::AdjustFontName() { CClientDC dc(this); CRect ViewFontRect; CSize FontNameSize, CharSize; int i;
CWnd *cWnd = GetDlgItem( IDC_EDITFONT); cWnd->GetClientRect( &ViewFontRect);
GetTextExtentPoint32( dc.GetSafeHdc(), (const TCHAR *)FontName, lstrlen((const TCHAR *)FontName), &FontNameSize);
if( ViewFontRect.Width() <= FontNameSize.cx){ GetTextExtentPoint32( dc.GetSafeHdc(), TEXT("<<"), 2, &CharSize); i = ( ViewFontRect.Width() /CharSize.cx) * 2; FontName[i-2] = '.'; FontName[i-1] = '.'; FontName[i] = '\0'; } }
/****************************************/ /* */ /* jump Reference code */ /* */ /****************************************/ void CRefrDlg::JumpReferCode() { if( !m_CodeList.CodeButtonClicked()) { if (CharFocus && !CompFinalized) { //
// We want to cancel ime composition with wParam = 0, lParam
// contains CS_INSERTCHAR.
//
this->SendDlgItemMessage(IDC_EDITCHAR, WM_IME_COMPOSITION, 0, CS_INSERTCHAR | CS_NOMOVECARET | GCS_COMPSTR | GCS_COMPATTR); } OutputMessageBox( this->GetSafeHwnd(), IDS_ILLEGALCODE_TITLE, IDS_ILLEGALCODE_MSG, TRUE);
}else{
if (CharFocus) { //
// We don't want to highlight an interim KOR IME composition.
//
if (CompFinalized) { this->SendDlgItemMessage(IDC_EDITCHAR, EM_SETSEL, 0, -1); } } else { this->SendDlgItemMessage(IDC_EDITCODE, EM_SETSEL, 0, -1); } } }
/****************************************/ /* */ /* COMMAND "IDOK" */ /* */ /****************************************/ void CRefrDlg::OnOK() { if( !m_CodeList.SelectCode){ OutputMessageBox( this->GetSafeHwnd(), IDS_REFERENCE_DLGTITLE, IDS_NOTSELCHARACTER_MSG, TRUE); return; } if( !TitleFlag){ memcpy( &ReffLogFont, &m_CodeList.rLogFont, sizeof( LOGFONT)); }else{ memcpy( &EditLogFont, &m_CodeList.cLogFont, sizeof( LOGFONT)); } CDialog::OnOK(); }
/****************************************/ /* */ /* COMMAND "IDCANCEL" */ /* */ /****************************************/ void CRefrDlg::OnCancel() { m_CodeList.SelectCode = 0;
CDialog::OnCancel(); }
/****************************************/ /* */ /* MESSAGE "EM_CHANGE" */ /* */ /****************************************/ void CRefrDlg::OnChangeEditcode() { TCHAR EditCode[5]; int i;
EditCode[0] = '\0'; this->GetDlgItemText(IDC_EDITCODE, EditCode, sizeof(EditCode)/sizeof(TCHAR)); for (i=0; i<lstrlen(EditCode); i++) { if ( EditCode[i] < TEXT('0') || (EditCode[i] > TEXT('9') && EditCode[i] < TEXT('A')) || (EditCode[i] > TEXT('F') && EditCode[i] < TEXT('a')) || EditCode[i] > TEXT('f')) { OutputMessageBox( this->GetSafeHwnd(), IDS_ILLEGALCODE_TITLE, IDS_ILLEGALCODE_MSG, TRUE); this->SendDlgItemMessage(IDC_EDITCODE, EM_SETSEL, 0, -1); return; } } if( lstrlen( EditCode) == 4 && CodeFocus) { JumpReferCode(); } }
/****************************************/ /* */ /* MESSAGE "WM_SETFOCUS" */ /* */ /****************************************/ void CRefrDlg::OnSetfocusEditcode() { this->SendDlgItemMessage(IDC_EDITCODE, EM_SETSEL, 0, -1); CodeFocus = TRUE; }
/****************************************/ /* */ /* MESSAGE "WM_KILLFOCUS" */ /* */ /****************************************/ void CRefrDlg::OnKillfocusEditcode() { CodeFocus = FALSE; }
/****************************************/ /* */ /* MESSAGE "WM_SETFOCUS" */ /* */ /****************************************/ void CRefrDlg::OnSetfocusEditchar() { if (CompFinalized) { this->SendDlgItemMessage( IDC_EDITCHAR, EM_SETSEL, 0, -1); } CharFocus = TRUE; }
/****************************************/ /* */ /* MESSAGE "WM_KILLFOCUS" */ /* */ /****************************************/ void CRefrDlg::OnKillfocusEditchar() { CharFocus = FALSE; }
/****************************************/ /* */ /* MESSAGE "EM_CHANGE" */ /* */ /****************************************/ void CRefrDlg::OnChangeEditchar() { WCHAR EditChar[5] = {0};
EditChar[0]=TEXT('\0'); #ifdef UNICODE
::GetDlgItemTextW(this->GetSafeHwnd(),IDC_EDITCHAR, (LPWSTR)EditChar, sizeof(EditChar)/sizeof(WCHAR)); #else
CHAR eChar[5]; int nchar = ::GetDlgItemText(this->GetSafeHwnd(),IDC_EDITCHAR, (LPSTR)eChar, sizeof(eChar)); MultiByteToWideChar(CP_ACP, 0, eChar, nchar, EditChar, sizeof(EditChar)/sizeof(EditChar[0])); #endif
if( CharFocus && EditChar[0] != TEXT('\0') ) { int iPos = 1; /*
#ifndef UNICODE
if (IsDBCSLeadByte(EditChar[0])) { iPos = 2; } #endif
*/ EditChar[iPos]=TEXT('\0'); JumpReferCode(); } }
/****************************************/ /* */ /* Callback function */ /* */ /****************************************/ static BOOL CALLBACK ComDlg32DlgProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: long WindowStyle;
WindowStyle = GetWindowLong( hDlg, GWL_EXSTYLE); WindowStyle |= WS_EX_CONTEXTHELP; SetWindowLong( hDlg, GWL_EXSTYLE, WindowStyle); break;
default: return FALSE; } return TRUE; }
static DWORD aIds[] = { ID_REFERCODE, IDH_EUDC_REFLIST, IDC_COLUMNHEADINGR, IDH_EUDC_REFLIST, IDC_STATICC, IDH_EUDC_REFCODE, IDC_EDITCODE, IDH_EUDC_REFCODE, IDC_STATICS, IDH_EUDC_REFCHAR, IDC_EDITCHAR, IDH_EUDC_REFCHAR, IDC_STATICF, IDH_EUDC_REFFONT, IDC_EDITFONT, IDH_EUDC_REFFONT, IDC_INFOFRAME, IDH_EUDC_REFFONT, IDC_BUTTOMFONT, IDH_EUDC_FONT, // IDOK, IDH_EUDC_OK,
// IDCANCEL, IDH_EUDC_CANCEL,
0,0 };
static DWORD aIdsCall[] = { ID_REFERCODE, IDH_EUDC_CALLLIST, IDC_COLUMNHEADINGR, IDH_EUDC_CALLLIST, IDC_STATICC, IDH_EUDC_CALLCODE, IDC_EDITCODE, IDH_EUDC_CALLCODE, IDC_STATICS, IDH_EUDC_CALLCHAR, IDC_EDITCHAR, IDH_EUDC_CALLCHAR, IDC_STATICF, IDH_EUDC_CALLFONT, IDC_EDITFONT, IDH_EUDC_CALLFONT, IDC_INFOFRAME, IDH_EUDC_CALLFONT, IDC_BUTTOMFONT, IDH_EUDC_FONT, // IDOK, IDH_EUDC_OK,
// IDCANCEL, IDH_EUDC_CANCEL,
0,0 };
/****************************************/ /* */ /* Window procedure */ /* */ /****************************************/ LRESULT CRefrDlg::WindowProc( UINT message, WPARAM wParam, LPARAM lParam) { if( message == WM_HELP){ ::WinHelp((HWND)((LPHELPINFO)lParam)->hItemHandle, HelpPath, HELP_WM_HELP, (DWORD_PTR)(LPTSTR)(TitleFlag ? aIdsCall:aIds)); return(0); } if( message == WM_CONTEXTMENU){ ::WinHelp((HWND)wParam, HelpPath, HELP_CONTEXTMENU, (DWORD_PTR)(LPTSTR)(TitleFlag ? aIdsCall : aIds)); return(0); } return CDialog::WindowProc( message, wParam, lParam); }
|