Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. std::string to const WCHAR*

std::string to const WCHAR*

Scheduled Pinned Locked Moved C / C++ / MFC
questionwinformsgraphics
30 Posts 6 Posters 0 Views 1 Watching
  • 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.
  • S Offline
    S Offline
    Stick
    wrote on last edited by
    #1

    I want to draw a string (from a variable) with GDI+ so I'm trying to do this: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); but the member m_ac is a std::string. How can I get it into the const WCHAR* format for this call?

    D J Z 3 Replies Last reply
    0
    • S Stick

      I want to draw a string (from a variable) with GDI+ so I'm trying to do this: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); but the member m_ac is a std::string. How can I get it into the const WCHAR* format for this call?

      D Offline
      D Offline
      David Crow
      wrote on last edited by
      #2

      Stick^ wrote:

      How can I get it into the const WCHAR* format for this call?

      At a minimum:

      m_graphics->DrawString(m_ac**.c_str()**, -1, &font, PointF(8,8), NULL, &grnbrush);


      "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

      "Judge not by the eye but by the heart." - Native American Proverb

      J S 2 Replies Last reply
      0
      • S Stick

        I want to draw a string (from a variable) with GDI+ so I'm trying to do this: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); but the member m_ac is a std::string. How can I get it into the const WCHAR* format for this call?

        J Offline
        J Offline
        James R Twine
        wrote on last edited by
        #3

        MultiByteToWideChar(...) is the de-facto way to convert from ANSI to Unicode (Wide) strings, so you can look into that.    For something a little more Q&D, look into the (ATL) Conversion Macros like A2WC(...), T2WC(...), etc.  Note that on VC++ 6.0, these macros use the _alloc(...) function (if a conversion is required) so you have to be careful using them directly in loops.    Peace!

        -=- James


        If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
        Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
        DeleteFXPFiles & CheckFavorites (Please rate this post!)

        S 1 Reply Last reply
        0
        • D David Crow

          Stick^ wrote:

          How can I get it into the const WCHAR* format for this call?

          At a minimum:

          m_graphics->DrawString(m_ac**.c_str()**, -1, &font, PointF(8,8), NULL, &grnbrush);


          "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

          "Judge not by the eye but by the heart." - Native American Proverb

          J Offline
          J Offline
          James R Twine
          wrote on last edited by
          #4

          Does that only work if the string is of type std::wstring?    Peace!

          -=- James


          If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
          Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
          DeleteFXPFiles & CheckFavorites (Please rate this post!)

          D 1 Reply Last reply
          0
          • S Stick

            I want to draw a string (from a variable) with GDI+ so I'm trying to do this: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); but the member m_ac is a std::string. How can I get it into the const WCHAR* format for this call?

            Z Offline
            Z Offline
            Zac Howland
            wrote on last edited by
            #5

            Use a wstring and call the c_str() method on it.

            If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week Zac

            S 1 Reply Last reply
            0
            • J James R Twine

              Does that only work if the string is of type std::wstring?    Peace!

              -=- James


              If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
              Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
              DeleteFXPFiles & CheckFavorites (Please rate this post!)

              D Offline
              D Offline
              David Crow
              wrote on last edited by
              #6

              The c_str() method is a member of both string and wstring. Is that what you are asking?


              "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

              "Judge not by the eye but by the heart." - Native American Proverb

              J 1 Reply Last reply
              0
              • D David Crow

                Stick^ wrote:

                How can I get it into the const WCHAR* format for this call?

                At a minimum:

                m_graphics->DrawString(m_ac**.c_str()**, -1, &font, PointF(8,8), NULL, &grnbrush);


                "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

                "Judge not by the eye but by the heart." - Native American Proverb

                S Offline
                S Offline
                Stick
                wrote on last edited by
                #7

                ummm seems that would do the reverse of what I want. I want to go to a wide string from a cstr.

                D 1 Reply Last reply
                0
                • J James R Twine

                  MultiByteToWideChar(...) is the de-facto way to convert from ANSI to Unicode (Wide) strings, so you can look into that.    For something a little more Q&D, look into the (ATL) Conversion Macros like A2WC(...), T2WC(...), etc.  Note that on VC++ 6.0, these macros use the _alloc(...) function (if a conversion is required) so you have to be careful using them directly in loops.    Peace!

                  -=- James


                  If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
                  Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
                  DeleteFXPFiles & CheckFavorites (Please rate this post!)

                  S Offline
                  S Offline
                  Stick
                  wrote on last edited by
                  #8

                  Don't think I can use ATL and not sure how I would do that anyway yet. I'm programming a win32 dll.

                  J J 2 Replies Last reply
                  0
                  • Z Zac Howland

                    Use a wstring and call the c_str() method on it.

                    If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week Zac

                    S Offline
                    S Offline
                    Stick
                    wrote on last edited by
                    #9

                    Would if I could, but I am given a c_str and must convert it to a wide, hence the question.

                    D Z 2 Replies Last reply
                    0
                    • D David Crow

                      The c_str() method is a member of both string and wstring. Is that what you are asking?


                      "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

                      "Judge not by the eye but by the heart." - Native American Proverb

                      J Offline
                      J Offline
                      James R Twine
                      wrote on last edited by
                      #10

                      No, I am verifying that even though he is using std::string (ANSI) instead of std::wstring (Unicode/Wide), he can still expect to get a const WCHAR* returned by std::string::c_str()?  I am under the impression that he will get a const **char*** from std::string::c_str(), and a const **WCHAR*** (or const wchar_t*) from std::**w**string::c_str().    Peace!

                      -=- James


                      If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
                      Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
                      DeleteFXPFiles & CheckFavorites (Please rate this post!)

                      D 1 Reply Last reply
                      0
                      • S Stick

                        Don't think I can use ATL and not sure how I would do that anyway yet. I'm programming a win32 dll.

                        J Offline
                        J Offline
                        James R Twine
                        wrote on last edited by
                        #11

                        You can use the conversion macros without adding "real" ATL support to your project.     Anyway, MultiByteToWideChar(...) is likely the way to go - look it up in MSDN for usage info.    Peace!

                        -=- James


                        If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
                        Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
                        DeleteFXPFiles & CheckFavorites (Please rate this post!)

                        1 Reply Last reply
                        0
                        • J James R Twine

                          No, I am verifying that even though he is using std::string (ANSI) instead of std::wstring (Unicode/Wide), he can still expect to get a const WCHAR* returned by std::string::c_str()?  I am under the impression that he will get a const **char*** from std::string::c_str(), and a const **WCHAR*** (or const wchar_t*) from std::**w**string::c_str().    Peace!

                          -=- James


                          If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
                          Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
                          DeleteFXPFiles & CheckFavorites (Please rate this post!)

                          D Offline
                          D Offline
                          David Crow
                          wrote on last edited by
                          #12

                          Because string.c_str() returns a char* is why I indicated it would need to be a minimum. A typecast would still need to be applied (to make it wide). I don't use the STL, but a better solution would be to use wstring instead.


                          "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

                          "Judge not by the eye but by the heart." - Native American Proverb

                          J 1 Reply Last reply
                          0
                          • S Stick

                            ummm seems that would do the reverse of what I want. I want to go to a wide string from a cstr.

                            D Offline
                            D Offline
                            David Crow
                            wrote on last edited by
                            #13

                            As I do not use the STL, I did not want to commit to a definite solution. That's why I prefaced it with, "At a minimum." From there you could have just cast it to a WCHAR*. A better solution is to use a wstring instead.


                            "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

                            "Judge not by the eye but by the heart." - Native American Proverb

                            1 Reply Last reply
                            0
                            • S Stick

                              Would if I could, but I am given a c_str and must convert it to a wide, hence the question.

                              D Offline
                              D Offline
                              David Crow
                              wrote on last edited by
                              #14

                              Stick^ wrote:

                              Would if I could, but I am given a c_str and must convert it to a wide, hence the question.

                              c_str() is a method of wstring. No conversion is necessary as it is already "wide." Now if you are unable to change std::string to std::wstring, that's a different problem.


                              "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

                              "Judge not by the eye but by the heart." - Native American Proverb

                              1 Reply Last reply
                              0
                              • S Stick

                                Would if I could, but I am given a c_str and must convert it to a wide, hence the question.

                                Z Offline
                                Z Offline
                                Zac Howland
                                wrote on last edited by
                                #15

                                You are given a const char* you mean? If that is the case, use MultiByteToWideChar to convert the const char* to an array of const wchar_t* and pass that to your draw function (NOTE: that will only work for UNICODE builds -- for a more generic approach, look at the A2T macro)

                                If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week Zac

                                S 1 Reply Last reply
                                0
                                • Z Zac Howland

                                  You are given a const char* you mean? If that is the case, use MultiByteToWideChar to convert the const char* to an array of const wchar_t* and pass that to your draw function (NOTE: that will only work for UNICODE builds -- for a more generic approach, look at the A2T macro)

                                  If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week Zac

                                  S Offline
                                  S Offline
                                  Stick
                                  wrote on last edited by
                                  #16

                                  No. I'm given a std::string... here's the declaration: string m_ac; Now, if I attempt: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); I get: Error 1 error C2664: 'Gdiplus::Status Gdiplus::Graphics::DrawString(const WCHAR *,INT,const Gdiplus::Font *,const Gdiplus::RectF &,const Gdiplus::StringFormat *,const Gdiplus::Brush *)' : cannot convert parameter 1 from 'std::string' to 'const WCHAR *' so as you can clearly see, the m_ac is NOT already wide. I have tried to do something like this: WCHAR str[20+1] = L""; WideCharToMultiByte(CP_ACP, 0, m_ac.c_str(), -1, str, wcslen(str)+1, NULL, NULL); but this does not work either. Nor does just m_ac in parameter 3.

                                  G J Z S 4 Replies Last reply
                                  0
                                  • D David Crow

                                    Because string.c_str() returns a char* is why I indicated it would need to be a minimum. A typecast would still need to be applied (to make it wide). I don't use the STL, but a better solution would be to use wstring instead.


                                    "Approved Workmen Are Not Ashamed" - 2 Timothy 2:15

                                    "Judge not by the eye but by the heart." - Native American Proverb

                                    J Offline
                                    J Offline
                                    James R Twine
                                    wrote on last edited by
                                    #17

                                    The const char* returned by c_str() is not a wide string, while casting it to WCHAR* will allow the code to compile, it will not work correctly.    Peace!

                                    -=- James


                                    If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
                                    Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
                                    DeleteFXPFiles & CheckFavorites (Please rate this post!)

                                    J D 2 Replies Last reply
                                    0
                                    • J James R Twine

                                      The const char* returned by c_str() is not a wide string, while casting it to WCHAR* will allow the code to compile, it will not work correctly.    Peace!

                                      -=- James


                                      If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
                                      Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
                                      DeleteFXPFiles & CheckFavorites (Please rate this post!)

                                      J Offline
                                      J Offline
                                      Jorgen Sigvardsson
                                      wrote on last edited by
                                      #18

                                      James R. Twine wrote:

                                      while casting it to WCHAR* will allow the code to compile, it will not work correctly.

                                      From the context, I think he meant casting the entire string, and not the pointer. :)

                                      -- Mr. Bender's Wardrobe by ROBOTANY 500

                                      J 1 Reply Last reply
                                      0
                                      • S Stick

                                        No. I'm given a std::string... here's the declaration: string m_ac; Now, if I attempt: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); I get: Error 1 error C2664: 'Gdiplus::Status Gdiplus::Graphics::DrawString(const WCHAR *,INT,const Gdiplus::Font *,const Gdiplus::RectF &,const Gdiplus::StringFormat *,const Gdiplus::Brush *)' : cannot convert parameter 1 from 'std::string' to 'const WCHAR *' so as you can clearly see, the m_ac is NOT already wide. I have tried to do something like this: WCHAR str[20+1] = L""; WideCharToMultiByte(CP_ACP, 0, m_ac.c_str(), -1, str, wcslen(str)+1, NULL, NULL); but this does not work either. Nor does just m_ac in parameter 3.

                                        G Offline
                                        G Offline
                                        George L Jackson
                                        wrote on last edited by
                                        #19

                                        Have you tried "mbstowcs" or "mbstowcs_s" in stdlib.h. std::string mbstr = "The string!"; std::vector<wchar_t> wcstr(mbstr.size() + 1, L'\0'); size_t written = 0; mbstate_t state = {0}; const char* pmbstr = mbstr.c_str(); errno_t result = mbsrtowcs_s(&written, &wcstr[0], wcstr.size(), &pmbstr, mbstr.size(), &state); std::wcout << &wcstr[0] << std::endl; -- modified at 20:19 Thursday 28th September, 2006

                                        1 Reply Last reply
                                        0
                                        • J Jorgen Sigvardsson

                                          James R. Twine wrote:

                                          while casting it to WCHAR* will allow the code to compile, it will not work correctly.

                                          From the context, I think he meant casting the entire string, and not the pointer. :)

                                          -- Mr. Bender's Wardrobe by ROBOTANY 500

                                          J Offline
                                          J Offline
                                          James R Twine
                                          wrote on last edited by
                                          #20

                                          You mean to create a temporary, as in wstring( sTheString.c_str() )?  I do not think that will work, either...  Unless I am missing the intent of your smiley, that is.    Peace!

                                          -=- James


                                          If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
                                          Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
                                          DeleteFXPFiles & CheckFavorites (Please rate this post!)

                                          J 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups