www.pudn.com > inet_stock.zip > APPMAIN.C


/* hq_cl:股票行情,分析,资讯,交易。
*  by lgd/Paladin.InetSoft guangzhou 1996.9
*  http://www.nease.net/~inetsoft, inetsoft@163.net
*  modify by lym(看此程序学了些win32编程,修改后作者里却不愿写上原作者的一个人) guangzhou 1997.5-1998
*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "global.h"
#include "resource.h"
#include "appmain.h"

#include "pctcp.h"
#include "hq.h"
#include "hq_cl.h"
#include "jy_cl.h"

#include "caption.h"
#include "mmp.h"
#include "cj.h"
#include "status.h"
#include "xlt.h"
#include "jlt.h"
#include "graph.h"
#include "maxmin.h"
#include "lithq.h"
#include "zs.h"
#include "fx.h"
#include "toolbar.h"
#include "msg.h"
#include "rsa.h"
#include "env.h"
#include "comm.h"

#include "hq_tcp.h"

int WinVer =3;
HINSTANCE ghInstance =NULL;

HWND ghWndMain =NULL, 
    ghWndStatus =NULL, 
    ghWndMaxMin =NULL,
	ghWndXlt =NULL, 
	ghWndJlt =NULL,
	ghWndCaption =NULL, 
	ghWndZs =NULL,
	ghWndMmp =NULL, 
	ghWndCj =NULL, 
	ghWndHq =NULL, 
	ghWndLitHq =NULL, 
	ghWndFx =NULL,
	ghDlgChkUsr =NULL,
	ghWndToolBar =NULL, 
	ghWndTips =NULL,
	ghWndHelp=NULL,
	hWndInput =NULL;
	
HMENU ghMenuHq =NULL, 
	ghMenuMain =NULL, 
	ghMenuMainGraph =NULL, 
	ghMenuGraph =NULL;
	
HBITMAP hBmpUp =NULL, 
	hBmpDown =NULL, 
	hBmpEqual =NULL;
	
BOOL IsSzRead=FALSE,IsShRead=FALSE;

int STATUS_HEIGHT=0;
int MSG_HEIGHT =0;
int INPUT_WIDTH =0; 
int TOOLBAR_HEIGHT =0;

BOOL gfTest =FALSE;

int gfOnLine = FALSE,
	gfConnecting =TRUE,
	gfDelete=FALSE;
int jy_running =FALSE;

char * IpSendBuffer,
	 *IpCommitBuffer;
unsigned int IpSendLen =0,
	IpCommitLen =0;

HANDLE hLibCtl3d =NULL;
char inkey[16+1],*winpy=NULL;
short SeleGp[MAX_SELE_NUM][2];

char UserID[HQ_USERID_SIZE+1];
char UserPwd[HQ_USERPWD_SIZE+1];

//extern HWND ghDlgJy;

extern char szDataPath[128];
extern unsigned int RANGE_MENU[7];
extern int SeleQs;

extern LPSTR HqTitles[HQ_FLDS_COUNT+2];
extern int Jy(void);
extern void UDP_Send_Exit(void);
extern HBRUSH DrawChild(HDC hDC, HWND hWnd);

extern int UDP_Client_ReadHq(void);
extern int AnaRecvData(void);
extern int AnaJyRecvData(void);

extern int UDP_Client_ReadJy(void);
extern int UDP_Send_Hq00(int jys, BOOL fFirst, int fRefresh, int fSel, int recCount, short *recList);
extern int UDP_Send_Hq01(int, BOOL, int, int);
extern int UDP_Send_Zx(void);
extern int sdHq,JyOffLineTime;
extern JY_ANS_CHKUSR curChkUsrRes;
extern HFILE hfZx ;

extern BOOL  Ip_Send_Pack();
extern int InitQsInfo(void);
extern int JyQs;
extern char Addr[MAX_ZQS_COUNT][15];
extern int ConnectToJyHost(char *HostName);
extern void SendJyQsxx(void);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstPre,
					LPSTR lpszCmdLine, int nCmdShow)
{                      	
	WNDCLASS wc;
	HWND hwnd;
	MSG msg;
	int x,y;
    
	if(hInstPre)
	{
		hwnd =FindWindow(APPNAME, NULL);
		if(hwnd)
			SetFocus(hwnd);
		return FALSE;
	}
	ghInstance =hInstance;
	
	memset(&wc, 0, sizeof(wc));
	wc.style =0;
	wc.lpfnWndProc = MainWndProc;
	wc.lpszClassName =APPNAME;
	wc.hbrBackground =GetStockObject(BLACK_BRUSH);
	wc.hInstance = hInstance;
	wc.lpszMenuName = NULL;
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);        
	wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
		
	if(!RegisterClass(&wc))
	{
		ErrMsg(NULL, "RegisterClass wnd_main failed!");
		return FALSE;                         
	}       
	
	if(!RegisterChilds()) return FALSE;
	
	if(!AppInit())
	{
		ErrMsg(NULL, "AppInit failed!");
		AppExit();
		return FALSE;
	}
	if(strstr(lpszCmdLine,"/T")!=NULL||strstr(lpszCmdLine,"/t")!=NULL)
		gfTest =TRUE;

	x =GetSystemMetrics(SM_CXSCREEN);
	y =GetSystemMetrics(SM_CYSCREEN) -GetSystemMetrics(SM_CYCAPTION)*2;
	hwnd =CreateWindow(APPNAME, APPNAME, WS_SYSMENU|WS_CLIPCHILDREN|
			WS_THICKFRAME|WS_MAXIMIZEBOX|WS_MINIMIZEBOX,
			0, 0, x, y,
			NULL, NULL, hInstance, NULL);	
	if(hwnd ==NULL)
	{
		ErrMsg(NULL, "建立主窗口失败!");
		return FALSE;
	}
	ghWndMain =hwnd;	
	ShowWindow(hwnd, SW_SHOW);
	InvalidateRect(hwnd, NULL, FALSE);
	
	while(GetMessage(&msg, 0, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	AppExit();
	
	return msg.wParam;
}

void LoadPy(void)
{
	OFSTRUCT os;
	HANDLE hf;
	long len;
	
	hf=OpenFile("winpy.dat", &os, OF_SHARE_DENY_NONE|OF_READ);	
	if(hf!=HFILE_ERROR)
	{   
		if((len =_llseek(hf,0L,SEEK_END))>0L)
		{
			winpy = (char *)GlobalAllocPtr(GHND,len+1);
			if(winpy!=NULL)
			{
				_llseek(hf,0L,SEEK_SET);
				if(_lread(hf,winpy,(UINT)len)!=(UINT)len)
				{
					GlobalFreePtr(winpy);
					winpy =NULL;
				}	
			}
		}
	}
	if(hf!=HFILE_ERROR) _lclose(hf);
}

BOOL AppInit(void)
{
	FARPROC fpTemp =NULL;
		
	WinVer =LOBYTE(LOWORD(GetVersion()));
	if(WinVer <4)
	{
		hLibCtl3d =LoadLibrary("CTL3DV2.DLL");
		if((UINT)hLibCtl3d <=32)
			hLibCtl3d =LoadLibrary("CTL3D.DLL");
		if((UINT)hLibCtl3d >32)
		{
			fpTemp =GetProcAddress(hLibCtl3d, "Ctl3dRegister");
			if(fpTemp)
				(*fpTemp)(ghInstance);
			fpTemp =GetProcAddress(hLibCtl3d, "Ctl3dAutoSubclass");
			if(fpTemp)
				(*fpTemp)(ghInstance);
		}
	}

	ghMenuMain =LoadMenu(ghInstance, MAKEINTRESOURCE(IDR_MENU_MAIN));
	if(!ghMenuMain)
	{
		ErrMsg(NULL, "Load main menu failed!");
		return FALSE;
	}
	ghMenuHq =GetSubMenu(ghMenuMain, 0);
	ghMenuMainGraph =LoadMenu(ghInstance, MAKEINTRESOURCE(IDR_MENU_GRAPH));
	
	if(!ghMenuMainGraph)
	{
		ErrMsg(NULL, "Load graph menu failed!");
		return FALSE;
	}
	ghMenuGraph =GetSubMenu(ghMenuMainGraph, 0);

	hBmpUp =LoadBitmap(ghInstance, MAKEINTRESOURCE(IDB_UP));
	hBmpDown =LoadBitmap(ghInstance, MAKEINTRESOURCE(IDB_DOWN));
	hBmpEqual =LoadBitmap(ghInstance, MAKEINTRESOURCE(IDB_EQUAL));

	if(!HqInit()) return FALSE;
	if(!JyInit()) return FALSE;
	if(!GraphInit()) return FALSE;
	if(!AnalyseInit()) return FALSE;
	if(PCTCPInit() !=0)
	{
		ErrMsg(NULL, "PCTCPInit() failed!");
		gfOnLine =FALSE;
	}
	IpSendBuffer = (char *)GlobalAllocPtr(GHND,MAX_WRITE_BUF_SIZE +1);
	if(IpSendBuffer ==NULL) return FALSE;
	
	IpCommitBuffer = (char *)GlobalAllocPtr(GHND,MAX_WRITE_BUF_SIZE +1);
	if(IpCommitBuffer ==NULL) return FALSE;
	GetSet();
	LoadPy();
	return TRUE;
}

void AppExit(void)
{
	FARPROC fpTemp =NULL;
	static BOOL fExit =FALSE;
	
	if(fExit) return;
	
	fExit =TRUE;

	SaveSet();

	GraphExit();
	HqExit();
	JyExit();
	PCTCPExit();
	GlobalFreePtr(IpSendBuffer);
	GlobalFreePtr(IpCommitBuffer);
	FxExit(Fx);

	if(ghMenuMain) DestroyMenu(ghMenuMain);
	if(ghMenuMainGraph) DestroyMenu(ghMenuMainGraph);
	if(hBmpUp) DeleteObject(hBmpUp);
	if(hBmpDown) DeleteObject(hBmpDown);
	if(hBmpEqual) DeleteObject(hBmpEqual);
	if((UINT)hLibCtl3d >32)
	{
		fpTemp =GetProcAddress(hLibCtl3d, "Ctl3dUnregister");
		if(fpTemp)
			(*fpTemp)(ghInstance);
		FreeLibrary(hLibCtl3d);
	}
	if(winpy!=NULL) GlobalFreePtr(winpy);
}

extern void ReadHqDataAll(void); 
extern void WriteHqDataAll(void);
extern void DelOldData(void);   
extern void ReadHqData(int jys);


LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message,
					WPARAM wParam, LPARAM lParam)
{
	FARPROC lpFarProc=NULL;
	static int recNum =0;
	int i,ret,j;
	char temp[100+1];
	HDC hDC;
	TEXTMETRIC tm;		
	STOCK_INFO_FRAME StockInfo;
	
	switch(message)
	{
		case WM_CREATE:		
			ghWndMain =hWnd;
			ghDlgJy =NULL;

			hDC =GetDC(hWnd);
			GetTextMetrics(hDC, &tm);
			ReleaseDC(hWnd,hDC);
			
			STATUS_HEIGHT =30;			
            MSG_HEIGHT =tm.tmHeight+4;
			INPUT_WIDTH =tm.tmMaxCharWidth*10;
			
			if(!CreateChilds(hWnd)) 
				return -1;
			InvalidateRect(hWnd, NULL, FALSE);
			PostMessage(hWnd,WM_USER+4,0,0L);
		break;  
		case WM_USER+1:
			switch(lParam)
			{
				case FD_READ:
					AnaRecvData();
				break;
				case FD_CONNECT:
					gfConnecting=FALSE;	
					gfOnLine =TRUE;					
					if(UDP_Send_Hq00(0, TRUE, FALSE, FALSE, HqPaintData.curRecCount, &recNum)<0)
					{
						ErrMsg(ghWndMain, "不能请求行情数据");
						gfOnLine =FALSE;
						PostMessage(hWnd,WM_USER+3,0,0L);
						break;
					}
					
					SetTimer(hWnd, 1, 100, NULL);		
					SetTimer(hWnd, 2, 1000*HQ_REFRESH_TIME, NULL);
				
					lpFarProc =MakeProcInstance((FARPROC)HqUserDlgProc, ghInstance);
					DialogBox(ghInstance, MAKEINTRESOURCE(IDD_HQUSER),
								hWnd, lpFarProc);
					FreeProcInstance(lpFarProc);
					
					if(!gfOnLine)
						PostMessage(hWnd,WM_USER+3,0,0L);
					else
					{			
						Msg("请求主机发送初始化数据",MSG_VERT);
						DelOldData();
						gfDelete=TRUE;
						gfOnLine=TRUE;						
					}
				break;
			}
		break;		
		case WM_USER+2:
			switch(lParam)
			{
				case FD_READ:
				    AnaJyRecvData();
				break;
				case FD_CONNECT:
					JyQs =SeleQs;
					DispQsName(JyQs,0);
					if(!ReadRsaCiper(JyQs,RsaKey,temp))
					{
						SendJyQsxx();
						RsaOk =0;
					}
					else
					{
						strncpy(DesKey,temp,8);
						DesKey[8]=0;
						RsaOk =1;
						DispQsName(JyQs,RsaOk);
					}				
				break;
			}
		break;
		case WM_USER +3:
			gfConnecting=FALSE;
			ReadHqDataAll();
			if(ReCreateChild()!=0)
				return (-1);
			IsSzRead=IsShRead=TRUE;				
			GetSelSet();
			SetTimer(hWnd, 1, 100, NULL);		
			SetTimer(hWnd, 2, 1000*HQ_REFRESH_TIME, NULL);
		break;
		case WM_USER +4:
			gfOnLine =FALSE;			
			gfConnecting=TRUE;            
			recNum =0;	     
            
            if(BeginConnect(HostName)<0)
			{
				Msg("连接主机失败,系统进入离线状态",MSG_VERT);
				PostMessage(hWnd,WM_USER+3,0,0L);
			}
			else
			{
				sprintf(temp,"正在连接主机%s",HostName);
				Msg(temp,MSG_VERT);
				SetTimer(hWnd, 1, 15000, NULL);
			}		
		break;
		case WM_USER +5:
			Msg("读取深圳初始化文件",MSG_VERT);		
			ReadHqData(0);
			IsSzRead=TRUE;		
		break;
		case WM_USER +6:
			Msg("读取上海初始化文件",MSG_VERT);		
			ReadHqData(1);
			IsShRead=TRUE;
			InitQsInfo();
			GetSelSet();
			if(access("winpy.dat",0)!=0)
			{
			 	StockInfo.type=FILE_WINPY;
				strcpy(StockInfo.name,"winpy.dat");
			   	UDP_Send_Stock_Info(&StockInfo);
			}			
		break;
		case WM_USER +7:
			LoadPy();
		break;
		case WM_SIZE:
		    CreateChilds(ghWndMain);
		break;

		case WM_SYSKEYDOWN:
			ret =toupper(wParam);
			switch(ret)
			{
			    case 'H':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F1, 0L);
			    break; 
			    case 'J':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F2, 0L);
			    break; 
				case 'R':
					SendMessage(ghWndXlt, WM_KEYDOWN,VK_F3, 0L);
				break;
				case 'A':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F4, 0L);
				break;				
				case 'Z':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F5, 0L);
				break;
				case 'W':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F6, 0L);
				break;				
				case 'S':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F7, 0L);
				break;
				case 'F':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F8, 0L);				
				break;				
				case 'E':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F9, 0L);					
				break; 
				case 'G':
					SendMessage(ghWndHq, WM_KEYDOWN,VK_F12, 0L);
				break;
				case 'Q':
					SendMessage(hWnd, WM_CLOSE,0, 0L);
				break;
				case '1':
					if((curChkUsrRes.userId !=0 && curChkUsrRes.flag==ANS_SUCC)||
							gfTest)
                    	DlgBuySell('B');
				break;
				case '2':
					if((curChkUsrRes.userId !=0 && curChkUsrRes.flag==ANS_SUCC)||
							gfTest)
                    	DlgBuySell('S');
				break;				
				case '3':
					if((curChkUsrRes.userId !=0 && curChkUsrRes.flag==ANS_SUCC)||
							gfTest)
                    	DlgCancel();
				break;	
				case '4':
					if((curChkUsrRes.userId !=0 && curChkUsrRes.flag==ANS_SUCC)||
							gfTest)
                    	DlgCjcx();
				break;
				case '5':
					if((curChkUsrRes.userId !=0 && curChkUsrRes.flag==ANS_SUCC)||
							gfTest)
                    	DlgWtcx();
				break;
				case '6':
					if((curChkUsrRes.userId !=0 && curChkUsrRes.flag==ANS_SUCC)||
							gfTest)
                    	DlgYecx();
				break;								
				case '7':
					if((curChkUsrRes.userId !=0 && curChkUsrRes.flag==ANS_SUCC)||
							gfTest)
                    	DlgChgPwd();
				break;				
			}
		break;

		case WM_TIMER:
			if(wParam ==2 && gfOnLine)
				CheckTime(TRUE);
			if(wParam ==1)
			{   
				KillTimer(ghWndMain,1);
				
				if(gfConnecting &&!gfOnLine)
				{
					ErrMsg(hWnd, "连接主机失败,系统进入离线状态");
					PostMessage(hWnd,WM_USER+3,0,0L);
				}				
				Ip_Send_Pack();
				
			    //if(JyOffLineTime>0)
             	//	JyOffLineTime--;
             	//if(JyOffLineTime==0)
             	//{
             	//	Msg("交易连接时间过长,系统复位",MSG_VERT);
             	//  	curChkUsrRes.userId=0;
             	//} 
             	
             	//if(JyOffLineTime<10&&JyOffLineTime*(int)JyOffLineTime/2==JyOffLineTime
             	//		&&JyOffLineTime>0)
             	//	DrawTime(-2);
             	//else
				DrawTime(-1);
					
             	SetTimer(ghWndMain,1,400,NULL);
			}
			if(wParam ==6) DestroyWindow(hWnd);
		break;
		
		case WM_CHAR:
			if(ghWndSetup==NULL)
			{
				SendMessage(ghWndMsg, WM_CHAR, wParam, lParam);
				return 0;
			}
		break;		
		case WM_KEYDOWN:
			if(wParam==VK_RETURN)
			{
				GetWindowText(hWndInput, inkey, sizeof(inkey));				
			    ret =PreComm(inkey);
			    switch(ret)
			    {
			    	case IP_CONN_COMM:
						strcpy(HostName,inkey);
						strcpy(inkey,"");
			    		SendMessage(hWnd, WM_USER+4, 0, 0L);
			    		SetWindowText(hWndInput, "");			    	
			    	break;
					case NULL_COMM:			    	
			    	case OP_CODE_COMM:
			    	case GP_CODE_COMM:
						if(IsWindowVisible(ghWndFx))
							SendMessage(ghWndFx, WM_KEYDOWN, wParam, lParam);
						else if(IsWindowVisible(ghWndXlt))
							SendMessage(ghWndXlt, WM_KEYDOWN, wParam, lParam);
						else SendMessage(ghWndHq, WM_KEYDOWN, wParam, lParam);			    	
			    	break;
			    	case PY_NAME_COMM:
			    		if(winpy==NULL)
			    			break;
			    		for(i=0;i<10;i++) SeleGp[i][0]=-1;
			    		
						for(i =0,j=0; itype =i;
						else Fx->type =IDM_FX_MACD;
					}
					Fx->IsDataOk=FALSE;
				    SendMessage(ghWndHq,WM_KEYDOWN,VK_F9,0L);
				break;
				case IDM_FX_5:
				case IDM_FX_15:
				case IDM_FX_30:
				case IDM_FX_60:
				case IDM_FX_DAY:
				case IDM_FX_WEEK:
				case IDM_FX_MONTH:
					for(i=0;irange], MF_BYCOMMAND|MF_UNCHECKED);
						Fx->range =i;
					}
					if(IsWindowVisible(ghWndFx))
					{
						Fx->IsDataOk=FALSE;
						InvalidateRect(ghWndFx, NULL, TRUE);
					}
				break;				
				case IDM_NEWS:
				     SendMessage(ghWndHq,WM_KEYDOWN,VK_F12,0L);
				break;
				case IDM_HELP:
				     SendMessage(ghWndHq,WM_KEYDOWN,VK_F1,0L);
				break;				
				case IDM_SZDP:
					SendMessage(ghWndHq, WM_COMMAND, IDM_GRAPH, 3L);
				break;
				case IDM_SHDP:
				    SendMessage(ghWndHq, WM_COMMAND, IDM_GRAPH, 4L);
				break;
				case IDM_GGXX:
				     SendMessage(ghWndHq,WM_KEYDOWN,VK_F3,0L);
				break;
				case IDM_EXIT:
					SendMessage(hWnd, WM_CLOSE, 0, 0L);
				break;
				
				default:
					if(IsWindowVisible(ghWndHq))
						SendMessage(ghWndHq, WM_COMMAND, wParam, lParam);
					//else if(IsWindowVisible(ghWndXlt))
					//	SendMessage(ghWndXlt, WM_COMMAND, wParam, lParam);
		    		else if(IsWindowVisible(ghWndFx))
						SendMessage(ghWndFx ,WM_COMMAND, wParam, lParam);
				break;
			}
		break;
	}
	
	return DefWindowProc(hWnd, message, wParam, lParam);
}

LRESULT CALLBACK HqSelDlgProc(HWND hDlg, UINT message,
						WPARAM wParam, LPARAM lParam)
{
	int i, k;
	char tmp[256];
	static int SelNum;
	DWORD dw;
	HWND hctl;
	int sel_num[MAX_HQSEL_REC_COUNT+1];
	LPSTR tok;
	
	switch(message)
	{
		case WM_INITDIALOG:
			ghDlgJy =hDlg;
			SendMessage(hDlg,WM_USER+1,wParam,lParam);
		return TRUE;	
		case WM_USER+1:
			SelNum =(int)lParam-IDM_HQSEL_SET_1;
			
			if(SelNum >=5)
			{
				EndDialog(hDlg, 0);
				return FALSE;
			}
			k =0;
			if(HqSelData[SelNum].recCount <=0)
				HqSelData[SelNum].jys =HqPaintData.jys;
			for(i =0; iMAX_HQSEL_REC_COUNT)
					{
						wsprintf(tmp, "最大可选数量不能超过%d", MAX_HQSEL_REC_COUNT);
						ErrMsg(hDlg, tmp);
						break;
					}
					if(SendDlgItemMessage(hDlg, IDL_NOTSEL, LB_GETSELITEMS, (int)dw,
										(LPARAM)(int FAR *)&sel_num[0]) ==LB_ERR)
						break;
					
					for(i =0; i<(int)dw; i++)
					{
						if(SendDlgItemMessage(hDlg, IDL_NOTSEL, LB_GETTEXT, sel_num[i],
							(LPARAM)(LPSTR)tmp) ==LB_ERR)
						{
							ErrMsg(hDlg, "Error LB_GETTEXT");
							break;
						}
						SendDlgItemMessage(hDlg, IDL_SEL, LB_ADDSTRING, i,
							(LPARAM)(LPSTR)tmp);
					}
					for(i =(int)dw -1; i>=0; i--)
						SendDlgItemMessage(hDlg, IDL_NOTSEL, LB_DELETESTRING, sel_num[i], 0L);
					
					hctl =GetDlgItem(hDlg, IDOK);
					EnableWindow(hctl, TRUE);
				break;
			    
			    case IDC_DEL:
					dw =SendDlgItemMessage(hDlg, IDL_SEL, LB_GETSELCOUNT, 0, 0L);
					if(dw ==LB_ERR) break;
					if(SendDlgItemMessage(hDlg, IDL_SEL, LB_GETSELITEMS, (int)dw,
										(LPARAM)(int FAR *)&sel_num[0]) ==LB_ERR)
						break;
					
					for(i =0; i<(int)dw; i++)
					{
						if(SendDlgItemMessage(hDlg, IDL_SEL, LB_GETTEXT, sel_num[i],
							(LPARAM)(LPSTR)tmp) ==LB_ERR)
						{
							ErrMsg(hDlg, "Error LB_GETTEXT");
							break;
						}
						SendDlgItemMessage(hDlg, IDL_NOTSEL, LB_ADDSTRING, i,
							(LPARAM)(LPSTR)tmp);
					}
					for(i =(int)dw -1; i>=0; i--)
						SendDlgItemMessage(hDlg, IDL_SEL, LB_DELETESTRING, sel_num[i], 0L);
					
					hctl =GetDlgItem(hDlg, IDOK);
					EnableWindow(hctl, TRUE);
				break;
			    
				case IDOK:
					k =(int)SendDlgItemMessage(hDlg, IDL_SEL, LB_GETCOUNT, 0, 0L);
					if(k >MAX_HQSEL_REC_COUNT)
					{
						wsprintf(tmp, "最大可选数量不能超过%d", MAX_HQSEL_REC_COUNT);
						ErrMsg(hDlg, tmp);
						break;
					}
					
					for(i =0; i3) break;
		DrawDlgFrame(hDlg, (BOOL)wParam, 1);
	return TRUE;

	case WM_NCPAINT:
		if(WinVer >3) break;
		DrawDlgFrame(hDlg, -1, 0);
	return TRUE;   
    */
		case WM_COMMAND:
			switch(wParam)
			{
				case IDC_ADD:
					dw =SendDlgItemMessage(hDlg, IDL_NOTSEL, LB_GETCURSEL, 0, 0L);
					if(dw ==LB_ERR) break;
					i =(int)dw;
					if(SendDlgItemMessage(hDlg, IDL_NOTSEL, LB_GETTEXT, i,
							(LPARAM)(LPSTR)tmp) ==LB_ERR)
					{
						ErrMsg(hDlg, "Error LB_GETTEXT");
						break;
					}
					SendDlgItemMessage(hDlg, IDL_SEL, LB_ADDSTRING, i,
						(LPARAM)(LPSTR)tmp);
					
					SendDlgItemMessage(hDlg, IDL_NOTSEL, LB_DELETESTRING, i, 0L);
					
					hctl =GetDlgItem(hDlg, IDOK);
					EnableWindow(hctl, TRUE);
				break;
			    
			    case IDC_DEL:
					dw =SendDlgItemMessage(hDlg, IDL_SEL, LB_GETCURSEL, 0, 0L);
					if(dw ==LB_ERR) break;
					i =(int)dw;
					if(SendDlgItemMessage(hDlg, IDL_SEL, LB_GETTEXT, i,
							(LPARAM)(LPSTR)tmp) ==LB_ERR)
					{
						ErrMsg(hDlg, "Error LB_GETTEXT");
						break;
					}
					SendDlgItemMessage(hDlg, IDL_NOTSEL, LB_ADDSTRING, i,
							(LPARAM)(LPSTR)tmp);
					SendDlgItemMessage(hDlg, IDL_SEL, LB_DELETESTRING, i, 0L);
					
					hctl =GetDlgItem(hDlg, IDOK);
					EnableWindow(hctl, TRUE);
				break;
			    
				case IDOK:
					j =(int)SendDlgItemMessage(hDlg, IDL_SEL, LB_GETCOUNT, 0, 0L);
					
					for(i =0; i=250) *(msg+250) =0;
	wsprintf(tmp, "错误: %s", msg);
	if(ghDlgJy) hwnd =ghDlgJy;
	else if(hwnd ==NULL) hwnd =ghWndMain;
	else hwnd =hWnd;
	MessageBox(hwnd, tmp, APPNAME, MB_OK|MB_ICONSTOP);
	return FALSE;
}

BOOL GetInitString(char *Entry, char *Item, char *buf)
{
	GetPrivateProfileString(Entry, Item, "", buf, 256, "st_cl.ini");
	if(*buf ==0) return FALSE;
	return TRUE;
}

BOOL PutInitString(char *Entry, char *Item, char *buf)
{
	return WritePrivateProfileString(Entry, Item, buf, "st_cl.ini");
}

int CheckTime(BOOL fRead)
{
	char tmp[15];
	LPSTR tok;
	int tim, jys;
	static int recNum =0;
	BOOL fret =FALSE;
	
	_strtime(tmp);
	tok =strtok(tmp, ":");
	tim =atoi(tok)*60;
	tim +=atoi(strtok(NULL, ":"));
	tim -=1;
	for(jys =0; jys <2; jys++)
	{
		if(tim HqTime[jys].pm_min_start+HqTime[jys].pm_min_count
				|| (tim HqTime[jys].am_min_start+HqTime[jys].am_min_count))
		{
			//if(HqTime[jys].fRunning ==TRUE)
				//HqTime[jys].fRunning =FALSE;
		}
		else if(HqTime[jys].fRunning ==FALSE)
		{
			HqTime[jys].fRunning =TRUE;     
			if(fRead)
			{
			    //if(!gfConnecting&&gfOnLine)
			    //{
				//	if(UDP_Send_Hq00(0, TRUE, FALSE, FALSE, HqPaintData.curRecCount, &recNum)<0)
				//	{
				//		ErrMsg(ghWndMain, "UDP_Send_Hq00 failed");
				//		DestroyWindow(ghWndMain);
				//		return FALSE;
				//	}
				//}
				fret =TRUE;
			}
		}
	}
	return fret;
}

