Thought I'd ask Gemini a similar question. Larger example, includes where the example came from, missing #define INCL_WIN.
Actually, looking at the source, it is old MS Programming library v1.3, 16 bit API?
#include <os2.h>
/* Window class structure */
static HAB hab;
static HWND hwndFrame;
/* Window procedure */
MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) {
switch (msg) {
case WM_PAINT: {
HPS hps;
RECTL rc;
WinQueryWindowRect(hwnd, &rc);
hps = WinGetPS(hwnd);
GpiSetColor(hps, SYSCLR_BLUE);
GpiFillRect(hps, &rc);
WinReleasePS(hps);
break;
}
case WM_DESTROY:
WinPostMsg(hwndFrame, WM_QUIT, 0, 0);
break;
default:
return WinDefWindowProc(hwnd, msg, mp1, mp2);
}
return 0;
}
/* Frame window procedure */
MRESULT EXPENTRY FrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) {
switch (msg) {
case WM_COMMAND:
switch (SHORT1FROMMP(mp1)) {
case IDM_QUIT:
WinPostMsg(hwnd, WM_CLOSE, 0, 0);
break;
}
break;
case WM_CLOSE:
WinDestroyWindow(hwnd);
break;
default:
return WinDefWindowProc(hwnd, msg, mp1, mp2);
}
return 0;
}
int main(VOID) {
HAB hab;
HMQ hmq;
HWND hwndFrame, hwndClient;
QMSG qmsg;
/* Initialize Presentation Manager */
hab = WinInitialize(0);
hmq = WinCreateMsgQueue(hab, 0);
/* Register window classes */
WinRegisterClass(hab, "MyClientClass", ClientWndProc, CS_SIZEREDRAW, 0);
WinRegisterClass(hab, "MyFrameClass", FrameWndProc, CS_SIZEREDRAW, 0);
/* Create frame window */
hwndFrame = WinCreateWindow(
HWND_DESKTOP,
"My Frame Window",
"MyFrameClass",
WS_VISIBLE | WS_BORDER | FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX,
0, 0, 200, 100,
HWND_DESKTOP,
HWND_TOP,
hab,
NULL,
NULL
);
/* Create client window */
hwndClient = WinCreateWindow(
hwndFrame,
"My Client Window",
"MyClientClass",
WS_VISIBLE,
0, 0, 200, 100,
hwndFrame,
HWND_TOP,
hab,
NULL,
NULL
);
/* Message loop */
while (WinGetMsg(hab, &qmsg, NULL, 0, 0)) {
WinDispatchMsg(hab, &qmsg);
}
/* Clean up */
WinDestroyWindow(hwndFrame);
WinDestroyMsgQueue(hmq);
WinTerminate(hab);
return 0;
}
Explanation:
Include Header:
#include <os2.h>: Includes the necessary header file for OS/2 Presentation Manager functions.
Global Variables:
hab: An anchor block handle, used to identify the application to Presentation Manager.
hwndFrame: A handle to the frame window.
Window Procedures:
ClientWndProc: Handles messages for the client window.
WM_PAINT: Fills the client area with blue color.
WM_DESTROY: Posts a quit message to the frame window.
FrameWndProc: Handles messages for the frame window.
WM_COMMAND: Processes menu commands (not implemented in this example).
WM_CLOSE: Destroys the frame window.
Main Function:
Initialization:
WinInitialize: Initializes Presentation Manager and returns an anchor block handle.
WinCreateMsgQueue: Creates a message queue for the application.
Window Registration:
WinRegisterClass: Registers the window classes for the client and frame windows.
Window Creation:
WinCreateWindow: Creates the frame and client windows with the specified attributes.
Message Loop:
WinGetMsg: Retrieves messages from the message queue.
WinDispatchMsg: Dispatches messages to the appropriate window procedures.
Cleanup:
WinDestroyWindow: Destroys the frame window.
WinDestroyMsgQueue: Destroys the message queue.
WinTerminate: Terminates Presentation Manager.
Note:
This is a basic example and can be extended to include more features such as menus, controls, and more complex window interactions.
You'll need to use an OS/2 development environment (such as IBM Visual Age for C++) to compile and run this code.
This code demonstrates the fundamental concepts of creating and managing windows in the OS/2 Presentation Manager environment.
This example provides a starting point for creating OS/2 Presentation Manager applications. You can further explore the Presentation Manager API to implement more advanced features and create sophisticated graphical user interfaces.
https://github.com/spacerace/MPL