假设您有两个或多个脚本中包含文本的字符串.当您使用GDI函数时TextOut,(现代版本)Windows将执行"字体链接".也就是说,GDI将使用您选择的字体绘制所需的字体,并以自动选择的适当字体绘制其余字体.例如,如果您的部分文本是英文(使用罗马字母),部分文本是中文(使用CJK字符),并且您选择了Arial,则英文部分将以Arial绘制,中文部分将使用用另一种具有CJK字形的字体绘制.
我的问题是,有没有办法确定哪种字体TextOut会选择(或选择)字体链接?
我必须使用低级Uniscribe API绘制一些文本,它不会自动进行字体链接.我已经实现了自己的字体链接,但有时候我的算法会选择TextOut与同一文本不同的字体.我试图更好地理解Windows算法,但我并不擅长在视觉上识别字体(特别是在不熟悉的脚本中).
这张照片说明了我的困境:

所有字符看起来都一样大小,但是在RichEdit控件中显示时,与我使用ExtTextOut时相比,它们之间的间距是不同的。
我想呈现与RichEdit控件中相同的字符(理想情况下),以保留换行位置。
谁能告诉我:
a)哪个更正确的表示形式?
b)为什么RichEdit控件显示的文本在亚洲字符之间没有空格?
c)有什么方法可以使ExtTextOut在绘制这些字符时重现RichEdit控件的行为?
d)如果我正在使用亚洲版本的Windows,这会有什么不同吗?
也许我很乐观,但是如果有人可以提供任何提示,我将非常感兴趣。
如果有帮助:
这是我的文字:
???????????1 2 3 4 5 6 7 8 9 0
Run Code Online (Sandbox Code Playgroud)
向亚洲读者表示歉意,这只是为了测试我们的Unicode实现,我什至不知道字符取自哪种语言,更不用说它们是否意味着任何意义了
为了通过将这些字符粘贴到RichEdit控件(例如,写字板)中来查看效果,您可能会发现必须滑动它们并将字体设置为“ Arial”。
我获得的富文本为:
{\ rtf1 \ ansi \ ansicpg1252 \ deff0 \ deflang2057 {\ fonttbl {\ f0 \ fnil \ fcharset0 Arial;}} {\ colortbl; \ red0 \ green0 \ blue0;} \ viewkind4 \ uc1 \ pard \ sa200 \ sl276 \ slmult1 \ lang9 \ fs22 \ u24555?\ u30340?\ u26837?\ u33394?\ u29392?\ u29432?\ u36339?\ … 我想要一个正确的方法,我可以输出一个字符串并在创建的窗口上显示它.我一直在使用textout()函数,但由于它只绘制窗口,一旦窗口最小化并恢复,窗口上显示的数据就会消失.此外,当要显示的数据超过Window的大小时,仅显示等于窗口大小的数据,并截断其他数据.还有其他方法可以在Window上输出数据吗?
我正在使用TextOut()在TCanvas上绘制文本,但我想要更大的字体.
我能做什么?
我正在编写一段代码,通过多次调用 TextOut 在屏幕上绘制文本。这是一个 C++ Win32 应用程序,我使用的是 Visual Studio 2012。在标记拼写错误等时,如何以 Word 的方式绘制波浪下划线?
TEXTMETRIC 有一个名为 tmUnderlined 的成员,它适用于普通下划线文本,但不适用于波浪下划线。我还发现微软的 RichEdit 控件支持波浪下划线,但我也不能使用它。
当然,我可以使用简单的正弦波创建一条路径,但在我这样做之前,我想检查是否有更标准的方法来做到这一点。
Windows 程序员您好!
我是使用 winapi 进行 Windows 编程的新手。我正在阅读这本非常好的书,当我使用 DrawText 和 TextOut 在客户区显示 unicode 字符 U+5167 (?) 时遇到了问题(显示为黑框)。神秘的是,这个特殊的 unicode 字符正确显示在 windows 标题区域中。当我使用 MessageBox 显示它时,这个 unicode 字符也能正确显示。最后,我尝试显示与此 unicode 相对接近的其他 unicode 字符,如 U+5166、U+5168、U+5157 和 U+5177;
这是标准定义的此 unicode 字符的链接。 http://unicode-table.com/en/#5167
注意:我正在使用 Visual Studio 2010 使用 Unicode 编译此代码
下面是我的代码。
#include<windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("HelloWin");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = …Run Code Online (Sandbox Code Playgroud) 您好,我正在尝试在WM_COMMAND案例中打印文本,因为我需要在按下按钮后打印文本.
这是我的代码:
switch(msg)
{
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 1:
PAINTSTRUCT ps;
HDC hDC;
hDC = BeginPaint(hwnd, &ps);
{
TextOut(hDC, 10, 50, "hello", 5);
}
EndPaint(hwnd, &ps);
UpdateWindow(hwnd);
break;
}
break;
}
Run Code Online (Sandbox Code Playgroud)
可悲的是,它没有打印任何东西.谢谢,问候.
/////////////////////////编辑:
我可以在WM_COMMAND期间使用TextOut():
HDC hDC;
hDC = GetDC(hwnd);
TextOut(hDC, 10, ypos, "Warnings: ", 10);
UpdateWindow(hwnd);
Run Code Online (Sandbox Code Playgroud)
谢谢你,对不起这个问题......
我正在使用 WinAPI 创建一个 Windows 应用程序。我正在使用该函数在处理窗口消息TextOut()时向用户显示更新的文本。WM_PAINT
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc;
hdc = BeginPaint(hwnd, &ps);
SelectObject(hdc, hfDefault);
// display the user data in the window
TextOut(hdc,10,70, "Points: 0", 9);
TextOut(hdc,10,85, "Level: 0", 8);
// ...
EndPaint(hwnd, &ps);
}
break;
Run Code Online (Sandbox Code Playgroud)
如何更改调用TextOut()函数后打印的文本以及确定打印文本长度的最后一个参数?
我发现有关使用的所有内容都TextOut()与文本字体有关。
整个代码片段......
#include <windows.h>
#include <string>
#include <vector>
using namespace std;
//=========================================================
// Globals.
HWND ghMainWnd = 0;
HINSTANCE ghAppInst = 0;
struct TextObj
{
string s; // The string object.
POINT p; // The position of the string, relative to the
// upper-left corner of the client rectangle of
// the window.
};
vector<TextObj> gTextObjs;
// Step 1: Define and implement the window procedure.
LRESULT CALLBACK
WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// Objects for painting.
HDC …Run Code Online (Sandbox Code Playgroud)