Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Unread
    • Recent
    • Tags
    • Users
    • Login

    GeUserArea::DrawText() in R21 behaves different from previous releases?

    Cinema 4D SDK
    r21 c++ classic api
    2
    3
    443
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • fwilleke80F
      fwilleke80
      last edited by fwilleke80

      Hello,

      in R21, we have a strange issue when drawing text into a GeUserArea:

      Screen Shot 2019-10-24 at 11.25.04.png

      We first draw the background including the blue highlight rectangle under the third thumbnail. Then, in a loop, we draw all the thumbnails and the label texts. The text background seems to draw over the highlight rectangle, partly blocking it.

      Setting the text drawing color is done like this:

      DrawSetTextCol(COLOR_TEXT, COLOR_TRANS);
      

      Then we draw the text like this:

      DrawText(labelStr, labelPosX, labelPosY, DRAWTEXT_HALIGN_CENTER);
      

      Questions:

      • Why is the text background drawn even though COLOR_TRANS is used as background color?
      • Why is the text background so much wider than the actual text? There are no leading or trailing spaces in labelStr.
      • Why is the label text of the third thumbnail not blocking the highlight rectangle, even though it's drawn with the exact same code?

      This works perfectly in all previous C4D releases.

      Thanks in advance for advice,
      greetings,
      Frank

      www.frankwilleke.de
      Only asking personal code questions here.

      1 Reply Last reply Reply Quote 0
      • M
        m_adam
        last edited by

        Here I'm not able to reproduce the issue, could you share your code, please.
        Since I'm pretty sure it's not language dependant I have made a quick test in python, but no success:

        import c4d
        
        
        GADGET_ID_GEUSERAREA = 10000
        
        
        class ExampleGeUserArea(c4d.gui.GeUserArea):
        
        
            def DrawBackGround(self, pictId, bmp, selected=True):
                
                if selected:
                    self.DrawSetPen(c4d.Vector(1, 0, 0))
                    self.DrawRectangle(pictId * 150, 5, (pictId + 1) * 150, 170)
                        
                print pictId, pictId * 150 + 5, (pictId + 1) * 150 - 5
                self.DrawBitmap(bmp, pictId * 150 + 5, 5,  145, 145, 0, 0, bmp.GetBw(), bmp.GetBh(), c4d.BMP_NORMALSCALED | c4d.BMP_ALLOWALPHA)
                
            def DrawTxt(self, pictId):
                self.DrawSetTextCol(c4d.COLOR_TEXT, c4d.COLOR_TRANS)
                self.DrawText("String for {}".format(pictId), (pictId + 1) * 150 - 75, 150, c4d.DRAWTEXT_HALIGN_CENTER)
                
            def DrawMsg(self, x1, y1, x2, y2, msg):
                self.DrawRectangle(x1, y1, x2, y2)
                
                obj = c4d.BaseObject(c4d.Ocube)
                bmp = obj.GetIconEx().GetGuiScalePart()
                
                
                for i in xrange(4):
                    selected = True if i > 2 else False
                    self.DrawBackGround(i, bmp, selected)
                    self.DrawTxt(i)
        
        class ExampleDialog(c4d.gui.GeDialog):
            geUserArea = ExampleGeUserArea()
        
            def CreateLayout(self):
                self.AddUserArea(GADGET_ID_GEUSERAREA, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, 100, 100)
        
                # Attaches the stored GeUserArea to the Gadget previously created
                self.AttachUserArea(self.geUserArea, GADGET_ID_GEUSERAREA)
        
                return True
        
        
        def main():
            global dlg
            # Creates a new instance of the GeDialog
            dlg = ExampleDialog()
        
            # Opens the GeDialog, since it's open it as Modal, it block Cinema 4D
            dlg.Open(c4d.DLG_TYPE_ASYNC, defaultw=300, defaulth=50)
        
        
        if __name__ == "__main__":
            main()
        

        If not possible to do it publicly, you can send us an email to [email protected]

        Cheers,
        Maxime.

        MAXON SDK Specialist

        Development Blog, MAXON Registered Developer

        1 Reply Last reply Reply Quote 0
        • fwilleke80F
          fwilleke80
          last edited by

          Hi Maxime,

          thanks for trying! I'm also sure it's not specific to C++. I'll send you some code as soon as I find the time to strip it down.

          Cheers,
          Frank

          www.frankwilleke.de
          Only asking personal code questions here.

          1 Reply Last reply Reply Quote 0
          • First post
            Last post