hur.cn - 华软网

 热门搜索

mfc控件和变量关联了怎么显示出这个变量呢??

  作者:未知    来源:网络    更新时间:2011/4/17
整个mfc项目的代码,。。我已经用 线程执行recv_udp_name函数获得了sData1 的值sData1 也已经和一个edit的控件联系关系过了,可是就是显示不了啊这个数据为什么
一直都是卡在控件上显示数据这块上了,研讨了半天了照旧没搞懂,下午看mfc深入浅出看的稀里糊涂的。。。
搞不清楚UpDateData(FALSE)这个函数用在那个地方,控件和变量联系关系后用什么来显示数据,显示之后要更新数据的显示才是用UpDateData(FALSE)这个函数的吧。。。 
谁能提供一个控件和变量相联系关系之后,再显示数据。。。每次改变变量显示也会更新的例子吗???


C++">#include "stdafx.h"
#include "416.h"
#include "416Dlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMy416Dlg 对话框
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD WINAPI recv_udp_name(LPVOID lpParameter);//定义一个udp接收函数

CString sData1 ; 
CString sData2 ; 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

CMy416Dlg::CMy416Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CMy416Dlg::IDD, pParent)
, sData1(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMy416Dlg::DoDataExchange(CDataExchange* pDX)////将一个控件和一个变量相联系关系
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, sData1);
}

BEGIN_MESSAGE_MAP(CMy416Dlg, CDialog)///MFC定义的宏,表示起头一个消息的映照描写
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP

END_MESSAGE_MAP()


// CMy416Dlg 消息措置惩罚程序

BOOL CMy416Dlg::OnInitDialog()///初始化对话框。///程序运行时的起头状态的设定。
{
CDialog::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

// TODO: 在此增加额外的初始化代码

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//GetDlgItem(IDC_EDIT1)->SetWindowText(sData1);
GetDlgItem(IDC_EDIT2)->SetWindowText(sData2);

CreateThread(NULL , 0 , recv_udp_name , NULL , 0 ,  NULL);////创建udp线程
// UpDateData(FALSE);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

return TRUE;  // 除非将焦点设置到控件,否则前往 TRUE
}



void CMy416Dlg::OnPaint()//////设定窗口巨细等的默许状态
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在事情区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CMy416Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}





////////////////////////////////////udp接收函数,函数体/////////////////
DWORD WINAPI recv_udp_name(LPVOID lpParameter)
{

 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 int i;
 wVersionRequested = MAKEWORD( 1, 1 ); 
 
 err = WSAStartup( wVersionRequested, &wsaData );//指明程序请求运用的Socket版本,执行成功后前往0
 if ( err != 0 ) {
  return 0;
 }
 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
  WSACleanup( );
  return 0;
 }

 SOCKET s=socket(AF_INET,SOCK_DGRAM,0);//创建套接字
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//存储IP地址,运用in_addr这个数据结构
 addrSrv.sin_family=AF_INET; //sin_family指代协议族,在socket编程中只可是AF_INET
 addrSrv.sin_port=htons(8080); //存储端口号

 bind(s,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);
 char recvBuf[256];
 while(1)
 {

 memset(recvBuf, 0, sizeof(recvBuf));
 i = recvfrom(s,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
sData1=recvBuf;//////////////////将收到的数据赋值给sData1/////

//TRACE("~~~~~%s\n",recvBuf);
//if( strcmp(recvBuf,sData2) != 0 )
//sData2=recvBuf;
afxDump<<"\n~~~~~~~~~123456~~~~~~~~~"<<recvBuf;
//GetDlgItem(IDC_EDIT1)->SetWindowText(sData1);
 }
closesocket(s);
 WSACleanup();
//UpdateData(FALSE);
return 0; 
}

---华软 网友回答---
变量赋值之后,要传给控件,运用UpdateData( FALSE );

要想让窗口显示出来,能够试一下线程sleep一下,建议发消息。

---华软网友回复---
引用 1 楼 jennyvenus 的回复:
变量赋值之后,要传给控件,运用UpdateData( FALSE );

要想让窗口显示出来,能够试一下线程sleep一下,建议发消息。

+1
---华软网友回复---
引用 1 楼 jennyvenus 的回复:
变量赋值之后,要传给控件,运用UpdateData( FALSE );

要想让窗口显示出来,能够试一下线程sleep一下,建议发消息。
变量赋值是在线程的while中完成的,赋值后要在什么地方调用UpdateData( FALSE );直接在while中用的话一直都报错。。。
---华软网友回复---
抓狂了。。。
C++">
sData1=recvBuf; ///这个地方赋值之后然后调用了UpdateData窗口照旧没有显示出来啊。。

BOOL UpdateData( FALSE );


---华软网友回复---
有没有人在。。。
我大概知道问题出在了什么地方,也有人提醒我有简单的措施。。。
能够在线程中发消息给窗口,在窗口中响应消息再UpdateData( FALSE );
这里我有几个问题想问下。。如果是窗口中有好几个控件每一个都要显示数据,更新的时候同时调用这个UpdateData能够???窗口中响应消息不是在控件下哈,这里我好像有点把窗口和控件搞混了。。。
---华软网友回复---
引用 5 楼 百度926 的回复:
有没有人在。。。
我大概知道问题出在了什么地方,也有人提醒我有简单的措施。。。
能够在线程中发消息给窗口,在窗口中响应消息再UpdateData( FALSE );
这里我有几个问题想问下。。如果是窗口中有好几个控件每一个都要显示数据,更新的时候同时调用这个UpdateData能够???窗口中响应消息不是在控件下哈,这里我好像有点把窗口和控件搞混了。。。


实在不行,就通过一个全局变量,存储你在线程中要保存的值,然后,在其余地方把这个值赋值给控件,不要在线程里面UpdateData()。

如果你这几个控件的赋值是在统一个函数,能够等他们的值都赋了,再调用依次 UpdateData(FALSE)就能够了。如果是在不同的函数赋值,那能够屡次调用这个Update函数。 然则不能在线程函数里面调用。 
---华软网友回复---
获得窗口句柄的函数CWnd *pWnd=FindWindow(NULL,"halloword");在网上看到是这样写的,这里面句柄是否是就是pWnd这个了。。。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。