// SettingDlg.cpp : 实现文件 // #include "stdafx.h" #include "TextHandle.h" #include "SettingDlg.h" #include "afxdialogex.h" // CSettingDlg 对话框 IMPLEMENT_DYNAMIC(CSettingDlg, CDialogEx) CSettingDlg::CSettingDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CSettingDlg::IDD, pParent) { m_clrFont = RGB(255, 0, 0); } CSettingDlg::~CSettingDlg() { } void CSettingDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CSettingDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON1, &CSettingDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CSettingDlg::OnBnClickedButton2) END_MESSAGE_MAP() // CSettingDlg 消息处理程序 void CSettingDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 CColorDialog clrDlg(m_clrFont); if (IDOK == clrDlg.DoModal()) { m_clrFont = clrDlg.GetColor(); } } void CSettingDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CString strFontName; // 字体名称 LOGFONT lf; // LOGFONT变量 // 将lf所有字节清零 memset(&lf, 0, sizeof(LOGFONT)); // 将lf中的元素字体名设为“宋体” _tcscpy_s(lf.lfFaceName, LF_FACESIZE, _T("宋体")); // 构造字体对话框,初始选择字体名为“宋体” CFontDialog fontDlg(&lf); if (IDOK == fontDlg.DoModal()) // 显示字体对话框 { // 如果m_font已经关联了一个字体资源对象,则释放它 if (m_font.m_hObject) { m_font.DeleteObject(); } // 使用选定字体的LOGFONT创建新的字体 // m_font.CreateFontIndirect(fontDlg.m_cf.lpLogFont); // // 获取编辑框IDC_FONT_EDIT的CWnd指针,并设置其字体 // GetDlgItem(IDC_FONT_EDIT)->SetFont(&m_font); // // // 如果用户选择了字体对话框的OK按钮,则获取被选择字体的名称并显示到编辑框里 // strFontName = fontDlg.m_cf.lpLogFont->lfFaceName; // SetDlgItemText(IDC_FONT_EDIT, strFontName); } }
// TextHandleView.h : CTextHandleView 类的接口 // #pragma once #include "atltypes.h" class CTextHandleCntrItem; class CTextHandleView : public CRichEditView { protected: // 仅从序列化创建 CTextHandleView(); DECLARE_DYNCREATE(CTextHandleView) // 特性 public: CTextHandleDoc* GetDocument() const; // 操作 public: // 重写 public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual void OnInitialUpdate(); // 构造后第一次调用 // 实现 public: virtual ~CTextHandleView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // 生成的消息映射函数 protected: afx_msg void OnDestroy(); afx_msg void OnFilePrintPreview(); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); DECLARE_MESSAGE_MAP() public: virtual BOOL PreTranslateMessage(MSG* pMsg); void GetCaretInfo(int & nCurrentRow, int & nCurrentCol); afx_msg void OnEnterIdle(UINT nWhy, CWnd* pWho); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); private: CRichEditCtrl *m_pRichEditCtrl; int m_nOrgCaretPos; public: afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); int m_nSelStart; int m_nSelEnd; BOOL m_bLBtnDown; BOOL SetCaret(void); afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); BOOL IsVisibleRange(LONG nChar); afx_msg void On32771(); }; #ifndef _DEBUG // TextHandleView.cpp 中的调试版本 inline CTextHandleDoc* CTextHandleView::GetDocument() const { return reinterpret_cast<CTextHandleDoc*>(m_pDocument); } #endif
// TextHandleView.cpp : CTextHandleView 类的实现 // #include "stdafx.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "TextHandle.h" #endif #include "TextHandleDoc.h" #include "CntrItem.h" #include "resource.h" #include "TextHandleView.h" #include "SettingDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CTextHandleView IMPLEMENT_DYNCREATE(CTextHandleView, CRichEditView) BEGIN_MESSAGE_MAP(CTextHandleView, CRichEditView) ON_WM_DESTROY() ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() ON_WM_ENTERIDLE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_WM_CHAR() ON_WM_LBUTTONDBLCLK() ON_WM_KEYDOWN() ON_COMMAND(ID_32771, &CTextHandleView::On32771) END_MESSAGE_MAP() // CTextHandleView 构造/析构 CTextHandleView::CTextHandleView() : m_nOrgCaretPos(0) , m_nSelStart(0) , m_nSelEnd(0) , m_bLBtnDown(FALSE) { // TODO: 在此处添加构造代码 m_pRichEditCtrl = NULL; } CTextHandleView::~CTextHandleView() { } BOOL CTextHandleView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CRichEditView::PreCreateWindow(cs); } void CTextHandleView::OnInitialUpdate() { CRichEditView::OnInitialUpdate(); m_pRichEditCtrl = &GetRichEditCtrl(); // 设置打印边距(720 缇 = 1/2 英寸) SetMargins(CRect(720, 720, 720, 720)); } void CTextHandleView::OnDestroy() { // 析构时停用此项;这在 // 使用拆分视图时非常重要 COleClientItem* pActiveItem = GetDocument()->GetInPlaceActiveItem(this); if (pActiveItem != NULL && pActiveItem->GetActiveView() == this) { pActiveItem->Deactivate(); ASSERT(GetDocument()->GetInPlaceActiveItem(this) == NULL); } CRichEditView::OnDestroy(); } void CTextHandleView::OnRButtonUp(UINT /* nFlags */, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CTextHandleView::OnContextMenu(CWnd* /* pWnd */, CPoint point) { #ifndef SHARED_HANDLERS theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } // CTextHandleView 诊断 #ifdef _DEBUG void CTextHandleView::AssertValid() const { CRichEditView::AssertValid(); } void CTextHandleView::Dump(CDumpContext& dc) const { CRichEditView::Dump(dc); } CTextHandleDoc* CTextHandleView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTextHandleDoc))); return (CTextHandleDoc*)m_pDocument; } #endif //_DEBUG // CTextHandleView 消息处理程序 BOOL CTextHandleView::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 if (pMsg->message == WM_KEYDOWN) { if (pMsg->wParam == VK_LEFT || pMsg->wParam == VK_BACK) { int nRow = 0, nCol = 0; GetCaretInfo(nRow, nCol); // TRACE("nRow:%d nCol:%d\n", nRow, nCol); if (nCol == 1) { return TRUE; } } if (pMsg->wParam == VK_UP || pMsg->wParam == VK_DOWN) { return TRUE; } } return CRichEditView::PreTranslateMessage(pMsg); } void CTextHandleView::GetCaretInfo(int &nCurrentRow, int &nCurrentCol) { CRichEditCtrl& theCtrl = this->GetRichEditCtrl(); // 获取当前行号 nCurrentRow = theCtrl.LineFromChar(-1); int nLineStartPos = theCtrl.LineIndex(-1); // 首字符索引 TRACE("nLineStartPos: %d\n", nLineStartPos); long nSelStart, nSelEnd; theCtrl.GetSel(nSelStart, nSelEnd); TRACE("nSelStart: %d nSelEnd: %d\n", nSelStart, nSelEnd); nCurrentCol = nSelStart - nLineStartPos + 1; /* CPoint VarCharPoint; // 指定字符的位置 CPoint CurrPoint; // 当前光标位置 int LineFirstIndex; // 当前行首字符位置 int Length; // 当前行长度 int CurrentCharIndex; // 当前编辑光标所在字符序号。 int CurrentLine; // 当前编辑光标所在的行号 int CurrentRow; // 当前编辑光标所在的列号 CRichEditCtrl &edit = GetRichEditCtrl(); CurrPoint = edit.GetCaretPos(); //获取光标位置 LineFirstIndex = edit.LineIndex(-1); // 获取当前行首字符位置 Length = edit.LineLength(-1); // 获取当前行长度. int i = 0; for (; i < Length; i++) { VarCharPoint = edit.GetCharPos(LineFirstIndex); if (VarCharPoint.x >= CurrPoint.x) { CurrentCharIndex = LineFirstIndex; break; } LineFirstIndex++; } CurrentRow = i; //列号 CurrentLine = edit.LineFromChar(CurrentCharIndex); //行号 */ } void CTextHandleView::OnEnterIdle(UINT nWhy, CWnd* pWho) { CRichEditView::OnEnterIdle(nWhy, pWho); TRACE("OnEnterIdle"); // TODO: 在此处添加消息处理程序代码 } void CTextHandleView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 m_bLBtnDown = TRUE; m_nSelStart = m_pRichEditCtrl->CharFromPos(point); if (SetCaret()) { m_pRichEditCtrl->SetSel(m_nOrgCaretPos, m_nOrgCaretPos); } else { m_pRichEditCtrl->SetSel(m_nSelStart, m_nSelStart); m_pRichEditCtrl->SetCaretPos(CPoint(-1, -1)); } // CRichEditView::OnLButtonDown(nFlags, point); } void CTextHandleView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (m_bLBtnDown) { m_nSelEnd = m_pRichEditCtrl->CharFromPos(point); m_pRichEditCtrl->SetSel(m_nSelStart, m_nSelEnd); } // CRichEditView::OnMouseMove(nFlags, point); } void CTextHandleView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 m_bLBtnDown = FALSE; SetCaret(); // CRichEditView::OnLButtonUp(nFlags, point); } void CTextHandleView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 // CRichEditView::OnLButtonDblClk(nFlags, point); } void CTextHandleView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 在此添加消息处理程序代码和/或调用默认值 long nSelStart = 0, nSelEnd = 0; m_pRichEditCtrl->GetSel(nSelStart, nSelEnd); if (nSelEnd - nSelStart != 0) // 中文咋办 { return; } CRichEditView::OnChar(nChar, nRepCnt, nFlags); } BOOL CTextHandleView::SetCaret(void) { if (m_pRichEditCtrl) { CPoint ptCaret = m_pRichEditCtrl->PosFromChar(m_nOrgCaretPos); CRect rectClient; m_pRichEditCtrl->GetClientRect(rectClient); if (rectClient.PtInRect(ptCaret)) // 光标可见,闪一下 { m_pRichEditCtrl->SetCaretPos(ptCaret); return TRUE; } else { m_pRichEditCtrl->SetCaretPos(CPoint(-1, -1)); // 隐藏光标 return FALSE; } } } BOOL CTextHandleView::IsVisibleRange(LONG nChar) { CPoint ptCaret = m_pRichEditCtrl->PosFromChar(nChar); CRect rectClient; m_pRichEditCtrl->GetClientRect(rectClient); return rectClient.PtInRect(ptCaret); } void CTextHandleView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 在此添加消息处理程序代码和/或调用默认值 long nSelStart = 0, nSelEnd = 0; m_pRichEditCtrl->GetSel(nSelStart, nSelEnd); if (nSelEnd - nSelStart != 0) { return; } CRichEditView::OnKeyDown(nChar, nRepCnt, nFlags); CPoint pt = m_pRichEditCtrl->GetCaretPos(); m_nOrgCaretPos = m_pRichEditCtrl->CharFromPos(pt); TRACE("m_bOrgCaretPos:%d\n", m_nOrgCaretPos); } void CTextHandleView::On32771() { // TODO: 在此添加命令处理程序代码 CSettingDlg dlgSetting; if (IDOK == dlgSetting.DoModal()) { ; } }
void CTest_menuView::OnTest() { // TODO: Add your command handler code here MessageBox("View click!"); static bool bClick = false; bClick = !bClick; CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); CMenu *pmenu = pFrame->GetMenu(); pFrame->m_bAutoMenuEnable = false; SetTimer(1, 1000, NULL); if (bClick) { pmenu->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED); pmenu->GetSubMenu(0)->CheckMenuItem(1, MF_BYPOSITION | MF_CHECKED); pmenu->GetSubMenu(0)->EnableMenuItem(0, MF_BYPOSITION | MF_ENABLED); pmenu->GetSubMenu(0)->EnableMenuItem(1, MF_BYPOSITION | MF_ENABLED); } else { pmenu->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_UNCHECKED); pmenu->GetSubMenu(0)->CheckMenuItem(1, MF_BYPOSITION | MF_UNCHECKED); // MF_BYCOMMAND pmenu->GetSubMenu(0)->EnableMenuItem(0, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); pmenu->GetSubMenu(0)->EnableMenuItem(1, MF_BYPOSITION | MF_DISABLED | MF_GRAYED); } } void CTest_menuView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CString strTime; // 获取系统当前时间,并保存到curTime CTime curTime = CTime::GetCurrentTime(); // 格式化curTime,将字符串保存到strTime strTime = curTime.Format(_T("%H:%M:%S")); // 在状态栏的时间窗格中显示系统时间字符串 CStatusBar* pStatusBar = (CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR); pStatusBar->SetPaneText(4, strTime); pStatusBar->SetWindowText("Hello world"); CView::OnTimer(nIDEvent); }