如何使用DrawText()在已知窗口句柄的情况下写入文本?

11

我想知道如何使用Windows API在特定窗口的给定位置编写文本。

例如,如果文本要写入的窗口内坐标为(x,y) = (40,10),那么我需要做什么才能在该位置编写一行文本到该窗口中?

2个回答

14

假设你的窗口名称为"hwnd",并且你想要在该窗口的x,y坐标位置写入文本,假设这个文本存储在"message"变量中,例如:

LPCWSTR message=L"My First Window";

RECT rect;
HDC wdc = GetWindowDC(hwnd);
GetClientRect (bgHandle, &rect) ;
SetTextColor(wdc, 0x00000000);
SetBkMode(wdc,TRANSPARENT);
rect.left=40;
rect.top=10;
DrawText( wdc, message, -1, &rect, DT_SINGLELINE | DT_NOCLIP  ) ;
DeleteDC(wdc);  

就是这样,记住这只是一个例子。


3
难道不应该是 GetDC(hwnd) 和 ReleaseDC(hwnd, wdc) 吗?至少在我的情况下,只有这样才有效。 - masterxilo
是的,你也可以那样做。 - Abhineet
2
在这个例子中,bgHandle是什么? - ST3
@user2623967:这里的“bgHandle”是主窗口即“hwnd”的子窗口。它正在检索子窗口即“bgHandle”将显示文本的坐标。 - Abhineet
3
不!当你使用 "get" 时,你需要 "release",例如 GetWindowDC() -> ReleaseDC(). 当你使用 "create" 时,你需要 "delete",例如 CreateCompatibleDC() -> *DeleteDC()*。 - γηράσκω δ' αεί πολλά διδασκόμε

4

我希望这是一个更完整的答案...

void OnPaint(HWND hWnd)
{
    RECT  rect;
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);

    GetClientRect(hWnd, &rect);
    SetTextColor(hdc, RGB(0xFF, 0x00, 0x00));
    SetBkMode(hdc, TRANSPARENT);
    rect.left = 40;
    rect.top = 10;
    DrawText(hdc, L"Hello World!", -1, &rect, DT_SINGLELINE | DT_NOCLIP);
    SelectObject(hdc, oldPen);
    DeleteObject(hPen);
    EndPaint(hWnd, &ps);
}

这将在WndProc的WM_PAINT消息中被调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接