MFC work

// 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);
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值