0
votes

I have been testing out some gdi functions, and wanted to test out something with strings. However for some reason when I run this program I get the following error: 'string' was not declared in this scope

I even tried to include the "using namespace std" in the beginning (which usually I don't have to do in order to create strings) but in that case, after declaring std::string myString; I get another error saying: error: 'string' is not a member of 'std'

what could I be doing wrong? The complete code is here:

#define _WIN32_WINNT    0x0500  

#include <tchar.h>
#include <windows.h>


LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

int WINAPI WinMain (HINSTANCE hThisInstance,
                 HINSTANCE hPrevInstance,
                 LPSTR lpszArgument,
                 int nCmdShow)
{
HWND hwnd;               /* This is the handle for our window */
MSG messages;            /* Here messages to the application are saved */
WNDCLASSEX wincl;        /* Data structure for the windowclass */

/* The Window structure */
wincl.hInstance = hThisInstance;
wincl.lpszClassName = szClassName;
wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;                 /* No menu */
wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
wincl.cbWndExtra = 0;                      /* structure or the window instance */
/* Use Windows's default colour as the background of the window */
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&wincl))
    return 0;

/* The class is registered, let's create the program*/
hwnd = CreateWindowEx (
       WS_EX_LAYERED,// | WS_EX_TRANSPARENT,                   /* Extended possibilites      for variation */
       szClassName,         /* Classname */
       _T("Code::Blocks Template Windows App"),       /* Title Text */
       WS_OVERLAPPEDWINDOW, /* default window */
       CW_USEDEFAULT,       /* Windows decides the position */
       CW_USEDEFAULT,       /* where the window ends up on the screen */
       544,                 /* The programs width */
       375,                 /* and height in pixels */
       HWND_DESKTOP,        /* The window is a child-window to desktop */
       NULL,                /* No menu */
       hThisInstance,       /* Program Instance handler */
       NULL                 /* No Window Creation data */
       );


COLORREF greyishColor = RGB(212, 208, 200);
SetLayeredWindowAttributes(hwnd, greyishColor, 0, LWA_COLORKEY);

/* Make the window visible on the screen */
ShowWindow (hwnd, 3);//nCmdShow);



                HDC hdc;
                hdc = GetDC(hwnd);
                //drawing a rectangle
                    Rectangle(hdc, 100, 100, 200, 300);


                ReleaseDC(hwnd, hdc);


                ///again doing the hdc bit
                hdc = GetDC(hwnd);
                HPEN hPenOld;


                HPEN hLinePen;
                COLORREF qLineColor = RGB(255, 0 , 0);
                hLinePen = CreatePen(PS_SOLID, 7, qLineColor);
                hPenOld = (HPEN)SelectObject(hdc, hLinePen);

                MoveToEx(hdc, 100, 100, NULL);
                LineTo(hdc, 500, 250);

                SelectObject(hdc, hPenOld);
                DeleteObject(hLinePen);

                ///again releasing
                ReleaseDC(hwnd, hdc);

//++++++++++++++++++++HERE IS WHERE MY ERROR IS HAPPENING:

                string myString;


/* Run the message loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messages, NULL, 0, 0))
{
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                  /* handle the messages */
    {
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}
2
You might want to #include <string> maybe?Xarn
So, what do you expect string to be?juanchopanza

2 Answers

13
votes

std::string lives in string header. You might want to actually #include <string> before trying to use it.

1
votes

For your declaration to be recognized, you must

#include <string>
using std::string;     // (or using namespace std if you want to use more of std.)  

If you want to use this string in relation with windows api, you have to pass argument mystring.c_str() to get a pointer to a null terminated c-string:

MessageBox(NULL, mystring.c_str(), TEXT("Attention !"), MB_OK); 

Also, be carefull: depending on your compiling options (see here), you may have to use either std::string or std::wstring.

If you want to use heavily strings in windows programmes but you want your code to compile independently of unicode setting, like with TCHAR and TEXT(), you could opt for the following type definition:

typedef std::basic_string<TCHAR> tstring;  // based on microsoft's TCHAR 

which you can then use as a normal string/wstring depending on the compiling options:

tstring s, t( TEXT("Hello"));
s = t + TEXT(" world !");