/**************************************************/ /* */ /* */ /* Character List( Referrence Dialog) */ /* */ /* */ /* */ /* Copyright (c) 1997-1999 Microsoft Corporation. */ /**************************************************/ #include "stdafx.h" #include "eudcedit.h" #include "refrlist.h" #include "util.h" #define STRSAFE_LIB #include // 6 * 16 Matrics #define NUM_CHAR 16 #define NUM_LINE 6 // Type of Character Code #define CHAR_INIT 0 // Initial value #define CHAR_SBCS 1 // SBCS #define CHAR_DBCS1 2 // DBCS1 #define CHAR_DBCS2 3 // DBCS2 #define CHAR_EUDC 4 // EUDC #define CHAR_ETC 5 // Other #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNCREATE( CRefrList, CEdit) BEGIN_MESSAGE_MAP( CRefrList, CEdit) //{{AFX_MSG_MAP( CRefrList) ON_WM_PAINT() ON_WM_VSCROLL() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONDBLCLK() ON_WM_SETCURSOR() ON_WM_KEYDOWN() ON_WM_SETFOCUS() ON_WM_KILLFOCUS() ON_WM_RBUTTONUP() //}}AFX_MSG_MAP END_MESSAGE_MAP() // Range of character code( high byte) static WORD HiByteRange[][10] = { // JPN CHT KRW CHS OTHER { 0x00a0, 0xfca0, 0x00a0, 0xfea0, 0x00a0, 0xfea0, 0x00a0, 0xfea0, 0x00a0, 0x00a0}, // CHAR_INIT { 0x0020, 0x00ff, 0x0020, 0x00ff, 0x0020, 0x00ff, 0x0020, 0x00ff, 0x0020, 0x00ff}, // CHAR_SBCS { 0x8140, 0x9fff, 0x8140, 0xa0ff, 0x8140, 0x8fff, 0x8140, 0xafff, 0x0020, 0x00ff}, // CHAR_DBCS1 { 0xe040, 0xeaff, 0xa140, 0xf9ff, 0x9040, 0x9fff, 0xb040, 0xf7ff, 0x0020, 0x00ff}, // CHAR_DBCS2 { 0xf040, 0xfcff, 0xfa40, 0xfeff, 0xa040, 0xfeff, 0xf840, 0xfeff, 0x0020, 0x00ff}, // CHAR_EUDC }; // Range of character code( low byte) static WORD LoByteRange[][10] = { { 0x0020, 0x00ff, 0x0020, 0x00ff, 0x0020, 0x00ff, 0x0020, 0x00ff, 0x0020, 0x00ff }, { 0x0040, 0x007e, 0x0040, 0x007e, 0x0041, 0x005a, 0x0040, 0x007e, 0x0040, 0x007e }, { 0x0080, 0x00fc, 0x0080, 0x00fe, 0x0061, 0x007a, 0x0080, 0x00fe, 0x0040, 0x007e }, { 0x0080, 0x00fc, 0x0080, 0x00fe, 0x0081, 0x00fe, 0x0080, 0x00fe, 0x0040, 0x007e }, { 0x0000, 0x003f, 0x0000, 0x003f, 0x0000, 0x003f, 0x0000, 0x003f, 0x0040, 0x007e }, }; extern LOGFONT ReffLogFont; extern LOGFONT EditLogFont; extern BOOL TitleFlag; extern BOOL CodeFocus; extern BOOL CharFocus; static CRect rcReferChar[NUM_LINE][NUM_CHAR]; static CRect rcReferCode[NUM_LINE]; /****************************************/ /* */ /* Default Constructor */ /* */ /****************************************/ CRefrList::CRefrList() { /* // Initialize static parameter if( CountryInfo.LangID == EUDC_CHT) CHN = 2; else if( CountryInfo.LangID == EUDC_JPN) CHN = 0; else if( CountryInfo.LangID == EUDC_KRW) CHN = 4; else if( CountryInfo.LangID == EUDC_CHS) CHN = 6; else CHN = 8; */ FocusFlag = FALSE; } /****************************************/ /* */ /* Destructor( Virtual) */ /* */ /****************************************/ CRefrList::~CRefrList() { SysFFont.DeleteObject(); CharFont.DeleteObject(); ViewFont.DeleteObject(); } /****************************************/ /* */ /* Set intitial code range */ /* */ /****************************************/ void CRefrList::SetCodeRange() { CHARSETINFO CharsetInfo; BYTE CharSet; SelectCode = 0x0020; ScrlBarPos = 0; StartCode = 0x0020; EndCode = 0xffff; ViewStart = 0x0020; ViewEnd = 0xffa0; /* SelectCode = HiByteRange[CHAR_SBCS][CHN]; ScrlBarPos = 0; StartCode = HiByteRange[CHAR_SBCS][CHN]; ViewStart = HiByteRange[CHAR_SBCS][CHN]; if( !TitleFlag){ if( rLogFont.lfCharSet == CountryInfo.CharacterSet){ // Correspond to DBCS ViewEnd = HiByteRange[CHAR_INIT][CHN+1]; EndCode = HiByteRange[CHAR_EUDC][CHN+1]; }else{ // Correspond to SBCS ViewEnd = HiByteRange[CHAR_INIT][CHN]; EndCode = HiByteRange[CHAR_SBCS][CHN+1]; } CharSet = rLogFont.lfCharSet; }else{ if( cLogFont.lfCharSet == CountryInfo.CharacterSet){ ViewEnd = HiByteRange[CHAR_INIT][CHN+1]; EndCode = HiByteRange[CHAR_EUDC][CHN+1]; }else{ ViewEnd = HiByteRange[CHAR_INIT][CHN]; EndCode = HiByteRange[CHAR_SBCS][CHN+1]; } CharSet = cLogFont.lfCharSet; } if(CharSet == SYMBOL_CHARSET) { dwCodePage = 1252; } else if(TranslateCharsetInfo((DWORD *)CharSet,&CharsetInfo,TCI_SRCCHARSET)) { dwCodePage = CharsetInfo.ciACP; } else { dwCodePage = CP_ACP; } */ } /****************************************/ /* */ /* Check type of character code */ /* */ /****************************************/ int CRefrList::CheckCharType( WORD Code) { /* if( !( Code & 0xff00)) return CHAR_SBCS; else if(( Code >= HiByteRange[CHAR_DBCS1][CHN]) && ( Code <= HiByteRange[CHAR_DBCS1][CHN+1])) return CHAR_DBCS1; else if(( Code >= HiByteRange[CHAR_DBCS2][CHN]) && ( Code <= HiByteRange[CHAR_DBCS2][CHN+1])) return CHAR_DBCS2; else if(( Code >= HiByteRange[CHAR_EUDC][CHN]) && ( Code <= HiByteRange[CHAR_EUDC][CHN+1])) return CHAR_EUDC; else return CHAR_ETC; */ return 0; } /****************************************/ /* */ /* Increase character code */ /* */ /****************************************/ WORD CRefrList::GetPlusCode( WORD Code, int ScrollNum) { WORD PrevCode; WORD LowByte, HighByte; int CharType; int CharType1, CharType2; int Offset; Code += (WORD)ScrollNum; /* PrevCode = (WORD)(Code - (WORD)ScrollNum); CharType1 = CheckCharType( PrevCode); CharType2 = CheckCharType( Code); if( CharType1 != CharType2){ if( CharType1 == CHAR_EUDC) Code = PrevCode; else{ Offset = Code - HiByteRange[CharType1][CHN+1]; Code = (WORD)( HiByteRange[CharType1+1][CHN] +Offset-1); } } CharType = CheckCharType( Code); if( CharType != CHAR_SBCS){ LowByte = Code & 0x00ff; HighByte = Code & 0xff00; if( LowByte <= LoByteRange[4][CHN+1] && LowByte >= LoByteRange[4][CHN] ){ #if 0 if( CountryInfo.LangID == EUDC_CHS) LowByte = 0x00a0; else LowByte = 0x0040; #endif LowByte = 0x0040; } Code = ( HighByte | LowByte); } */ return Code; } /****************************************/ /* */ /* Decrease Character Code */ /* */ /****************************************/ WORD CRefrList::GetMinusCode( WORD Code, int ScrollNum) { WORD PrevCode; int CharType; int CharType1, CharType2; int Offset; Code -= (WORD)ScrollNum; /* PrevCode = (WORD)( Code + (WORD)ScrollNum); CharType1 = CheckCharType( Code); CharType2 = CheckCharType( PrevCode); if( CharType1 != CharType2){ if( CharType2 == CHAR_SBCS) return (WORD)HiByteRange[CHAR_SBCS][CHN]; else{ Offset = HiByteRange[CharType2][CHN] - Code; return (WORD)(HiByteRange[CharType2-1][CHN+1]-Offset+1); } } CharType = CheckCharType( Code); if( CharType != CHAR_SBCS){ WORD LowByte; WORD HighByte; WORD Tmp; LowByte = Code & 0x00ff; HighByte = Code & 0xff00; if( LowByte <= LoByteRange[4][CHN+1] && LowByte >= LoByteRange[4][CHN] ){ LowByte = 0xf0; Tmp = ( HighByte >> 8); Tmp -= 0x1; HighByte = Tmp << 8; } Code = ( HighByte | LowByte); } */ return Code; } /****************************************/ /* */ /* Calculate scroll position */ /* */ /****************************************/ int CRefrList::GetBarPosition( WORD Code) { short i, StartType, EndType; int Pos = 0; Pos = (Code - StartCode) /NUM_CHAR; return Pos; /* StartType = CheckCharType( StartCode); EndType = CheckCharType( Code); if( EndType == CHAR_SBCS){ Pos = ( Code - HiByteRange[CHAR_SBCS][CHN]) /NUM_CHAR; return Pos; } for (i = StartType; i < EndType; i++){ if( i == CHAR_SBCS){ Pos += (HiByteRange[CHAR_SBCS][CHN+1] - HiByteRange[CHAR_SBCS][CHN] + 1) / NUM_CHAR; }else{ Pos += CalculateCode( HiByteRange[i][CHN], HiByteRange[i][CHN+1]) / NUM_CHAR; } } Pos += CalculateCode( HiByteRange[i][CHN], Code) / NUM_CHAR; return Pos; */ } /****************************************/ /* */ /* Calculate character code */ /* */ /****************************************/ WORD CRefrList::CalculateCode( WORD Start, WORD End) { WORD PageNum = 0; WORD CodeNum = 0; if ( Start >= End ) return 0; PageNum = HIBYTE(End) - HIBYTE(Start); #if 0 if( CountryInfo.LangID == EUDC_CHS){ if( HIBYTE(End)){ WORD LoCode; WORD HiCode; HiCode = End & 0xff00; LoCode = End & 0x00ff; if( LoCode < 0xa0) LoCode = 0xa0; End = HiCode | LoCode; } CodeNum = End - Start - PageNum * 0x00a0; }else CodeNum = End - Start - PageNum * 0x0040; #endif CodeNum = End - Start - PageNum * 0x0040; return CodeNum; } /****************************************/ /* */ /* Calculate code from scroll pos */ /* */ /****************************************/ WORD CRefrList::GetCodeScrPos( int Pos) { short i, StartType, EndType; WORD Code = 0; WORD NumLine = 0, PNumLine = 0; if (Pos == 0) return StartCode; if (Pos >= BottomCode) return ViewEnd; Code = StartCode + Pos * NUM_CHAR; Code &= 0xfff0; return Code; /* if( !Pos) return HiByteRange[1][CHN]; if( Pos >= BottomCode) return ViewEnd; StartType = CheckCharType( HiByteRange[1][CHN]); EndType = CheckCharType( HiByteRange[4][CHN+1]); for( i = StartType; i <= EndType; ++i){ if( i == CHAR_SBCS ) NumLine += (HiByteRange[i][CHN+1] - HiByteRange[i][CHN] + 1) /NUM_CHAR; else NumLine += CalculateCode( HiByteRange[i][CHN],HiByteRange[i][CHN+1])/NUM_CHAR; if( NumLine > Pos){ NumLine = PNumLine; break; } PNumLine = NumLine; } Code = HiByteRange[i][CHN]; Pos -= NumLine; while( Code < HiByteRange[i][CHN+1]){ NumLine = CalculateCode( HiByteRange[i][CHN], Code) /NUM_CHAR; if( Pos <= NumLine){ break; } Code += NUM_CHAR; } Code &= 0xfff0; return Code; */ } /****************************************/ /* */ /* Jump view if editbox get focus */ /* */ /****************************************/ BOOL CRefrList::CodeButtonClicked() { WCHAR CodeValue[15] = {0}; WCHAR CharValue[15] = {0}; WORD Code1, Code2; Code1 = (WORD)0; Code2 = (WORD)0; #ifdef UNICODE ::GetDlgItemTextW(GetParent()->GetSafeHwnd(), IDC_EDITCODE, CodeValue, 15); ::GetDlgItemTextW(GetParent()->GetSafeHwnd(), IDC_EDITCHAR, CharValue, 15); #else CHAR CodeValueA[15]; CHAR CharValueA[15]; ::GetDlgItemText(GetParent()->GetSafeHwnd(), IDC_EDITCODE, CodeValueA, 15); int nchar = ::GetDlgItemText(GetParent()->GetSafeHwnd(), IDC_EDITCHAR, CharValueA, 15); MultiByteToWideChar(CP_ACP, 0, CodeValueA, 4, CodeValue, sizeof(CodeValue)/sizeof(CodeValue[0])); MultiByteToWideChar(CP_ACP, 0, CharValueA, nchar, CharValue, sizeof(CharValue)/sizeof(CharValue[0])); #endif /* ::GetDlgItemTextA( GetParent()->GetSafeHwnd(),IDC_EDITCHAR, CharValue, 15); */ if( CodeValue[0] == '\0' && CharValue[0] == '\0') return TRUE; if( CodeValue[0] == '\0') Code2 = 0xffff; else Code2 = (WORD)wcstol((LPWSTR)CodeValue, (WCHAR **)0, 16); if( CharValue[0] == '\0') Code1 = 0xffff; else Code1 = CharValue[0]; if( CodeFocus){ if( !IsCheckedCode( Code2)) goto Error; SelectCode = Code2; } if( CharFocus){ if( !IsCheckedCode( Code1)) goto Error; SelectCode = Code1; } if( SelectCode >= ViewEnd) ViewStart = ViewEnd; else ViewStart = SelectCode & 0xfff0; BottomCode = (WORD)GetBarPosition((WORD)ViewEnd); this->SetScrollRange( SB_VERT, 0, BottomCode, FALSE); ScrlBarPos = (short)GetBarPosition( ViewStart); this->SetScrollPos( SB_VERT, ScrlBarPos, TRUE); this->InvalidateRect( &CodeListRect, TRUE); this->UpdateWindow(); return TRUE; Error: return FALSE; } /****************************************/ /* */ /* Check Character Code Range */ /* */ /****************************************/ BOOL CRefrList::IsCheckedCode( WORD CodeStock) { WORD Offset; int CharType; int CharType1; /* if(( CharType = CheckCharType( CodeStock)) == CHAR_ETC) return FALSE; CharType1 = CheckCharType( ViewEnd); Offset = CodeStock & 0x00ff; if( CharType == CHAR_SBCS){ if( Offset < LoByteRange[0][CHN]) return FALSE; }else{ if( CharType1 == CHAR_SBCS) return FALSE; if( Offset >= LoByteRange[4][CHN] && Offset <= LoByteRange[4][CHN+1] ) return FALSE; if(( Offset >= LoByteRange[1][CHN] && Offset <= LoByteRange[1][CHN+1]) || ( Offset >= LoByteRange[2][CHN] && Offset <= LoByteRange[2][CHN+1]) || ( Offset >= LoByteRange[3][CHN] && Offset <= LoByteRange[3][CHN+1])){ ; }else return FALSE; } */ return TRUE; } #define FIX_SPACE 6 #define LINEWIDTH 4 /****************************************/ /* * /* Calcurate character size */ /* */ /****************************************/ void CRefrList::CalcCharSize() { char Dummy[] = "FA40"; int Sx; CClientDC dc( this); this->GetClientRect( &CodeListRect); CFont *OldFont = dc.SelectObject( &SysFFont); GetTextExtentPoint32A( dc.GetSafeHdc(), Dummy, 4, &FixSize); FixSize.cx += FIX_SPACE; dc.SelectObject( OldFont); CharSize.cy = ( CodeListRect.Height() - ((NUM_LINE-1)*LINEWIDTH) - 2) /NUM_LINE; CharSize.cx = ( CodeListRect.Width() - FixSize.cx - 2 - (NUM_CHAR*LINEWIDTH)) / NUM_CHAR; for( int i = 0; i < NUM_LINE; i++){ rcReferCode[i].left = 1; rcReferCode[i].top = 1 + i*(CharSize.cy + LINEWIDTH); rcReferCode[i].right = rcReferCode[i].left + FixSize.cx; rcReferCode[i].bottom = rcReferCode[i].top + CharSize.cy; Sx = rcReferCode[i].right + LINEWIDTH; for( int j = 0; j < NUM_CHAR; j++){ rcReferChar[i][j].left = Sx + j*( CharSize.cx + LINEWIDTH); rcReferChar[i][j].top = rcReferCode[i].top; rcReferChar[i][j].right = rcReferChar[i][j].left + CharSize.cx; rcReferChar[i][j].bottom = rcReferChar[i][j].top + CharSize.cy; } } } /****************************************/ /* */ /* MESSAGE "WM_PAINT" */ /* */ /****************************************/ void CRefrList::OnPaint() { register int i, j; WORD Code; HRESULT hresult; CPaintDC dc( this); int BottomCode = GetBarPosition((WORD)ViewEnd); this->SetScrollRange( SB_VERT, 0, BottomCode, FALSE); this->SetScrollPos( SB_VERT, ScrlBarPos, TRUE); // Initialize character code Code = ViewStart; // Change Mapping mode int OldMode = dc.SetMapMode(MM_TEXT); dc.SetViewportOrg( 0, 0); CFont *OldFont = dc.SelectObject( &SysFFont); for( i = 0; i < NUM_LINE; i++){ int xOffset, yOffset; TCHAR Work[5]; int wLength, CharType; // Draw character code on character list to display dc.SelectObject( &SysFFont); //*STRSAFE* wsprintf(Work, _T("%04X"), Code); hresult = StringCchPrintf(Work , ARRAYLEN(Work), _T("%04X"), Code); if (!SUCCEEDED(hresult)) { return ; } dc.SetBkColor( COLOR_FACE); dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); //COLOR_BLACK); if( rcReferCode[i].Height() > FixSize.cy){ yOffset = (rcReferCode[i].Height() - FixSize.cy) /2; }else yOffset = 0; ::ExtTextOut(dc, rcReferCode[i].left + FIX_SPACE/2, rcReferCode[i].top + yOffset, ETO_OPAQUE, &rcReferCode[i], (TCHAR *)Work, 4, NULL); dc.SelectObject( &CharFont); for( j = 0; j < NUM_CHAR; j++ , Code = GetPlusCode( Code, 1)){ WORD Offset; CSize cSize; WCHAR Work1[5]; Work1[0] = Code; Work1[1] = 0; wLength = 1; /* if(( CharType = CheckCharType( Code)) == CHAR_SBCS){ Work[0] = LOBYTE(Code); wLength = 1; }else if( CharType == CHAR_DBCS1 || CharType == CHAR_DBCS2 || CharType == CHAR_EUDC ){ Offset = Code & 0x00ff; if(( Offset <= LoByteRange[1][CHN+1] && Offset >= LoByteRange[1][CHN]) || ( Offset <= LoByteRange[2][CHN+1] && Offset >= LoByteRange[2][CHN]) || ( Offset <= LoByteRange[3][CHN+1] && Offset >= LoByteRange[3][CHN]) ){ Work[0] = (BYTE)((Code>>8) & 0x00ff); Work[1] = (BYTE) (Code & 0x00ff); wLength = 2; }else{ continue; } }else wLength = 0; Work[wLength] = (BYTE)'\0'; #ifdef UNICODE WCHAR wszCodeTemp[2]; wLength = MultiByteToWideChar(dwCodePage, 0, (LPSTR) Work, wLength, wszCodeTemp, 1); Work[0] = LOBYTE(wszCodeTemp[0]); Work[1] = HIBYTE(wszCodeTemp[0]); Work[2] = '\0'; #endif */ BOOL PtIn; if( rcReferChar[i][j].PtInRect( LButtonPt) || SelectCode == Code){ TCHAR CodeNum[10]; // If character is selected by clickking // left button, draw it on dialog PtIn = TRUE; SelectCode = Code; dc.SetBkColor( COLOR_FACE); dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); // COLOR_BLACK); //*STRSAFE* wsprintf((TCHAR *)CodeNum, _T("%04X"), Code); hresult = StringCchPrintf((TCHAR *)CodeNum , ARRAYLEN(CodeNum), _T("%04X"), Code); if (!SUCCEEDED(hresult)) { return ; } if (!CodeFocus) { ::SetDlgItemText(GetParent()->GetSafeHwnd(), IDC_EDITCODE, (LPCTSTR)CodeNum); } if (!CharFocus) { #ifdef UNICODE ::SetDlgItemTextW(GetParent()->GetSafeHwnd(), IDC_EDITCHAR, (LPCWSTR)Work1); #else CHAR Work2[5]; int nchar=WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)Work1, 1, (LPSTR)Work2, sizeof(Work2), 0,0); Work2[nchar]=0; ::SetDlgItemText(GetParent()->GetSafeHwnd(), IDC_EDITCHAR, (LPCSTR)Work2); #endif } }else{ PtIn = FALSE; dc.SetBkColor( COLOR_FACE); dc.SetTextColor(GetSysColor(COLOR_WINDOWTEXT)); // COLOR_BLACK); } BOOL sts = GetTextExtentPoint32W( dc.GetSafeHdc(), (LPCWSTR)Work1, wLength, &cSize); if( rcReferChar[i][j].Width() > cSize.cx){ xOffset = rcReferChar[i][j].Width() - cSize.cx; xOffset /= 2; }else xOffset = 0; if( rcReferChar[i][j].Height() > cSize.cy){ yOffset = rcReferChar[i][j].Height() - cSize.cy; yOffset /= 2; }else yOffset = 0; // Draw character code on character list ExtTextOutW(dc.GetSafeHdc(), rcReferChar[i][j].left + xOffset, rcReferChar[i][j].top + yOffset, ETO_OPAQUE, &rcReferChar[i][j], (LPCWSTR)Work1, wLength, NULL); DrawConcave( &dc, rcReferChar[i][j], PtIn); } } dc.SelectObject( OldFont); dc.SetMapMode(OldMode); LButtonPt.x = 0; LButtonPt.y = 0; } /****************************************/ /* */ /* MESSAGE "WM_VSCROLL" */ /* */ /****************************************/ void CRefrList::OnVScroll( UINT nSBCode, UINT nPos, CScrollBar *pScrollBar) { int MoveScr; BOOL ThumbTrkFlag, ThumbPosFlag; BottomCode = (WORD)GetBarPosition((WORD)ViewEnd); this->SetScrollRange( SB_VERT, 0, BottomCode, FALSE); MoveScr = 0; ThumbTrkFlag = ThumbPosFlag = FALSE; switch( nSBCode){ case SB_LINEDOWN: if(( ViewStart + NUM_CHAR) <= ViewEnd){ MoveScr = 0 - (CharSize.cy + LINEWIDTH); ViewStart = GetPlusCode( ViewStart,NUM_CHAR); ScrlBarPos = (short)GetBarPosition( ViewStart); } break; case SB_LINEUP: if(( ViewStart - NUM_CHAR) >= StartCode){ MoveScr = CharSize.cy + LINEWIDTH; ViewStart = GetMinusCode(ViewStart,NUM_CHAR); ScrlBarPos = (short)GetBarPosition( ViewStart); } break; case SB_PAGEDOWN: if(( ViewStart + NUM_CHAR*NUM_LINE) <= ViewEnd){ MoveScr = ( 0 -(CharSize.cy+LINEWIDTH)) *NUM_LINE; ScrlBarPos = (short)GetBarPosition( ViewStart); ScrlBarPos += NUM_LINE; ViewStart = GetCodeScrPos( ScrlBarPos); }else{ MoveScr = ( 0 -(CharSize.cy+LINEWIDTH)) *NUM_LINE; ViewStart = ViewEnd; ScrlBarPos = (short)GetBarPosition( ViewStart); } break; case SB_PAGEUP: if(( ViewStart - NUM_CHAR*NUM_LINE) >= StartCode && ViewStart >= NUM_CHAR*NUM_LINE){ MoveScr = (CharSize.cy + LINEWIDTH) *NUM_LINE; ScrlBarPos = (short)GetBarPosition( ViewStart); ScrlBarPos -= NUM_LINE; ViewStart = GetCodeScrPos( ScrlBarPos); }else{ MoveScr = (CharSize.cy + LINEWIDTH) *NUM_LINE; ViewStart = StartCode; ScrlBarPos = (short)GetBarPosition( ViewStart); } break; case SB_THUMBPOSITION: ThumbPosFlag = TRUE; ScrlBarPos = (short)nPos; ViewStart = GetCodeScrPos( nPos); break; case SB_THUMBTRACK: ThumbTrkFlag = TRUE; break; case SB_TOP: ViewStart = StartCode; ScrlBarPos = 0; break; case SB_BOTTOM: ViewStart = ViewEnd; ScrlBarPos = BottomCode; break; default: break; } if( abs( MoveScr) <= (CharSize.cy + LINEWIDTH) && abs( MoveScr) > 0 && !ThumbTrkFlag){ CRect ScrllRect; CRect ClintRect; GetClientRect( &ClintRect); ScrllRect.CopyRect( &ClintRect); if( MoveScr < 0){ ClintRect.top = 0 - MoveScr; this->ScrollWindow( 0, MoveScr, &ClintRect, NULL); ScrllRect.top = ( 0-MoveScr)*(NUM_LINE -1); }else{ ClintRect.top = 0; ClintRect.bottom = MoveScr*(NUM_LINE -1); this->ScrollWindow( 0, MoveScr, &ClintRect, NULL); ScrllRect.top = 0; ScrllRect.bottom = ScrllRect.top + MoveScr; } this->InvalidateRect( &ScrllRect, FALSE); }else if( !ThumbTrkFlag && ( MoveScr || ThumbPosFlag)){ this->InvalidateRect( &CodeListRect, TRUE); } this->SetScrollPos( SB_VERT, ScrlBarPos, TRUE); } /****************************************/ /* */ /* MESSAGE "WM_LBUTTONDOWN" */ /* */ /****************************************/ void CRefrList::OnLButtonDown( UINT , CPoint point) { CRect test; BOOL PtIn; unsigned int i, j; PtIn = FALSE; this->SetFocus(); for( i = 0; i < NUM_LINE; i++){ for( j = 0; j < NUM_CHAR; j++){ if( rcReferChar[i][j].PtInRect( point)){ if( IsCorrectChar( i, j)) PtIn = TRUE; break; } } } if( !PtIn){ MessageBeep((UINT)-1); return; } LButtonPt = point; SearchKeyPosition( TRUE); SelectCode = 0; for( i = 0; i < NUM_LINE; i++){ for( j = 0; j < NUM_CHAR; j++){ if( rcReferChar[i][j].PtInRect( LButtonPt)){ test.SetRect( rcReferChar[i][j].left - 2, rcReferChar[i][j].top - 2, rcReferChar[i][j].right + 2, rcReferChar[i][j].bottom + 2); this->InvalidateRect( &test, FALSE); break; } } } this->UpdateWindow(); } /****************************************/ /* */ /* MESSAGE "WM_LBUTTONDBLCLK" */ /* */ /****************************************/ void CRefrList::OnLButtonDblClk( UINT nFlags, CPoint point) { BOOL PtIn; unsigned int i, j; LButtonPt = point; this->InvalidateRect( &CodeListRect, FALSE); this->UpdateWindow(); PtIn = FALSE; this->SetFocus(); for( i = 0; i < NUM_LINE; i++){ for( j = 0; j < NUM_CHAR; j++){ if( rcReferChar[i][j].PtInRect( point)){ if( IsCorrectChar( i, j)) PtIn = TRUE; break; } } } if( !PtIn){ MessageBeep((UINT)-1); return; }else{ GetParent()->PostMessage( WM_COMMAND, IDOK, 0L); } } /****************************************/ /* */ /* MESSAGE "WM_SETCURSOR" */ /* */ /****************************************/ BOOL CRefrList::OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message) { ::SetCursor( AfxGetApp()->LoadStandardCursor(IDC_ARROW)); return TRUE; } /****************************************/ /* */ /* Reset parameter */ /* */ /****************************************/ void CRefrList::ResetParam() { LButtonPt.x = LButtonPt.y = 0; /* SelectCode = HiByteRange[CHAR_SBCS][CHN]; */ SelectCode = 0x0020; ScrlBarPos = 0; this->SetScrollPos( SB_VERT, ScrlBarPos, TRUE); } /****************************************/ /* */ /* Draw Concave ractangle */ /* */ /****************************************/ void CRefrList::DrawConcave( CDC *dc, CRect rect, BOOL PtIn) { CBrush ConBrush, *OldBrush; CRect Rt; if (!dc) { return; } Rt.SetRect( rect.left-1, rect.top-1, rect.right+1, rect.bottom+1); if( !PtIn){ ConBrush.CreateSolidBrush( COLOR_HLIGHT); OldBrush = dc->SelectObject( &ConBrush); dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY); dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY); dc->SelectObject( OldBrush); ConBrush.DeleteObject(); ConBrush.CreateSolidBrush( COLOR_SHADOW); OldBrush = dc->SelectObject( &ConBrush); dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY); dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY); dc->SelectObject( OldBrush); ConBrush.DeleteObject(); if( FocusFlag){ CBrush fBrush; CPen fPen, *OldPen; fBrush.CreateStockObject( NULL_BRUSH); fPen.CreatePen( PS_SOLID, 1, COLOR_FACE); OldBrush = dc->SelectObject( &fBrush); OldPen = dc->SelectObject( &fPen); dc->Rectangle( &rect); dc->SelectObject( OldBrush); dc->SelectObject( OldPen); fBrush.DeleteObject(); fPen.DeleteObject(); } }else{ ConBrush.CreateSolidBrush( COLOR_SHADOW); OldBrush = dc->SelectObject( &ConBrush); dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY); dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY); dc->SelectObject( OldBrush); ConBrush.DeleteObject(); ConBrush.CreateSolidBrush( COLOR_HLIGHT); OldBrush = dc->SelectObject( &ConBrush); dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY); dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY); dc->SelectObject( OldBrush); ConBrush.DeleteObject(); if( FocusFlag){ CBrush fBrush; CPen fPen, *OldPen; fBrush.CreateStockObject( NULL_BRUSH); fPen.CreatePen( PS_SOLID, 1, COLOR_SHADOW); OldBrush = dc->SelectObject( &fBrush); OldPen = dc->SelectObject( &fPen); dc->Rectangle( &rect); dc->SelectObject( OldBrush); dc->SelectObject( OldPen); fBrush.DeleteObject(); fPen.DeleteObject(); } } } /****************************************/ /* */ /* MESSAGE "WM_KEYDOWN" */ /* */ /****************************************/ void CRefrList::OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags) { int sPos; int ePos; if( nChar == VK_UP || nChar == VK_DOWN || nChar == VK_LEFT || nChar == VK_RIGHT){ sPos = GetBarPosition( ViewStart); ePos = GetBarPosition( SelectCode); if( ePos - sPos >= NUM_LINE || ePos < sPos){ ViewStart = SelectCode & 0xfff0; ScrlBarPos = (short)GetBarPosition( ViewStart); this->Invalidate(FALSE); this->UpdateWindow(); } switch( nChar){ case VK_UP: if( SelectCode - NUM_CHAR < StartCode) break; if( SelectCode - NUM_CHAR < ViewStart){ this->SendMessage(WM_VSCROLL, SB_LINEUP, 0); } SearchKeyPosition(FALSE); SelectCode = GetMinusCodeKey( SelectCode, NUM_CHAR); SearchKeyPosition(FALSE); break; case VK_DOWN: if( SelectCode + NUM_CHAR > EndCode) break; if( ePos - sPos >= NUM_LINE - 1){ this->SendMessage(WM_VSCROLL, SB_LINEDOWN, 0); } SearchKeyPosition(FALSE); SelectCode = GetPlusCodeKey( SelectCode, NUM_CHAR); SearchKeyPosition(FALSE); break; case VK_LEFT: if( SelectCode - 1 < StartCode) break; if( SelectCode - 1 < ViewStart){ this->SendMessage(WM_VSCROLL, SB_LINEUP, 0); } SearchKeyPosition(FALSE); SelectCode = GetMinusCodeKey( SelectCode, 1); SearchKeyPosition(FALSE); break; case VK_RIGHT: WORD TmpCode; int TmpPos; if( SelectCode + 1 > EndCode) break; TmpCode = GetPlusCodeKey( SelectCode, 1); sPos = GetBarPosition( ViewStart); ePos = GetBarPosition( SelectCode); TmpPos = GetBarPosition( TmpCode); if( TmpPos - sPos >= NUM_LINE){ this->SendMessage(WM_VSCROLL, SB_LINEDOWN, 0); } SearchKeyPosition(FALSE); SelectCode = GetPlusCodeKey( SelectCode, 1); SearchKeyPosition(FALSE); break; } }else CEdit::OnKeyDown(nChar, nRepCnt, nFlags); } /****************************************/ /* */ /* Search focus position */ /* */ /****************************************/ void CRefrList::SearchKeyPosition( BOOL Flg) { CRect test; int sViewPt, sCodePt; int sType, eType; unsigned int i, j; sViewPt = GetBarPosition( ViewStart); sCodePt = GetBarPosition( SelectCode); if(( sViewPt > sCodePt || abs( sCodePt - sViewPt) >= NUM_LINE) && Flg){ this->Invalidate( FALSE); return; } i = (unsigned int)(sCodePt - sViewPt); j = (unsigned int)(SelectCode & 0x000f); /* sType = CheckCharType( ViewStart); eType = CheckCharType( SelectCode); if( sType != eType && sType != CHAR_SBCS) i++; */ test.SetRect( rcReferChar[i][j].left - 2, rcReferChar[i][j].top - 2, rcReferChar[i][j].right + 2, rcReferChar[i][j].bottom + 2); this->InvalidateRect( &test, FALSE); } /****************************************/ /* */ /* MESSAGE "WM_SETFOCUS" */ /* */ /****************************************/ void CRefrList::OnSetFocus( CWnd* pOldWnd) { CEdit::OnSetFocus(pOldWnd); this->HideCaret(); FocusFlag = TRUE; SearchKeyPosition(TRUE); this->UpdateWindow(); } /****************************************/ /* */ /* SearchCode */ /* */ /****************************************/ BOOL CRefrList::IsCorrectChar( UINT i, UINT j) { int sViewPt, CharType; WORD wCode; WORD sOffset; BOOL flg; flg = FALSE; BottomCode = (WORD)GetBarPosition((WORD)ViewEnd); sViewPt = GetBarPosition( ViewStart); wCode = GetCodeScrPos( sViewPt + i); wCode |= j; /* CharType = CheckCharType( wCode); sOffset = wCode & 0x00ff; if( CharType == CHAR_SBCS){ if( sOffset >= LoByteRange[0][CHN] && sOffset <= LoByteRange[0][CHN+1]) flg = TRUE; }else{ if(( sOffset >= LoByteRange[1][CHN] && sOffset <= LoByteRange[1][CHN+1]) || ( sOffset >= LoByteRange[2][CHN] && sOffset <= LoByteRange[2][CHN+1]) || ( sOffset >= LoByteRange[3][CHN] && sOffset <= LoByteRange[3][CHN+1])) flg = TRUE; } return flg; */ return TRUE; } /****************************************/ /* */ /* Increase key focus */ /* */ /****************************************/ WORD CRefrList::GetPlusCodeKey( WORD Code, int ScrollNum) { /* WORD PrevCode; WORD LowByte, HighByte; WORD LLByte; int CharType; int CharType1, CharType2; int Offset; */ Code += (WORD)ScrollNum; /* PrevCode = (WORD)(Code - (WORD)ScrollNum); CharType1 = CheckCharType( PrevCode); CharType2 = CheckCharType( Code); if( CharType1 != CharType2){ if( CharType1 == CHAR_EUDC) Code = PrevCode; else{ Offset = Code - HiByteRange[CharType1][CHN+1]; Code = (WORD)( HiByteRange[CharType1+1][CHN] +Offset-1); } } CharType = CheckCharType( Code); if( CharType != CHAR_SBCS){ LowByte = Code & 0x00ff; HighByte = Code & 0xff00; LLByte = Code & 0x000f; if( LowByte <= LoByteRange[4][CHN+1] && LowByte >= LoByteRange[4][CHN] ){ LowByte = 0x0040 + LLByte; } Code = ( HighByte | LowByte); }*/ return Code; } /****************************************/ /* */ /* Decrease focus key */ /* */ /****************************************/ WORD CRefrList::GetMinusCodeKey( WORD Code, int ScrollNum) { /* WORD PrevCode; WORD LLByte; int CharType; int CharType1, CharType2; int Offset; */ Code -= (WORD)ScrollNum; /* PrevCode = (WORD)( Code + (WORD)ScrollNum); CharType1 = CheckCharType( Code); CharType2 = CheckCharType( PrevCode); if( CharType1 != CharType2){ if( CharType2 == CHAR_SBCS) return (WORD)HiByteRange[CHAR_SBCS][CHN]; else{ Offset = HiByteRange[CharType2][CHN] - Code; return (WORD)(HiByteRange[CharType2-1][CHN+1]-Offset+1); } } CharType = CheckCharType( Code); if( CharType != CHAR_SBCS){ WORD LowByte; WORD HighByte; WORD Tmp; LowByte = Code & 0x00ff; HighByte = Code & 0xff00; LLByte = Code & 0x000f; if( LowByte <= LoByteRange[4][CHN+1] && LowByte >= LoByteRange[4][CHN] ){ LowByte = 0xf0 + LLByte; Tmp = ( HighByte >> 8); Tmp -= 0x1; HighByte = Tmp << 8; } Code = ( HighByte | LowByte); }*/ return Code; } /****************************************/ /* */ /* MESSAGE "WM_KILLFOCUS" */ /* */ /****************************************/ void CRefrList::OnKillFocus( CWnd* pNewWnd) { CEdit::OnKillFocus(pNewWnd); FocusFlag = FALSE; SearchKeyPosition(TRUE); this->UpdateWindow(); } /****************************************/ /* */ /* MESSAGE "WM_RBUTTONUP" */ /* */ /****************************************/ void CRefrList::OnRButtonUp( UINT nFlags, CPoint point) { GetParent()->SendMessage( WM_CONTEXTMENU, (WPARAM)this->GetSafeHwnd(), 0); } BEGIN_MESSAGE_MAP( CRefListFrame, CStatic) //{{AFX_MSG_MAP( CRefListFrame) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() /****************************************/ /* */ /* Default Constructor */ /* */ /****************************************/ CRefListFrame::CRefListFrame() { } /****************************************/ /* */ /* Destructor */ /* */ /****************************************/ CRefListFrame::~CRefListFrame() { } /****************************************/ /* */ /* MESSAGE "WM_PAINT" */ /* */ /****************************************/ void CRefListFrame::OnPaint() { CRect FrameRect; CPaintDC dc( this); this->GetClientRect( &FrameRect); this->DrawConcave( &dc, FrameRect); } /****************************************/ /* */ /* Draw Concave Rect */ /* */ /****************************************/ void CRefListFrame::DrawConcave( CDC *dc, CRect rect) { CBrush ConBrush, *OldBrush; CRect Rt; Rt.SetRect( rect.left-1, rect.top-1, rect.right, rect.bottom); ConBrush.CreateSolidBrush( COLOR_HLIGHT); OldBrush = dc->SelectObject( &ConBrush); dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY); dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY); dc->SelectObject( OldBrush); ConBrush.DeleteObject(); ConBrush.CreateSolidBrush( COLOR_SHADOW); OldBrush = dc->SelectObject( &ConBrush); dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY); dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY); dc->SelectObject( OldBrush); ConBrush.DeleteObject(); } BEGIN_MESSAGE_MAP( CRefInfoFrame, CStatic) //{{AFX_MSG_MAP( CRefInfoFrame) ON_WM_PAINT() //}}AFX_MSG_MAP END_MESSAGE_MAP() /****************************************/ /* */ /* Default Constructor */ /* */ /****************************************/ CRefInfoFrame::CRefInfoFrame() { } /****************************************/ /* */ /* Destructor */ /* */ /****************************************/ CRefInfoFrame::~CRefInfoFrame() { } /****************************************/ /* */ /* MESSAGE "WM_PAINT" */ /* */ /****************************************/ void CRefInfoFrame::OnPaint() { CRect FrameRect; CPaintDC dc( this); this->GetClientRect( &FrameRect); this->DrawConcave( &dc, FrameRect); } /****************************************/ /* */ /* Draw Concave Rect */ /* */ /****************************************/ void CRefInfoFrame::DrawConcave( CDC *dc, CRect rect) { CBrush ConBrush, *OldBrush; CRect Rt; Rt.SetRect( rect.left-1, rect.top-1, rect.right, rect.bottom); ConBrush.CreateSolidBrush( COLOR_SHADOW); OldBrush = dc->SelectObject( &ConBrush); dc->PatBlt( Rt.left, Rt.top, Rt.Width(), 1, PATCOPY); dc->PatBlt( Rt.left, Rt.top, 1, Rt.Height(), PATCOPY); dc->SelectObject( OldBrush); ConBrush.DeleteObject(); ConBrush.CreateSolidBrush( COLOR_HLIGHT); OldBrush = dc->SelectObject( &ConBrush); dc->PatBlt( Rt.left, Rt.bottom, Rt.Width(), 1, PATCOPY); dc->PatBlt( Rt.right, Rt.top, 1, Rt.Height()+1, PATCOPY); dc->SelectObject( OldBrush); ConBrush.DeleteObject(); }