www.pudn.com > dos_gui.zip > LISTBOX.CPP


// 1993 (c) ALL RIGHTS RESERVED 
// AUTHOR:  XuYongYong 
 
/* 	listbox.cpp 
*/ 
#include "listbox.h" 
 
/**************************************************************************/ 
listbox_class::listbox_class(int ID,char *title_hotkey, 
		int left,int top,int width,int height, 
		int therow ,int thecolumn, int string_num, char ** thestring_list) 
	:	control_class(ID,title_hotkey,NORMAL ,LISTBOX, 
			left,top,width,height,0, string_num-1, -1 ) 
			//current_value=-1::because no more blue at first 
{ 
	title_pos_x =left ; 
	title_pos_y =top -bar_height; 
// max_value =string_num +1 ; 
	row=therow; 
	column=thecolumn; 
	if ((row== -1)||(column==-1) ) { 
		column=1; 
		row =( height -2) / bar_height; 
	} 
	string_list =thestring_list; 
	box.left  =left+1; 
	box.top   =top +1; 
	box_width =( width - 2  ) /column; 
	box_height=( height- 2  ) / row ; 
	box.right =box.left+box_width ; 
	box.bottom=box.top +box_height; 
 
	setup_control(); 
} 
 
void listbox_class::setup_control()  //used for every update controls 
// max_value changed  // setup inner variables 
{ 
	itemnum =max_value+1; 
	begin_show =0; 
} 
 
/**************************************************************************/ 
void listbox_class::draw ( ) 
{ 
   if ( status & INVISIBLE) return;    // INVISIBLE 
 
	control_class::draw(); 
  int k; 
  Trect tmprect; 
 
	FillRect (bounds,WHITE); 
	setcolor (BLACK); 
	FrameRect (bounds); 
	setcolor (BLACK); 
	for (k=begin_show;(kmax_value)) return ; 
	tmprect =get_string_rect (current_value); 
	FillRect (tmprect,BLUE ); 
	setcolor (WHITE); 
	outtextxy (tmprect.left+2, tmprect.top +2, string_list[current_value]); 
 
	setcolor (WHITE); 
	setlinestyle( DOTTED_LINE,1,NORM_WIDTH ); 
	FrameRect (get_string_rect(current_value)); 
	setlinestyle( SOLID_LINE,1,NORM_WIDTH ); 
} 
 
/**************************************************************************/ 
void listbox_class::unselect ( ) 
{ Rect tmprect; 
 
	if ((current_valuemax_value)) return ; 
	tmprect =get_string_rect (current_value); 
	FillRect (tmprect,WHITE ); 
	setcolor (BLACK); 
	outtextxy (tmprect.left+2, tmprect.top +2, string_list[current_value]); 
 
	setcolor (WHITE); 
	setlinestyle( DOTTED_LINE,1,NORM_WIDTH ); 
	FrameRect (get_string_rect(current_value)); 
	setlinestyle( SOLID_LINE,1,NORM_WIDTH ); 
} 
/**************************************************************************/ 
int listbox_class::control_change_value	(int new_value  ) 
{  	if (control_class::control_change_value(new_value)==TRUE) 
		return TRUE; 
  Trect tmprect; 
	if (new_value < begin_show) { 
		begin_show =new_value; 
		draw(); 
	} else if ( (new_value >=begin_show+column*row) ) { 
		begin_show= new_value -column*row+1; 
		draw(); 
	}  else { 
		if (!( status & INVISIBLE))  unselect (); 
	} 
	current_value =new_value; 
	if (!( status & INVISIBLE)) select(); 
	thequeue.SendMessage(ID,ListBoxValueChangedMSG,this); 
	return TRUE; 
} 
 
/**************************************************************************/ 
int listbox_class::key_pressed_handler 
	(int key_scan_num ) 
{ int new_value; 
 
	switch (key_scan_num )	{ 
	case LEFTKEY: 
		new_value =current_value -row; 
		if (new_value<0 ) new_value =0; 
		break; 
	case RIGHTKEY: 
		new_value =current_value +row; 
		if (new_value>= max_value ) new_value =max_value; 
		break; 
	case UPKEY: 
		new_value =current_value -1; 
		if (new_value<0 )  new_value = 0; 
		break; 
	case DOWNKEY: 
		new_value =current_value +1; 
		if (new_value>= max_value) new_value =max_value; 
		break; 
	case HOMEKEY: 
		new_value =0; 
		break; 
	case ENDKEY: 
		new_value =max_value; 
		break; 
	case PGUPKEY: 
		new_value =current_value -row; 
		if (new_value<0 )  new_value = 0; 
		break; 
	case PGDNKEY: 
		new_value =current_value +row; 
		if (new_value>= max_value) new_value =max_value; 
		break; 
	case SPACEKEY: 
		thequeue.SendMessage(ID, 
			ListBoxItemSelectedMSG,this); 
		return TRUE; 
//		break; 
//	default : return FALSE;	//this is another way to do below 
	default : return control_class::key_pressed_handler (key_scan_num) ; 
	} 
//	return control_change_value(new_value ); 
	control_change_value(new_value ); 
	return TRUE; 
} 
 
 
int listbox_class::msg_handler	(MSG& message ) 
{ int x,y ,k; 
	switch (message.Action){ 
		case MouseLButtonDownMSG: 
			x=win_mouse_x - bounds.left; 
			y=win_mouse_y - bounds.top; 
			x=x / box_width ; 
			y=y / box_height; 
			k=begin_show  + x*row + y; 
			if (k==current_value) { 
					thequeue.SendMessage(ID, 
				ListBoxItemSelectedMSG,this); 
				return TRUE; 
			} 
			if ( k <= max_value ) { 
				control_change_value( k ); 
				return TRUE; 
			} 
	} 
	return	control_class::msg_handler(message); 
}