如何将格式字符串打印到窗口中

How to print format string into a window?

本文关键字:窗口 打印 字符串 格式      更新时间:2023-10-16

窗口句柄HWND hwnd已经可用,现在我想打印一个格式字符串进入这个hwnd描述的窗口。我不太熟悉Windows API,非常感谢您的帮助。

例如:

num = 23;
printFunction(hwnd, "number is %d", num);

是否有一个函数来解决这个问题?谢谢你!

UPDATE:我在使用IDA Pro SDK时遇到这个问题。

创建一个示例子窗口:

HWND hwnd = NULL;
TForm *form = create_tform("Sample subwindow", &hwnd);

我使用SendMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)"hello world");打印hello world字符串在子窗口,但我应该怎么做,如果我想打印格式字符串到这个子窗口?

没那么简单。

首先你需要设置你的窗口过程来处理WM_PAINT。这将给你一个HDC(设备上下文)。有了这个HDC,你可以调用DrawText来绘制你的字符串。您很可能需要使用sprintf来形成字符串。

sprintf(myString, "number is %d", num);
SendMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)myString);

如果您已经有了可以发送文本的子窗口,那么您可以使用类似于以下内容:

#include <strsafe.h>
#define MAXSTRING 1024
CHAR string[MAXSTRING];
StringCchPrintf(string, ARRAYSIZE(string), "number is %d", num);
SendMessage(hwnd, WM_SETTEXT, NULL, (LPARAM)string);

使用StringCchPrintf在中间字符串中格式化文本,然后使用WM_SETTEXT将该字符串发送到子窗口以显示。没有一个函数可以一次完成这两件事,但是如果你发现自己经常这样做,也没有什么可以阻止你编写一个辅助函数来包装这两件事。

(我在这里使用了StringCchPrintf,这是一个Windows API,你也可以使用c风格的sprintf(),就像printf()一样,但它需要一个额外的字符串作为参数。使用StringCchPrintf的优点是,它使用一个额外的长度参数来避免缓冲区溢出,这可能导致安全问题;如果你打算做任何"现实世界",了解这些"安全"的版本是一个很好的实践。

,

快速说明这与另一个答案的关系:在Windows中,通常有两种基本方法可以在屏幕上显示文本。最简单的方法是创建一堆标签或文本控件,让它们为你绘图,并将文本发送给它们。如果您来自基于unix风格的控制台环境(printf等),这是最简单的入门方法。这似乎是您已经使用的方法,也是我在上面使用的方法。另一种方法是自己画文本。这是相当复杂的一点,因为你需要创建自己的控件,并处理来自Windows的各种请求,这样你的控件就会在Windows请求时重新绘制自己-使用DrawText或其他api。这就是这些控件实际上代表你做的事情。这使您可以完全控制文本位置、字体、颜色等,但如果您只想为一个简单的applet显示一些状态或结果文本,则有些多余。任何一本Windows编程的书都有很多关于这种方法的细节。