Thread: Dialog box not initialising

  1. #1
    Registered User
    Join Date
    Sep 2019
    Posts
    3

    Dialog box not initialising

    I am following "theForger's Win32 API programming tutorial" and have become stuck on one the controls example. Standard Controls: Button, Edit, List Box, Static

    The aim of the example is to create a dialog box which allows the user to enter a string and the amount of times the user wants the string to be printed in a separate box (see fig below).

    Dialog box not initialising-controls-fig-png

    I believe I have followed the code exactly and included the resource and resource script files in the project folder.

    My question is: when I go to run the program the process returns with "status -1" and no dialog window is shown like in the figure above. Why would this be happening? I have attached the source code, resource file and resource script below.

    Source code:

    Code:
    #include <windows.h>
    #include "resource1.h"
    
    
    BOOL CALLBACK DlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
        switch(Message)
        {
            case WM_INITDIALOG:
    
    
                // This is where we set up the dialog box, and initialise any default values
    
    
                SetDlgItemText(hwnd, IDC_TEXT, "This is a string!");
                SetDlgItemInt(hwnd, IDC_NUMBER, 5, FALSE);
            break;
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    case IDC_ADD:
                    {
                        // When somebody clicks the add button, first we get the number
                        // they entered.
    
    
                        BOOL bSuccess;
                        int nTimes = GetDlgItemInt(hwnd, IDC_NUMBER, &bSuccess, FALSE);
                        // Then we get the string they entered.
                        // First we need to find out how long it is
                        // so that we can allocate memory.
                        if(bSuccess)
                        {
                            int len = GetWindowTextLength(GetDlgItem(hwnd, IDC_TEXT));
                            if(len > 0)
                            {
                                // Now we allocate, and get the string into the buffer.
                                int i;
                                char* buf;
    
    
                                buf = (char*)GlobalAlloc(GPTR, len + 1);
                                GetDlgItemText(hwnd, IDC_TEXT, buf, len + 1);
    
    
                                // Now we add the string to the list the number of times
                                // the user has asked us to.
    
    
                                for(i = 0; i < nTimes; i++)
                                {
                                    int index = SendDlgItemMessage(hwnd, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)buf);
    
    
                                    // Here we are associating the value nTimes with the item
                                    // just for the heck of it, we'll use it to display later.
                                    // Normally you would put some more useful data here, such
                                    // as a pointer.
                                    SendDlgItemMessage(hwnd, IDC_LIST, LB_SETITEMDATA, (WPARAM)index, (LPARAM)nTimes);
    
    
                                }
                                // DON'T FORGET TO FREE THE MEMORY!!!
                                GlobalFree((HANDLE)buf);
                            }
                            else
                            {
                                MessageBox(hwnd, "You didn't enter anything!", "Warning", MB_OK);
                            }
                        }
                        else
                        {
                            MessageBox(hwnd, "Couldn't translate that message :(", "Warning", MB_OK);
                        }
                    }
                    break;
                    case IDC_REMOVE:
                    {
                        // When the user clicks the Remove button, first we get the
                        //number of selected items.
                        HWND hList = GetDlgItem(hwnd, IDC_LIST);
                        int count = SendMessage(hList, LB_GETSELCOUNT, 0, 0);
                        if(count != LB_ERR)
                        {
                            if(count != 0)
                            {
                                //And then allocate room to store the list of selected items.
    
    
                                int i;
                                int *buf = (int*)GlobalAlloc(GPTR, sizeof(int) * count);
                                SendMessage(hList, LB_GETSELITEMS, (WPARAM)count, (LPARAM)buf);
    
    
                                // Now we loop through the list to remove each item
                                // that was selected.
    
    
                                // WARNING!!!
                                // We loop backwards, because if we loop from top to
                                // bottom , it would change the indexes of the other items!!
    
    
                                for(i = count - 1; i >= 0; i--)
                                {
                                    SendMessage(hList, LB_DELETESTRING, (WPARAM)buf[i], 0);
                                }
    
    
                                GlobalFree(buf);
                            }
                            else
                            {
                                MessageBox(hwnd, "Nothing was selected!", "Warning", MB_OK);
                            }
                        }
                        else
                        {
                            MessageBox(hwnd, "Error counting items :(", "Warning", MB_OK);
                        }
                    }
                    break;
                    case IDC_CLEAR:
                        SendDlgItemMessage(hwnd, IDC_LIST, LB_RESETCONTENT, 0, 0);
                    break;
                    case IDC_LIST:
                        switch(HIWORD(wParam))
                        {
                            case LBN_SELCHANGE:
                            {
                            // Get number of selected items.
                            HWND hList = GetDlgItem(hwnd, IDC_LIST);
                            int count = SendMessage(hList, LB_GETSELCOUNT, 0, 0);
                            if(count != LB_ERR)
                            {
                                // We only want to continue if one and only one item
                                // is selected.
    
    
                                if(count == 1)
                                {
                                    // Since we know ahead of time we are only getting
                                    // one index, there's no need to allocate an array.
    
    
                                    int index;
                                    int err = SendMessage(hList, LB_GETSELITEMS, (WPARAM)1, (LPARAM)&index);
                                    if(err != LB_ERR)
                                    {
                                        // Get the data we associated with the item above
                                        // (the number of times it was added)
    
    
                                        int data = SendMessage(hList, LB_GETITEMDATA, (WPARAM)index, 0);
    
    
                                        SetDlgItemInt(hwnd, IDC_SHOWCOUNT, data, FALSE);
                                    }
                                    else
                                    {
                                        MessageBox(hwnd, "Error getting selected item :(", "Warning", MB_OK);
                                    }
                                }
                                else
                                {
                                    // No items or more than one item was selected.
                                    // Either way we aren't going to process this.
                                    SetDlgItemText(hwnd, IDC_SHOWCOUNT, "-");
                                }
                            }
                            else
                            {
                                MessageBox(hwnd, "Error counting items :(", "Warning", MB_OK);
                            }
                        }
                        break;
                    }
                    break;
                }
            break;
            case WM_CLOSE:
                EndDialog(hwnd, 0);
            break;
            default:
                return FALSE;
        }
        return TRUE;
    }
    
    
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
    {
        return DialogBoxA(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
    }
    Resource file:

    Code:
    
    #define IDC_STATIC -1
    
    
    #define IDD_MAIN            101
    #define IDC_TEXT            1002
    #define IDC_NUMBER          1003
    #define IDC_LIST            1004
    #define IDC_ADD             1005
    #define IDC_REMOVE          1006
    #define IDC_CLEAR           1007
    #define IDC_SHOWCOUNT       1008
    Resource script:

    Code:
    #include "resource1.h"
    
    
    IDD_MAIN DIALOG DISCARDABLE 0, 0, 207, 156
    STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Controls one"
    FONT 8, "MS Sans Serif"
    BEGIN
        LTEXT "Add" IDC_STATIC,7,10,14,8
        EDITTEXT IDC_TEXT, 25,7,120,14,ES_AUTOHSCROLL
        EDITTEXT IDC_NUMBER, 150,7,21,14,ES_NUMBER
        LTEXT "times." IDC_STATIC, 177,10,23,8
        LISTBOX IDC_LIST,7,25,138,106,LBS_NOINTEGRALHEIGHT |
            LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
        PUSHBUTTON "&Add",IDC_ADD,150,30,50,14
        PUSHBUTTON "&Remove",IDC_REMOVE,150,47,50,14
        PUSHBUTTON "&Clear",IDC_CLEAR,150,64,50,14
        LTEXT "This item was added",IDC_STATIC,7,141,66,8
        CTEXT "-",IDC_SHOWCOUNT,77,141,32,8
        LTEXT "times",IDC_STATIC,114,141,17,8
    END
    Thanks (& excuse the beginner questions!)

  2. #2
    null pointer Structure's Avatar
    Join Date
    May 2019
    Posts
    338

    Post

    returns with "status -1"
    Code:
    return DialogBoxA(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
    "without goto we would be wtf'd"

  3. #3
    null pointer Structure's Avatar
    Join Date
    May 2019
    Posts
    338
    "without goto we would be wtf'd"

  4. #4
    Registered User
    Join Date
    Sep 2019
    Posts
    3
    Could you explain why it is returning -1, instead of initialising the dialog box?

  5. #5
    null pointer Structure's Avatar
    Join Date
    May 2019
    Posts
    338

    Post

    why it is returning -1
    From the link i posted above:
    DialogBoxA Return Value: NONE
    "without goto we would be wtf'd"

  6. #6
    null pointer Structure's Avatar
    Join Date
    May 2019
    Posts
    338
    Code:
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
    {
        return DialogBoxA(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
    }
    try...
    Code:
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {  
      DialogBoxA(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
      return 0;
    }
    "without goto we would be wtf'd"

  7. #7
    Registered User
    Join Date
    Sep 2019
    Posts
    3
    Thank you for your help in understanding. I managed to work out why it was not creating the dialog box --> because I was creating the resource script in the wrong way through codeblocks. Instead of creating it via "new empty file" and naming it something.rc, I was doing new file>C/C++ source and naming it something.rc.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Initialising C++ arrays
    By JayCee++ in forum C++ Programming
    Replies: 13
    Last Post: 10-10-2011, 08:40 AM
  2. Before initialising a variable
    By GokhanK in forum C Programming
    Replies: 4
    Last Post: 01-16-2011, 06:11 PM
  3. Initialising
    By eeeeej in forum C Programming
    Replies: 24
    Last Post: 01-23-2008, 07:18 AM
  4. Initialising Arrays
    By studiesrule in forum C++ Programming
    Replies: 16
    Last Post: 10-31-2006, 08:01 AM
  5. initialising
    By Unregistered in forum Windows Programming
    Replies: 2
    Last Post: 12-12-2001, 05:36 PM

Tags for this Thread