Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка при в коде MessageBox. Объясните.

18K
13 июля 2007 года
Splanger
5 / / 20.09.2006
Совсем недавно уселся изучать DirectX. В качестве учебного пособия с примерами взял сайт: http://directxtutorial.com/Tutorial9/A-Win32/dx9A2.aspx

Программирую в Visual Studio .NET 2003.

Всё-бы ничего, только при попытки скомпилировать код, который должен рисовать MessageBox с кнопками в Windows Application, выскакивает такая вот ошибка:

Цитата:
d:\Documents\Projects\C++\test\test.cpp(13): error C2664: 'MessageBoxA' : cannot convert parameter 2 from 'const unsigned short [13]' to 'LPCSTR'



Код программы:

Код:
#include <windows.h>    // include the basic windows header file

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nShowCmd)
{
    // create a "Hello World" message box using MessageBox()
    MessageBox(NULL,
               L"Hello World!",
               L"Just another Hello World program!",
               MB_ICONEXCLAMATION | MB_OK); //Здесь ошибка.

    // return 0 to Windows
    return 0;
}


Объясните если не трудно, в чём конкретно ошибка? И как исправить?
18K
13 июля 2007 года
Splanger
5 / / 20.09.2006
И заранее ещё один вопрос:

При попытки скомпилировать код, который рисует простое окно WinApplication, выскакивают аж три ошибки:

1.
Цитата:
d:\Documents\Projects\C++\test\test.cpp(32): error C2440: '=' : cannot convert from 'const unsigned short [13]' to 'LPCSTR'



2.

 
Код:
d:\Documents\Projects\C++\test\test.cpp(49): error C2664: 'CreateWindowExA' : cannot convert parameter 2 from 'const unsigned short [13]' to 'LPCSTR'


3.
Цитата:
d:\Documents\Projects\C++\test\test.cpp(70): warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data




Код программы:

Код:
// include the basic windows header file
#include <windows.h>
#include <windowsx.h>

// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd,
                         UINT message,
                         WPARAM wParam,
                         LPARAM lParam);

// the entry point for any Windows program
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpCmdLine,
                   int nCmdShow)
{
    // the handle for the window, filled by a function
    HWND hWnd;
    // this struct holds information for the window class
    WNDCLASSEX wc;

    // clear out the window class for use
    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    // fill in the struct with the needed information
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WindowProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = L"WindowClass1"; //Ошибка номер 1

    // register the window class
    RegisterClassEx(&wc);

    // create the window and use the result as the handle
    hWnd = CreateWindowEx(NULL,
                          L"WindowClass1",    // name of the window class
                          L"Our First Windowed Program",   // title of the window
                          WS_OVERLAPPEDWINDOW,    // window style
                          300,    // x-position of the window
                          300,    // y-position of the window
                          500,    // width of the window
                          400,    // height of the window
                          NULL,    // we have no parent window, NULL
                          NULL,    // we aren't using menus, NULL
                          hInstance,    // application handle
                          NULL);    // used with multiple windows, NULL.  Ошибка номер 2

    // display the window on the screen
    ShowWindow(hWnd, nCmdShow);

    // enter the main loop:

    // this struct holds Windows event messages
    MSG msg;

    // wait for the next message in the queue, store the result in 'msg'
    while(GetMessage(&msg, NULL, 0, 0))
    {
        // translate keystroke messages into the right format
        TranslateMessage(&msg);

        // send the message to the WindowProc function
        DispatchMessage(&msg);
    }

    // return this part of the WM_QUIT message to Windows
    return msg.wParam; //Ошибка номер 3
}

// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    // sort through and find what code to run for the message given
    switch(message)
    {
        // this message is read when the window is closed
        case WM_DESTROY:
            {
                // close the application entirely
                PostQuitMessage(0);
                return 0;
            } break;
    }

    // Handle any messages the switch statement didn't
    return DefWindowProc (hWnd, message, wParam, lParam);
}


Разжуйте чайнику, что из-за чего ошибки и как с ними бороться?
22K
14 июля 2007 года
Pastor
43 / / 16.05.2007
(int)msg.wParam - и предупреждение пропадет,
у тебя LPCSTR(const char *) а ты ему пихаешь строку L"", юникод
L убери и будет тебе счастье....
да... совет на будующее не ставь ты L... лучше пиши _TEXT("")
18K
14 июля 2007 года
Splanger
5 / / 20.09.2006
Безмерно благодарю! Наконец всё заработало =)
Спасибо.

Цитата: Pastor
(int)msg.wParam - и предупреждение пропадет,
у тебя LPCSTR(const char *) а ты ему пихаешь строку L"", юникод
L убери и будет тебе счастье....
да... совет на будующее не ставь ты L... лучше пиши _TEXT("")



А что вообще означает юникод "L"? Для чего он используется?

22K
25 июля 2007 года
MagAlex
22 / / 20.07.2007
Вообще не надо, ни "L", ни "_TEXT('')"... так всё работает...
350
26 июля 2007 года
cheburator
589 / / 01.06.2006
В кодировке Unicode символы представлены двумя байтами (соответствующий тип символа называется wchar_t). Те строки, которые мы задаем непосредственно в коде, окутывая в кавычки, компилятор по умолчанию компилирует в однобайтные строки. Добавляя символ L впереди, мы даем указание компилятору рассматривать строку как последовательность двухбайтовых символов.
Чтобы не возникало проблем, принято использовать конструкцию
 
Код:
_T("какая-то строка")

Макроопределение _T() раскрывается в обычные символы или wchar_t, как правило, в зависимости от настроек проекта.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог