annotate foosdk/sdk/libPPUI/windowLifetime.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "ImplementOnFinalMessage.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "win32_op.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <functional>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 namespace PP {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! Create a new window object - obj_t derived from CWindowImpl<> etc, with automatic lifetime management, \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! OnFinalMessage() is automatically overridden to delete the window object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! Does NOT create the window itself, it's up to you to call Create() or SubclassWindow() with the returned object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 template<typename obj_t, typename ... arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 obj_t* newWindowObj(arg_t && ... arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 return new ImplementOnFinalMessage<obj_t>(std::forward<arg_t>(arg) ...);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! Subclass HWND with window class object obj_t deriving from CWindowImpl<> etc, with automatic lifetime management of the object, \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 //! OnFinalMessage() is automatically overridden to delete the window subclass object.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 template<typename obj_t, typename ... arg_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 obj_t* subclassThisWindow(HWND wnd, arg_t && ... arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 PFC_ASSERT( wnd != NULL );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 auto ret = newWindowObj<obj_t>(std::forward<arg_t>(arg) ...);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 WIN32_OP_D(ret->SubclassWindow(wnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 //! Creates a new window object, of ctrl_t typem with automatic lifetime management,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //! and replaces an existing control in a dialog.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 template<typename ctrl_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 ctrl_t * replaceDialogCtrl(CWindow wndDialog, UINT replaceControlID) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 CWindow wndReplace = wndDialog.GetDlgItem(replaceControlID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 ATLASSERT(wndReplace != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 CRect rc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 CWindow wndPrev = wndDialog.GetNextDlgTabItem(wndReplace, TRUE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 WIN32_OP_D(wndReplace.GetWindowRect(&rc));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 WIN32_OP_D(wndDialog.ScreenToClient(rc));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 CString text;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 wndReplace.GetWindowText(text);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 WIN32_OP_D(wndReplace.DestroyWindow());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 auto ctrl = newWindowObj<ctrl_t>();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 WIN32_OP_D(ctrl->Create(wndDialog, &rc, text, 0, 0, replaceControlID));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 if (wndPrev != NULL) ctrl->SetWindowPos(wndPrev, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 ctrl->SetFont(wndDialog.GetFont());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 return ctrl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }