Files
envi-code/SourceCode/Code2026/tg_shs/shs_TwtAnotate/CharDlg.cpp
T

449 lines
11 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
// CharDlg.cpp : implementation file
2026-09-28 15:28:50 +08:00
//
#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;
2026-10-04 00:04:20 +08:00
char CCharDlg::m_charGreece[][3] = { "Α","Β","Γ","Δ","Ε","Ζ","Η",
"Θ","Ι","Κ","Λ","Μ","Ν","Ξ",
"Ο","Π","Ρ","Σ","Τ","Υ","Φ",
"Χ","Ψ","Ω","α","β","γ","δ",
"ε","ζ","η","θ","ι","κ","λ",
"μ","ν","ξ","ο","π","ρ","σ",
"τ","υ","φ","χ","ψ","ω"};
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
char CCharDlg::m_charMath[][3] = { "≈","≡","=","≤","≥","<",">",
"≮","≯","∷","±","+","-","×",
"÷","/","∫","∮","∝","∞","∧",
"∨","∑","∏","∪","∩","∈","∵",
"∴","⊥","∥","∠","⌒","⊙","≌",
"∽","√"};
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
char CCharDlg::m_charSerial[][3] = { "⒈","⒉","⒊","⒋","⒌","⒍","⒎",
"⒏","⒐","⒑","⒒","⒓","⒔","⒕",
"⒖","⒗","⒘","⒙","⒚","⒛","⑴",
"⑵","⑶","⑷","⑸","⑹","⑺","⑻",
"⑼","⑽","⑾","⑿","⒀","⒁","⒂",
"⒃","⒄","⒅","⒆","⒇","①","②",
"③","④","⑤","⑥","⑦","⑧","⑨",
"⑩","㈠","㈡","㈢","㈣","㈤","㈥",
"㈦","㈧","㈨","㈩"};
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
char CCharDlg::m_charRomaSerial[][3] = { "Ⅰ","Ⅱ","Ⅲ","Ⅳ","Ⅴ","Ⅵ","Ⅶ",
"Ⅷ","Ⅸ","Ⅹ","Ⅺ","Ⅻ","ⅰ","ⅱ",
"ⅲ","ⅳ","ⅴ","ⅵ","ⅶ","ⅷ","ⅸ",
"ⅹ"};
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
char CCharDlg::m_charInterpunction[][3] = { "。",",","、",";",":","?","!",
".","∶","…","—","·","ˉ","ˇ",
"‘","’","“","”","々","~","‖",
""","'","`","|","〃","¨","〔",
"〕","〈","〉","《","》","「","」",
"『","』","〖","〗","【","】","(",
")","[","]","{","}"};
2026-09-28 15:28:50 +08:00
2026-10-04 00:04:20 +08:00
char CCharDlg::m_charSpecific[][3] = { "°","′","″","$","£","¥","‰",
"%","℃","¤","¢","§","№","☆",
"★","○","●","◎","◇","◆","□",
"■","△","▲","※","→","←","↑",
"↓","〓","#","&","@","\","^",
"_"," ̄"};
2026-09-28 15:28:50 +08:00
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();
2026-10-04 00:04:20 +08:00
pDC->MoveTo(rect2.right - 1, rect2.top); //画边粗线
2026-09-28 15:28:50 +08:00
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;
}