C++如何实时显示childwindow中的文字

C++ how to display text in child window at real time

当我右击任何地方时,此应用程序创建一个child window(即白框),并在再次右击后销毁child window。我已经实现了通过 Direct 2D 扩展和收缩红色矩形的机制。我希望 child window 在我对其进行更改时实时显示矩形的宽度和高度。我根本不与 child window 交互:它不需要用于关闭和其他东西的“x”按钮;它只是打印出几行数据。

这是我的主要 window 程序中的内容:

case WM_RBUTTONUP:
            {
                DemoApp *pDemoApp = reinterpret_cast<DemoApp *>(static_cast<LONG_PTR>(
                    ::GetWindowLongPtrW(hwnd, GWLP_USERDATA)));
                pDemoApp->showTextBox = !pDemoApp->showTextBox;  //showTextBox is a boolean
                if (pDemoApp->showTextBox) {
                    POINTS cursor = MAKEPOINTS(lParam);
                    pDemoApp->child_hwnd = CreateWindowEx(
                        WS_EX_TOPMOST,
                        "LISTBOX",
                        "I dont need a title here",
                        WS_CHILDWINDOW,
                        cursor.x,
                        cursor.y,
                        100,
                        200,
                        pDemoApp->main_hwnd,
                        NULL,
                        HINST_THISCOMPONENT,
                        pDemoApp
                    );
                    ShowWindow(pDemoApp->child_hwnd, SW_SHOWNORMAL);
                    UpdateWindow(pDemoApp->child_hwnd);
                }
                else {
                    DestroyWindow(pDemoApp->child_hwnd);
                }
            }
            break;

我该如何离开这里?我想知道:

  1. 使用 Direct Write 在 child window 中绘制文本是我唯一的选择吗?我在白框中看到了虚线,所以我认为一定有一种方法可以显示纯文本。

  2. 我这里用的是LISTBOX,是预定义的windowsclass名字。我如何为它设置程序?还有什么预定义的 class 名称更适合我的需要?还是我必须注册一个自定义的;

  3. 我想拖动 child window,我该如何设置它以便系统为我处理拖动。

  4. 弹出一个对话框来显示文本会比弹出一个 child window 更好吗?

谢谢。

由于您使用的是 Win32 LISTBOX 控件作为子控件 window,因此您有几个选项可以在其中显示矩形的尺寸:

  • 为 ListBox 提供 LBS_HASSTRINGS 样式,并向其中添加 1-2 项。然后,每当您更改矩形时,将 LB_DELETESTRINGLB_ADDSTRING 消息发送到列表框的 HWND 以根据需要显示更新后的尺寸。 ListBox 无法更新 现有项目,因此要更改现有项目的文本,您必须删除该项目,然后用新文本重新添加它。

  • 给 ListBox 一个 LBS_OWNERDRAW... 样式,并在其中添加 1-2 个空白项。然后让 ListBox 的 parent window 处理来自 ListBox 的 WM_MEASUREITEMWM_DRAWITEM 通知,以根据需要在项目中显示矩形的当前尺寸.每当更改矩形时,在 ListBox 的 HWND 上调用 InvalidateRect() 以触发重绘。