?? mtextdlg.cpp
字號:
// 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;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -