www.pudn.com > cguitest7.15.rar > Guilib.cpp


#include"stdafx.h" 
 
#include"guilib.h" 
#include 
#include 
#include 
#include 
//////////////////////////////////////////////////////////////globe various////////////////////////////////////////////////////// 
CNode* gl_focus = NULL;     //point to the node with text or button 
CNode* gl_mainfocus = NULL; //point to the node with win 
void*  gl_pointerCollector[OBJ_NUM]; 
int    gl_pointerType[OBJ_NUM]; 
CWin*  gl_desktop = NULL; 
int    gl_pointerNum = 0; 
CVector* gl_activeWinVec = NULL; 
CMssg* gl_mssg = NULL; 
void* gl_pdata = NULL; 
CVector* gl_mssgVec = NULL;  
/////////////////////////////////////////////////globe pointer manage///////////////////////////////////////////////////// 
void collectPointer(void* pointer, int ptrType){ 
 
	gl_pointerCollector[gl_pointerNum] = pointer; 
	gl_pointerType[gl_pointerNum] = ptrType; 
	gl_pointerNum++; 
} 
void iniGui(CWin* pstartWindow){ 
 
//	gl_pdata = newCData(NULL, DEF_TYPE); 
	gl_mssg = newCMssg(NULL, WM_DEF, 0, 0);  
    gl_mssgVec = newCVector(); 
	gl_activeWinVec = newCVector();	 
	CRect1* deskRect = newCRect(30, 30, SCREEN_X, SCREEN_Y); 
    gl_desktop = newCWin(deskRect, "desktop"); 
//    void* pdesktopData = newCData(gl_desktop, CWIN); 
 
//	CData* pstartWinData = newCData(pstartWindow, CWIN);//start node 
	 
	 
//	gl_activeWinVec->push_back(gl_desktop, gl_activeWinVec); 
//    gl_activeWinVec->push_back(pstartWindow, gl_activeWinVec);//push startWindow into activeWinVec 
	 
    show(gl_desktop);//, CWIN); 
	show(pstartWindow);//, CWIN); 
 
} 
void freeAll(){ 
 
	int i=0; //void* p=NULL; 
	for(i=0; isize = 0; 
//	gl_activeWinVec->head = NULL; 
//	gl_activeWinVec->tail = NULL; 
} 
 
void freeOne(void* pointer){ 
	if(pointer==NULL){   
		return;  
	} 
	int i;  
	for(i=0; isize = 0; 
	self->head = NULL; 
	self->tail = NULL; 
    //member function 
    self->push_back = push_back; 
	self->eraseByIndex = eraseByIndex; 
    self->eraseByKey = eraseByKey; 
	self->getByIndex = getByIndex; 
	self->getIndex = getIndex; 
	self->clear = clear; 
    collectPointer(self, CVECTOR);//add to pointercollector 
	return self;	 
} 
CNode* newCNode(){ 
 
	CNode* self = (CNode*)malloc(sizeof(CNode)); 
	self->next = NULL; 
	self->pdata = NULL; 
	collectPointer(self, CNODE); 
	return self; 
} 
 
 
CNode* push_back(void* pdata, CVector* self){ 
 
		CNode* p = newCNode();    //create a home node for the elem 
		p->pdata = pdata; 
		p->next = NULL; 
		if( self && self->tail){                //not empty 
			self->tail->next = p;      //add to the end of the list, become the new tail 
		}else{                   //empty list 
			self->head = p; 
		} 
		self->tail = p; 
		self->size++; 
		push_back_hook(p, pdata); 
		return p; 
} 
void push_back_hook(CNode* pnewNode, void* pdata){ 
     
	int winType = TYPE_DEF; 
	CWin* pwin = NULL; 
	CButtn* pbtn = NULL; 
	CText* ptxt = NULL; 
 
	winType = getPtrType(pdata); 
 
	switch(winType){ 
	case CWIN: 
		    pwin = (CWin*)pdata; 
			pwin->pExtra = pnewNode; 
			break; 
	case CBUTTN: 
			pbtn = (CButtn*)pdata; 
			pbtn->pExtra = pnewNode; 
			break; 
    case CTEXT: 
			ptxt = (CText*)pdata; 
			ptxt->pExtra = pnewNode; 
			break; 
	} 
	 
} 
void eraseByIndex(int nindex, CVector* self){ 
 
	   	if(nindex>=0 && self && nindexsize){			 
		    if(self->head==self->tail){      //has only one node  
		    	self->head = NULL;  
		    	self->tail = NULL; 
			}else if(nindex==0){ //delete head node (list have at least two nodes) 
		    	CNode* q = self->head;  
		    	self->head = self->head->next;	 
			}else{ 
		    	CNode* p = self->head; 
				int i; 
		    	for(i=0; inext; 
				} 
		    	if(p->next==self->tail){              //target node is tail 
			    	self->tail = p; 
				}else{                          //target node is between head and tail 
			    	p->next = p->next->next; 
				} 
			} 
		    self->size--; 
		} 
 
} 
void eraseByKey(const void* pdata, CVector* self){ 
     
	   CNode* p = NULL; 
       CNode* q = NULL;	 
	   if(self && self->head && self->head->pdata==pdata){				//delete head node 
        	if(self->head==self->tail){                         //has only one node 
		    	self->head = NULL;  
		    	self->tail = NULL; 
			}else{                                  //has at least two nodes 
		    	self->head = self->head->next;	 
			} 
			self->size--; 
			return; 
		} 
 
							//record the p's forhead 
		for(p=self->head; p!=self->tail; q=p, p=p->next ){ 
			if(p->pdata==pdata){                       //find the target node 
				q->next = p->next;                   //target is between head and tail 
				self->size--; 
				return; 
			} 
		} 
		if(p && p==self->tail && p->pdata==pdata){           //delete tail node 
			self->tail = q; 
            self->size--; 
		}  
 
} 
 
void* getByIndex(int nindex, CVector* self){ 
 
	if(nindex>=0 && nindexsize){ 
			CNode* p = NULL; 
			int j = 0; 
			for(j=0,p=self->head; jnext); 
			return p->pdata; 
	} 
    return NULL;	 
} 
 
int getIndex(const void* pdata, CVector* self){ 
 
    int i=0; 
	void* ptemp = NULL; 
	for(i=0; isize; i++){ 
        ptemp = self->getByIndex(i, self); 
		if(ptemp==pdata){ 
			return i; 
		} 
	} 
	return -1; 
} 
 
void clear(CVector* self){ 
	self->size = 0; 
	self->head = NULL; 
	self->tail = NULL; 
} 
//////////////////////////////////////////////////////////////CData//////////////////////////////////////////////////////// 
/*CData* newCData(void* pobj, int wintype){ 
 
	CData* self = (CData*)malloc(sizeof(CData)); 
	self->wintype = wintype; 
	self->pobj = pobj; 
	collectPointer(self, CDATA); 
	return self; 
}*/ 
//////////////////////////////////////////////////////////////CRec//////////////////////////////////////////////////////// 
 
CRect1* newCRect(int x, int y, int w, int l){ 
 
	CRect1* self = (CRect1*)malloc(sizeof(CRect1)); 
	self->x = x; 
	self->y = y; 
    self->w = w; 
	self->l = l; 
	collectPointer(self, CRECT); 
	return self; 
} 
//////////////////////////////////////////////////////////////CMssg//////////////////////////////////////////////////////// 
 
CMssg* newCMssg(void* pdata, int type, int lparam, int wparam){ 
 
	CMssg* self = (CMssg*)malloc(sizeof(CMssg)); 
	self->pdata = pdata; 
	self->type = type; 
	self->lparam = lparam; 
	self->wparam = wparam; 
	collectPointer(self, CMSSG); 
	return self; 
} 
//////////////////////////////////////////////////////////////CWin//////////////////////////////////////////////////////// 
CWin* newCWin(CRect1* prec, char* caption){ 
 
    int i; 
	CWin* self = (CWin*)malloc(sizeof(CWin)); 
	self->prec = prec; 
    self->caption = caption; 
	self->pchild_vec = newCVector(); 
	 
	for(i=0; iwinproc[i] = NULL; 
	} 
	self->winproc[WM_SHOW1] = OnShow;    //default proc 
	self->winproc[WM_CHANGEFOCUS1] = OnChangeFocus;//focus; 
	self->winproc[WM_CLOSE1] = OnClose; 
//	self->addComponent = addComponent; 
//	self->drawWin = drawWin; 
	collectPointer(self, CWIN); 
	return self; 
} 
 
void changeFocus(){ 
	 
	//get topwin in activeWinVec; 
 
	eraseFocus(); 
 
	CNode* ptopNode= gl_activeWinVec->tail;      
	if(ptopNode == NULL){ 
 
		gl_mainfocus = NULL; 
		gl_focus = NULL; 
 
	}else if(gl_mainfocus!=ptopNode){//if top win is changed, renew the two globe pointer          
	 
		gl_mainfocus = ptopNode; 
		gl_focus = gl_mainfocus; 
 
	}else if(gl_focus!=gl_mainfocus){ //gl_mainfocus==ptopNode && gl_mainfocus!=gl_focus                                                        
		if(gl_focus && getPtrType(gl_focus)==CNODE && gl_focus->next){ 
	//	if(gl_focus && gl_focus->next){ 
			gl_focus = gl_focus->next; 
		}else{ 
			gl_focus = gl_mainfocus; 
		} 
     
	}else{								//gl_focus==gl_mainfocus 
        CWin* pwin = (CWin*)gl_mainfocus->pdata; 
//		if(pwin && getPtrType(pwin)==CWIN && pwin->pchild_vec && pwin->pchild_vec->head) 
//		int nPtrTp = getPtrType(pwin); 
//	    if(nPtrTp==CWIN && pwin->pchild_vec->size>0) 
			gl_focus = pwin->pchild_vec->head; 
	} 
//	if(gl_activeWinVec->size!=1){//if only desktop left, need no focustag 
		tagFocus(); 
//	}else{ 
//		eraseFocus(); 
//	} 
	 
} 
 
void tagFocus(){ 
 
	void* pdata = NULL; 
	CWin* pwin = NULL; 
	CButtn* pbtn = NULL; 
	CText* ptxt = NULL; 
    CDC *pDC = (AfxGetApp()->m_pMainWnd)->GetDC(); 
    int nptrTp = getPtrType(gl_focus); 
	if(gl_focus && nptrTp==CNODE && gl_focus->pdata){ 
//    if(gl_focus && gl_focus->pdata){ 
		pdata = gl_focus->pdata; 
		int winType = getPtrType(pdata);  
		switch(winType){ 
		case CWIN: 
			pwin = (CWin*)pdata; 
			if(pwin->caption != "desktop") 
				pDC->TextOut(pwin->prec->x-10, pwin->prec->y, '>'); 
			break; 
		case CBUTTN: 
			pbtn = (CButtn*)pdata; 
            pDC->TextOut(pbtn->prec->x-10, pbtn->prec->y, '>'); 
			break; 
		case CTEXT: 
			ptxt = (CText*)pdata; 
			pDC->TextOut(ptxt->prec->x-10, ptxt->prec->y, '>'); 
			break; 
		} 
	} 
	(AfxGetApp()->m_pMainWnd)->ReleaseDC(pDC); 
} 
void eraseFocus(){ 
 
	void* pdata = NULL; 
	CWin* pwin = NULL; 
	CButtn* pbtn = NULL; 
	CText* ptxt = NULL; 
    CDC *pDC = (AfxGetApp()->m_pMainWnd)->GetDC(); 
    int nptrTp = getPtrType(gl_focus); 
	if(gl_focus && nptrTp==CNODE && gl_focus->pdata){ 
//	if(gl_focus && gl_focus->pdata){ 
 
		pdata = gl_focus->pdata; 
        int winType = getPtrType(pdata);  
		switch(winType){ 
		case CWIN: 
			pwin = (CWin*)pdata; 
            pDC->TextOut(pwin->prec->x-10, pwin->prec->y, "  "); 
			break; 
		case CBUTTN: 
			pbtn = (CButtn*)pdata; 
            pDC->TextOut(pbtn->prec->x-10, pbtn->prec->y, "  "); 
			break; 
		case CTEXT: 
			ptxt = (CText*)pdata; 
			pDC->TextOut(ptxt->prec->x-10, ptxt->prec->y, "  "); 
			break; 
		} 
	} 
    (AfxGetApp()->m_pMainWnd)->ReleaseDC(pDC); 
} 
 
void setFocus(void* p){ 
 
	eraseFocus(); 
	CWin* pwin = NULL; 
	CButtn* pbtn = NULL; 
	CText* ptxt = NULL; 
	int winType = getPtrType(p); 
	switch(winType){ 
	case CWIN: 
		pwin = (CWin*)p; 
		if(pwin->pExtra && gl_focus!=pwin->pExtra){ 
			gl_mainfocus = (CNode*)pwin->pExtra; 
			gl_focus= gl_mainfocus; 
		} 
		break; 
	case CBUTTN: 
		pbtn = (CButtn*)p; 
		if(pbtn->pExtra && gl_focus!=pbtn->pExtra){ 
			gl_focus = (CNode*)pbtn->pExtra; 
			gl_mainfocus = (CNode*)pbtn->parentWin->pExtra; 
		} 
		break; 
	case CTEXT: 
		ptxt = (CText*)p; 
		if(ptxt->pExtra && gl_focus!=ptxt->pExtra){ 
			gl_focus = (CNode*)ptxt->pExtra; 
			gl_mainfocus = (CNode*)ptxt->parentWin->pExtra; 
		} 
		break; 
	} 
	tagFocus(); 
} 
void OnChangeFocus(CMssg* pmssg){ 
 
    changeFocus(); 
 
} 
 
void addComponent(CWin* pwin, void* pdata){//, int wintype){ 
 
//	 CData* pdata = newCData(pobj, wintype); 
	 
 
	 pwin->pchild_vec->push_back(pdata, pwin->pchild_vec); 
 
	  
} 
 
void drawWin(CWin* self){ 
 
	 CDC *pDC = (AfxGetApp()->m_pMainWnd)->GetDC(); 
	 pDC->Rectangle(self->prec->x, self->prec->y, self->prec->x+self->prec->w, self->prec->y+self->prec->l); 
     pDC->TextOut(self->prec->x+DSP_GAP, self->prec->y+DSP_GAP, self->caption ); 
	 (AfxGetApp()->m_pMainWnd)->ReleaseDC(pDC); 
} 
//////////////////////////////////////////////////////////////CButtn/////////////////////////////////////////////////////// 
CButtn* newCButtn(CWin* parentWin, CRect1* prec, char* caption){ 
	int i; 
	CButtn* self = (CButtn*)malloc(sizeof(CButtn)); 
	self->prec = prec; 
    self->caption = caption; 
	self->parentWin = parentWin; 
 
	for(i=0; iwinproc[i] = NULL; 
	} 
	self->winproc[WM_SHOW1] = OnShow;    //default proc 
	self->winproc[WM_CHANGEFOCUS1] = OnChangeFocus;//focus; 
	self->winproc[WM_CLOSE1] = OnClose; 
	self->winproc[WM_CLICK1] = OnButtnClick;//for test 
	collectPointer(self, CBUTTN); 
	if(parentWin){ 
		addComponent(parentWin, self);//, CBUTTN); 
	} 
//	self->drawButtn = drawButtn; 
	 
	 
	return self; 
} 
 
 
void drawButtn(CButtn* self){ 
 
	 CDC *pDC = (AfxGetApp()->m_pMainWnd)->GetDC(); 
	 pDC->Rectangle(self->prec->x, self->prec->y, self->prec->x+self->prec->w, self->prec->y+self->prec->l); 
     pDC->TextOut(self->prec->x+DSP_GAP, self->prec->y+DSP_GAP, self->caption ); 
	 (AfxGetApp()->m_pMainWnd)->ReleaseDC(pDC); 
} 
 
 
//////////////////////////////////////////////////////////////CText/////////////////////////////////////////////////////// 
CText* newCText(CWin* parentWin, CRect1* prec, char* caption, int font_x, int font_y){ 
	int i=0; 
	CText* self = (CText*)malloc(sizeof(CText)); 
	self->parentWin = parentWin; 
	self->prec = prec; 
	self->caption = caption; 
	self->font_x = font_x; 
	self->font_y = font_y; 
	self->pformatVec = newCVector(); 
	self->curPos = 0; 
	self->endPos = 0; 
	self->dspChBgn = 0; 
	self->dspChEnd = 0; 
	self->dspLnBgn = 0;	 
	self->text[0] = '\0'; 
	 
	for(i=0; iwinproc[i] = NULL; 
	} 
	self->winproc[WM_CHANGEFOCUS1]=OnChangeFocus; 
	self->winproc[WM_KEYDOWN1]=OnKeyDown; 
    self->winproc[WM_DBKEYDOWN1]=OnDbKeyDown; 
	self->winproc[WM_TRIKEYDOWN1]=OnDbKeyDown; 
	collectPointer(self, CTEXT); 
	if(parentWin){ 
		addComponent(parentWin, self);//, CBUTTN); 
	} 
	 
	return self; 
} 
void drawText(CText* self){ 
      
	 CDC *pDC = (AfxGetApp()->m_pMainWnd)->GetDC(); 
	 pDC->Rectangle(self->prec->x, self->prec->y, self->prec->x+self->prec->w, self->prec->y+self->prec->l); 
     pDC->TextOut(self->prec->x, self->prec->y-self->font_y, self->caption ); 
     textOut(self); 
	 (AfxGetApp()->m_pMainWnd)->ReleaseDC(pDC); 
} 
void append(char c, CText* self){ 
	 
	if(self->endPos>=TEXT_BUFF_SIZE){ 
		//wait to add erro message 
	}else{ 
		int i=0; 
		for(i=self->endPos; i>=self->curPos; i--){ 
			self->text[i+1] = self->text[i]; 
		} 
		self->text[self->curPos] = c;     	 
		self->curPos++; 
		self->endPos++;	 
	}	 
} 
void delet(CText* self){ 
 
	if(self->endPos>0){ 
			int i=0; 
			for( i=self->curPos; i<=self->endPos; i++){ 
				self->text[i-1] = self->text[i]; 
			}  
			self->curPos--; 
			self->endPos--; 
			 
		} 
 
} 
void format(CText* self){ 
 
	int ncperLine = (self->prec->w-DSP_GAP*2)/self->font_x; 
	char* ptext = self->text; 
	int i=0; 
	int j=0; 
	int k=0; 
	int nCount = 0; 
	char* pch = NULL; 
	int nLineBgn = self->dspLnBgn; 
	int nLineEnd = self->dspLnBgn+(self->prec->l-DSP_GAP*2)/self->font_y; 
	 
//	CNode* pnode0 = NULL; 
//	CNode* pnode1 = NULL; 
    CVector* pvec = self->pformatVec; 
    clear(self->pformatVec); 
	push_back(ptext, self->pformatVec); 
	for(i=0; i<=self->endPos-1; i++,ptext++){ 
		 
		nCount++; 
		if(nCount==ncperLine || *ptext==ENTER){ 
			push_back(ptext+1, self->pformatVec); 
			nCount = 0; 
		} 
	} 
	push_back(self->text+self->endPos, self->pformatVec); 
     
	 
	if(nLineEnd>pvec->size-1){ 
		nLineEnd = pvec->size-1; 
	} 
	 
	for(j=0; jendPos; j++){ 
		if(self->text+j==pvec->getByIndex(nLineBgn, pvec)){ 
		    self->dspChBgn = j; 
			self->dspChEnd = j+i; 
			break; 
		} 
   
	} 
	i = self->dspChBgn; 
	//for(j=0; jsize-1; j++){ 
	for(j=nLineBgn; jgetByIndex(j, pvec); 
		//pnode1 = pvec->getByIndex(j+1, pvec); 
        k = 0; 
         
		for(pch=(char*)pvec->getByIndex(j, pvec); pchgetByIndex(j+1, pvec); pch++,i++,k++){ 
			self->format_x[i] = self->prec->x+DSP_GAP + k*self->font_x; 
			self->format_y[i] = self->prec->y+DSP_GAP + (j-nLineBgn)*self->font_y; 
		} 
   
	} 
 
	 
} 
void textOut(CText* self){ 
     
	 format(self); 
	 CDC *pDC = (AfxGetApp()->m_pMainWnd)->GetDC(); 
	 int i=0; 
  
	 for(i=self->dspChBgn; idspChEnd; i++){ 
 
		pDC->TextOut(self->format_x[i], self->format_y[i], self->text[i]); 
	 } 
     (AfxGetApp()->m_pMainWnd)->ReleaseDC(pDC); 
} 
 
void paint(void* pobj){//, int wintype){ 
	 
	int i; 
	int wintype = getPtrType(pobj); 
    void* pdata = NULL;  
	CVector* pvec = NULL; 
	CWin* pwin = (CWin*)pobj; 
	CButtn* pbtn = (CButtn*)pobj; 
	CText* ptxt = (CText*)pobj; 
 
	switch(wintype){ 
	case CWIN: 
		drawWin(pwin); 
		pvec = pwin->pchild_vec; 
 
		for(i=0; isize; i++){ 
			pdata = pvec->getByIndex(i, pvec); 
			paint(pdata);//, wintype); 
		} 
		break; 
	case CBUTTN: 
		drawButtn(pbtn); 
		break; 
	case CTEXT: 
		drawText(ptxt); 
		break; 
	} 
	 
} 
 
void show(CWin* pwin){ 
 
//	CData* pdata = newCData(pwin, CWIN); 
	void* pdata = NULL; 
	paint(pwin);//, CWIN); 
 
	int index = gl_activeWinVec->getIndex(pwin, gl_activeWinVec);//renew gl_activeWinVec 
 
	if(index==-1){//not found, add directly 
 
		gl_activeWinVec->push_back(pwin, gl_activeWinVec); 
 
	}else if(indexsize){ 
		 
//		freeOne(pdata);//free temp variable 
        pdata = gl_activeWinVec->getByIndex(index, gl_activeWinVec); 
		gl_activeWinVec->eraseByIndex(index, gl_activeWinVec); 
		gl_activeWinVec->push_back(pdata, gl_activeWinVec); 
	} 
	changeFocus(); 
	 
} 
 
void OnShow(CMssg* pmssg){ 
 
    void* pdata = pmssg->pdata; 
	int nptrTp = getPtrType(pdata); 
	if(nptrTp == CWIN){ 
		CWin* pwin = (CWin*)pdata; 
		show(pwin); 
	} 
 
} 
 
void OnClose(CMssg* pmssg){ 
 
	void* pdata = pmssg->pdata; 
	int nptrTp = getPtrType(pdata); 
	if(nptrTp == CWIN){ 
		CWin* pwin = (CWin*)pdata; 
		close(pwin); 
	} 
	 
} 
 
void close(CWin* pwin){ 
     
	CNode* pnode = NULL; 
//	void* pdata = NULL;//newCData(pwin, CWIN); 
	void* pdata = NULL; 
	gl_activeWinVec->eraseByKey(pwin, gl_activeWinVec); 
//    eraseFocus();//for test 
    paint(gl_desktop);//, CWIN); 
	pnode = gl_activeWinVec->tail; 
    if(pnode && pnode->pdata && pnode->pdata!=gl_desktop){ 
 
		pdata = pnode->pdata; 
		paint(pdata);//, pdata->wintype); 
	} 
	changeFocus(); 
//	freeOne(pdata); 
} 
 
void OnKeyDown(CMssg* pmssg){ 
	CText* text = NULL; 
 
	if(getPtrType(pmssg->pdata)==CTEXT){ 
		text = (CText*)pmssg->pdata; 
		append(pmssg->lparam, text); 
		if(text->parentWin){ 
			show(text->parentWin); 
			setFocus(pmssg->pdata); 
		} 
 
		 
	} 
} 
 
void OnDbKeyDown(CMssg* pmssg){ 
	CText* text = NULL; 
 
	if(getPtrType(pmssg->pdata)==CTEXT){ 
		text = (CText*)pmssg->pdata; 
		delet(text); 
		append(pmssg->lparam, text); 
		if(text->parentWin){ 
			show(text->parentWin); 
		} 
	} 
} 
 
void sendMessage(CMssg* pmssg){ 
	if(pmssg){ 
		push_back(pmssg, gl_mssgVec); 
	} 
} 
CMssg* waitMessage(){ 
	CMssg* ptemp = NULL; 
	for(;;){ 
		if(gl_mssgVec->size>0){ 
			ptemp = (CMssg*)gl_mssgVec->head->pdata; 
			eraseByKey(gl_mssgVec->head->pdata, gl_mssgVec); 
			Sleep(100); 
			return ptemp; 
		} 
	} 
	return NULL; 
} 
 
int dispatchMessage(CMssg* pmssg){ 
	CWin* pwin = NULL; 
	CButtn* pbtn = NULL; 
	CText* ptxt = NULL; 
	int winType = TYPE_DEF; 
    if(pmssg->type==WM_DESTROY1){ 
		return 0; 
	} 
	if(pmssg->pdata){ 
		//gl_focus = pmssg->pdata; 
		winType = getPtrType(pmssg->pdata); 
 
		switch(winType){ 
		case CWIN: 
			pwin = (CWin*)pmssg->pdata; 
			 
			if(pwin->winproc[pmssg->type] && pmssg->type!=WM_CHANGEFOCUS1 && gl_focus!=pwin->pExtra){ 
				setFocus(pwin); 
			} 
			if(pwin->winproc[pmssg->type] ){ 
					pwin->winproc[pmssg->type](pmssg); 
			} 
			break; 
 
		case CBUTTN: 
			pbtn = (CButtn*)pmssg->pdata; 
			 
			if(pbtn->winproc[pmssg->type] && pmssg->type!=WM_CHANGEFOCUS1 && gl_focus!=pbtn->pExtra){ 
				setFocus(pbtn); 
			} 
			if(pbtn->winproc[pmssg->type]){ 
				   pbtn->winproc[pmssg->type](pmssg); 
            } 
			break; 
 
        case CTEXT: 
			ptxt = (CText*)pmssg->pdata; 
			 
			if(ptxt->winproc[pmssg->type] && pmssg->type!=WM_CHANGEFOCUS1 && gl_focus!=ptxt->pExtra){ 
				setFocus(ptxt);	 
			} 
			if(ptxt->winproc[pmssg->type]){ 
					ptxt->winproc[pmssg->type](pmssg); 
			} 
			int tp = getPtrType(gl_focus->pdata);//for test 
			break; 
		 
		}//switch 
		 
	} 
//	freeOne(pmssg); 
	return 1; 
} 
int enter_main_times = 0;//for test 
char buff[20];           //for test 
//////////////////////////////////////////////////////////////test//////////////////////////////////////////////////////// 
 
void main(){ 
 
//	int a = 10; 
//	int i; 
//	char* caption=NULL; 
//	CVector* pv = NULL; 
//	CData* pda = NULL; 
//	CButtn* pbtn = NULL; 
     
    CDC *pDC = (AfxGetApp()->m_pMainWnd)->GetDC(); 
	enter_main_times++; 
	char* str = itoa(enter_main_times, buff, 10); 
	pDC->TextOut(500, 200, str); 
    CRect1* wrect1 = newCRect(60, 60, 140, 200); 
	CRect1* brect1 = newCRect(80, 80, 40, 20); 
	CRect1* brect2 = newCRect(80, 120, 40, 20); 
	CRect1* brect3 = newCRect(80, 160, 40, 20); 
    CRect1* trect1 = newCRect(80, 160, 100, 80); 
 
	CWin* win1 = newCWin(wrect1,"win1"); 
	CButtn* butn1 = newCButtn(win1, brect1, "butn1"); 
	//CButtn* butn2 = newCButtn(win1, brect2,  "butn2"); 
    //CButtn* butn3 = newCButtn(win1, brect3,  "butn3");	 
	CText* text2 = newCText(win1, trect1, "text2", 8, 16); 
 
	CWin* win2 = newCWin(wrect1, "win2"); 
	CButtn* butn4 = newCButtn(win2, brect2, "butn4"); 
    CText* text1 = newCText(win2, trect1, "text1", 8, 16); 
	CMssg* pmssg0 = NULL; 
    iniGui(win2); 
 
    append('1',text1); 
    append('2',text1); 
	append('3',text1); 
	append('4',text1); 
	append('5',text1); 
	append('<',text1); 
	append('6',text1); 
	append('7',text1); 
	append('8',text1); 
/*	append('9',text1); 
	append('1',text1); 
	append('1',text1); 
//	append('0',text1); 
	append('2',text1); 
 
	append('2',text1); 
    append('2',text1); 
	append('3',text1); 
	append('4',text1); 
	append('5',text1); 
	append('6',text1); 
	append('7',text1); 
	append('8',text1); 
	append('9',text1); 
	append('1',text1); 
	append('1',text1); 
//	append('0',text1); 
	append('2',text1); 
 
	append('3',text1); 
    append('2',text1); 
	append('3',text1); 
	append('4',text1); 
	append('5',text1); 
	append('6',text1); 
	append('7',text1); 
	append('8',text1); 
	append('9',text1); 
	append('1',text1); 
	append('1',text1); 
//	append('0',text1); 
	append('2',text1); 
 
	append('4',text1); 
    append('2',text1); 
	append('3',text1); 
	append('4',text1); 
	append('5',text1); 
	append('6',text1); 
	append('7',text1); 
	append('8',text1); 
	append('9',text1); 
	append('1',text1); 
	append('1',text1); 
	append('<',text1); 
	append('2',text1); 
 
	append('5',text1); 
    append('2',text1); 
	append('3',text1); 
	append('4',text1); 
	append('5',text1); 
	append('6',text1); 
	append('7',text1); 
	append('8',text1); 
	append('9',text1); 
	append('1',text1); 
	append('1',text1); 
	append('<',text1); 
	append('2',text1); 
 
    append('6',text1); 
    append('2',text1); 
	append('3',text1); 
	append('4',text1); 
	append('5',text1); 
	append('6',text1); 
	append('7',text1); 
	append('8',text1); 
	append('9',text1); 
	append('1',text1); 
	append('1',text1); 
//	append('0',text1); 
	append('2',text1); 
 
	append('7',text1); 
    append('2',text1); 
	append('3',text1); 
	append('4',text1); 
	append('5',text1); 
	append('6',text1); 
	append('7',text1); 
	append('8',text1); 
	append('9',text1); 
	append('1',text1); 
	append('1',text1); 
	append('<',text1); 
	append('2',text1); 
	append('<',text1);*/ 
//	text1->curPos--; 
//	append('2',text1); 
//	delet(text1); 
//	butn1->winproc[WM_CLICK1] = butn1_OnClick;  
//	butn4->winproc[WM_CLICK1] = butn4_OnClick; 
	//addComponent(win1, butn1, CBUTTN); 
	//addComponent(win1, butn2, CBUTTN); 
	//addComponent(win1, butn3, CBUTTN); 
	 
    text1->dspLnBgn = 0; 
	 
	 
//	pv = win1->pchild_vec; 
//	CDC *pDC = (AfxGetApp()->m_pMainWnd)->GetDC(); 
	void* pdata = gl_activeWinVec->tail->pdata;//newCData(win1, CWIN); 
	CMssg* pmssg = newCMssg(text2, WM_KEYDOWN1, 's', 0); 
	//paint(pmssg); 
// 	OnChangeFocus(pmssg); 
//	OnChangeFocus(pmssg); 
//	OnDbKeyDown(pmssg); 
    CMssg* pmssg1 = newCMssg(win1, WM_SHOW1, 0, 0); 
	CMssg* pmssg2 = newCMssg(win1, WM_CHANGEFOCUS1, 0, 0); 
	CMssg* pmssg3 = newCMssg(butn1, WM_CHANGEFOCUS1, '8', 0); 
	CMssg* pmssg4 = newCMssg(text2, WM_CHANGEFOCUS1, 'w', 0); 
	CMssg* pmssg6 = newCMssg(win1, WM_CLOSE1, 'w', 0); 
	CMssg* pmssg7 = newCMssg(win2, WM_CLOSE1, 'w', 0); 
	CMssg* pmssg8 = newCMssg(win2, WM_SHOW1, 'w', 0); 
	CMssg* pmssg9 = newCMssg(text1, WM_KEYDOWN1, '5', 0); 
	CMssg* pmssg10 = newCMssg(text1, WM_TRIKEYDOWN1, 'v', 0); 
	CMssg* pmssg11 = newCMssg(butn4, WM_CLICK1, 'v', 0); 
    CMssg* pmssg5 = newCMssg(text2, WM_DESTROY1, '9', 0); 
	sendMessage(pmssg1); 
 
//	OnChangeFocus(pmssg2); 
	sendMessage(pmssg1); 
	sendMessage(pmssg2); 
	sendMessage(pmssg3); 
//	OnKeyDown(pmssg3); 
//	sendMessage(pmssg3); 
	 
 
	sendMessage(pmssg4); 
	sendMessage(pmssg6); 
	sendMessage(pmssg7); 
	sendMessage(pmssg8); 
	sendMessage(pmssg9); 
	sendMessage(pmssg10); 
	sendMessage(pmssg11); 
//	sendMessage(pmssg5); 
 
	 
	sendMessage(pmssg5); 
//  sendKeyMssg(nChar); 
//	CMssg* pmssg5 = newCMssg(text1, WM_KEYDOWN1, 'w', 0); 
//	OnKeyDown(pmssg1); 
 
//    OnChangeFocus(pmssg); 
/*	OnChangeFocus(pmssg); 
	OnChangeFocus(pmssg); 
	OnChangeFocus(pmssg); 
	win1->winproc[WM_CHANGEFOCUS1](pmssg);*/ 
  
   for(int j=0;j<1000;j++){ 
	 
		pmssg0 = waitMessage(); 
		if(!dispatchMessage(pmssg0)){ 
			break; 
		} 
		 
//		freeOne(pmssg0); 
 
	} 
   int i = getPtrType(gl_focus->pdata);//for test 
   //eraseFocus();//for test 
	freeAll(); 
     
//	enter_main_times--; 
//    str = itoa(enter_main_times, buff, 10); 
//	pDC->TextOut(500, 220, str); 
	(AfxGetApp()->m_pMainWnd)->ReleaseDC(pDC); 
    
} 
//void sendKeyMssg(UINT nChar){ 
//	CMssg* pmssg = newCMssg(gl_focus->pdata, WM_KEYDOWN1, nChar, 0); 
//	sendMessage(pmssg); 
//} 
void OnButtnClick(CMssg* pmssg){ 
	 
	CButtn* butn = NULL; 
 
	if(getPtrType(pmssg->pdata)==CBUTTN){ 
		butn = (CButtn*)pmssg->pdata; 
			close(butn->parentWin); 
 
	} 
}