IDD_ABOUT: необъявленный идентификатор

Я новичок в языке программирования c/c++ и следую онлайн-руководству по Win32. Когда я создаю и компилирую свой проект (MS VS C++ 2010 Express), я получаю эту ошибку: «IDD_ABOUT»: необъявленный идентификатор. Я не знаю, как это исправить. :(

Основной.cpp:

#include <Windows.h>

#define ID_FILE_EXIT 9001
#define ID_HELP_ABOUT 9002

const char g_szClassName[] = "myWindowClass";

BOOL CALLBACK AboutDlgProc( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam )
{
    switch( Message )
    {
    case WM_INITDIALOG:

        return TRUE;

    case WM_COMMAND:
        switch( LOWORD( wParam ) )
        {
        case IDOK:
            EndDialog( hwnd, IDOK );
            break;

        case IDCANCEL:
            EndDialog( hwnd, IDCANCEL );
            break;
        }
        break;

    default:
        return FALSE;
    }
    return TRUE;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CREATE:
        {
            HMENU hMenu, hSubMenu;
            HICON hIcon, hIconSm;

            hMenu = CreateMenu();

            hSubMenu = CreatePopupMenu();
            AppendMenu( hSubMenu, MF_STRING, ID_FILE_EXIT, "E&xit" );
            AppendMenu( hMenu, MF_STRING | MF_POPUP, ( UINT )hSubMenu, "&File" );

            hSubMenu = CreatePopupMenu();
            AppendMenu( hSubMenu, MF_STRING, ID_HELP_ABOUT, "&About" );
            AppendMenu( hMenu, MF_STRING | MF_POPUP, ( UINT )hSubMenu, "&Help" );

            SetMenu( hwnd, hMenu );

            hIcon = ( HICON )LoadImage( NULL, "menu_one.ico", IMAGE_ICON, 32, 32, LR_LOADFROMFILE );
            if( hIcon )
                SendMessage( hwnd, WM_SETICON, ICON_BIG, ( LPARAM )hIcon );
            else
                MessageBox( hwnd, "Could not load large icon!", "ERROR!", MB_OK | MB_ICONERROR );

            hIconSm = ( HICON )LoadImage( NULL, "menu_one.ico", IMAGE_ICON, 16, 16, LR_LOADFROMFILE );
            if( hIconSm )
                SendMessage( hwnd, WM_SETICON, ICON_SMALL, ( LPARAM )hIconSm );
            else
                MessageBox( hwnd, "Could not load small icon!", "ERROR!", MB_OK | MB_ICONERROR );
        }
        break;

    case WM_COMMAND:
        switch( LOWORD( wParam ) )
        {
        case ID_FILE_EXIT:
            PostMessage( hwnd, WM_CLOSE, 0, 0 );
            break;

        case ID_HELP_ABOUT:
            {
                int ret = DialogBox( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDD_ABOUT ), hwnd, AboutDlgProc );
                if( ret == IDOK )
                    MessageBox( hwnd, "Dialog exited with IDOK.", "Notice", MB_OK | MB_ICONINFORMATION );
                else if( ret == IDCANCEL )
                    MessageBox( hwnd, "Dialog exited with IDCANCEL.", "Notice", MB_OK | MB_ICONINFORMATION );
                else if( ret == -1 )
                    MessageBox( hwnd, "Dialog failed!", "Error", MB_OK | MB_ICONINFORMATION );
            }
            break;
        }
        break;

    case WM_LBUTTONDOWN:

        break;

    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;

    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;

    default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG msg;

    // Step 1: Registering the Window Class
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 1;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm = NULL;

    if( !RegisterClassEx( &wc ) )
    {
        MessageBox( NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK );
        return 0;
    }

    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        500, 200, 800, 600,
        NULL, NULL, hInstance, NULL );

    if( hwnd == NULL )
    {
        MessageBox( NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK );
        return 0;
    }

    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );

    while( GetMessage( &msg, NULL, 0, 0 ) > 0 )
    {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }

    return msg.wParam;
}

Ресурс.rc:

#include <Windows.h>

#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

IDD_ABOUT DIALOG DISCARDABLE  0, 0, 239, 66
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "My About Box"
FONT 8, "MS Sans Serif"
BEGIN
    DEFPUSHBUTTON   "&OK",IDOK,174,18,50,14
    PUSHBUTTON      "&Cancel",IDCANCEL,174,35,50,14
    GROUPBOX        "About this program...",IDC_STATIC,7,7,225,52
    CTEXT           "An example program showing how to use Dialog Boxes\r\n\r\nby theForger",IDC_STATIC,16,18,144,33
END

person Vince    schedule 04.10.2013    source источник


Ответы (1)


У меня такое ощущение, что Visual Studio Express не включает в себя надлежащий редактор ресурсов, который автоматически генерирует ресурсы, поэтому я предполагаю, что вы создали файл .rc вручную. Если это так, вам, вероятно, просто нужно определить символ. Создайте включаемый файл с именем resource.h и добавьте в него эту строку:

#define IDD_ABOUT   100

Затем включите его в начало файлов .cpp и .rc:

#include <Windows.h>
#include "resource.h" // add this line

Заголовки окон определяют общие идентификаторы определенных ресурсов (IDOK, IDCANCEL, IDC_STATIC и т. д.), но для всего остального вам потребуется добавить свой собственный символ. Значения на самом деле не имеют значения — любое число до 65534 допустимо, если оно не конфликтует с каким-либо другим идентификатором, используемым в той же «области действия» (например, два элемента управления в одном диалоговом окне должны иметь разные идентификаторы, но вы можно повторно использовать тот же идентификатор в другом диалоговом окне).

person Jonathan Potter    schedule 04.10.2013
comment
Я создал файл .rc вручную, и это отлично сработало. Я сделал глупую любительскую ошибку, лол :P - person Vince; 06.10.2013
comment
я пробовал то же самое, вы пишете, но теперь он дает мне диалог, показывающий, что диалог не выполнен - person Master Yoda; 11.06.2015