Hi everyone. I'm having trouble getting groups working in a list box.I'm trying to have two groups. One will be "Done", and the other will be "todo". I'm getting these errors:

In function `LRESULT WindowProcedure(HWND__*, UINT, WPARAM, LPARAM)':
`ListView_EnableGroupView' undeclared (first use this function)
(Each undeclared identifier is reported only once for each function it appears in.)
`LVGROUP' undeclared (first use this function)
expected `;' before "lg"
`lg' undeclared (first use this function)
`LVGF_HEADER' undeclared (first use this function)
`LVGF_GROUPID' undeclared (first use this function)
`ListView_InsertGroup' undeclared (first use this function)
[Build Error] [main.o] Error 1

Could someone please help.
This is my code:

#define _WIN32_ 0x600

#include <windows.h>
#include <commctrl.h>
#include "resource.h"
HWND hWndButton;
HWND hWndEditBox;
HFONT hFont;
HWND hWnd; 
HWND hWndListView;
LVCOLUMN LvCol; // Make Coluom struct for ListView

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
            
    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 color 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 (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "To-do list",       /* Title Text */
           WS_SYSMENU | WS_MINIMIZEBOX , /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           340,                 /* The programs width */
           210,                 /* 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 */
           );

    /* Make the window visible on the screen */
    ShowWindow (hWnd, nFunsterStil);

    /* 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_CREATE:
             {
             HINSTANCE hInstance = (HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE) ;
            hWndButton = CreateWindowEx(
            0,
            "BUTTON",
            "ADD",
            WS_VISIBLE | WS_CHILD,
            250,
            0,
            90,
            20,
            hWnd,
            (HMENU) IDB_BUTTON,
            hInstance,
            NULL);
             hFont = CreateFont(0, 0, 0, 0, 0, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_MODERN, "Courier New");
             hWndEditBox = CreateWindow(
            "EDIT", 
            "", 
            WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL,
            0, 
            0, 
            250, 
            20, 
            hWnd, 
            (HMENU)IDC_EDITBOX_TEXT, 
            (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), 
            NULL);
            SendMessage(hWndEditBox, WM_SETFONT, (WPARAM)hFont, TRUE);
         
            
             hWndListView = CreateWindowEx(0L, WC_LISTVIEW, "", WS_VISIBLE | WS_CHILD | LVS_REPORT,
                          0, 21, 340, 190, hWnd, 
                          (HMENU) ID_LISTVIEW, hInstance, NULL);
                 //Groups
   ListView_EnableGroupView(hWndListView, TRUE);                       
LVGROUP lg;
lg.cbSize = sizeof(LVGROUP);
lg.mask = LVGF_HEADER | LVGF_GROUPID;

lg.pszHeader = L"To-do";
lg.iGroupId = 101;
ListView_InsertGroup(hWndListView, -1, &lg);

lg.pszHeader = L"Done";
lg.iGroupId = 102;
ListView_InsertGroup(hWndListView, -1, &lg);
              // Here we put the info on the Coulom headers
				// this is not data, only name of each header we like
                memset(&LvCol,0,sizeof(LvCol)); // Reset Coluom
				LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; // Type of mask
				LvCol.cx=0x0;                                // width between each coloum
				LvCol.pszText="Time";                     // First Header
 				LvCol.cx=0x28;

				// Inserting Couloms as much as we want
				SendMessage(hWndListView,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol); // Insert/Show the coloum
			
                LvCol.cx=0x125;
				LvCol.pszText="Item";                       
                SendMessage(hWndListView,LVM_INSERTCOLUMN,2,(LPARAM)&LvCol); 
				

               

                          
                          
                          
                          }
                          
            
             break;
        case WM_DESTROY:
                     
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
            case WM_COMMAND: 
        {
            switch (LOWORD(wParam))
            {
                case IDB_BUTTON:
                {
                    switch (HIWORD(wParam))
                    {
                        case BN_CLICKED:
                            
int TxtSize = GetWindowTextLength (hWndEditBox) + 1;
char *Entry = new char [TxtSize];
GetWindowText (hWndEditBox, Entry, TxtSize);
MessageBox (hWnd, Entry, "", MB_OK | MB_ICONINFORMATION);
delete[] Entry;
                        break; 
                    }
                }
                break;
            }
            return 0;
        } 
        break; 
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hWnd, message, wParam, lParam);
        
    }

    return 0;
}

Dani AI

Generated

Quick diagnostic and the real fix: the compiler errors mean the LVGROUP type and the grouping macros aren’t being exposed by your headers. In your posted code you defined the wrong macro (_WIN32_), and that kind of target/version macro must be set before any Windows headers so the SDK exposes newer controls. and were pointing in the right direction — set the Windows-target macro in your project (or in a small header included before everything) so the commctrl declarations for grouping are visible. (learn.microsoft.com)

Runtime and library steps you must also do for groups to work: initialize the common-controls classes for list views, link the common-controls library, and provide a manifest that requests ComCtl32 version 6.0 (grouping APIs are only available when the app uses the v6 common-controls). Call the common-controls initializer for list-view classes before creating the control. If you don’t do these things the grouping symbols may compile (once headers are fixed) but grouping won’t work at runtime. (learn.microsoft.com)

Practical checklist (fast troubleshooting):

  • Fix the macro placement/name (before includes), recompile.
  • Initialize common controls with the list-view flag before creating the control.
  • Link comctl32 (or add the equivalent linker pragma) and include a v6 manifest.
  • Do not insert groups into an empty list-view — add items (and set each item’s group id) or create items that reference the group id; groups won’t be visible otherwise. Also avoid LVS_OWNERDATA for grouping. If your Dev‑C++/MinGW headers still don’t declare LVGROUP, update the SDK/headers (or install MinGW‑w64) — only use manual fallbacks if you understand the ABI implications. (learn.microsoft.com)

If those steps are followed (correct macro, InitCommonControlsEx, manifest/comctl32, items with iGroupId) grouping will compile and display. : fix the macro name/placement first and then re-check the other items above.

Recommended Answers

All 6 Replies

where did you declare and code ListView_InsertGroup() ? It is not in any win32 api function that I know of so it has to be in your code someplace.

where did you declare and code ListView_InsertGroup() ? It is not in any win32 api function that I know of so it has to be in your code someplace.

Thanks for the reply but I think it is a win32 api function. I found it here on the microsoft website.

try defining this at the top of your program. The macro compiles ok with VC++ 2005 Express but may not with other compilers. It only works on XP and Vista.

#define _WIN32_WINNT  0x501

Thanks, but it's still not working (same error). I'm using dev c++ in case it helps.

I used Dev-C++, created a Windows program then added that macro and it compiled without a problem. Just had to include commctrl.h header file.

#include <windows.h>
#include <commctrl.h>
<snip>

ListView_InsertGroup(0,0,0);
<snip>

define the following in your souce code before including commctrl.h
#define _WIN32_WINNT 0x600
and it should work - maybe.

It's often even better to set this definition in your compiler options.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.