⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mtextdlg.cpp

📁 mtext,编辑器,支持潜入对象
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// MtextDlg.cpp : implementation file
//

#include "stdafx.h"
#include "MtextDlg.h"
#include "FormatTabDlg.h"
#include "StackStyleDlg.h"
#include "MTextWidthSetDlg.h"
///////////////////////////////
#include "afxpriv.h"
#include "zwstack.h"
#include "Atlbase.h"
////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//来自
#include "icad.h"
#include "IcadApi.h"
#include "MTextPropSheet.h"
#include "resource.hm"
#include "paths.h"
#include "truetypeutils.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMTextDlg dialog

#define HEIGHT_COEF 1.34
#define TWIPS_PER_INCH 1440.0
#define DDXM_BLANK INT_MAX
//Modified Cybage AW 30/04/2001 [
//Reason : A constant view object is maintained for the 
//text editor, so that it is not affected by zoom factors
#define MIDWIN_0				384
#define MIDWIN_1				142
#define CENTERPROJECTION_0		6.24334	
#define CENTERPROJECTION_1		4.5
#define PIXELHEIGHT				-0.0316901
#define PIXELWIDTH				0.0316901
#define VIEWSIZE				9.0
//Modified Cybage AW 30/04/2001 ]


/****************************************************************************
* Author:		Denis Petrov
* Description:	Converts height in units into height in twips 
*				(1 twip = 1 / 1440 inch)
****************************************************************************/
void CMTextDlg::ConvertTextHeightToTwips(sds_real realHeight, long& twipsHeight)
{
	ASSERT(realHeight >= 0.0);

	//Modified Cybage AW 30/04/2001[
	//Reason : The current Zoom factor is applied on the text editor. To remove
	//this bug the values needed for coordinate conversion are hard coded in the 
	//view object.
//	struct gr_view* pView = SDS_CURGRVW;


	struct gr_view* pView = new gr_view;

	
	pView->midwin[0] = MIDWIN_0;
		pView->midwin[1] = MIDWIN_1;
	
		sds_point centerProjection;
		centerProjection[0] = CENTERPROJECTION_0;
		centerProjection[1] = CENTERPROJECTION_1;
		centerProjection[2] = 0.0;
		pView->SetCenterProjection(centerProjection);
		
		pView->SetPixelHeight(PIXELHEIGHT);
		pView->SetPixelWidth(PIXELWIDTH);
	
		pView->viewsize = VIEWSIZE;
		//Modified Cybage AW 30/04/2001 ]

	


	int pixelsHeight, pixelsPerInch = 96;
	ConvertTextHeightToPix(realHeight, pView, pixelsHeight);
	

	HDC hdcDisplay = CreateDC("DISPLAY", NULL, NULL, NULL);
	if(hdcDisplay)
		pixelsPerInch = GetDeviceCaps(hdcDisplay, LOGPIXELSY);
	DeleteDC(hdcDisplay);
	twipsHeight = long(HEIGHT_COEF * TWIPS_PER_INCH * (double)pixelsHeight / (double)pixelsPerInch + 0.5);
	
	//Modified Cybage AW 30/04/2001
	delete pView;
}

