📄 richeditdlg.cpp
字号:
// RichEditDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Controls.h"
#include "RichEditDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
struct FONTDATA
{
CString strFont;
CComboBoxEx *FontBox;
CRichEditDlg *Papa;
};
#define EDIT_STYLES ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN
#define EDIT_EX_STYLES WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE
/////////////////////////////////////////////////////////////////////////////
// CRichEditDlg property page
IMPLEMENT_DYNCREATE(CRichEditDlg, CPropertyPage)
CRichEditDlg::CRichEditDlg() : CPropertyPage(CRichEditDlg::IDD)
{
//{{AFX_DATA_INIT(CRichEditDlg)
m_nFormatItalic = FALSE;
m_nFormatBold = FALSE;
m_nFormatStrikout = FALSE;
m_nFormatUnderline = FALSE;
m_nParaAlign = 0;
m_nParaIndentBullets = FALSE;
//}}AFX_DATA_INIT
m_clrBack = GetSysColor (COLOR_WINDOW);
for (int i = 0; i < 16; ++i)
m_clrCustom[i] = RGB (0xff, 0xff, 0xff);
m_psp.dwFlags &= ~PSP_HASHELP;
}
CRichEditDlg::~CRichEditDlg()
{
}
void CRichEditDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CRichEditDlg)
DDX_Control(pDX, IDC_INDENTBULLETS, m_ctlParaIndentBullets);
DDX_Control(pDX, IDC_POINTBOX, m_ctlPointBox);
DDX_Control(pDX, IDC_FONTBOX, m_ctlFontBox);
DDX_Control(pDX, IDC_PARAGRAPHRIGHT, m_ctlParaRight);
DDX_Control(pDX, IDC_PARAGRAPHCENTER, m_ctlParaCenter);
DDX_Control(pDX, IDC_PARAGRAPHLEFT, m_ctlParaLeft);
DDX_Control(pDX, IDC_INDENTMORE, m_ctlParaIndentMore);
DDX_Control(pDX, IDC_INDENTLESS, m_ctlParaIndentLess);
DDX_Control(pDX, IDC_FORMATUNDERLINE, m_ctlFormatUnderline);
DDX_Control(pDX, IDC_FORMATSTRIKEOUT, m_ctlFormatStrikeout);
DDX_Control(pDX, IDC_FORMATITALIC, m_ctlFormatItalic);
DDX_Control(pDX, IDC_FORMATBOLD, m_ctlFormatBold);
DDX_Control(pDX, IDC_RICH_SAMPLE, m_RichSample);
DDX_Check(pDX, IDC_FORMATITALIC, m_nFormatItalic);
DDX_Check(pDX, IDC_FORMATBOLD, m_nFormatBold);
DDX_Check(pDX, IDC_FORMATSTRIKEOUT, m_nFormatStrikout);
DDX_Check(pDX, IDC_FORMATUNDERLINE, m_nFormatUnderline);
DDX_Radio(pDX, IDC_PARAGRAPHLEFT, m_nParaAlign);
DDX_Check(pDX, IDC_INDENTBULLETS, m_nParaIndentBullets);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CRichEditDlg, CPropertyPage)
//{{AFX_MSG_MAP(CRichEditDlg)
ON_BN_CLICKED(IDC_RICHSETCOLOR, OnRichsetcolor)
ON_WM_PAINT()
ON_CBN_SELCHANGE(IDC_FONTBOX, OnSelchangeFontbox)
ON_CBN_SELCHANGE(IDC_POINTBOX, OnSelchangePointbox)
ON_BN_CLICKED(IDC_RICHSETTEXTCOLOR, OnRichsettextcolor)
ON_BN_CLICKED(IDC_FORMATBOLD, OnFormatBold)
ON_BN_CLICKED(IDC_FORMATITALIC, OnFormatItalic)
ON_BN_CLICKED(IDC_FORMATSTRIKEOUT, OnFormatStrikeout)
ON_BN_CLICKED(IDC_FORMATUNDERLINE, OnFormatUnderline)
ON_BN_CLICKED(IDC_PARAGRAPHLEFT, OnParagraphleft)
ON_BN_CLICKED(IDC_PARAGRAPHCENTER, OnParagraphcenter)
ON_BN_CLICKED(IDC_PARAGRAPHRIGHT, OnParagraphright)
ON_BN_CLICKED(IDC_INDENTLESS, OnIndentless)
ON_BN_CLICKED(IDC_INDENTMORE, OnIndentmore)
ON_BN_CLICKED(IDC_INDENTBULLETS, OnIndentbullets)
ON_NOTIFY(EN_MSGFILTER, IDC_RICH_SAMPLE, OnMsgfilterRichSample)
ON_NOTIFY(CBEN_GETDISPINFO, IDC_FONTBOX, OnGetdispinfoFontbox)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CRichEditDlg message handlers
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CPropertyPage::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_UPDATE flag ORed into the lParam mask.
BOOL CRichEditDlg::OnInitDialog()
{
//DWORD mask;
//RECT r;
CPropertyPage::OnInitDialog();
long mask = m_RichSample.GetEventMask();
m_RichSample.SetEventMask (mask | ENM_UPDATE | ENM_KEYEVENTS | ENM_MOUSEEVENTS | ENM_SCROLLEVENTS);
m_CharFormat.dwEffects &= ~(CFM_ITALIC | CFM_BOLD | CFM_UNDERLINE
| CFM_STRIKEOUT | CFM_COLOR | CFM_SIZE | CFM_FACE);
HICON hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_FORMATBOLD),
IMAGE_ICON,
16, 16, 0);
m_ctlFormatBold.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_FORMATITALIC),
IMAGE_ICON,
16, 16, 0);
m_ctlFormatItalic.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_FORMATUNDERLINE),
IMAGE_ICON,
16, 16, 0);
m_ctlFormatUnderline.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_FORMATSTRIKEOUT),
IMAGE_ICON,
16, 16, 0);
m_ctlFormatStrikeout.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_PARAGRAPHLEFT),
IMAGE_ICON,
16, 16, 0);
m_ctlParaLeft.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_PARAGRAPHCENTER),
IMAGE_ICON,
16, 16, 0);
m_ctlParaCenter.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_PARAGRAPHRIGHT),
IMAGE_ICON,
16, 16, 0);
m_ctlParaRight.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_INDENTMORE),
IMAGE_ICON,
16, 16, 0);
m_ctlParaIndentMore.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_INDENTLESS),
IMAGE_ICON,
16, 16, 0);
m_ctlParaIndentLess.SetIcon (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_INDENTBULLETS),
IMAGE_ICON,
16, 16, 0);
m_ctlParaIndentBullets.SetIcon (hIcon);
DeleteObject (hIcon);
m_imageFonts.Create (16, 16, ILC_MASK, 2, 2);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_TRUETYPEFONTS),
IMAGE_ICON, 16, 16, 0);
m_imageFonts.Add (hIcon);
DeleteObject (hIcon);
hIcon = (HICON) LoadImage (AfxGetInstanceHandle (),
MAKEINTRESOURCE (IDI_PRINTERFONTS),
IMAGE_ICON, 16, 16, 0);
m_imageFonts.Add (hIcon);
DeleteObject (hIcon);
m_ctlFontBox.SetImageList (&m_imageFonts);
//
// Get an enumerated list of fonts and place them
// in a sorted list.
//
CWindowDC dc(this);
FONTDATA fd;
CString strFont = _T("Times New Roman");
fd.FontBox = &m_ctlFontBox;
fd.strFont = strFont;
fd.Papa = this;
::EnumFontFamilies ((HDC) dc, NULL, (FONTENUMPROC) AddFontName, (LPARAM) &fd);
//
// Use the sorted list to load the font combo box.
//
int nCount = m_FontData.GetCount ();
POSITION pos = m_FontData.GetHeadPosition ();
CFontData font = m_FontData.GetHead ();
for (int n = 0; pos != NULL; ++n)
{
font = m_FontData.GetNext (pos);
COMBOBOXEXITEM cbi;
memset (&cbi, '\0', sizeof (COMBOBOXEXITEM));
cbi.iItem = n;
cbi.mask = CBEIF_IMAGE | CBEIF_TEXT | CBEIF_SELECTEDIMAGE | CBS_SORT;
cbi.iImage = font.m_nIcon;
cbi.iSelectedImage = font.m_nIcon;
// cbi.pszText = (char *) (LPCSTR) font.m_strName;
cbi.pszText = LPSTR_TEXTCALLBACK;
m_ctlFontBox.InsertItem (&cbi);
if (!font.m_strName.CompareNoCase (strFont))
m_ctlFontBox.SetCurSel (n);
}
CHARFORMAT cf;
memset (&cf,'\0', sizeof (CHARFORMAT));
strcpy (cf.szFaceName, _T("Times New Roman"));
cf.yHeight = 20 * 10;
cf.dwMask = CFM_FACE | CFM_SIZE;
m_RichSample.SetDefaultCharFormat (cf);
m_RichSample.SetSel (-1, -1);
m_ctlPointBox.SelectString (-1, _T("10"));
m_RichSample.ReplaceSel (_T(""));
m_RichSample.SetFocus ();
return FALSE;
}
void CRichEditDlg::OnRichsetcolor()
{
CColorDialog cc (m_clrBack);
cc.m_cc.lpCustColors = m_clrCustom;
if (cc.DoModal () == IDCANCEL)
return;
m_clrBack = cc.GetColor();
m_RichSample.SetBackgroundColor (false, m_clrBack);
m_RichSample.SetFocus ();
}
void CRichEditDlg::OnRichsettextcolor()
{
CHARFORMAT cf;
memset (&cf, '\0', sizeof (CHARFORMAT));
cf.dwMask = CFM_COLOR;
m_RichSample.GetSelectionCharFormat (cf);
CColorDialog cc (cf.crTextColor);
cc.m_cc.lpCustColors = m_clrCustom;
if (cc.DoModal () == IDCANCEL)
return;
cf.dwMask = CFM_COLOR;
cf.dwEffects &= ~CFE_AUTOCOLOR;
cf.crTextColor = cc.GetColor ();
m_RichSample.SetSelectionCharFormat (cf);
m_RichSample.SetFocus ();
}
void CRichEditDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
CFont *font = GetFont ();
LOGFONT lf;
font->GetLogFont (&lf);
lf.lfEscapement = 600;
lf.lfOrientation = 600;
lf.lfQuality = PROOF_QUALITY;
lf.lfUnderline = TRUE;
strcpy (lf.lfFaceName, "Arial Bold");
CFont SlantFont;
SlantFont.CreateFontIndirect (&lf);
CFont *fontOld = dc.SelectObject (&SlantFont);
CRect rc;
m_ctlFormatBold.GetWindowRect (&rc);
ScreenToClient (&rc);
CString text = "Bold";
dc.SetTextAlign (TA_BASELINE);
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlFormatItalic.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "Italic";
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlFormatUnderline.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "Underline";
CSize sz = dc.GetTextExtent(text);
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlFormatStrikeout.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "Strikeout";
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlParaLeft.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "Left";
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlParaRight.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "Right";
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlParaCenter.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "Center";
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlParaIndentLess.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "Less";
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlParaIndentMore.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "More";
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
m_ctlParaIndentBullets.GetWindowRect (&rc);
ScreenToClient (&rc);
text = "Bullets";
dc.TextOut (rc.left + (rc.right - rc.left) / 2, rc.top - 2, text);
dc.SelectObject (fontOld);
}
int CALLBACK CRichEditDlg::AddFontName(ENUMLOGFONT *lpelfe, NEWTEXTMETRIC *lpntme, int FontType, LPARAM lParam)
{
static int nItem = 0;
FONTDATA *fd = (FONTDATA *) lParam;
CFontData font;
CRichEditDlg *edit = fd->Papa;
font.m_strName = lpelfe->elfLogFont.lfFaceName;
switch (FontType)
{
case RASTER_FONTTYPE:
case DEVICE_FONTTYPE:
font.m_nIcon = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -