MFC CEditView::SetRect()的问题

ProgJ 2016-02-23 01:15:33
void EditView::OnInitialUpdate()
{
......
// view margin
CRect rc;
GetClientRect(&rc);
rc.OffsetRect(9, 3);// 左边留9 ,上边留3

m_pCtrlREdit = &GetEditCtrl();
ASSERT_VALID(m_pCtrlREdit);
m_pCtrlREdit->SetRect(rc);
.....
CString str = "H:\\2016寒假作业\\Test\\txt\\默认标题.txt";
ReadTitle(str);
}



这是运行效果
但是当我将窗口放大再缩小后,设置的rect似乎无效了,因为我发现文字的位置变了,见图:


而且是放大后就已经变了。。
怎么解决啊。。

而且奇怪的是在同一框架下的另一个视图CRichEditView就能保持效果。。
...全文
301 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2016-02-24
  • 打赏
  • 举报
回复
CEdit::SetMargins
void SetMargins( UINT nLeft, UINT nRight );
那就 调不了,

另外可以 用 CStatic 作为 CEdit 父窗口,这样 可以 把 edit 放 static 的 中间。如
ProgJ 2016-02-24
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
改改 那个 0 看看。
试了的,那个0对应是右边界。。
schlafenhamster 2016-02-24
  • 打赏
  • 举报
回复
改改 那个 0 看看。
ProgJ 2016-02-24
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
CEdit &edit=GetEditCtrl(); edit.SetMargins(m_leftMargin,0);
感谢!不过这个函数不能调整上下边界是吗
ProgJ 2016-02-24
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
edit 是 SetMargin 不是 SetRect
为什么提示说未定义标识符。。
schlafenhamster 2016-02-24
  • 打赏
  • 举报
回复
CEdit &edit=GetEditCtrl(); edit.SetMargins(m_leftMargin,0);
schlafenhamster 2016-02-24
  • 打赏
  • 举报
回复
edit 是 SetMargin 不是 SetRect
ProgJ 2016-02-24
  • 打赏
  • 举报
回复
引用 13 楼 schlafenhamster 的回复:

#if !defined(AFX_STATICHASEDIT_H__D8077042_BE6D_442E_8287_912CA9D1FE81__INCLUDED_)
#define AFX_STATICHASEDIT_H__D8077042_BE6D_442E_8287_912CA9D1FE81__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// StaticHasEdit.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CStaticHasEdit window

class CStaticHasEdit : public CStatic
{
// Construction
public:
	CStaticHasEdit();
	CEdit &GetEdit(){return m_Edit;}
protected:
	HICON m_hIcon;
	CEdit m_Edit;
	CFont m_Font;
// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CStaticHasEdit)
	protected:
	virtual void PreSubclassWindow();
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CStaticHasEdit();

	// Generated message map functions
protected:
	//{{AFX_MSG(CStaticHasEdit)
	afx_msg void OnPaint();
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
};

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

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STATICHASEDIT_H__D8077042_BE6D_442E_8287_912CA9D1FE81__INCLUDED_)

// StaticHasEdit.cpp : implementation file
//

#include "stdafx.h"
#include "RoudEdit.h"
#include "StaticHasEdit.h"

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

/////////////////////////////////////////////////////////////////////////////
// CStaticHasEdit

CStaticHasEdit::CStaticHasEdit()
{
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}

CStaticHasEdit::~CStaticHasEdit()
{
}


BEGIN_MESSAGE_MAP(CStaticHasEdit, CStatic)
	//{{AFX_MSG_MAP(CStaticHasEdit)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStaticHasEdit message handlers

void CStaticHasEdit::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	CRect rc;
	GetClientRect(rc);
	rc.DeflateRect(26,14);
	m_Edit.Create(WS_CHILD|WS_VISIBLE|ES_LEFT,rc,this,1);
//
	m_Font.CreateFont( 26, 0, 0, 0, FW_HEAVY, 0, 0, 0, ANSI_CHARSET, \
	OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, \
	VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" );
//
	m_Edit.SetFont(&m_Font,FALSE);
//
	CStatic::PreSubclassWindow();
}

void CStaticHasEdit::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
// 边缘圆角框
	CPen pen;
	pen.CreatePen(PS_SOLID,1, RGB(255, 0, 0));
//
	CPen *pOld;
	pOld=dc.SelectObject(&pen);
// 
	CBrush *pOldBr;
	pOldBr=(CBrush*)dc.SelectStockObject(WHITE_BRUSH);
//
	CRect rc;
	GetClientRect(rc);
	dc.RoundRect(&rc, CPoint(12,12));
//
	::DrawIconEx(dc.GetSafeHdc(),4,20,m_hIcon,16,16,NULL,(HBRUSH)NULL,DI_NORMAL);
	::DrawIconEx(dc.GetSafeHdc(),rc.right-20,20,m_hIcon,16,16,NULL,(HBRUSH)NULL,DI_NORMAL);
	dc.SelectObject(pOld);
	dc.SelectObject(pOldBr);
// Do not call CStatic::OnPaint() for painting messages
}
在 PreSubclassWindow() 里 createedit 使用 ,拖 2个 static ,加变量 后改 为 (。h) CStaticHasEdit m_stcEdit1; CStaticHasEdit m_stcEdit; 初始化 时 // TODO: Add extra initialization here m_stcEdit.GetEdit().SetWindowText( "我是圆角编译框 1 !"); m_stcEdit1.GetEdit().SetWindowText("我是圆角编译框 2 !");
懂了。十分感谢!
schlafenhamster 2016-02-24
  • 打赏
  • 举报
回复

#if !defined(AFX_STATICHASEDIT_H__D8077042_BE6D_442E_8287_912CA9D1FE81__INCLUDED_)
#define AFX_STATICHASEDIT_H__D8077042_BE6D_442E_8287_912CA9D1FE81__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// StaticHasEdit.h : header file
//

/////////////////////////////////////////////////////////////////////////////
// CStaticHasEdit window

class CStaticHasEdit : public CStatic
{
// Construction
public:
	CStaticHasEdit();
	CEdit &GetEdit(){return m_Edit;}
protected:
	HICON m_hIcon;
	CEdit m_Edit;
	CFont m_Font;
// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CStaticHasEdit)
	protected:
	virtual void PreSubclassWindow();
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CStaticHasEdit();

	// Generated message map functions
protected:
	//{{AFX_MSG(CStaticHasEdit)
	afx_msg void OnPaint();
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
};

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

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STATICHASEDIT_H__D8077042_BE6D_442E_8287_912CA9D1FE81__INCLUDED_)

// StaticHasEdit.cpp : implementation file
//

#include "stdafx.h"
#include "RoudEdit.h"
#include "StaticHasEdit.h"

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

/////////////////////////////////////////////////////////////////////////////
// CStaticHasEdit

CStaticHasEdit::CStaticHasEdit()
{
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}

CStaticHasEdit::~CStaticHasEdit()
{
}


BEGIN_MESSAGE_MAP(CStaticHasEdit, CStatic)
	//{{AFX_MSG_MAP(CStaticHasEdit)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStaticHasEdit message handlers

void CStaticHasEdit::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	CRect rc;
	GetClientRect(rc);
	rc.DeflateRect(26,14);
	m_Edit.Create(WS_CHILD|WS_VISIBLE|ES_LEFT,rc,this,1);
//
	m_Font.CreateFont( 26, 0, 0, 0, FW_HEAVY, 0, 0, 0, ANSI_CHARSET, \
	OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, \
	VARIABLE_PITCH | FF_SWISS, "MS Sans Serif" );
//
	m_Edit.SetFont(&m_Font,FALSE);
//
	CStatic::PreSubclassWindow();
}

void CStaticHasEdit::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
// 边缘圆角框
	CPen pen;
	pen.CreatePen(PS_SOLID,1, RGB(255, 0, 0));
//
	CPen *pOld;
	pOld=dc.SelectObject(&pen);
// 
	CBrush *pOldBr;
	pOldBr=(CBrush*)dc.SelectStockObject(WHITE_BRUSH);
//
	CRect rc;
	GetClientRect(rc);
	dc.RoundRect(&rc, CPoint(12,12));
//
	::DrawIconEx(dc.GetSafeHdc(),4,20,m_hIcon,16,16,NULL,(HBRUSH)NULL,DI_NORMAL);
	::DrawIconEx(dc.GetSafeHdc(),rc.right-20,20,m_hIcon,16,16,NULL,(HBRUSH)NULL,DI_NORMAL);
	dc.SelectObject(pOld);
	dc.SelectObject(pOldBr);
// Do not call CStatic::OnPaint() for painting messages
}
在 PreSubclassWindow() 里 createedit 使用 ,拖 2个 static ,加变量 后改 为 (。h) CStaticHasEdit m_stcEdit1; CStaticHasEdit m_stcEdit; 初始化 时 // TODO: Add extra initialization here m_stcEdit.GetEdit().SetWindowText( "我是圆角编译框 1 !"); m_stcEdit1.GetEdit().SetWindowText("我是圆角编译框 2 !");
ProgJ 2016-02-24
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:
CEdit::SetMargins void SetMargins( UINT nLeft, UINT nRight ); 那就 调不了, 另外可以 用 CStatic 作为 CEdit 父窗口,这样 可以 把 edit 放 static 的 中间。如
能不能讲下怎么用 CStatic 作为 CEdit 父窗口啊。。?是直接把 edit控件 放在 static控件 的 中间吗?
ProgJ 2016-02-23
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
放 OnSize

void CGUI_OneNoteView::OnSize(UINT nType, int cx, int cy) 
{
	CRichEditView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
// view margin
#if 1
	CRect rc;
	GetClientRect(rc);
	rc.OffsetRect(40,0);
	CRichEditCtrl& Edit=GetRichEditCtrl();
	Edit.SetRect(rc);
#endif
	
}
出问题的是CEditView,不是CRichEditView 而且我刚在CEditView::OnSize()加了也没效果。。
schlafenhamster 2016-02-23
  • 打赏
  • 举报
回复
放 OnSize

void CGUI_OneNoteView::OnSize(UINT nType, int cx, int cy) 
{
	CRichEditView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
// view margin
#if 1
	CRect rc;
	GetClientRect(rc);
	rc.OffsetRect(40,0);
	CRichEditCtrl& Edit=GetRichEditCtrl();
	Edit.SetRect(rc);
#endif
	
}
ProgJ 2016-02-23
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
你修改窗口大小以后再重新SetRect一下看看呢?
这个我也想到了,试了一下的确是可以。 但是还是很奇怪额。。为什么在初始化时设置的区域会失效呢?而且相对比的CRichEditView却是正常的
Eleven 2016-02-23
  • 打赏
  • 举报
回复
你修改窗口大小以后再重新SetRect一下看看呢?

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