/****************************************************************************
* Author:		Denis Petrov
* Description:	Converts height in twips into height in units
*				(1 twip = 1 / 1440 inch)
****************************************************************************/
void CMTextDlg::ConvertTwipsToTextHeight(sds_real& realHeight, long twipsHeight)
{
	ASSERT(twipsHeight >= 0);
	//Modified Cybage AW 30/04/2001[
	//Reason : The current Zoom factor is applied on the text editor. To remove
	//this bug the values needed for coordinate conversion are hard coded in the 
	//view object.
//	struct gr_view* pView = SDS_CURGRVW;
	
	
	struct gr_view* pView = new gr_view;
		
		
			pView->midwin[0] = MIDWIN_0;
				pView->midwin[1] = MIDWIN_1;
			
				sds_point centerProjection;
				centerProjection[0] = CENTERPROJECTION_0;
				centerProjection[1] = CENTERPROJECTION_1;
				centerProjection[2] = 0.0;
				pView->SetCenterProjection(centerProjection);
				
				pView->SetPixelHeight(PIXELHEIGHT);
				pView->SetPixelWidth(PIXELWIDTH);
			
				pView->viewsize = VIEWSIZE;
				//Modified Cybage AW 30/04/2001 ]
	
	
	

	int pixelsHeight, pixelsPerInch = 96;
	HDC hdcDisplay = CreateDC("DISPLAY", NULL, NULL, NULL);
	if(hdcDisplay)
		pixelsPerInch = GetDeviceCaps(hdcDisplay, LOGPIXELSY);
	DeleteDC(hdcDisplay);
	pixelsHeight = long((double)twipsHeight * (double)pixelsPerInch / (HEIGHT_COEF * TWIPS_PER_INCH) + 0.5);
	ConvertPixToTextHeight(realHeight, pView, pixelsHeight);

	//Modified Cybage AW 30/04/2001
	delete pView;
}

/////////////////////////////////////////////////////////////////////////////



#if _MFC_VER == 0x0400 || _MFC_VER == 0x0410

#define WM_SOCKET_NOTIFY  0x0373
#define WM_SOCKET_DEAD    0x0374

#endif
#define WM_KICKIDLE       0x036A


CMTextDlg::CMTextDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMTextDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMTextDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	m_pRichEditOle=NULL;
	m_lpObject=NULL;
	m_lpStorage=NULL;
	m_lpClientSite=NULL;
	m_pDataObject=NULL;
	m_CurrentSelStackIndex=-1;
	m_dcTarget.m_hDC=NULL;
//	if (!AfxOleInit())
//	{
//		AfxMessageBox("FAILD");
//		return ;//FALSE;
//	}

	if (LoadLibrary(_T("riched20.dll")) == NULL)
	{
		AfxMessageBox("FAILD", MB_OK|MB_ICONEXCLAMATION);
		return ;//FALSE;
	}
	//	LoadLibrary("riched20.dll");
	AfxInitRichEdit();
}
CMTextDlg::CMTextDlg(UINT nIDCaption, SDS_mTextData *dataPtr, CWnd *pParentWnd, UINT iSelectPage)
: CDialog(CMTextDlg::IDD, pParentWnd)
{
	m_pMTextData = dataPtr;
	m_pRichEditOle=NULL;
	m_lpObject=NULL;
	m_lpStorage=NULL;
	m_lpClientSite=NULL;
	m_pDataObject=NULL;
	m_CurrentSelStackIndex=-1;
	m_bIsOK=FALSE;
	m_bIsTransparent=FALSE;
	m_dcTarget.m_hDC=NULL;
	m_iStackAlign=Align_Top;
	m_iLineSpaceStyle=0;
	m_dLineSpace=1.0;
	//	if (!AfxOleInit())
	//	{
	//		AfxMessageBox("FAILD");
	//		return ;//FALSE;
	//	}
	
	if (LoadLibrary(_T("riched20.dll")) == NULL)
	{
		AfxMessageBox("FAILD", MB_OK|MB_ICONEXCLAMATION);
		return ;//FALSE;
	}

	//	LoadLibrary("riched20.dll");
	AfxInitRichEdit();
//	PRINTINFO_LINE_PRE;
//	PRINTINFO_LINE;
}

void CMTextDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMTextDlg)
	DDX_Control(pDX, IDC_RICHEDIT_MText, m_ctlRichText);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMTextDlg, CDialog)
	//{{AFX_MSG_MAP(CMTextDlg)
	ON_WM_SIZING()
	ON_WM_SIZE()
	ON_WM_NCLBUTTONDBLCLK()
	ON_COMMAND(ID_CHAR_BOLD, OnCharBold)
	ON_COMMAND(ID_CHAR_ITALIC, OnCharItalic)
	ON_COMMAND(ID_CHAR_UNDERLINE, OnCharUnderline)
	ON_UPDATE_COMMAND_UI(ID_CHAR_BOLD, OnUpdateCharBold)
	ON_UPDATE_COMMAND_UI(ID_CHAR_ITALIC, OnUpdateCharItalic)
	ON_UPDATE_COMMAND_UI(ID_CHAR_UNDERLINE, OnUpdateCharUnderline)
	ON_COMMAND(ID_EditUndo, OnEditUndo)
	ON_COMMAND(ID_EditRedo, OnEditRedo)
	ON_UPDATE_COMMAND_UI(ID_EditUndo, OnUpdateEditUndo)
	ON_UPDATE_COMMAND_UI(ID_EditRedo, OnUpdateEditRedo)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_EditAutoUPCASE, OnEditAutoUPCASE)
	ON_COMMAND(ID_EditCut, OnEditCut)
	ON_COMMAND(ID_EditCOPY, OnEditCOPY)
	ON_COMMAND(ID_EditDegree, OnEditDegree)
	ON_COMMAND(ID_EditDelFormat, OnEditDelFormat)
	ON_COMMAND(ID_EditDiameter, OnEditDiameter)
	ON_COMMAND(ID_EditFindR, OnEditFindR)
	ON_COMMAND(ID_EditOther, OnEditOther)
	ON_COMMAND(ID_EditPast, OnEditPast)
	ON_COMMAND(ID_EditPlus, OnEditPlus)
	ON_COMMAND(ID_EditPutWord, OnEditPutWord)
	ON_COMMAND(ID_EditSelectALL, OnEditSelectALL)
	ON_COMMAND(ID_EditTable, OnEditTable)
	ON_COMMAND(ID_EditBlackSpace, OnEditBlackSpace)
	ON_COMMAND(ID_EditCombineP, OnEditCombineP)
	ON_COMMAND(ID_EditAlignL, OnEditAlignL)
	ON_COMMAND(ID_EditAlignC, OnEditAlignC)
	ON_COMMAND(ID_EditAlignR, OnEditAlignR)
	ON_COMMAND(ID_EditAlignL_C, OnEditAlignL_C)
	ON_COMMAND(ID_EditAlignC_C, OnEditAlignC_C)
	ON_COMMAND(ID_EditAlignR_C, OnEditAlignR_C)
	ON_COMMAND(ID_EditAlignL_D, OnEditAlignL_D)
	ON_COMMAND(ID_EditAlignC_D, OnEditAlignC_D)
	ON_COMMAND(ID_EditAlignR_D, OnEditAlignR_D)
	ON_COMMAND(ID_EditChangeLOWCASE, OnEditChangeLOWCASE)
	ON_COMMAND(ID_EditChangeUPCASE, OnEditChangeUPCASE)
	ON_COMMAND(ID_Stack, OnStack)
	ON_UPDATE_COMMAND_UI(ID_Stack, OnUpdateStack)
	ON_COMMAND(ID_StackStyle, OnStackStyle)
	ON_COMMAND(ID_UndoStack, OnStack)
	ON_COMMAND(ID_BUTTON_OK, OnOkButton)
	ON_WM_DESTROY()
	ON_COMMAND(ID_Transparent, OnTransparent)
	ON_COMMAND(ID_MTextWithSet, OnMTextWithSet)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_KICKIDLE, OnKickIdle)
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
	ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMTextDlg message handlers
void CMTextDlg::OnSizing(UINT fwSide, LPRECT pRect) 
{
	//	CMTextDlg::OnSizing(fwSide, pRect);
	//MessageBox("asf");
	//this->SetWindowPos(&wndTop,pRect->left,pRect->top,pRect->right-pRect->left,pRect->bottom-pRect->top,SWP_DEFERERASE);
	//this->m_ctlRichText.SetWindowPos(&wndTop,0,0,pRect->right-pRect->left-10,pRect->bottom-pRect->top-25,SWP_DEFERERASE);
	m_HaveChangeSize=TRUE;
	m_ChangeSize=*pRect;
	// TODO: Add your message handler code here
	
}