int SaveSet(void)
{
	int i, j;
	char tmp[6000], tmp1[256];
	
	for(i =0; i<5; i++)
	{
		sprintf(tmp, "%d,%d", HqSelData[i].jys, HqSelData[i].recCount);
		for(j =0; j=2) HqSelData[i].jys =1;
		if(!(tok =strtok(NULL, ","))) continue;
		HqSelData[i].recCount =atoi(tok);
		for(j =0; j=2) HqSelData[i].jys =1;
		if(!(tok =strtok(NULL, ","))) continue;
		HqSelData[i].recCount =atoi(tok);
		for(j =0; j0)
				step = maxRange/TolNum;
		break;
		case WM_USER+2:
			strcpy(file,(LPSTR)lParam);
			TolNum=sline =CurSor=0;
			
			TolNum =LoadPage(file,sline,0);
			if(TolNum>0) 
			{
				step = maxRange/TolNum;
				InvalidateRect(ghWndHelp, NULL, TRUE);
			}
			else
				SetTimer(hWnd,1,1000,NULL);
			
		break;
		case WM_VSCROLL:
			pos=GetScrollPos(hWnd,SB_VERT);
			if(wParam==SB_BOTTOM)
				sline=TolNum -1;
			if(wParam==SB_LINEDOWN)
				if(sline=0) 
					sline -=LinePerScr;
				else 
					sline=0;			
			}
			if(wParam==SB_LINEUP) if(sline>0) sline--;
			if(wParam==SB_TOP) sline=0;
			pos=step*sline ;
			SetScrollPos(hWnd,SB_VERT,pos,TRUE);
			InvalidateRect(ghWndHelp, NULL, TRUE);
		break;
		case WM_KEYDOWN:
			if(wParam==VK_ESCAPE)
			{
				SetScrollPos(hWnd,SB_VERT,0,TRUE);
				ShowWindow(hWnd,SW_HIDE);
				KillTimer(hWnd,1);
				for(i=0;i0)
				{
					hdc =GetDC(hWnd);
					SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
					SetBkColor(hdc, RGB(0, 0, 0));				
					SetTextColor(hdc, RGB(10,150,100));
					TextOut(hdc,2,CurSor*FontHeight,PageBuff[sline+CurSor],
						strlen(PageBuff[sline+CurSor])-1);
						
			 		if(CurSor>0) CurSor--; 
					SetTextColor(hdc, RGB(0,255,255));
					TextOut(hdc,2,CurSor*FontHeight,PageBuff[sline+CurSor],
						strlen(PageBuff[sline+CurSor])-1);
						
			 		ReleaseDC(hWnd,hdc);
			 	}
			 	break;
			}
			
			if(wParam==VK_DOWN) 
			{   
				if(TolNum>0)
				{
					hdc =GetDC(hWnd);	
					SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
					SetBkColor(hdc, RGB(0, 0, 0));				
					SetTextColor(hdc, RGB(10,150,100));
					TextOut(hdc,2,CurSor*FontHeight,PageBuff[sline+CurSor],
						strlen(PageBuff[sline+CurSor])-1);			
					
					if(CurSor0)
				{
					CurSor =0;
					if(sline+LinePerScr0)
				{
					CurSor =LinePerScr -1;
					if(sline -LinePerScr>=0) 
						sline -=LinePerScr;
					else 
						sline=0;
				}
			}
			if(wParam ==VK_RETURN)
			{   
			
				if(TolNum>0)
				{
					if(strstr(strupr(file),"IDX")!=NULL)
			        {
						StockInfo.type= 2;
						strncpy(line,PageBuff[sline+CurSor],12);
						line[12] =0;
						for(i=0;i<12;i++)
						{
							if(line[i]!=' ') break;
						}
						if(i<12)
						{
							strcpy(StockInfo.name,&line[i]);
			    			sprintf(file,"%s\\%s",szDataPath,&line[i]);
			    			TolNum=sline =CurSor=0;
			    			UDP_Send_Stock_Info(&StockInfo);
			    			SetTimer(hWnd,1,3000,NULL);
			    		}
			    	}
			    }
			}
			pos=step*sline ; 
			SetScrollPos(hWnd,SB_VERT,pos,TRUE);
			InvalidateRect(ghWndHelp, NULL, TRUE);
		break;
		case WM_TIMER:
			KillTimer(hWnd,1);
			TolNum =LoadPage(file,sline,0);
			if(TolNum>0) 
			{
				step = maxRange/TolNum;
				InvalidateRect(ghWndHelp, NULL, TRUE);
			}
			else
				SetTimer(hWnd,1,1000,NULL);
		break;
		//case WM_KILLFOCUS:
		//	KillTimer(hWnd,1);
		//break;
		case WM_PAINT:
			BeginPaint(hWnd, &ps);
			SelectObject(ps.hdc,GetStockObject(SYSTEM_FIXED_FONT));
			SetBkColor(ps.hdc, RGB(0, 0, 0));
			
    		for(i=sline,j=0;i