单文档ceditview 如何更新文字

yyang0514 2014-07-24 06:07:28
我在串口响应函数中受到了数据,但是不知道如何在view界面中更新显示。我在OnDraw(CDC* pDC)和OnEnUpdate()函数中尝试显示都没有成功。请问如何更新显示到view页面。
我的代码如下:

void CserialtoolView::OnComm()
{
// TODO: 在此处添加消息处理程序代码
int inCount;
CString str;
VARIANT input;
BYTE rxdata[1024];
long len,k,i=0;
COleSafeArray safearray;
CByteArray Array;

switch(myComm.get_CommEvent())
{
case 2:
{
inCount=myComm.get_InBufferCount();
input=myComm.get_Input();

safearray=input;
len=safearray.GetOneDimSize();
for (k=0;k<len;k++)
{
safearray.GetElement(&k,rxdata+k);
if(rxdata[k]=='\n')
{
myStr+="\r\n";
}
else
{
str.Format(_T("%c"),rxdata[k]);
myStr+=str;
}

}
//MessageBox(myStr);
//UpdateData(FALSE);
Invalidate();
break;
}
default:
break;
}
}


void CserialtoolView::OnEnUpdate()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CEditView::OnInitDialog()
// 函数,以将 EM_SETEVENTMASK 消息发送到该控件,
// 同时将 ENM_UPDATE 标志“或”运算到 lParam 掩码中。

// TODO: 在此添加控件通知处理程序代码
SetWindowText(myStr);
}


void CserialtoolView::OnDraw(CDC* pDC)
{
// TODO: 在此添加专用代码和/或调用基类
//SetWindowText(myStr);
//pDC->TextOut(200,200,myStr);
SetWindowText(myStr);
}

...全文
119 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyang0514 2014-07-25
  • 打赏
  • 举报
回复
引用 1 楼 tiger9991 的回复:
OnDraw里面不是有pDC指针么?用pDC->TextOut SetWindowText貌似修改标题名。
我先在遇到的主要问题是: 1.当串口接收到数据时,应该用什么消息通知控件进行显示? 我尝试过重写ondraw,update个消息,但是无法响应。 响应ENUPDATE消息也没有成功。 再线面代码中,通过messagebox 可知道oncomm函数能够实时监测到串口消息,但是OnEnUpdate(),OnDraw()和OnUpdate()都没有响应。

void CserialtoolView::OnComm()
{
	// TODO: 在此处添加消息处理程序代码
	int inCount;
	CString str;
	VARIANT input;
	BYTE rxdata[1024];
	long len,k,i=0;
	COleSafeArray safearray;
	CByteArray Array;	

	switch(myComm.get_CommEvent())
	{
	case 2:
		{
			inCount=myComm.get_InBufferCount();
			input=myComm.get_Input();

			safearray=input;
			len=safearray.GetOneDimSize();
			for (k=0;k<len;k++)
			{
				safearray.GetElement(&k,rxdata+k);
				if(rxdata[k]=='\n')
				{
					myStr+="\r\n";
				}
				else
				{
					str.Format(_T("%c"),rxdata[k]);
					myStr+=str;
				}

			}
			MessageBox(myStr);
			UpdateData(FALSE);
			Invalidate();
			break;
		}
	default:
		break;
	}
}


void CserialtoolView::OnEnUpdate()
{
	// TODO:  如果该控件是 RICHEDIT 控件,它将不
	// 发送此通知,除非重写 CEditView::OnInitDialog()
	// 函数,以将 EM_SETEVENTMASK 消息发送到该控件,
	// 同时将 ENM_UPDATE 标志“或”运算到 lParam 掩码中。

	// TODO:  在此添加控件通知处理程序代码
	MessageBox(_T("OnEnUpdate"));
	MessageBox(myStr);
	SetWindowText(myStr);
	#if 0
CDC* pdc=GetDC();
	pdc->TextOutW(200,200,_T("test"));
#endif
}


void CserialtoolView::OnDraw(CDC* pDC)
{
	// TODO: 在此添加专用代码和/或调用基类
	//SetWindowText(myStr);
	//pDC->TextOut(200,200,myStr);
	MessageBox(_T("OnDraw"));
	//CDC* pdc=GetDC();
	pDC->TextOutW(200,200,myStr);
	//SetWindowText(myStr);
}


void CserialtoolView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
{
	// TODO: 在此添加专用代码和/或调用基类
	MessageBox(_T("OnUpdate"));
	//MessageBox(myStr);
	SetWindowText(myStr);
	CEdit& theEdit = GetEditCtrl();
	theEdit.SetWindowText(myStr);
	UpdateData(0);
	
}
fishion 2014-07-25
  • 打赏
  • 举报
回复
ceditview的话,其实就不用处理OnDraw方法了,直接
void CserialtoolView::OnComm()
{
    // TODO: 在此处添加消息处理程序代码
    int inCount;
    CString str;
    VARIANT input;
    BYTE rxdata[1024];
    long len,k,i=0;
    COleSafeArray safearray;
    CByteArray Array;   
 
    switch(myComm.get_CommEvent())
    {
    case 2:
        {
            inCount=myComm.get_InBufferCount();
            input=myComm.get_Input();
 
            safearray=input;
            len=safearray.GetOneDimSize();
            for (k=0;k<len;k++)
            {
                safearray.GetElement(&k,rxdata+k);
                if(rxdata[k]=='\n')
                {
                    myStr+="\r\n";
                }
                else
                {
                    str.Format(_T("%c"),rxdata[k]);
                    myStr+=str;
                }
 
            }
            //MessageBox(myStr);
            //UpdateData(FALSE);
            GetEditCtrl()->SetWindowText(myStr);
            break;
        }
    default:
        break;
    }
}
yyang0514 2014-07-25
  • 打赏
  • 举报
回复
引用 2 楼 fishion 的回复:
ceditview的话,其实就不用处理OnDraw方法了,直接
void CserialtoolView::OnComm()
{
    // TODO: 在此处添加消息处理程序代码
    int inCount;
    CString str;
    VARIANT input;
    BYTE rxdata[1024];
    long len,k,i=0;
    COleSafeArray safearray;
    CByteArray Array;   
 
    switch(myComm.get_CommEvent())
    {
    case 2:
        {
            inCount=myComm.get_InBufferCount();
            input=myComm.get_Input();
 
            safearray=input;
            len=safearray.GetOneDimSize();
            for (k=0;k<len;k++)
            {
                safearray.GetElement(&k,rxdata+k);
                if(rxdata[k]=='\n')
                {
                    myStr+="\r\n";
                }
                else
                {
                    str.Format(_T("%c"),rxdata[k]);
                    myStr+=str;
                }
 
            }
            //MessageBox(myStr);
            //UpdateData(FALSE);
            GetEditCtrl()->SetWindowText(myStr);
            break;
        }
    default:
        break;
    }
}
非常感谢,已经能正常输出。
看不见的裂痕 2014-07-24
  • 打赏
  • 举报
回复
OnDraw里面不是有pDC指针么?用pDC->TextOut SetWindowText貌似修改标题名。

16,548

社区成员

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

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

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