MFC中CEdit显示文件内容问题,求解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中CEdit显示文件内容问题,求解相关的知识,希望对你有一定的参考价值。
有一个文件,我想给它显示到编辑框中,通过下面的代码成功的显示到了编辑框中:
CStdioFile fp; fp.Open(_T(".\\config\\tmp\\modbus.cfg"),CFile::modeRead); CString str,strTemp; do str += strTemp; str += _T("\r\n"); while(fp.ReadString(strTemp)); fp.Close(); m_ctrlEdit->SetWindowTextW((LPCTSTR)str);
其中m_ctrlEdit是我用代码创建的一个编辑框,但是显示的结果和文件里面的格式不一样:
CEdit中的显示:
文件中的内容显示:
怎么样才能让CEdit显示的内容的格式和文件中的一模一样,求各位指点,在线等,只剩下这点分了。。。
文本文件的对齐问题。
不同字体下,这种对齐的效果都不一样,即使是外部打开txt文件,也不一定都是对齐的。
你这个要对齐,首先看看字体问题吧,设置CEdit字体。
你可以通过下面代码测试一下各种字体效果,找到合适的,在InitDialog里面设置一下就可以了:
CFont *TempFont=m_ctrlEdit->GetFont();CFont font;
LOGFONT LogFont;
int size;
TempFont->GetLogFont(&LogFont);
CFontDialog dlg;
if(IDOK==dlg.DoModal())
LOGFONT temp;
dlg.GetCurrentFont(&temp);
font.CreateFontIndirect(&temp);
m_ctrlEdit->SetFont (&font);
//这段代码放到某个按钮响应函数中 参考技术A 法1.用制表符,
法2.计算每行的字节数。然后安装列宽,给不同的字符串添加空格。 参考技术B 目测是读取制表符长度的原因
为啥子控件不出现在 MFC 派生的 CWnd 中
【中文标题】为啥子控件不出现在 MFC 派生的 CWnd 中【英文标题】:Why child control doesn't appear in MFC derived CWnd为什么子控件不出现在 MFC 派生的 CWnd 中 【发布时间】:2014-04-07 11:17:28 【问题描述】:我想将简单的 Cedit 添加到我从 CWnd 派生的 GUI 类中。该类是简单的容器,与 MFC 中的 Panel 相同。在类的构造函数中,我在类中添加了简单的 CEdit 实例。 但是当我在客户端对话框中实例化面板时,面板显示但按钮不显示。为什么它不显示。 面板代码
面板头文件
#pragma once
#include "afxwin.h"
class CPanel :
public CWnd
public:
CPanel(void);
~CPanel(void);
virtual void PreSubclassWindow();
virtual void DoDataExchange(CDataExchange* pDX);
CEdit *txt;
DECLARE_MESSAGE_MAP()
;
面板源文件
#include "stdafx.h"
#include "Panel.h"
CPanel::CPanel(void)
WNDCLASS wndcls;
HINSTANCE hins=AfxGetInstanceHandle();
if(!(::GetClassInfo(hins,_T("CPanelCtrl"),&wndcls)))
wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
wndcls.lpfnWndProc=::DefWindowProc;
wndcls.cbClsExtra=wndcls.cbWndExtra=0;
wndcls.hInstance=hins;
wndcls.hIcon=NULL;
wndcls.hCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS );
wndcls.hbrBackground=(HBRUSH)(COLOR_3DFACE+13);
wndcls.lpszMenuName=NULL;
wndcls.lpszClassName=_T("CPanelCtrl");
txt=new CEdit();
txt->Create(ES_PASSWORD,CRect(10,10,25,35),this,1);
if (!AfxRegisterClass(&wndcls))
AfxThrowResourceException();
return;
else
return;
CPanel::~CPanel(void)
void CPanel::PreSubclassWindow()
// TODO: Add your specialized code here and/or call the base class
CWnd::PreSubclassWindow();
void CPanel::DoDataExchange(CDataExchange* pDX)
// TODO: Add your specialized code here and/or call the base class
CWnd::DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(CPanel, CWnd)
END_MESSAGE_MAP()
在 OninitDialog 方法的对话框中我喜欢这样
panel=new CPanel();
panel->Create(L"CPanelCtrl",L"Hello ", WS_VISIBLE , CRect(70, 70, 400, 200), this, 1);
【问题讨论】:
【参考方案1】:两个提示:
首先:您为 CEdit 分配与 CPanel 相同的 ID:1。
第二:你在 CPanel 构造函数中创建 CEdit,我会尝试在 CPanel WM_CREATE 处理程序中创建它,因为在 CPanel 构造函数中 CPanel 的 HWND 尚未分配。
【讨论】:
这没关系。据我了解,编辑控件应该是面板内的成员(子)。 @xMRi 它仍然需要一个有效的父 HWND【参考方案2】:-
创建编辑控件的代码只运行一次,因为在窗口类注册后,编辑控件就永远不会被创建。
在创建父窗口时,不能创建子窗口。
在父窗口的 WM_CREATE 处理程序中创建子窗口。
如果您总是有一个编辑控件,为什么要使用指向它的指针。只需创建一个简单的成员。
如果编辑控件位于面板内,则应使用 WS_CHILD。
【讨论】:
谢谢。你是对的。我应该处理 WM_CREATE。通过处理它,一切正常以上是关于MFC中CEdit显示文件内容问题,求解的主要内容,如果未能解决你的问题,请参考以下文章