Dynamically Drawing Text Strings
Windows only
Overview
On occasion, it is useful to dynamically display some text while in the middle of a point picking operation. Rhino’s VariableFilletSrf
command is a good example of a command that does this.
To add this capability to an plugin command, you need to:
- Derive a new class from
CRhinoGetPoint
. - Override the
CRhinoGetPoint::DynamicDraw
virtual function. - From within the
DynamicDraw
override, callCRhinoViewport::DrawString
.
Sample
The following example code demonstrates how to derive a new class from CRhinoGetPoint
, override the CRhinoGetPoint::DynamicDraw
member, and draw text dynamically.
class CDrawStringGetPoint : public CRhinoGetPoint
{
public:
CDrawStringGetPoint() {}
void DynamicDraw( HDC hdc, CRhinoViewport& vp, const ON_3dPoint& pt );
};
void CDrawStringGetPoint::DynamicDraw( HDC hdc, CRhinoViewport& vp, const ON_3dPoint& pt )
{
// Format active point as a string
ON_wString str;
RhinoFormatPoint( pt, str );
// Build world-to-screen coordinate transformation
ON_Xform w2s;
vp.VP().GetXform( ON::world_cs, ON::screen_cs, w2s );
// Transform point from world to screen coordinates
ON_3dPoint screenpoint = w2s * pt;
// Offset point so text does not overlap cursor
screenpoint.x += 5.0;
screenpoint.y += -5.0;
// Draw string using the system font
vp.DrawString( str, str.Length(), screenpoint, false, 0, 12, L"System" );
// Allow base class to draw
CRhinoGetPoint::DynamicDraw( hdc, vp, pt );
}
You can use the above class as you would a CRhinoGetPoint
object. Just create a new CDrawStringGetPoint
object, initialize the class by calling base class members, and call it’s GetPoint
member. For example:
CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
{
CDrawStringGetPoint gp;
gp.SetCommandPrompt( L"Pick test point" );
gp.GetPoint();
if( gp.CommandResult() != success )
return gp.CommandResult();
// TODO...
return success;
}