// CharDlg.cpp : implementation file // #include "stdafx.h" #include "CharDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCharDlg dialog static int g_nTypeIndex = 0; char CCharDlg::m_charGreece[][3] = { "¦¡","¦¢","¦£","¦¤","¦¥","¦¦","¦§", "¦¨","¦©","¦ª","¦«","¦¬","¦­","¦®", "¦¯","¦°","¦±","¦²","¦³","¦´","¦µ", "¦¶","¦·","¦¸","¦Á","¦Â","¦Ã","¦Ä", "¦Å","¦Æ","¦Ç","¦È","¦É","¦Ê","¦Ë", "¦Ì","¦Í","¦Î","¦Ï","¦Ð","¦Ñ","¦Ò", "¦Ó","¦Ô","¦Õ","¦Ö","¦×","¦Ø"}; char CCharDlg::m_charMath[][3] = { "¡Ö","¡Ô","£½","¡Ü","¡Ý","£¼","£¾", "¡Ú","¡Û","¡Ë","¡À","£«","£­","¡Á", "¡Â","£¯","¡Ò","¡Ó","¡Ø","¡Þ","¡Ä", "¡Å","¡Æ","¡Ç","¡È","¡É","¡Ê","¡ß", "¡à","¡Í","¡Î","¡Ï","¡Ð","¡Ñ","¡Õ", "¡×","¡Ì"}; char CCharDlg::m_charSerial[][3] = { "¢±","¢²","¢³","¢´","¢µ","¢¶","¢·", "¢¸","¢¹","¢º","¢»","¢¼","¢½","¢¾", "¢¿","¢À","¢Á","¢Â","¢Ã","¢Ä","¢Å", "¢Æ","¢Ç","¢È","¢É","¢Ê","¢Ë","¢Ì", "¢Í","¢Î","¢Ï","¢Ð","¢Ñ","¢Ò","¢Ó", "¢Ô","¢Õ","¢Ö","¢×","¢Ø","¢Ù","¢Ú", "¢Û","¢Ü","¢Ý","¢Þ","¢ß","¢à","¢á", "¢â","¢å","¢æ","¢ç","¢è","¢é","¢ê", "¢ë","¢ì","¢í","¢î"}; char CCharDlg::m_charRomaSerial[][3] = { "¢ñ","¢ò","¢ó","¢ô","¢õ","¢ö","¢÷", "¢ø","¢ù","¢ú","¢û","¢ü","¢¡","¢¢", "¢£","¢¤","¢¥","¢¦","¢§","¢¨","¢©", "¢ª"}; char CCharDlg::m_charInterpunction[][3] = { "¡£","£¬","¡¢","£»","£º","£¿","£¡", "£®","¡Ã","¡­","¡ª","¡¤","¡¥","¡¦", "¡®","¡¯","¡°","¡±","¡©","¡«","¡¬", "£¢","£§","£à","£ü","¡¨","¡§","¡²", "¡³","¡´","¡µ","¡¶","¡·","¡¸","¡¹", "¡º","¡»","¡¼","¡½","¡¾","¡¿","£¨", "£©","£Û","£Ý","£û","£ý"}; char CCharDlg::m_charSpecific[][3] = { "¡ã","¡ä","¡å","¡ç","¡ê","£¤","¡ë", "£¥","¡æ","¡è","¡é","¡ì","¡í","¡î", "¡ï","¡ð","¡ñ","¡ò","¡ó","¡ô","¡õ", "¡ö","¡÷","¡ø","¡ù","¡ú","¡û","¡ü", "¡ý","¡þ","££","£¦","£À","£Ü","£Þ", "£ß","£þ"}; CCharDlg::CCharDlg(CWnd* pParent /*=NULL*/) : CDialog(CCharDlg::IDD, pParent) { //{{AFX_DATA_INIT(CCharDlg) m_character = _T(""); //}}AFX_DATA_INIT m_left = -1; m_top = -1; } CCharDlg::~CCharDlg() { delete m_pFont; } void CCharDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CCharDlg) DDX_Control(pDX, IDC_COMBO_TYPE, m_combo_type); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CCharDlg, CDialog) //{{AFX_MSG_MAP(CCharDlg) ON_WM_PAINT() ON_WM_LBUTTONUP() ON_CBN_SELCHANGE(IDC_COMBO_TYPE, OnSelchangeComboType) ON_WM_LBUTTONDBLCLK() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCharDlg message handlers BOOL CCharDlg::OnInitDialog() { CDialog::OnInitDialog(); m_indexCombo = 0; m_countChar = 48; CRect rect; CWnd* pWnd = GetDlgItem(IDC_STATIC_FRAME); CDC *pDC = pWnd->GetDC(); pWnd->GetClientRect(rect); m_wndWidth = rect.Width(); m_wndHeight = rect.Height(); m_Hdistance = m_wndWidth / 10; m_Vdistance = m_wndHeight / 6; m_pFont = new CFont; m_pFont->CreateFont(rect.bottom - rect.top, 0, 0, 0, 700, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS, _T("Arial")); m_combo_type.SetCurSel(g_nTypeIndex); OnSelchangeComboType(); UpdateData(false); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CCharDlg::writechar(char pchar[][3],int count) { CWnd* pWnd=GetDlgItem(IDC_STATIC_FRAME); CDC *pDC = pWnd->GetDC(); CFont *pOldFont; CFont *pLargeFont=new CFont; pLargeFont->CreateFont(28, 0, 0, 0, 700, FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH&FF_SWISS, _T("Arial")); pOldFont=(CFont *)pDC->SelectObject(pLargeFont); int i = 0 - (int)(m_Hdistance / 1.1); int l = 0 - (int)(m_Vdistance / 1.1); for(int n = 0; n < count; n++) { if(n % 10 == 0) { i = 0 - int(m_Hdistance / 1.1); l = l + m_Vdistance; } pDC->TextOut(i = i + m_Hdistance, l, pchar[n]); } pDC->SelectObject(pOldFont); delete pLargeFont; } void CCharDlg::OnPaint() { CPaintDC dc(this); // device context for painting CRect rect; CWnd* pWnd = GetDlgItem(IDC_STATIC_FRAME); pWnd->GetClientRect(rect); CDC *pDC = pWnd->GetDC(); CBrush* pNewBrush = new CBrush; pNewBrush->CreateSolidBrush(RGB(255, 255, 255)); CBrush* pOldBrush = pDC->SelectObject(pNewBrush); pDC->Rectangle(rect); pDC->SelectObject(pOldBrush); delete pNewBrush; drawPane(); switch(m_indexCombo) { case 0: writechar(m_charGreece, m_countChar); break; case 1: writechar(m_charMath, m_countChar); break; case 2: writechar(m_charRomaSerial, m_countChar); break; case 3: writechar(m_charSerial, m_countChar); break; case 4: writechar(m_charInterpunction, m_countChar); break; case 5: writechar(m_charSpecific, m_countChar); break; } if(m_left >= 0 && m_top >= 0) { drawSmallPane(); } // Do not call CDialog::OnPaint() for painting messages } BOOL CCharDlg::Check(CPoint point) { CRect rect; CWnd* pWnd = GetDlgItem(IDC_STATIC_FRAME); pWnd->GetWindowRect(rect); ScreenToClient(&rect); CRgn* myRgn=new CRgn(); myRgn->CreateRectRgnIndirect(rect); if(myRgn->PtInRegion(point)) { int i,j; i = point.x / m_Hdistance - 1; j = point.y / m_Vdistance - 1; i = j * 10 + i; switch(m_indexCombo) { case 0: if(i < 48) m_character = m_charGreece[i]; else m_character = ""; break; case 1: if(i < 40) m_character=m_charMath[i]; else m_character = ""; break; case 2: if(i < 22) m_character = m_charRomaSerial[i]; else m_character = ""; break; case 3: if(i < 60) m_character = m_charSerial[i]; else m_character = ""; break; case 4: if(i < 47) m_character = m_charInterpunction[i]; else m_character = ""; break; case 5: if(i < 37) m_character = m_charSpecific[i]; else m_character = ""; break; } } else return FALSE; delete myRgn; return TRUE; } void CCharDlg::OnLButtonDblClk(UINT nFlags, CPoint point) { if(!Check(point)) return; g_nTypeIndex = m_combo_type.GetCurSel(); CDialog::OnLButtonDblClk(nFlags, point); CDialog::OnOK(); } void CCharDlg::OnLButtonUp(UINT nFlags, CPoint point) { if(!Check(point)) return; CRect rect; CWnd* pWnd=GetDlgItem(IDC_STATIC_FRAME); pWnd->GetWindowRect(rect); ScreenToClient(&rect); if(m_left >= 0 && m_top >= 0) delSmallPane(); m_left = ((point.x - rect.left) / m_Hdistance) * m_Hdistance; m_top = ((point.y - rect.top) / m_Vdistance) * m_Vdistance; drawSmallPane(); CRect rect2; pWnd->GetClientRect(rect2); CDC *pDC = pWnd->GetDC(); pDC->MoveTo(rect2.right - 1, rect2.top); //»­±ß´ÖÏß pDC->LineTo(rect2.right - 1, rect2.bottom); pDC->MoveTo(rect2.left, rect2.bottom - 1); pDC->LineTo(rect2.right, rect2.bottom - 1); CDialog::OnLButtonUp(nFlags, point); } void CCharDlg::drawPane() { CWnd* pWnd=GetDlgItem(IDC_STATIC_FRAME); CDC *pDC = pWnd->GetDC(); int i, j; m_pen.DeleteObject(); m_pen.CreatePen(PS_SOLID, 1, RGB(0 , 0 ,0)); pDC->SelectObject(m_pen); for(j = 0; j <= m_wndHeight; j = j + m_Vdistance) { pDC->MoveTo(0, j); pDC->LineTo(m_wndWidth, j); } for(i = 0; i <= m_wndWidth ; i = i + m_Hdistance) { pDC->MoveTo(i, 0); pDC->LineTo(i, m_wndHeight); } } void CCharDlg::drawSmallPane() { CWnd* pWnd=GetDlgItem(IDC_STATIC_FRAME); CDC *pDC = pWnd->GetDC(); m_pen.DeleteObject(); m_pen.CreatePen(PS_SOLID,1,RGB(0, 0, 0)); pDC->SelectObject(m_pen); pDC->MoveTo(m_left + m_Hdistance, m_top + 1); pDC->LineTo(m_left + 1, m_top + 1); pDC->LineTo(m_left + 1, m_top + m_Vdistance); m_pen.DeleteObject(); m_pen.CreatePen(PS_SOLID,2,RGB(220, 220, 220)); pDC->SelectObject(m_pen); pDC->MoveTo(m_left + m_Hdistance - 1, m_top + 1); pDC->LineTo(m_left + m_Hdistance -1, m_top + m_Vdistance -1 ); pDC->LineTo(m_left + 1, m_top + m_Vdistance -1 ); m_pen.DeleteObject(); m_pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); pDC->SelectObject(m_pen); pDC->MoveTo(m_left, m_top); pDC->LineTo(m_left, m_top + m_Vdistance); pDC->LineTo(m_left + m_Hdistance, m_top + m_Vdistance); pDC->LineTo(m_left + m_Hdistance, m_top); pDC->LineTo(m_left, m_top); } void CCharDlg::delSmallPane() { CWnd* pWnd=GetDlgItem(IDC_STATIC_FRAME); CDC *pDC = pWnd->GetDC(); m_pen.DeleteObject(); m_pen.CreatePen(PS_SOLID,2,RGB(255, 255, 255)); pDC->SelectObject(m_pen); pDC->MoveTo(m_left + m_Hdistance, m_top + 1); pDC->LineTo(m_left + 1, m_top + 1); pDC->LineTo(m_left + 1, m_top + m_Vdistance); pDC->MoveTo(m_left + m_Hdistance - 1, m_top + 1); pDC->LineTo(m_left + m_Hdistance -1, m_top + m_Vdistance -1 ); pDC->LineTo(m_left + 1, m_top + m_Vdistance -1 ); m_pen.DeleteObject(); m_pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); pDC->SelectObject(m_pen); pDC->MoveTo(m_left , m_top); pDC->LineTo(m_left, m_top + m_Vdistance); pDC->LineTo(m_left + m_Hdistance, m_top + m_Vdistance); pDC->LineTo(m_left + m_Hdistance, m_top); pDC->LineTo(m_left, m_top); } void CCharDlg::OnSelchangeComboType() { if(m_left >= 0 && m_top >= 0) delSmallPane(); m_left = -1, m_top = -1; switch( m_combo_type.GetCurSel() ) { case 0 : m_indexCombo = 0; m_countChar = 48; OnPaint(); break; case 1 : m_indexCombo = 1; m_countChar = 40; OnPaint(); break; case 2 : m_indexCombo = 2; m_countChar = 22; OnPaint(); break; case 3 : m_indexCombo = 3; m_countChar = 60; OnPaint(); break; case 4 : m_indexCombo = 4; m_countChar = 47; OnPaint(); break; case 5 : m_indexCombo = 5; m_countChar = 37; OnPaint(); break; } } void CCharDlg::OnCancel() { m_character = ""; CDialog::OnCancel(); } void CCharDlg::OnOK() { g_nTypeIndex = m_combo_type.GetCurSel(); CDialog::OnOK(); } bool GetSpecialChar(CWnd*pParent,CString &res) { CTemporaryResourceOverride vTemp; CCharDlg dlg(pParent); if(dlg.DoModal() != IDOK || dlg.m_character == "") return false; res=dlg.m_character; return true; }