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

📄 draw.c

📁 站长96年写的一个Internet上用的股票行情、分析、交易、资讯程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <windows.h>#include <stdio.h>#include <malloc.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <commdlg.h>#include "resource.h"#include "global.h"#include "fx.h"#define	SELECTED_COLOR	RGB(255,0,0)extern 	CHOOSECOLOR cc;extern 	char *DIAGR_NAME;extern HWND ghWndFx;int DrawDiagram(HDC hDc,int CurRecPrt,int Show,PARA *Para,DATA *Data,PAINT_PARA *PaintPara,long Feature){	int i,j,k;	double 	fhdj,               //高密度			fwdt,               //宽密度			step,               //每相邻横坐标的值差			repl;	int fwdk,                   //一个K线的宽		htitle,                 //顶标注区高		ltitle,                 //顶标注区长度的一半		wleft,                  //左标注区宽		wtitle,                 //顶标注区长度		show,                   //显示记录数		coor;                   //横坐标数目	long feature;               //画图特性码	HPEN hPen,hDPen[20];	HBRUSH hBBrush;	char tmp[20];	TEXTMETRIC tm;	HDC hdc;		    if(Para->rc.bottom ==0||Para->rc.right ==0)    	return TRUE;	if(hDc!=NULL)	hdc =hDc;	else 	hdc =GetDC(ghWndFx);	if(Feature==0L)	feature=Para->feature;	else	feature=Feature;		SetTextColor(hdc,RGB(200,155,0));	SetBkColor(hdc,RGB(0,0,0));	SetTextAlign(hdc,TA_LEFT|TA_TOP);	SetBkMode(hdc, OPAQUE);	SelectObject(hdc,GetStockObject(SYSTEM_FONT));	SelectObject(hdc,GetStockObject(BLACK_PEN));	SelectObject(hdc,GetStockObject(BLACK_BRUSH));	GetTextMetrics(hdc, &tm);	Rectangle(hdc,0,0,PaintPara->rc.right/2,tm.tmHeight+2);	TextOut(hdc,0, 2, DIAGR_NAME, strlen(DIAGR_NAME));		SetBkMode(hdc, TRANSPARENT);		SelectObject(hdc, PaintPara->hFont);	show =Show;	if(show+CurRecPrt>Data->size) show=Data->size-CurRecPrt;		SelectObject(hdc, GetStockObject(WHITE_PEN));	GetTextMetrics(hdc, &tm); 	htitle=(int)(tm.tmHeight+tm.tmHeight*30/100);	Para->htitle =htitle;	if(Fx->PaintPara.wleft==0)	{    	wleft=(int)(tm.tmAveCharWidth*10+tm.tmMaxCharWidth*20/100);    	Fx->PaintPara.wleft=wleft;    }    else    	wleft=Fx->PaintPara.wleft;	//画外框	if(feature&DW_FRAME&&!(feature&DW_SELE))	{		SelectObject(hdc,GetStockObject(BLACK_BRUSH));		hPen =CreatePen(PS_SOLID, FRAME_WIDTH, RGB(200,200,200));			SelectObject(hdc,hPen);		SelectObject(hdc,GetStockObject(BLACK_BRUSH));		Rectangle(hdc,Para->rc.left+1,Para->rc.top,			Para->rc.right,Para->rc.bottom);    		Rectangle(hdc,Para->rc.left+wleft,Para->rc.top,			Para->rc.right,Para->rc.bottom);		SelectObject(hdc, GetStockObject(BLACK_PEN));		DeleteObject(hPen);    	}			//画选中标志		SetBkMode(hdc, OPAQUE);	SelectObject(hdc,GetStockObject(WHITE_PEN));	if(PaintPara->object==Para->no)		SelectObject(hdc,GetStockObject(GRAY_BRUSH));	else		SelectObject(hdc,GetStockObject(BLACK_BRUSH));	Rectangle(hdc,Para->rc.left+2,Para->rc.top+1,		Para->rc.left+wleft-1,Para->rc.top+htitle+2);	SelectObject(hdc,GetStockObject(BLACK_BRUSH));		SetBkMode(hdc, TRANSPARENT);			   	if(Data->size <=0||show==0)   	{    	    if(hDc==NULL)	ReleaseDC(ghWndFx,hdc);   	 	return FALSE;   	}    if(DW_DELE&feature)		SetROP2(hdc,R2_XORPEN);    		SetRect(&Para->rc,Para->rc.left +FRAME_WIDTH,Para->rc.top +FRAME_WIDTH,			Para->rc.right -FRAME_WIDTH,Para->rc.bottom -FRAME_WIDTH);	if(DEFSHOWDOT>show)		fwdt =(float)(Para->rc.right-Para->rc.left-wleft-5)/DEFSHOWDOT;	else		fwdt =(float)(Para->rc.right-Para->rc.left-wleft-5)/show;	fwdk=(int)(fwdt*80/100);    	Para->fwdt =fwdt;		//计算最大值	if(feature&DW_MAX)	{		Para->price[0]=0;		for(i=CurRecPrt; i<CurRecPrt+show; i++)		{ 	    	for(j=0;j<Data->num;j++)	    	{				//if(Para->color[j]==0)				//	continue;	    					if(Para->price[0]<Data->v[j][i]) 					Para->price[0]=Data->v[j][i];			}		}	}	//计算最小值	if(feature&DW_MIN)	{		Para->price[1]=Para->price[0];    		for(i=CurRecPrt; i<CurRecPrt+show; i++)		{ 	    	for(j=0;j<Data->num;j++)	    	{	    		if(Para->color[j]==0&&Data->method[0]==VOULMN_BAR_METHOD)	    			continue;				if(Para->price[1]>Data->v[j][i]&&Data->v[j][i]!=0) 					Para->price[1]=Data->v[j][i];			}		}	}		//if(Para->price[0]==0||Para->price[0]==Para->price[1])	if(Para->price[0]==Para->price[1])		fhdj=1;					else			fhdj =(double)(Para->rc.bottom-Para->rc.top-htitle)/(double)(Para->price[0]-Para->price[1]);	Para->fhdj =fhdj;			//标顶部数据名称	SetTextAlign(hdc, TA_LEFT|TA_TOP);	wtitle =(Para->rc.right-wleft -5)/4;	ltitle =wtitle/2;	for(i=0,j=0;i<10;i++)	{		if(strlen(Para->pname[i])==0)			continue;		strcpy(tmp,Para->pname[i]);		Para->xtitle[j]=j*wtitle +5;		if(feature&DW_NAME)		{			if((feature&DW_DELE|feature&DW_SELE)&&GetSerial(feature)==i)				SetTextColor(hdc,SELECTED_COLOR);			else				SetTextColor(hdc,Para->color[i]);			TextOut(hdc,Para->xtitle[j]+wleft,Para->rc.top+2,				tmp,strlen(tmp));		}		Para->xtitle[j]+=ltitle+wleft;		j++;	}		//标左边坐标	coor =5;	step = (Para->price[0]-Para->price[1])/coor;	while(step*fhdj<tm.tmHeight&&coor>0)	{		coor--;		if(coor==0) 		{			step =0;			coor =1;			break;		}		step = (Para->price[0]-Para->price[1])/coor;	}	SetViewportOrg(hdc, Para->rc.left+wleft,		(int)((Para->price[0]-Para->price[1])*fhdj)+Para->rc.top+htitle);		SetTextAlign(hdc, TA_RIGHT|TA_TOP);	if(feature&DW_SELE|feature&DW_DELE)		SetTextColor(hdc,SELECTED_COLOR);    else		SetTextColor(hdc, RGB(255, 255, 0));	SelectObject(hdc, PaintPara->hFont);	for(i=1;i<=coor&&(feature&DW_LEFT);i++)	{		MoveTo(hdc,0,(int)(-1*(step*fhdj*i)));		hLineTo(hdc,Para->rc.right-wleft-FRAME_WIDTH,(int)(-1*(step*fhdj*i)));			if(Data->method[0]==VOULMN_BAR_METHOD)			sprintf(tmp, "%.0f",Para->price[1]+step*i);		else			sprintf(tmp, "%.2f",Para->price[1]+step*i);		TextOut(hdc, -1*FRAME_WIDTH,(int)(-1*(step*fhdj*i)), tmp, strlen(tmp));	}		//画警告线		SetViewportOrg(hdc, Para->rc.left+wleft,		(int)(Para->price[0]*fhdj)+Para->rc.top+htitle);	if(feature&DW_ALERT)	{   		for(j=0;j<3;j++)		{			if(Para->price[2+j]==0) 				continue;			if((feature&DW_DELE|feature&DW_SELE)&&GetSerial(feature)==j)				hPen=CreatePen(PS_DOT,1,SELECTED_COLOR);  	    	else    			hPen=CreatePen(PS_DOT,1,RGB(10,150,100));      		SelectObject(hdc,hPen);			MoveTo(hdc,0,-1*(int)(fhdj*Para->price[2+j]));			LineTo(hdc,Para->rc.right-wleft-FRAME_WIDTH,-1*(int)(fhdj*Para->price[2+j]));			SelectObject(hdc, GetStockObject(BLACK_PEN));			DeleteObject(hPen);					}		}	//画0轴	if(Para->price[1]<=0&&Para->price[0]>=0&&feature&DW_X_COOR)	{   		if(feature&DW_DELE|feature&DW_SELE)			hPen=CreatePen(PS_SOLID,1,SELECTED_COLOR);  	    else			hPen =CreatePen(PS_SOLID, 1, RGB(65,65,65));		SelectObject(hdc, hPen);         		MoveTo(hdc,0,0);		LineTo(hdc, Para->rc.right-wleft,0);		SelectObject(hdc, GetStockObject(WHITE_PEN));		DeleteObject(hPen);	}    //建立画笔    for(j=0;j<20;j++)    {       	if(Para->color[j]!=0)    	{   			if((feature&DW_DELE|feature&DW_SELE)&&!(j/10)^GetSerial(feature))				hDPen[j]=CreatePen(PS_SOLID,1,SELECTED_COLOR);      	    else    			hDPen[j] =CreatePen(PS_SOLID, 1, Para->color[j]);    	}    	else    	    hDPen[j] =0;    }    hBBrush=CreateSolidBrush(RGB(0,255,255));    SelectObject(hdc,GetStockObject(BLACK_BRUSH));	//画分析数据线	for(j=0;j<10;j++)	{   		if(Para->color[j]==0)			continue;		if(!(feature>>j&0x1))			continue;		//价K线		if(Data->method[j] ==PRICE_BAR_METHOD&&j<7)		{			if(Para->color[j+3]!=0)				continue;			for(i =CurRecPrt,k=1; i<CurRecPrt+show; i++,k++)			{				if(Data->v[j][i]<Data->v[j+1][i])      //ks<ss				{       					SelectObject(hdc, hDPen[j]);					Rectangle(hdc,(int)(fwdt*k),-(int)(Data->v[j][i]*fhdj),						(int)(fwdt*k)+fwdk,-(int)(Data->v[j+1][i]*fhdj));					if(Data->v[j+2][i]>Data->v[j+1][i])					{						MoveTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+1][i]*fhdj));						LineTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+2][i]*fhdj));					}					if(Data->v[j+3][i]<Data->v[j][i])					{						MoveTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j][i]*fhdj));						LineTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+3][i]*fhdj));					}				}							if(Data->v[j][i]==Data->v[j+1][i])     //ks ==ss				{		    		SelectObject(hdc, hDPen[j]);		    		MoveTo(hdc,(int)(fwdt*k),-(int)(Data->v[j][i]*fhdj));		    		LineTo(hdc,(int)(fwdt*k)+fwdk,-(int)(Data->v[j][i]*fhdj));					if(Data->v[j+2][i]>Data->v[j][i])					{						MoveTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j][i]*fhdj));						LineTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+2][i]*fhdj));					}					if(Data->v[j+3][i]<Data->v[j+1][i])					{						MoveTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+1][i]*fhdj));						LineTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+3][i]*fhdj));					}		    				}   		 		 				if(Data->v[j][i]>Data->v[j+1][i])	//ks>ss				{		   					SelectObject(hdc, hDPen[10+j]);					SelectObject(hdc,hBBrush);					Rectangle(hdc,(int)(fwdt*k),-(int)(Data->v[j+1][i]*fhdj),						(int)(fwdt*k)+fwdk,-(int)(Data->v[j][i]*fhdj));					if(Data->v[j+2][i]>Data->v[j][i])					{                              						MoveTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j][i]*fhdj));						LineTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+2][i]*fhdj));					}					if(Data->v[j+3][i]<Data->v[j+1][i])					{						MoveTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+1][i]*fhdj));						LineTo(hdc,(int)((fwdt*k)+fwdk/2),-(int)(Data->v[j+3][i]*fhdj));					}					SelectObject(hdc,GetStockObject(BLACK_BRUSH));													}			    }		}		//方形		if(Data->method[j] ==VOULMN_BAR_METHOD)		{			for(i =CurRecPrt,k=1; i<CurRecPrt+show; i++,k++)			{						if(Data->v[j+1][i]<=0)				{       					SelectObject(hdc, hDPen[j]);					if(fwdk>0)						Rectangle(hdc,(int)(fwdt*k),-(int)(Data->v[j][i]*fhdj),							(int)(fwdt*k)+fwdk,-(int)(Para->price[1]*fhdj));					else					{						MoveTo(hdc,(int)(fwdt*k+fwdk/2),-(int)(Para->price[1]*fhdj));						LineTo(hdc,(int)(fwdt*k+fwdk/2),-(int)(Data->v[j][i]*fhdj));					}				}						if(Data->v[j+1][i]>0)				{		   					SelectObject(hdc, hDPen[10+j]);					SelectObject(hdc,hBBrush);										if(fwdk>0)						Rectangle(hdc,(int)(fwdt*k),-(int)(Data->v[j][i]*fhdj),							(int)(fwdt*k)+fwdk,-(int)(Para->price[1]*fhdj));					else					{						MoveTo(hdc,(int)(fwdt*k+fwdk/2),-(int)(Para->price[1]*fhdj));						LineTo(hdc,(int)(fwdt*k+fwdk/2),-(int)(Data->v[j][i]*fhdj));					}					SelectObject(hdc,GetStockObject(BLACK_BRUSH));						}	        			}				}		//曲线		if(Data->method[j] ==CURVE_METHOD)		{			for(i=CurRecPrt,k=1;i<CurRecPrt+show&&Data->v[j][i]==0;i++,k++);			if(i<CurRecPrt+show)			{				if(Data->v[j][i]<Para->price[1])					repl =Para->price[1];				else if(Data->v[j][i]>Para->price[0])			    	repl =Para->price[0];		    	else		    		repl =Data->v[j][i];				MoveTo(hdc,(int)(fwdt*k+fwdk/2),(int)(-1*fhdj*repl));				SelectObject(hdc,hDPen[j]);					for(; i<CurRecPrt+show; i++,k++)

⌨️ 快捷键说明

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