List boxes are WC_LISTBOX class windows and are predefined by the system. Applications can create list boxes by calling WinCreateWindow, using WC_LISTBOX as the window-class parameter.
A list box passes notification messages to its owner window, so an application uses its client window, rather than the frame window, as the owner of the list. The client-window procedure receives the messages sent from the list box. For example, to create a list box that completely fills the client area of a frame window, an application would make the client window the owner and parent of the list-box window, and make the list-box window the same size as the client window. This is shown in the following code fragment.
#define ID_LISTWINDOW 250 HWND hwndClient,hwndList; RECTL rcl; /* How big is the client window? */ WinQueryWindowRect(hwndClient, &rcl); /* Make a list-box window. */ hwndList = WinCreateWindow(hwndClient, /* Parent */ WC_LISTBOX, /* Class */ "", /* Name */ WS_VISIBLE | LS_NOADJUSTPOS, /* Style */ 0, 0, /* x, y */ rcl.xRight, rcl.yTop, /* cx, cy */ hwndClient, /* Owner */ HWND_TOP, /* Behind */ ID_LISTWINDOW, /* ID */ NULL, /* Control data */ NULL); /* parameters */
Because the list box draws its own border, and a frame-window border already surrounds the client area of a frame window due to the adjacent frame controls, the effect is a double-thick border around the list box. You can change this effect by calling WinInflateRect to overlap the list-box border with the surrounding frame-window border, resulting in only one list-box border.
Notice that the code specifies the list-box window style LS_NOADJUSTPOS. This ensures that the list box is created exactly the specified size. If the LS_NOADJUSTPOS style is not specified, the list-box height is rounded down, if necessary, to make it a multiple of the item height. Enabling a list box to adjust its height automatically is useful for preventing partial items being displayed at the bottom of a list box.