{"id":1598,"date":"2018-01-30T20:00:05","date_gmt":"2018-01-30T20:00:05","guid":{"rendered":"https:\/\/clarionsharp.com\/blog\/?p=1598"},"modified":"2018-01-30T20:00:05","modified_gmt":"2018-01-30T20:00:05","slug":"new-status-bar-implementation-c11","status":"publish","type":"post","link":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/","title":{"rendered":"New Status bar implementation (C11)"},"content":{"rendered":"<p>The new implementation of the Status bar is fully backward compatible. This means that if a program doesn&#8217;t use any of the new Status bar\/style interfaces, the Status bar is drawn exactly the same as the old implementation. If the interfaces are used, besides the improved visual appearance there are the following changes:<\/p>\n<p>&#8211; An empty status bar without zones remains visible and can be used to display<br \/>\nthe resize gripper.<\/p>\n<p>&#8211; Text from the MSG attribute of controls or menu items is drawn in the<br \/>\nleftmost text zone when the control or menu\/item has focus.<\/p>\n<p>Before diving into the details here are a couple screenshots<\/p>\n<p><a href=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-1608\" src=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png\" alt=\"StatusBar\" width=\"709\" height=\"27\" srcset=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png 1318w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb-300x11.png 300w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb-768x29.png 768w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb-1024x39.png 1024w\" sizes=\"auto, (max-width: 709px) 100vw, 709px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1607\" src=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB.png\" alt=\"Big StatusBar\" width=\"1327\" height=\"112\" srcset=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB.png 1327w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB-300x25.png 300w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB-768x65.png 768w, https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/BigSB-1024x86.png 1024w\" sizes=\"auto, (max-width: 1327px) 100vw, 1327px\" \/><\/a><\/p>\n<div><\/div>\n<p>The Status bar implementation exposes a set of 3 interfaces:<\/p>\n<p>1) IStatusZone: gives access to properties of a particular zone;<br \/>\nthere are 3 extended interfaces derived from it for Text, Image<br \/>\nand Progress zones &#8211; ITextZone, IImageZone and IProgressZone<\/p>\n<p>2) IStatusStyle: represents an instance of the style for the Status bar<\/p>\n<p>3) IStatusBar: represents an instance of the Status bar object<\/p>\n<p>&#8211; Supported Properties:<br \/>\n1) PROP:StatusInterface &#8211; is used to get a reference to the<br \/>\nWINDOW&#8217;s Status bar object<\/p>\n<p>2) PROP:StatusStyle &#8211; a SYSTEM property to get the reference to<br \/>\nthe default status style object<\/p>\n<p>Both properties are read-only but the returned objects can be modified.<\/p>\n<p>&#8211; When the Status bar object is created because of OPENing a<br \/>\nWINDOW with the STATUS attribute, or by setting the PROP:Status<br \/>\nproperty to a WINDOW without a Status bar, the current default style<br \/>\nis used to set up the bar&#8217;s appearance. The Status bar uses its own<br \/>\ncopy of the style data. Therefore changes in the default style do not<br \/>\naffect existing status bars automatically. The current bar&#8217;s<br \/>\nstyle can be changed by a call to the IStatusBar.ApplyStyle method.<\/p>\n<p>&#8211; Because one instance of the status bar object can be shared by<br \/>\nmore than one WINDOW, there is no method to destroy an instance of<br \/>\nthe IStatusBar interface. For backward compatibility, the<br \/>\nstatus bar of a WINDOW can be destroyed by specifying a zero width for<br \/>\nthe first zone using the PROP:Status property:<\/p>\n<p>Window {PROP:Status, 1} = 0<\/p>\n<p>&#8211; The initial state of the default status Style object mimics the traditional<br \/>\nStatus bar&#8217;s appearance. The only visual difference are the use of different RGB values<br \/>\nfor the colors used to draw the Status bar&#8217;s upper border and the zones bevels.<\/p>\n<p>The rest of this post contains the details of the new interfaces.<\/p>\n<p>Interfaces:<\/p>\n<p>IStatusZone<br \/>\n&#8212;&#8212;&#8212;&#8211;<\/p>\n<p>GetKind &#8211; Returns numeric value of zone&#8217;s type as they are<br \/>\nlisted in the StatusZoneKind ITEMIZE structure<\/p>\n<p><code>StatusZoneKind ITEMIZE(0),PRE(STATUSZONE)<br \/>\nTEXT EQUATE<br \/>\nIMAGE EQUATE<br \/>\nPROGRESS EQUATE<br \/>\nEND<\/code><\/p>\n<p>GetWidth &#8211; If passed parameter is TRUE, function returns current<br \/>\nactual width of the zone in pixels including all<br \/>\nmargins, optional bevel and optional separator.<br \/>\nIf passed parameter is FALSE, function returns the<br \/>\nunadjusted width of zone in dialog units.<\/p>\n<p>SetWidth &#8211; Changes the unadjusted width of the zone. Rules are the<br \/>\nsame as for value passed to the PROP:Status property.<br \/>\nUnadjusted width is given in zone&#8217;s dialog units<br \/>\nand does not include zone margins and the optional separator.<\/p>\n<p>If the value is negative, the zone is expandable with minimum<br \/>\nwidth (in dlu&#8217;s) equal to the absolute value of the passed<br \/>\nnumber. By default, when A zone is created its<br \/>\nunadjusted width is set equal to -1. For text<br \/>\nzones dialog units are determined by the font used<br \/>\nto draw text in that zone. For zones of other kinds,<br \/>\ndialog units are determined by the font from the<br \/>\nStatus bar&#8217;s style.<\/p>\n<p>HasBevel &#8211; Returns TRUE if a bevel is present around the content<br \/>\npart of the zone, and FALSE if no bevel is present.<\/p>\n<p>SetBevel &#8211; Modifies zone&#8217;s flag controlling the drawing of the<br \/>\nbevel around content area. The passed parameter must be<br \/>\none of the values listed in the StatusFlagValue ITEMIZE<br \/>\nstructure:<\/p>\n<p>&#8211; STATUSFLAG:OFF &#8211; to not draw the bevel<br \/>\n&#8211; STATUSFLAG:ON &#8211; to draw the bevel<br \/>\n&#8211; STATUSFLAG:DEFAULT &#8211; drawing of the bevel is<br \/>\ndetermined by status bar&#8217;s style.<\/p>\n<p>Default value is STATUSFLAG:DEFAULT.<\/p>\n<p>HasSeparator &#8211; Returns TRUE if separator is drawing at the far edge<br \/>\nof the zone and FALSE if no separator is drawing<\/p>\n<p>SetSeparator &#8211; Modifies zone&#8217;s flag controlling the drawing of the<br \/>\nseparator. Passed parameter must be one of values<br \/>\nlisted in the StatusFlagValue ITEMIZE structure:<\/p>\n<p>&#8211; STATUSFLAG:OFF &#8211; do not draw the separator<br \/>\n&#8211; STATUSFLAG:ON &#8211; draw the separator<br \/>\n&#8211; STATUSFLAG:DEFAULT &#8211; drawing of the separator is<br \/>\ndetermined by the Status bar&#8217;s style.<br \/>\nDefault value is STATUSFLAG:DEFAULT.<\/p>\n<p>If the last zone has the separator flag equal to STATUSFLAG:DEFAULT, the<br \/>\nseparator is not drawn regardless of the style settings.<\/p>\n<p>&#8212;&#8212;&#8212;<br \/>\nITextZone<br \/>\n&#8212;&#8212;&#8212;<\/p>\n<p>GetText &#8211; Returns the current text of the zone. The returned value can be<br \/>\npassed to the ToString function to convert it to a STRING type.<\/p>\n<p>SetText &#8211; Changes the text displayed in the zone. Default value is<br \/>\nan empty string.<\/p>\n<p>GetAlignment &#8211; Returns the numeric value of text alignment as they are<br \/>\nlisted in the StatusAlignValue ITEMIZE structure. The<br \/>\nSTATUSALIGN:DEFAULT and STATUSALIGN:LEFT values are<br \/>\nequivalent.<\/p>\n<p>! Alignment of text in text zones<\/p>\n<p><code>StatusAlignValue ITEMIZE(0),PRE(STATUSALIGN)<br \/>\nDEFAULT EQUATE<br \/>\nLEFT EQUATE<br \/>\nRIGHT EQUATE<br \/>\nCENTER EQUATE<br \/>\nEND<\/code><\/p>\n<p>SetAlignment &#8211; Changes the text alignment in the zone content area,<br \/>\nDefault value is STATUSALIGN:DEFAULT<\/p>\n<p>GetIndent &#8211; Returns the value of text indentation in pixels relative to<br \/>\nthe base point determined by current alignment.<\/p>\n<p>SetIndent &#8211; Changes text indent value to the passed value, countied in<br \/>\npixels. Default value is 0.<\/p>\n<p>GetFont &#8211; Returns an instance of the IFontProperties interface<br \/>\nallowing to modify parameters of the font used to<br \/>\ndraw text in the zone. A NULL result means that the zone is<br \/>\nusing the font specified by Status bar&#8217;s style.<\/p>\n<p>SetFont &#8211; Changes the font used to draw text in the zone.<br \/>\nDefault value is NULL, i.e. usage of the font from the<br \/>\nStatus bar&#8217;s style.<\/p>\n<p>*** Notes:<\/p>\n<p>The IFontDescription interface has no public methods to clone and destroy<br \/>\ninstances. ITextZone.SetFont automatically releases the previous zone&#8217;s<br \/>\nfont (unless it is NULL), clones the passed font (unless it is NULL) and<br \/>\nset it to zone. The expected flow of work with a zone&#8217;s font is as<br \/>\nfollows:<\/p>\n<p>ZoneFont &amp;= BarStyle.GetFont() ! Get the font from style<br \/>\nZone.SetFont (ZoneFont) ! Set the clone of font to zone<br \/>\nZoneFont &amp;= Zone.GetFont() ! Get the reference to cloned font<br \/>\n&#8230; modify font &#8230;<br \/>\nZone.FontChanged() ! Notify zone that font changed<\/p>\n<p>GetTextColor &#8211; Returns the color used to draw text in the zone. If the zone<br \/>\nhas its own font, the returned value is equal to<br \/>\nresult of call to IFontProperties.FontColor() for this<br \/>\nfont. If the zone is using the default font from the bar&#8217;s<br \/>\nstyle, the text color can be changed separately. In this<br \/>\ncase, GetTextColor() returns that color value.<\/p>\n<p>SetTextColor &#8211; Changes color of==used for drawing text. If the zone has its own<br \/>\nfont, this function has the same effect as a call to the<br \/>\nfont&#8217;s IFontProperties.FontColor(newcolor) method. If the<br \/>\nzone is using the default font from the bar&#8217;s style, this<br \/>\nfunction can be used to change text color in the zone<br \/>\nwhile retaining all other characteristics of the default<br \/>\nfont.<\/p>\n<p>FontChanged &#8211; This method must be called to notify the zone that its font has<br \/>\nbeen changed by calls to methods of the IFontProperties<br \/>\ninterface returned by the GetFont function.<\/p>\n<p>IImageZone<br \/>\n&#8212;&#8212;&#8212;-<\/p>\n<p>GetImage &#8211; Returns the name of the image drawn in the zone. Returned<br \/>\nvalue can be passed to the ToString function to convert<br \/>\nit to STRING type.<\/p>\n<p>SetImage &#8211; Sets\/changes the image displayed in the zone. Default value is<br \/>\nNULL which means that zone remains blank.<\/p>\n<p>*** Notes:<\/p>\n<p>If the width of zone is greater than the width of the image, the image is drawn<br \/>\nleft aligned in the zone content rectangle (right-aligned in case of<br \/>\nright-to-left window layout). If width of the zone is less or equal to the width of<br \/>\nthe image, the image is drawn centered in the zone content rectangle.<\/p>\n<p>GetDrawMode &#8211; Returns the numeric value of the image drawing mode<br \/>\nas they are listed in the StatusImageMode ITEMIZE<br \/>\nstructure.<\/p>\n<p>! Modes of drawing images in image zones<\/p>\n<p>StatusImageMode ITEMIZE(0),PRE(STATUSIMAGE)<br \/>\nNORMAL EQUATE<br \/>\nDISABLED EQUATE<br \/>\nGRAYED EQUATE<br \/>\nEND<\/p>\n<p>SetDrawMode &#8211; Changes the mode to draw zone image. Parameter must be<br \/>\none of values listed in the StatusImageMode ITEMIZE<br \/>\nstructure. Default value is STATUSIMAGE:NORMAL.<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;-<br \/>\nIProgressZone<br \/>\n&#8212;&#8212;&#8212;&#8212;-<\/p>\n<p>GetValue &#8211; Returns the current progress value.<\/p>\n<p>SetValue &#8211; Changes the current progress value.<\/p>\n<p>GetMin &#8211; Returns the lower bound for progress value.<\/p>\n<p>GetMax &#8211; Returns the upper bound for progress value.<\/p>\n<p>SetRange &#8211; Changes the lower and upper bounds for the progress value.<br \/>\nDefault range is 0..100<\/p>\n<p>GetColor &#8211; Returns the color used to draw the progress bar.<\/p>\n<p>SetColor &#8211; Changes the color to draw the progress bar.<\/p>\n<p>*** Notes:<\/p>\n<p>If the progress zone has a bevel, the bevel is used as the frame for<br \/>\nthe progress bar. If the zone has no bevel, additional lines are drawn to<br \/>\nshow the unfilled part of the progress bar.<\/p>\n<p>&#8212;&#8212;&#8212;&#8212;<br \/>\nIStatusStyle<br \/>\n&#8212;&#8212;&#8212;&#8212;<\/p>\n<p>Clone &#8211; Returns a cloned copy of the style object.<\/p>\n<p>Destroy &#8211; Destroys the style object. The Destroy method must<br \/>\nbe called for all style objects returned from calls<br \/>\nto IStatusStyle.Clone methods.<\/p>\n<p>CreateBar &#8211; Creates the status bar object for the passed WINDOW<br \/>\nusing the style determining by SELF. The previous<br \/>\nWINDOW&#8217;s status bar object is disposed. It is not<br \/>\nrecommended to use this function for the active MDI<br \/>\nchild window. Created status bar has no zones and<br \/>\nis frozen.<\/p>\n<p>Apply &#8211; Copies information from one style object to another.<br \/>\nCan be used for &#8220;atomic&#8221; changing of the system<br \/>\ndefault status style.<\/p>\n<p>GetMetric &#8211; Returns the value for the given style metric. Parameter<br \/>\nmust be one of values listed in the StatusMetric<br \/>\nITEMIZE structure.<\/p>\n<p>Supported metrics are:<br \/>\nSTATUS:HMARGIN &#8211; margin from status bar edge to first<br \/>\nzone and, if no resize gripper is drawn, from<br \/>\nthe last zone to the status bar edge. Default value<br \/>\nis 4.<\/p>\n<p>STATUS:ZONEHMARGIN &#8211; Horizontal margins around the zone content<br \/>\nrectangle. Default value is 4.<\/p>\n<p>STATUS:ZONEVMARGIN &#8211; Vertical margins above and below the zone<br \/>\ncontent rectangle. Default value is 2.<\/p>\n<p>STATUS:TEXTHMARGIN &#8211; Horizontal margins around the<br \/>\ntext bounding rectangle in text zones. Default<br \/>\nvalue is 2.<\/p>\n<p>STATUS:TEXTVMARGIN &#8211; Vertical margins above and below the text<br \/>\nbounding rectangle in text zones. Default value<br \/>\nis 0.<\/p>\n<p>STATUS:TEXTINDENT &#8211; indentation of text relatively the<br \/>\nbase point (determined by text alignment) in the<br \/>\ntext bounding rectangle. Default value is 0.<\/p>\n<p>STATUS:SEPMARGIN &#8211; margins above and below the zones&#8217;<br \/>\nseparator line. Default value is 2.<\/p>\n<p>***Notes: All returned values are in pixels.<\/p>\n<p>SetMetric &#8211; Changes the given style metric. The first parameter must<br \/>\nbe one of values listed in the StatusMetric ITEMIZE<br \/>\nstructure.<\/p>\n<p>GetHeight &#8211; Returns the height in pixels of the status bar determined<br \/>\nby the style. If the parameter value is FALSE, the function<br \/>\nreturns the value set by last call to the SetHeight method.<br \/>\nIf parameter is TRUE, function returns adjusted height<br \/>\nvalue. Adjusted height is maximum of GetHeight(FALSE)<br \/>\nand height calculated from style&#8217;s font and metrics.<\/p>\n<p>SetHeight &#8211; Changes the unadjusted height for styled status bars.<br \/>\nPassed value must be in pixels. Default value is 0,<br \/>\ni.e. the adjusted height is determined by the font and<br \/>\nmetrics.<\/p>\n<p>BkgndBrush &#8211; Returns the instance of the IBrush interface used to<br \/>\ndraw the Status bar&#8217;s background. If IBrush.Type is<br \/>\nCWBrush_Null (default), the background is painted<br \/>\nusing the COLOR:BTNFACE color.<\/p>\n<p>GetFont &#8211; Returns the instance of the IFontProperties interface<br \/>\nused as the default font for Text zones.<\/p>\n<p>SetFont &#8211; Sets\/changes the style&#8217;s default font. If the passed parameter is NULL<br \/>\n(default), the font specified by SYSTEM properties is used.<\/p>\n<p>GetTextColor &#8211; Returns the default color used to draw text in Text<br \/>\nzones.<\/p>\n<p>SetTextColor &#8211; Changes the default color used to draw text in Text<br \/>\nzones. If the passed value is COLOR:None, the color returned<br \/>\nby SYSTEM{PROP:FontColor + PROP:StatusFont} is used.<\/p>\n<p>GetProgressColor &#8211; Returns the default color used to draw Progress bars in<br \/>\nprogress zones.<\/p>\n<p>SetProgressColor &#8211; Changes the color used to draw Progress bars in<br \/>\nprogress zones.<\/p>\n<p>GetSeparatorColor &#8211; Returns the color used to draw flat separator lines.<\/p>\n<p>SetSeparatorColor &#8211; Sets\/changes the color used to draw flat separator lines.<\/p>\n<p>HasZoneBevel &#8211; Returns the default value of the flag to draw bevel around<br \/>\nthe content rectangle for zones of a given kind.<\/p>\n<p>SetZoneBevel &#8211; Changes default value of the flag to draw the bevel around<br \/>\ncontent rectangle for zones of the kind given by the first<br \/>\nparameter. Default value is TRUE for text zones and<br \/>\nFALSE for image and progress zones.<\/p>\n<p>GetFlag &#8211; Returns value of the style flag corresponding to<br \/>\npassed parameter. Parameter must be one of values<br \/>\nlisted in the StausStyleFlag ITEMIZE structure:<\/p>\n<p>STATUS:THEMED &#8211; if TRUE, and themes are available for<br \/>\nthe program, some metrics and visual aspects are<br \/>\ndetermined by the visual theme rather than by values<br \/>\nset in the style. If the flag is FALSE, style does not<br \/>\nuse the visual theme.<\/p>\n<p>STATUS:SEPARATOR &#8211; if TRUE, the separator line is<br \/>\ndrawn after every zone except the last one by default.<\/p>\n<p>If the flag is FALSE (default), separators are not<br \/>\ndrawn unless this setting is overridden in a<br \/>\nparticular zone.<\/p>\n<p>STATUS:GRIPPER &#8211; If TRUE, the resize gripper is drawn<br \/>\nin the lower-far corner of status bars owned by resizable<br \/>\nnot-maximized WINDOWs. If flag is FALSE (default),<br \/>\nthe gripper is not drawn.<\/p>\n<p>STATUS:BORDER3D &#8211; If TRUE, the status bar&#8217;s upper edge<br \/>\nis drawn using a bevel. If the flag is FALSE, a flat<br \/>\nborder is drawn. The flag only affects not-themed<br \/>\nstatus bars using solid colors to paint the bar&#8217;s<br \/>\nbackground. The flat border is drawn in all other<br \/>\ncases.<\/p>\n<p>STATUS:SEPARATOR3D &#8211; If TRUE, separator lines are drawn<br \/>\nusing a bevel. If the flag is FALSE, the separator line<br \/>\nis drawn flat. Flag is ignored for themed status<br \/>\nbars.<\/p>\n<p>SetFlag &#8211; Changes value of the style flag corresponding to passed<br \/>\nfirst parameter. This parameter must have one of values<br \/>\nlisted in the StatusStyleFlag ITEMIZE structure.<\/p>\n<p>&#8212;&#8212;&#8212;-<br \/>\nIStatusBar<br \/>\n&#8212;&#8212;&#8212;-<\/p>\n<p>ApplyStyle &#8211; Applies parameters of the passed style to the status bar.<\/p>\n<p>NumZones &#8211; Returns the number of zones in the status bar.<\/p>\n<p>GetZone &#8211; Returns the reference to object implementing the zone<br \/>\nwith passed index. Index value is 1-based. If passed<br \/>\nindex is 0 or greater than number of zones, a NULL<br \/>\nreference is returned.<\/p>\n<p>AddZone &#8211; Creates the object implementing the zone of given kind<br \/>\nand inserts it at position specified by first parameter.<br \/>\nIf position parameter is out of range 1..,<br \/>\nthe created zone is appending to the end of list of zones.<br \/>\nThe position value is 1-based.<\/p>\n<p>DeleteZone &#8211; Destroys the number of zones equal to the second parameter<br \/>\nstarting from the position given by the first parameter. By default,<br \/>\nthe only zone is creating. If second parameter is 0,<br \/>\nall zones since passed position are destroyed.<\/p>\n<p>*** Notes:<\/p>\n<p>DeleteZone can be used to delete all zones from the status bar. This leaves<br \/>\nan empty status bar.<\/p>\n<p>Freeze &#8211; Freezes the status bar to avoid multiple redrawings on<br \/>\nvolume changes to zones.<\/p>\n<p>Unfreeze &#8211; Unfreezes previously frozen status bar. More than one<br \/>\nlevel of freezing is possible, therefore the number of calls<br \/>\nto Unfreeze must be equal to number of calls<br \/>\nto Freeze.<\/p>\n<p>SetClickCallback &#8211; Sets a callback function that is invoked if the mouse is clicked or<br \/>\ndouble clicked within content rectangle of any zone. The<br \/>\n1-based index of clicked zone is passed to the callback<br \/>\nfunction as a parameter. The KEYCODE() function can be used<br \/>\nto determine which mouse button has been clicked.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The new implementation of the Status bar is fully backward compatible. This means that if a program doesn&#8217;t use any of the new Status bar\/style interfaces, the Status bar is drawn exactly the same as the old implementation. If the interfaces are used, besides the improved visual appearance there are the following changes: &#8211; An &hellip; <a href=\"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">New Status bar implementation (C11)<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":1608,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[36,5],"tags":[],"class_list":["post-1598","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-clarion-11","category-clarionnews"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>New Status bar implementation (C11) - Clarion<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"New Status bar implementation (C11) - Clarion\" \/>\n<meta property=\"og:description\" content=\"The new implementation of the Status bar is fully backward compatible. This means that if a program doesn&#8217;t use any of the new Status bar\/style interfaces, the Status bar is drawn exactly the same as the old implementation. If the interfaces are used, besides the improved visual appearance there are the following changes: &#8211; An &hellip; Continue reading New Status bar implementation (C11) &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/\" \/>\n<meta property=\"og:site_name\" content=\"Clarion\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/softvelocity\/\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-30T20:00:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1318\" \/>\n\t<meta property=\"og:image:height\" content=\"50\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"rzaunere\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"rzaunere\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/\"},\"author\":{\"name\":\"rzaunere\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/person\\\/b90e860529aea05ad064cf2687697ce3\"},\"headline\":\"New Status bar implementation (C11)\",\"datePublished\":\"2018-01-30T20:00:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/\"},\"wordCount\":2594,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/01\\\/sb.png\",\"articleSection\":[\"Clarion 11\",\"Clarion News\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/\",\"name\":\"New Status bar implementation (C11) - Clarion\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/01\\\/sb.png\",\"datePublished\":\"2018-01-30T20:00:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/#primaryimage\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/01\\\/sb.png\",\"contentUrl\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/01\\\/sb.png\",\"width\":1318,\"height\":50,\"caption\":\"StatusBar\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/new-status-bar-implementation-c11\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"New Status bar implementation (C11)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\",\"name\":\"Clarion\",\"description\":\"Deliver your software on time, every time\",\"publisher\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#organization\",\"name\":\"SoftVelocity\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/svlogonew57.png\",\"contentUrl\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/03\\\/svlogonew57.png\",\"width\":221,\"height\":57,\"caption\":\"SoftVelocity\"},\"image\":{\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/softvelocity\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/SoftVelocity\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/#\\\/schema\\\/person\\\/b90e860529aea05ad064cf2687697ce3\",\"name\":\"rzaunere\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g\",\"caption\":\"rzaunere\"},\"url\":\"https:\\\/\\\/clarionsharp.com\\\/blog\\\/author\\\/rzaunere\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"New Status bar implementation (C11) - Clarion","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/","og_locale":"en_US","og_type":"article","og_title":"New Status bar implementation (C11) - Clarion","og_description":"The new implementation of the Status bar is fully backward compatible. This means that if a program doesn&#8217;t use any of the new Status bar\/style interfaces, the Status bar is drawn exactly the same as the old implementation. If the interfaces are used, besides the improved visual appearance there are the following changes: &#8211; An &hellip; Continue reading New Status bar implementation (C11) &rarr;","og_url":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/","og_site_name":"Clarion","article_publisher":"https:\/\/www.facebook.com\/softvelocity\/","article_published_time":"2018-01-30T20:00:05+00:00","og_image":[{"width":1318,"height":50,"url":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png","type":"image\/png"}],"author":"rzaunere","twitter_card":"summary_large_image","twitter_misc":{"Written by":"rzaunere","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/#article","isPartOf":{"@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/"},"author":{"name":"rzaunere","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/person\/b90e860529aea05ad064cf2687697ce3"},"headline":"New Status bar implementation (C11)","datePublished":"2018-01-30T20:00:05+00:00","mainEntityOfPage":{"@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/"},"wordCount":2594,"commentCount":0,"publisher":{"@id":"https:\/\/clarionsharp.com\/blog\/#organization"},"image":{"@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/#primaryimage"},"thumbnailUrl":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png","articleSection":["Clarion 11","Clarion News"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/","url":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/","name":"New Status bar implementation (C11) - Clarion","isPartOf":{"@id":"https:\/\/clarionsharp.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/#primaryimage"},"image":{"@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/#primaryimage"},"thumbnailUrl":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png","datePublished":"2018-01-30T20:00:05+00:00","breadcrumb":{"@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/#primaryimage","url":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png","contentUrl":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2018\/01\/sb.png","width":1318,"height":50,"caption":"StatusBar"},{"@type":"BreadcrumbList","@id":"https:\/\/clarionsharp.com\/blog\/new-status-bar-implementation-c11\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/clarionsharp.com\/blog\/"},{"@type":"ListItem","position":2,"name":"New Status bar implementation (C11)"}]},{"@type":"WebSite","@id":"https:\/\/clarionsharp.com\/blog\/#website","url":"https:\/\/clarionsharp.com\/blog\/","name":"Clarion","description":"Deliver your software on time, every time","publisher":{"@id":"https:\/\/clarionsharp.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/clarionsharp.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/clarionsharp.com\/blog\/#organization","name":"SoftVelocity","url":"https:\/\/clarionsharp.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2019\/03\/svlogonew57.png","contentUrl":"https:\/\/clarionsharp.com\/blog\/wp-content\/uploads\/2019\/03\/svlogonew57.png","width":221,"height":57,"caption":"SoftVelocity"},"image":{"@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/softvelocity\/","https:\/\/www.youtube.com\/user\/SoftVelocity"]},{"@type":"Person","@id":"https:\/\/clarionsharp.com\/blog\/#\/schema\/person\/b90e860529aea05ad064cf2687697ce3","name":"rzaunere","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/91d95e38759c411d27f646b60da7f4769ce91e87b484669af240e51c729b1e7c?s=96&d=mm&r=g","caption":"rzaunere"},"url":"https:\/\/clarionsharp.com\/blog\/author\/rzaunere\/"}]}},"_links":{"self":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/comments?post=1598"}],"version-history":[{"count":10,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1598\/revisions"}],"predecessor-version":[{"id":1617,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/posts\/1598\/revisions\/1617"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/media\/1608"}],"wp:attachment":[{"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/media?parent=1598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/categories?post=1598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/clarionsharp.com\/blog\/wp-json\/wp\/v2\/tags?post=1598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}