The main window in most applications is a top-level frame window. An application creates a top-level frame window by specifying the handle of the desktop window, or HWND_DESKTOP, as the hwndParent parameter in a call to the WinCreateStdWindow function.
The following figure shows the main() function for a simple PM application. This function initializes the application, creates a message queue, and registers the window class for the client window before creating a top-level frame window.
#define IDR_RESOURCES 1 MRESULT EXPENTRY ClientWndProc(HWND, ULONG, MPARAM, MPARAM); int main(VOID) { HWND hwndFrame; HWND hwndClient; HMQ hmq; QMSG qmsg; HAB hab; /* Set the frame-window creation flags. */ ULONG flFrameFlags = FCF_TITLEBAR | /* Title bar */ FCF_SIZEBORDER | /* Size border */ FCF_MINMAX | /* Minimize and maximize buttons. */ FCF_SYSMENU | /* System menu */ FCF_SHELLPOSITION | /* System-default size and position */ FCF_TASKLIST ; /* Add name to Task List. */ /* Initialize the application for PM */ hab = WinInitialize(0); /* Create the application message queue. */ hmq = WinCreateMsgQueue(hab, 0); /* Register the class for the client window. */ WinRegisterClass( hab, /* Anchor block handle */ "MyPrivateClass", /* Name of class being registered */ (PFNWP)ClientWndProc, /* Window procedure for class */ CS_SIZEREDRAW | /* Class style */ CS_HITTEST, /* Class style */ 0); /* Extra bytes to reserve */ /* Create a top-level frame window with a client window */ /* that belongs to the window class "MyPrivateClass". */ hwndFrame = WinCreateStdWindow( HWND_DESKTOP, /* Parent is desktop window. */ WS_VISIBLE, /* Make frame window visible. */ &flFrameFlags, /* Frame controls */ "MyPrivateClass", /* Window class for client */ NULL, /* No window title */ WS_VISIBLE, /* Make client window visible . */ (HMODULE) 0, /* Resources in application module */ IDR_RESOURCES, /* Resource identifier */ NULL); /* Pointer to client window handle */ /* Start the main message loop. Get messages from the */ /* queue and dispatch them to the appropriate windows. */ while (WinGetMsg(hab, &qmsg, 0, 0, 0)) WinDispatchMsg(hab, &qmsg); /* Main loop has terminated. Destroy all windows and the */ /* message queue; then terminate the application. */ WinDestroyWindow(hwndFrame); WinDestroyMsgQueue(hmq); WinTerminate(hab); return 0; }