Pergunta

I'm new to c / c++ programing language and am following an online tutorial about Win32. When I build and compile my project ( MS VS C++ 2010 Express ), i get this error: 'IDD_ABOUT' : undeclared identifier. I'm not sure how to fix this. :(

Main.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;
}

Resource.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
Foi útil?

Solução

I have a feeling that Visual Studio Express doesn't include a proper resource editor that auto-generates resource includes, so I'm guessing you've created the .rc file manually. If so, you probably just need to define the symbol. Create an include file called resource.h and add this line to it:

#define IDD_ABOUT   100

Then include it at the top of your .cpp and .rc files:

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

The windows headers define generic certain resource IDs (IDOK, IDCANCEL, IDC_STATIC, etc) but for anything else you'll need to add your own symbol. The values don't really matter - any number up to 65534 is ok as long as it doesn't clash with any other ID in use in the same "scope" (e.g. two controls in the one dialog should have different IDs, but you can re-use the same ID in another dialog).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top