void CMTextDlg::OnSize(UINT nType, int cx, int cy) 
{
	CDialog::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	if(m_ctlRichText.m_hWnd!=NULL)
	this->m_ctlRichText.SetWindowPos(&wndTop,0,27,cx,cy-27,SWP_DEFERERASE);
	
}
BOOL CMTextDlg::OnInitDialog() 
{
	m_bIsOnInitial=TRUE;
	CDialog::OnInitDialog();
//	SetTransparent(TRUE,85);
	m_ctlRichText.SetEventMask(WM_CONTEXTMENU);

//	m_ctlRichText.SetOptions(ECOOP_OR ,ECO_SAVESEL);
	// Modify the default character format so that all new
	// text is striked out and not bold.

/*
	CHARFORMAT cf;
	GetSelectionCharFormat(cf);
	if(!(cf.dwMask&CFM_BOLD)||!(cf.dwEffects&CFE_BOLD))
		cf.dwEffects=CFE_BOLD;
	else
		cf.dwEffects=0;
	cf.dwMask=CFM_BOLD;
	SetSelectionCharFormat(cf);*/

	
	CHARFORMAT cf;
	cf.dwMask =CFM_COLOR|CFM_BOLD|CFM_FACE;
	cf.dwEffects=0;
	cf.crTextColor=COLOR_FOR_LAYER_PLUS;
	strcpy(cf.szFaceName,_T("Txt"));
	m_ctlRichText.SetDefaultCharFormat(cf);
	m_ctlRichText.SetBackgroundColor(FALSE, RGB(0,0,0));
	// TODO: Add extra initialization here
	m_HaveChangeSize=FALSE;

	m_wndStyleBar.Create(this);
    m_wndStyleBar.LoadToolBar(IDR_STYLE_BAR);
    m_wndStyleBar.SetBarStyle(CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY);
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
	m_wndStyleBar.ShowWindow(SW_SHOW);

	///////////////////////////////////////////////////////////////////////////
	::SendMessage(m_ctlRichText.m_hWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&m_pRichEditOle);
	ASSERT(m_pRichEditOle != NULL); 
    //////////////////////////////////////////////////////////////////////////
	m_wndStyleBar.init(m_pMTextData);
	m_ctlRichText.init2(m_pMTextData);
	Init(m_pMTextData);
	m_bIsOnInitial=FALSE;
//	m_ctlRichText.SetActiveWindow();
//	m_ctlRichText.SetFocus();
//	PRINTINFO_LINE_PRE;
//	PRINTINFO_LINE;
	return TRUE;  
	// return TRUE unless you set the focus to a control
	// EXCEPTION: OCX Property Pages should return FALSE
}
void CMTextDlg::OnNcLButtonDblClk(UINT nHitTest, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
//	PostMessage(WN_NCLBUTTONDBLCLK,0,0);
	m_HaveChangeSize=TRUE;
	CWnd::OnNcLButtonDblClk(nHitTest,point);
	
}

void CMTextDlg::OnCharBold() 
{
	// TODO: Add your command handler code here
	m_ctlRichText.OnCharBold();

}

void CMTextDlg::OnCharItalic()
{
	// TODO: Add your command handler code here
	m_ctlRichText.OnCharItalic();
}

void CMTextDlg::OnCharUnderline()
{
	// TODO: Add your command handler code here
	m_ctlRichText.OnCharUnderline();
}

void CMTextDlg::OnUpdateCharBold(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CToolBarCtrl &pToolCtrl = m_wndStyleBar.GetToolBarCtrl();
	
	if(m_wndStyleBar.m_wndFontNames.GetFontType()==TRUETYPE_FONTTYPE)
	{
		int iValue =m_ctlRichText.IsBold();
		switch( iValue)
		{ 
		case -1: 
			pToolCtrl.Indeterminate(ID_CHAR_BOLD,TRUE);
			pToolCtrl.CheckButton(ID_CHAR_BOLD,FALSE);
			pToolCtrl.EnableButton(ID_CHAR_BOLD,TRUE);
			break; 
		case  1:
			pToolCtrl.Indeterminate(ID_CHAR_BOLD,FALSE);
			pToolCtrl.CheckButton(ID_CHAR_BOLD,TRUE);
			pToolCtrl.EnableButton(ID_CHAR_BOLD,TRUE);
			break;
		default:
			pToolCtrl.CheckButton(ID_CHAR_BOLD,FALSE);
			pToolCtrl.Indeterminate(ID_CHAR_BOLD,FALSE);
			pToolCtrl.EnableButton(ID_CHAR_BOLD,TRUE);
			break;
		}
	}
	else
	{
		pToolCtrl.CheckButton(ID_CHAR_BOLD,FALSE);
		pToolCtrl.Indeterminate(ID_CHAR_BOLD,FALSE);
		pToolCtrl.EnableButton(ID_CHAR_BOLD,FALSE);
	}
}

void CMTextDlg::OnUpdateCharItalic(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CToolBarCtrl &pToolCtrl = m_wndStyleBar.GetToolBarCtrl();
		
	if(m_wndStyleBar.m_wndFontNames.GetFontType()==TRUETYPE_FONTTYPE)
	{
		int iValue =m_ctlRichText.IsItalic();
		switch( iValue)
		{ 
		case -1:
			pToolCtrl.Indeterminate(ID_CHAR_ITALIC,TRUE);
			pToolCtrl.CheckButton(ID_CHAR_ITALIC,FALSE);
			pToolCtrl.EnableButton(ID_CHAR_ITALIC,TRUE);
			break; 
		case  1:
			pToolCtrl.Indeterminate(ID_CHAR_ITALIC,FALSE);
			pToolCtrl.CheckButton(ID_CHAR_ITALIC,TRUE);
			pToolCtrl.EnableButton(ID_CHAR_ITALIC,TRUE);
			break;
		default:
			pToolCtrl.CheckButton(ID_CHAR_ITALIC,FALSE);
			pToolCtrl.Indeterminate(ID_CHAR_ITALIC,FALSE);
			pToolCtrl.EnableButton(ID_CHAR_ITALIC,TRUE);
			break;
		}
	}
	else
	{
		pToolCtrl.CheckButton(ID_CHAR_ITALIC,FALSE);
		pToolCtrl.Indeterminate(ID_CHAR_ITALIC,FALSE);
		pToolCtrl.EnableButton(ID_CHAR_ITALIC,FALSE);
	}
}

void CMTextDlg::OnUpdateStack(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	int iStackStatus;
	CToolBarCtrl &pToolCtrl = m_wndStyleBar.GetToolBarCtrl();
	m_ctlRichText.GetStackStatus(iStackStatus);
	if(IsSelectStack())
		iStackStatus=3;
	switch(iStackStatus) 
	{
	case 0://选中了可Stack的字符串
	case 1:
	case 2:
		pToolCtrl.EnableButton(ID_Stack);
		pToolCtrl.CheckButton(ID_Stack,FALSE);
		pToolCtrl.Indeterminate(ID_Stack,FALSE);
		break;
	case 3: //选中了Stack
		pToolCtrl.EnableButton(ID_Stack);
		pToolCtrl.CheckButton(ID_Stack,TRUE);
		pToolCtrl.Indeterminate(ID_Stack,FALSE);
		break;
	case -1:
		pToolCtrl.EnableButton(ID_Stack,FALSE);
		pToolCtrl.CheckButton(ID_Stack,FALSE);
		pToolCtrl.Indeterminate(ID_Stack,TRUE);
		break;
	}
	
}
void CMTextDlg::OnUpdateCharUnderline(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	CToolBarCtrl &pToolCtrl = m_wndStyleBar.GetToolBarCtrl();
	int iValue =m_ctlRichText.IsUnderlined();
	switch( iValue)
	{ 
	case -1:
		pToolCtrl.Indeterminate(ID_CHAR_UNDERLINE,true);
		pToolCtrl.CheckButton(ID_CHAR_UNDERLINE,false);
		break; 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -