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显示文件内容问题,求解的主要内容,如果未能解决你的问题,请参考以下文章

单击控件时在MFC中选择CEdit控件的内容

mfc CFile 读取内容到char数组的问题?

在 CEdit 控件中显示省略号

MFC - 是不是可以为除 CEdit 之外的任何其他控件显示气球提示?

在 mfc 的 cedit 控制中处理箭头键

MFC输入框CEdit控件十六进制转换