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;
我该如何离开这里?我想知道:
使用 Direct Write 在 child window 中绘制文本是我唯一的选择吗?我在白框中看到了虚线,所以我认为一定有一种方法可以显示纯文本。
我这里用的是LISTBOX
,是预定义的windowsclass名字。我如何为它设置程序?还有什么预定义的 class 名称更适合我的需要?还是我必须注册一个自定义的;
我想拖动 child window,我该如何设置它以便系统为我处理拖动。
弹出一个对话框来显示文本会比弹出一个 child window 更好吗?
谢谢。
由于您使用的是 Win32 LISTBOX
控件作为子控件 window,因此您有几个选项可以在其中显示矩形的尺寸:
为 ListBox 提供 LBS_HASSTRINGS
样式,并向其中添加 1-2 项。然后,每当您更改矩形时,将 LB_DELETESTRING
和 LB_ADDSTRING
消息发送到列表框的 HWND
以根据需要显示更新后的尺寸。 ListBox 无法更新 现有项目,因此要更改现有项目的文本,您必须删除该项目,然后用新文本重新添加它。
给 ListBox 一个 LBS_OWNERDRAW...
样式,并在其中添加 1-2 个空白项。然后让 ListBox 的 parent window 处理来自 ListBox 的 WM_MEASUREITEM
和 WM_DRAWITEM
通知,以根据需要在项目中显示矩形的当前尺寸.每当更改矩形时,在 ListBox 的 HWND
上调用 InvalidateRect()
以触发重绘。
当我右击任何地方时,此应用程序创建一个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;
我该如何离开这里?我想知道:
使用 Direct Write 在 child window 中绘制文本是我唯一的选择吗?我在白框中看到了虚线,所以我认为一定有一种方法可以显示纯文本。
我这里用的是
LISTBOX
,是预定义的windowsclass名字。我如何为它设置程序?还有什么预定义的 class 名称更适合我的需要?还是我必须注册一个自定义的;我想拖动 child window,我该如何设置它以便系统为我处理拖动。
弹出一个对话框来显示文本会比弹出一个 child window 更好吗?
谢谢。
由于您使用的是 Win32 LISTBOX
控件作为子控件 window,因此您有几个选项可以在其中显示矩形的尺寸:
为 ListBox 提供
LBS_HASSTRINGS
样式,并向其中添加 1-2 项。然后,每当您更改矩形时,将LB_DELETESTRING
和LB_ADDSTRING
消息发送到列表框的HWND
以根据需要显示更新后的尺寸。 ListBox 无法更新 现有项目,因此要更改现有项目的文本,您必须删除该项目,然后用新文本重新添加它。给 ListBox 一个
LBS_OWNERDRAW...
样式,并在其中添加 1-2 个空白项。然后让 ListBox 的 parent window 处理来自 ListBox 的WM_MEASUREITEM
和WM_DRAWITEM
通知,以根据需要在项目中显示矩形的当前尺寸.每当更改矩形时,在 ListBox 的HWND
上调用InvalidateRect()
以触发重绘。