⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 使用于2410终端上的一个播放类似ppt文件的程序,涉及Tcp/IP通信、局域网广播、Qt视窗系统、pThread等多个方面。修改makefile中编译工具即可编译
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	MessageBox(e->y());	return;	int iWidth=width();	int iHeight=height();	QPainter  painter;	QPixmap tempimage(QSize(iWidth,iHeight));	//move in from left	for(int i=0;i<iWidth;i++)	{		painter.begin(&tempimage);		painter.fillRect(QRect(0,0,iWidth,iHeight),QBrush(white));		painter.drawPixmap(QPoint(i,0),image);		painter.moveTo(i,0);		painter.lineTo(0,iHeight);		painter.end();		for(int j=0;j<111000;j++);		bitBlt(this,QPoint(i,0),&tempimage);	}	painter.begin(&tempimage);	painter.fillRect(QRect(0,0,iWidth,iHeight),QBrush(white));	painter.end();	bitBlt(this,QPoint(0,0),&tempimage);	//blind hori 	int iPart=iWidth/20;	for(int i=0;i<iPart;i++)	for(int j=0;j<20;j++)	{		painter.begin(&tempimage);		painter.drawPixmap(j*iPart+i,0,image,j*iPart+i,0,1,iHeight);		for(int k=0;k<10000;k++);		painter.end();		bitBlt(this,QPoint(0,0),&tempimage);	}	painter.begin(&tempimage);	painter.fillRect(QRect(0,0,iWidth,iHeight),QBrush(white));	painter.end();	bitBlt(this,QPoint(0,0),&tempimage);	//blind vert		iPart=iHeight/10;		for(int i=0;i<iPart;i++)	for(int j=0;j<10;j++)	{		painter.begin(&tempimage);		painter.drawPixmap(0,j*iPart+i,image,0,j*iPart+i,iWidth,1);		for(int k=0;k<10000;k++);		painter.end();		bitBlt(this,QPoint(0,0),&tempimage);	}		painter.begin(&tempimage);	painter.fillRect(QRect(0,0,iWidth,iHeight),QBrush(white));	painter.end();	bitBlt(this,QPoint(0,0),&tempimage);	}*/void CMyMainWnd::PaintLabels(QPainter* painter){	printf("waiting from gsemlabel\n");	sem_wait(&gsemlabel);	//printf("Paint labels\n");	printf("prepare to paint\n");	PICLABELLIST* q=listhead;	while(q)	{		//printf("list head:%d\n",q);		//printf("new font\n");		//printf("print font size\n");		//printf("font size:%d\n",q->piclabel.FontSize);		//printf("print end\n");		FILE* tempfile=fopen("templbl","w+b");		fwrite(q->piclabel.BmpFile,1,q->piclabel.BmpSize,tempfile);		fclose(tempfile);		QPixmap img("templbl");		if(img.isNull())			{			printf("cant load bmp\n");		}		else painter->drawPixmap(q->piclabel.Left,q->piclabel.Top,img);		q=q->next;		printf("print a label\n");		continue;			QFont font("unifont",q->piclabel.FontSize);		/*if(q->piclabel.FontStyle&1)*/	font.setBold(true);		/*if(q->piclabel.FontStyle&2)*/	font.setItalic(true);		//printf("set font style\n");		if(q->piclabel.FontStyle&4)	font.setUnderline(true);		//if(font.bold()) printf("bold\n");		//printf("fontstyle:%d\n",q->piclabel.FontStyle);		//getchar();		//printf("set font\n");		painter->setFont(font);		//printf("fontcolor:%d,left:%d,top:%d\n",q->piclabel.FontColor,q->piclabel.Left,q->piclabel.Top);		//printf("set pen\n");		//painter->setPen((q->piclabel.FontColor&0xff)<<16 | (q->piclabel.FontColor&0xff00) | (q->piclabel.FontColor&0xff0000)>>16);		//QString str=trUtf8(q->piclabel.chtitle);		//printf("string:%s\n",q->piclabel.chtitle);		//QString str=trUtf8(q->piclabel.chtitle);		//painter->drawText(q->piclabel.Left,q->piclabel.Top,str);			//QGbkCodec gbk;		//QString str=gbk.toUnicode(q->piclabel.chtitle,strlen(q->piclabel.chtitle));		//wchar_t ch[100]; 		//memset(ch,0,100);		//mbstowcs(ch,q->piclabel.chtitle);		//QString str(ch,wcslen(ch));		//qWarning(QString::fromLocal8Bit(q->piclabel.chtitle));		//getchar();		//printf("draw text\n");		painter->drawText(q->piclabel.Left,q->piclabel.Top,QString::fromLocal8Bit(STR_MOUSEDOWN));		//painter->drawText(q->piclabel.Left,q->piclabel.Top,str);	}	//printf("paint over\n");	sem_post(&gsemlabel);	//printf("back\n");}void CMyMainWnd::paintEvent(QPaintEvent* ){	printf("a paint event\n");		int iWidth=width();	int iHeight=height();	QPainter painter;	printf("paint begin\n");	painter.begin(this);	sem_wait(&semfilename);	QPixmap image(filename);	sem_post(&semfilename);	if (!image.isNull()) 	{		//printf("%f,%f\n",(float)iWidth/image.width(), (float)iHeight/image.height());		//m.scale((float)iWidth/image.width(),(float)iHeight/image.height());		//m.scale(0.5f,0.5f);		//image=image.xForm(m);		//printf("width:%d,height;%d",image.width(),image.height());		printf("begin to draw image\n");		painter.drawPixmap(0,0,image);		printf("draw image end\n");	}	//qImage.scale(iWidth/2,iHeight/2);	//paint the currnet bmp	//painter.drawPixmap(QPoint(0,0),image,QRect(0,0,-1,-1));	//bitBlt(this,0,0,&image,0,0,image.width(),image.height(),Qt::CopyROP );	printf("prant ip\n");	painter.setFont(QFont("unifont",24));	painter.setPen(red);	painter.drawText(5,iHeight-40,QString(statestr));	painter.drawText(5,iHeight-30,QString(localip));	if (clicked)	{		//dhc 2008-1-1 alter codes relative clickevent		//painter.drawText(iWidth-190,iHeight-50,QString::fromLocal8Bit(STR_MOUSEDOWN));			printf("paint clicked\n");	}	else printf("not clicked\n");	painter.setPen(white);	painter.drawText(7,iHeight-28,QString(localip));	printf("paint other\n");	if(picctrl.blhasfile)	{		if(picctrl.iplaytype==0)			painter.drawPixmap(2,5,pixauto);		else painter.drawPixmap(2,5,pixhand);	}	else	{		painter.drawPixmap(2,5,pixno);		painter.drawText(25,5,QString("Found no pictures!"));	}	if (picctrl.blplaying)	{		if(picctrl.blpausing)			painter.drawText(iWidth-100,iHeight-20,QString("Paused"));		else	painter.drawText(iWidth-100,iHeight-20,QString("Playing"));	}	//draw frame		printf("paint frame\n");	painter.setPen(QPen(gray,3));	painter.drawRect(1,1,iWidth-1,iHeight-2);	int j=0;	painter.setPen(QPen(darkGray,1));	for(int i=iHeight-5;i<=iHeight;i++)	{		painter.setPen(black);		painter.moveTo(0,i);		painter.lineTo(iWidth,i);		painter.setPen(darkGray);				painter.moveTo(j++,i);		painter.lineTo(iWidth,i);	}	j=0;	for(int i=iWidth-5;i<=iWidth;i++)	{		painter.setPen(black);		painter.moveTo(i,0);		painter.lineTo(i,iHeight);		painter.setPen(darkGray);				painter.moveTo(i,j++);		painter.lineTo(i,iHeight);	}	printf("prepare to paint label\n");	if (gShowLbl) PaintLabels(&painter);	printf("end\n");	painter.end();	return;}void MessageBox(char* ch){	QMessageBox::warning(NULL,QString::fromLocal8Bit(ch),QString::fromLocal8Bit(ch));		printf("%s\n",ch);}void MessageBox(int i){	char ch[50];	memset(ch,0,50);	//sprintf(ch,"%d,%x",i,i);	//QMessageBox::warning(NULL,ch,ch);	//printf("%s",ch);}int ParsePrj(char* prjfile){	printf("begin parsing prjfile\n");		printf("size of picbody:%d\n",sizeof(PICBODY));	memset(&picctrl,0,sizeof(picctrl));	picctrl.inumber=-1;	PICPRJHEAD 	prjhead;	PICBODY*	pbody=NULL;	int i=0;	FILE* file=fopen(prjfile,"r+b");	if(!file)			gotoerror("prjfile not exists\n");				picctrl.blhasfile=true;	if(fread(&prjhead,1,sizeof(prjhead),file)!=sizeof(prjhead))		gotoerror("read prjhead error\n");		picctrl.iplaytype=prjhead.iPlayType;	picctrl.ipiccount=prjhead.iPicCount;	picctrl.iplaytype=prjhead.iPlayType;	if(ppicbodyarr) delete [] ppicbodyarr;	ppicbodyarr=new (PICBODY*)[prjhead.iPicCount];	printf("now,begining parsing....\n");	pbody=new(PICBODY);	for(i=0;i<prjhead.iPicCount;i++)	{		pbody=new(PICBODY);		if(fread(pbody,1,sizeof(PICBODY),file)!=sizeof(PICBODY))		{			delete pbody;			gotoerror("parse bmp info error\n");			}		ppicbodyarr[i]=pbody;		printf("delaytime:%d\n",pbody->iDelayTime);		if((i==prjhead.iPicCount-1)&&pbody->iNextPic==-1)		{			pbody->iNextPic=0;		}		//printf("bmp info:title:%s\n",\					pbody->chTitle);		//printf("bmp size:%d\n",pbody->iSize);		//printf("bmp next:%d\n",pbody->iNextPic);	}		//delete pbody;	return 1;_error:	if(ppicbodyarr)	delete ppicbodyarr;	ppicbodyarr=NULL;	//if (pbody) 	delete pbody;	if(file) fclose(file);	return -1;}void * udpclient(void *){	int sock=socket(AF_INET,SOCK_DGRAM,0);	//int timeo=3000;	if(sock==-1)	return NULL;	struct sockaddr_in addr;	memset(&addr,0,sizeof(struct sockaddr_in));	addr.sin_addr.s_addr = htonl(INADDR_ANY);	addr.sin_family=AF_INET;	addr.sin_port=htons(7010);	if(bind(sock,(struct sockaddr*)&addr,sizeof(struct sockaddr))==-1)		return NULL;	struct  timeval timeout;	timeout.tv_sec=1; 	timeout.tv_usec=0;    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(struct timeval)); 	int recvlen,clientsock;	char recvbuff[2000];	bool recving=false;	FILE* pfile=NULL;	int hasrecv=0;	char* bitarr=NULL;	int  packcount=0;	struct sockaddr_in addrsvr;	socklen_t addrlen=0;	int failcount=0;	for(;;)	{	_recvcode:		if((recvlen=recvfrom(sock,recvbuff,2000,0,(struct sockaddr*)&addrsvr,&addrlen))>0)		{			if (recvlen>0)			{				if(failcount) failcount=0;				if(!PBROADCASTHEAD(recvbuff)->iflag) continue;				if(!recving)				{					if(PBROADCASTHEAD(recvbuff)->itotalsize>0)					{						pfile=fopen(PBROADCASTHEAD(recvbuff)->chfilename,"w+b");						char* ptemp=new char[PBROADCASTHEAD(recvbuff)->itotalsize];						fwrite(ptemp,1,PBROADCASTHEAD(recvbuff)->itotalsize,pfile);						packcount=(PBROADCASTHEAD(recvbuff)->itotalsize+PACKSIZE-1)/PACKSIZE;						printf("filename:%s\n",PBROADCASTHEAD(recvbuff)->chfilename);						recving=true;						hasrecv=0;						bitarr=new char[packcount];						memset(bitarr,0,packcount);					}					else					{						mainwindow->ResetPaint();						continue;					}				}				printf("recv size:%d,totalsize:%d,ipos:%d\n",recvlen,PBROADCASTHEAD(recvbuff)->itotalsize,PBROADCASTHEAD(recvbuff)->ipos);				//if( PBROADCASTHEAD(recvbuff)->ipos<5&&test)	continue; 				printf("udp recvlen:%d\n",hasrecv+=recvlen-sizeof(BROADCASTHEAD));				*(bitarr+PBROADCASTHEAD(recvbuff)->ipos)=1;				fseek(pfile,PBROADCASTHEAD(recvbuff)->ipos*1024,SEEK_SET);				fwrite(recvbuff+sizeof(BROADCASTHEAD),1,recvlen-sizeof(BROADCASTHEAD),pfile);			}		}		else		{//recv len<0			//printf("failcount:%d,pack count:%d,recvcount:%d\n",failcount,packcount,recvlen);			failcount++;			if(recving)			{				if(failcount<5) 				for(int i=0;i<packcount;i++)				{					printf("pos:%d,%d",i,*(bitarr+i));					if(!*(bitarr+i)&&addrlen)//we has known the server addr					{						printf("pos:%d was lost\n",*(bitarr+i));						int socksnd=socket(PF_INET,SOCK_DGRAM,0);						printf("send pos%d\n",i);						BROADCASTHEAD head;						memset(&head,0,sizeof(BROADCASTHEAD));						head.iflag=0;						head.ipos=i;						struct sockaddr_in socksvr;						memcpy(&socksvr,&addrsvr,sizeof(struct sockaddr_in));						socksvr.sin_port = htons (7011);						if(-1==sendto(socksnd,&head,sizeof(BROADCASTHEAD),0,(sockaddr*)&socksvr,sizeof(struct sockaddr_in)))						{							printf("send error\n");							break;						}						//usleep(10000);						close(socksnd);						goto _recvcode;					}				}				//printf("recv suc\n");				fclose(pfile);				mainwindow->SetCurrentFileName("ppt.bmp");				mainwindow->repaint(true);				pfile=NULL;				recving=false;			}		}	}	close(sock);	return NULL;}int recvprj(int sock,int ilen){	REQCMD	reqcmd;	ACKCMD	ackcmd;	char* buff=new char[ilen];	char* bmpbuff=NULL;	PICPRJHEAD* phead=NULL;	char  statestr[50];	char  bmpname[10];	if(recvn(sock,buff,ilen)==-1)		gotoerror("error where recv prj file\n");	memset(&ackcmd,0,sizeof(ackcmd));	if(sendfail(sock,&ackcmd,sizeof(ackcmd)))		gotoerror("error when send ack\n");			phead=(PICPRJHEAD*)buff;	printf("piccount:%d,playtype:%d,size:%d",phead->iPicCount,phead->iPlayType,phead->iSize);	for(int i=0;i<phead->iPicCount;i++)	{			printf("prepare to recv bmp %d\n",i);		sprintf(statestr,"receiving picture:%d/%d",i+1,phead->iPicCount);		mainwindow->SetStateStr(statestr);		memset(&reqcmd,0,sizeof(reqcmd));		if(recvfail(sock,&reqcmd,sizeof(reqcmd)))			gotoerror("error when recv bmp req\n");			bmpbuff=new char[reqcmd.nextdatalen];		if(recvn(sock,bmpbuff,reqcmd.nextdatalen)==-1)			gotoerror("error when recv bmp file\n");		if(sendfail(sock,&ackcmd,sizeof(ackcmd)))			gotoerror("error when send bmp ack\n");		memset(bmpname,0,10);		sprintf(bmpname,"%d.bmp",i);		savefile(bmpname,bmpbuff,reqcmd.nextdatalen);		delete	bmpbuff;		bmpbuff=NULL;		printf("recv bmp:%d succ\n",i);	}	savefile(prjfilename,buff,ilen);	ParsePrj(prjfilename);	if(buff)	delete buff;	return 1;_error:	if (buff)	delete buff;		if(bmpbuff)	delete bmpbuff;	return -1;}void * PicManageThread(void* pparam){	char 		chbmpname[20];	PICBODY*	pbody;	int 		idelay=0,i;	//int 		fdfifo,fdfifoblock;	int 		chcmd;	int 		retid;	struct 		message msg;	int icount=0;	//if (parseprj(prjfilename)==-1)	//	gotoerror("parse prj failed\n");			if(!picctrl.blhasfile)		gotoerror("term has no prj\n");	if(!picctrl.ipiccount)		gotoerror("prj has no files\n");	//show first file	picctrl.inumber=0;	picctrl.blplaying=true;	picctrl.blpausing=false;	printf("begin playing \n");	switch (picctrl.iplaytype)	{		case 0://auto		{_autoplay:			printf("count:%d\n",icount++);			printf("**********************************************************************\n");			memset(chbmpname,0,20);			pbody=ppicbodyarr[picctrl.inumber];				printf("now playing bmp:%d,delay time is %d second\n",picctrl.inumber,pbody->iDelayTime);			printf("title:%s,delaytime:%d,isize:%d,inextpic:%d\n",pbody->chTitle,pbody->iDelayTime,pbody->iSize,pbody->iNextPic);			sprintf(chbmpname,"%d.bmp",picctrl.inumber);			//printf(chbmpname);			mainwindow->ShowPic(chbmpname,pbody->iMoveinType);			idelay=pbody->iDelayTime*100;				for(i=0;i<idelay;i++)			{				//printf("delay:%d:%d\n",i,idelay);			//	printf("open pipe to read\n");				if(!picctrl.blpausing)					retid=msgrcv(msglistid,&chcmd,0,0,IPC_NOWAIT);				else 						retid=msgrcv(msglistid,&chcmd,0,0,0);			//	printf("msg return\n");				if(retid>=0)				{					printf("recv cmd:%d\n",chcmd);					switch(chcmd)					{						case PICBEGINPLAY:							{								printf("beign\n");								sem_wait(&gsem);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -