示例#1
0
Value*
FooControl::set_property(Value** arg_list, int count)
{
	Value* val = arg_list[0];
	Value* prop = arg_list[1];

	if (prop == n_value)
	{
		value = val->to_float();
		if (parent_rollout != NULL && parent_rollout->page != NULL)
		{
			ISpinnerControl* spin = GetISpinner(GetDlgItem(parent_rollout->page, control_ID));
			if (spin_type == EDITTYPE_INT)
				spin->SetValue((int)value, FALSE);
			else
				spin->SetValue(value, FALSE);
			ReleaseISpinner(spin);
		}
	}
	else if (prop == n_range)
	{
		Point3 p;
		if (is_point3(val))
			p = val->to_point3();
		else
			throw TypeError (MaxSDK::GetResourceStringAsMSTR(IDS_SPINNER_RANGE_MUST_BE_A_VECTOR), val);
		min = p.x; max = p.y; value = p.z;

		if (parent_rollout != NULL && parent_rollout->page != NULL)
		{
			ISpinnerControl* spin = GetISpinner(GetDlgItem(parent_rollout->page, control_ID));
			if (spin_type == EDITTYPE_INT)
			{
				spin->SetLimits((int)p.x, (int)p.y, FALSE);
				spin->SetScale(1.0F);
				spin->SetValue((int)p.z, FALSE);
			}
			else
			{
				spin->SetLimits(p.x, p.y, FALSE);
				spin->SetScale(0.1F);
				spin->SetValue(p.z, FALSE);
			}
			ReleaseISpinner(spin);
		}
	}
	else
		return RolloutControl::set_property(arg_list, count);

	return val;
}
示例#2
0
// ============================================================================
Value* AngleControl::set_property(Value** arg_list, int count)
{
   Value* val = arg_list[0];
   Value* prop = arg_list[1];

   if (prop == n_text || prop == n_caption)
   {
      const TCHAR* text = val->to_string();
      caption = val->get_heap_ptr();
      if (parent_rollout != NULL && parent_rollout->page != NULL)
         set_text(text, GetDlgItem(parent_rollout->page, control_ID +1), n_left);
   }  
   else if(prop == n_diameter ||
      prop == n_width ||
      prop == n_height)
   {
      if(parent_rollout && parent_rollout->page)
         SetDiameter(val->to_int());
   }
   else if(prop == n_degrees)
   {
      if(parent_rollout && parent_rollout->page)
         SetDegrees(val->to_float());
   }
   else if(prop == n_radians)
   {
      if(parent_rollout && parent_rollout->page)
         SetRadians(val->to_float());
   }
   else if (prop == n_range)
   {
      if(parent_rollout && parent_rollout->page)
      {  Point3 p;
         if (is_point3(val))
            p = val->to_point3();
         else
            throw TypeError (MaxSDK::GetResourceStringAsMSTR(IDS_ANGLE_RANGE_MUST_BE_A_VECTOR), val);
         m_min = p.x; m_max = p.y; 
         SetDegrees(m_degrees = p.z);
      }
   }
   else if(prop == n_startDegrees)
   {
      if(parent_rollout && parent_rollout->page)
         SetStartDegrees(val->to_float());
   }
   else if(prop == n_startRadians)
   {
      if(parent_rollout && parent_rollout->page)
         SetStartRadians(val->to_float());
   }
   else if(prop == n_dir)
   {
      if (val != n_CW && val != n_CCW)
         throw RuntimeError (MaxSDK::GetResourceStringAsMSTR(IDS_ANGLE_DIR_BAD_VALUE), val);
      if(parent_rollout && parent_rollout->page)
         m_dirCCW = val != n_CW;
      Invalidate();
   }
   else if(prop == n_color)
   {
      if(parent_rollout && parent_rollout->page)
         SetColor(val);
   }
   else if(prop == n_bitmap)
   {
      if(parent_rollout && parent_rollout->page)
         SetBitmap(val);
   }
   else
      return RolloutControl::set_property(arg_list, count);

   return val;
}
示例#3
0
void
FooControl::add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y)
{
	HWND	label, edit_box, spinner;
	int		left, top, width, height;
	SIZE	size;
	const TCHAR*	text = caption->eval()->to_string();	

	/* add 3 controls for a spinner: the label static, value custeditbox, & spinner itself,
	 * label & edit box are given IDs that are the spinner id * control_count & that + 1, to make
	 * sure they are unique and decodable */

	parent_rollout = ro;
	control_ID = next_id();
	WORD label_id = next_id();
	WORD edit_box_id = next_id();	

	// compute bounding box, apply layout params
	layout_data pos;
	setup_layout(ro, &pos, current_y);
	Value* fw = control_param(fieldwidth);
	int spin_width = (fw == &unsupplied) ? ro->current_width / 2 : fw->to_int() + 10;
	GetTextExtentPoint32(ro->rollout_dc, text, static_cast<int>(_tcslen(text)), &size); 	
	int lbl_width = size.cx;
	int orig_width = lbl_width + spin_width;

	pos.width = orig_width + 2;
	pos.left = pos.left + ro->current_width - pos.width; 
	pos.height = ro->text_height + 3;
	process_layout_params(ro, &pos, current_y);

	// place spinner elements
	int cex = (fw == &unsupplied) ? pos.width * lbl_width / orig_width : pos.width - spin_width;
	cex = min(cex, pos.width);
	width = lbl_width; height = ro->text_height;
	left = pos.left + cex - width - 1; top = pos.top; 
	label = CreateWindow(_T("STATIC"),
							text,
							WS_VISIBLE | WS_CHILD | WS_GROUP,
							left, top, width, height,    
							parent, (HMENU)label_id, hInstance, NULL);

	width = pos.width - cex - 13; height = ro->text_height + 3;
	left = pos.left + cex + 1; 
	edit_box = CreateWindowEx(0,
							CUSTEDITWINDOWCLASS,
							_T(""),
							WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_GROUP,
							left, top, width, height,    
							parent, (HMENU)edit_box_id, hInstance, NULL);

	left += width; width = 10; 
	spinner = CreateWindowEx(0,
							SPINNERWINDOWCLASS,
							_T(""),
							WS_VISIBLE | WS_CHILD,
							left, top, width, height,    
							parent, (HMENU)control_ID, hInstance, NULL);

    SendDlgItemMessage(parent, label_id, WM_SETFONT, (WPARAM)ro->font, 0L);
    SendDlgItemMessage(parent, edit_box_id, WM_SETFONT, (WPARAM)ro->font, 0L);

	/* setup the spinner control */

	ISpinnerControl* spin = GetISpinner(spinner);
	Value*			 range = control_param(range);
	Value*			 type = control_param(type);
	Value*			 scaleval = control_param(scale);

	if (type == n_integer)
		spin_type = EDITTYPE_INT;
	else if (type == n_worldUnits)
		spin_type = EDITTYPE_UNIVERSE;
	else if (type == n_float || type == &unsupplied)
		spin_type = EDITTYPE_FLOAT;
	else
		throw TypeError (MaxSDK::GetResourceStringAsMSTR(IDS_SPINNER_TYPE_MUST_BE_INTEGER_OR_FLOAT), type);
	
	if (ro->init_values)
	{
		if (range == &unsupplied)
		{
			min = 0.0f; max = 100.0f; value = 0.0f;
		}
		else if (is_point3(range))
		{
			Point3 p = range->to_point3();
			min = p.x; max = p.y; value = p.z;
		}
		else
			throw TypeError (MaxSDK::GetResourceStringAsMSTR(IDS_SPINNER_RANGE_MUST_BE_A_VECTOR), range);

		if (scaleval == &unsupplied)
		{
				scale = (spin_type == EDITTYPE_INT) ? 1.0f : 0.1f;
		}
		else
			scale = scaleval->to_float();
	}
	
    spin->LinkToEdit(edit_box, spin_type);
	spin->SetScale(scale);
    if (spin_type == EDITTYPE_INT)
	{
		spin->SetLimits((int)min, (int)max, FALSE);
		spin->SetValue((int)value, FALSE);
	}
	else if (spin_type == EDITTYPE_UNIVERSE)
	{
		spin->SetLimits(min, max, FALSE);
		spin->SetValue(value, FALSE);
	}
	else
	{
		spin->SetLimits(min, max, FALSE);
		spin->SetValue(value, FALSE);
	}
	ReleaseISpinner(spin);
}
示例#4
0
void AngleControl::add_control(Rollout *ro, HWND parent, HINSTANCE hInstance, int& current_y)
{
   caption = caption->eval();

   HWND  label;
   int      left, top, width, height;
   SIZE  size;
   const TCHAR *label_text = caption->eval()->to_string();

   parent_rollout = ro;
   control_ID = next_id();
   WORD label_id = next_id();

   Value *val;
   if((val = control_param(diameter)) != &unsupplied)
      m_diameter = val->to_int();
   else if((val = control_param(width)) != &unsupplied)
      m_diameter = val->to_int();
   else if((val = control_param(height)) != &unsupplied)
      m_diameter = val->to_int();
   else
      m_diameter = 64;

   val = control_param(degrees);
   if(val != &unsupplied)
      m_degrees = val->to_float();
   else
      m_degrees = 0.f;

   val = control_param(radians);
   if(val != &unsupplied)
      m_degrees = RadToDeg(val->to_float());

   val = control_param(range);
   if (val == &unsupplied)
   {
      m_min = -360.0f; m_max = 360.0f;
   }
   else if (is_point3(val))
   {
      Point3 p = val->to_point3();
      m_min = p.x; m_max = p.y; m_degrees = p.z;
   }
   else
      throw TypeError (MaxSDK::GetResourceStringAsMSTR(IDS_ANGLE_RANGE_MUST_BE_A_VECTOR), val);

   val = control_param(startDegrees);
   if(val != &unsupplied)
      SetStartDegrees(val->to_float());
   else
      SetStartDegrees(0.f);

   val = control_param(startRadians);
   if(val != &unsupplied)
      SetStartDegrees(RadToDeg(val->to_float()));

   val = control_param(dir);
   if(val != &unsupplied)
   {
      if (val != n_CW && val != n_CCW)
         throw RuntimeError (MaxSDK::GetResourceStringAsMSTR(IDS_ANGLE_DIR_BAD_VALUE), val);
      m_dirCCW = val != n_CW;
   }

   val = control_param(bitmap);
   if(val != &unsupplied)
      SetBitmap(val);
   else
      SetColor(control_param(color));

   m_lButtonDown = FALSE;

   layout_data pos;
   compute_layout(ro, &pos, current_y);
   left = pos.left; top = pos.top;

   // place optional label
   int label_height = (_tcslen(label_text) != 0) ? ro->text_height + SPACING_BEFORE - 2 : 0;
   // LAM - defect 298613 - not creating the caption HWND was causing problems (whole screen redrawn
   // when control moved, setting caption text set wrong HWND). Now always create.
// if (label_height != 0)
// {
      DLGetTextExtent(ro->rollout_dc, label_text, &size);   
      width = min(size.cx, pos.width); height = ro->text_height;
      label = CreateWindow(_T("STATIC"),
                        label_text,
                        WS_VISIBLE | WS_CHILD | WS_GROUP,
                        left, top, width, height,    
                        parent, (HMENU)label_id, hInstance, NULL);
// }

   // place angle box
   top = pos.top + label_height;
   width = pos.width;

   m_hWnd = CreateWindow(
      ANGLECTRL_WINDOWCLASS,
      TEXT(""),
      WS_VISIBLE | WS_CHILD | WS_GROUP,
      pos.left, top, width, m_diameter,    
      parent, (HMENU)control_ID, g_hInst, this);

   m_hToolTip = CreateWindow(
      TOOLTIPS_CLASS,
      TEXT(""), WS_POPUP,
      CW_USEDEFAULT, CW_USEDEFAULT,
      CW_USEDEFAULT, CW_USEDEFAULT,
      m_hWnd, (HMENU)NULL, g_hInst, NULL);

   SendMessage(label, WM_SETFONT, (WPARAM)ro->font, 0L);
   SendMessage(m_hToolTip, TTM_ADDTOOL, 0, (LPARAM)GetToolInfo());
}