使用C在窗口中显示字符串输出(在WIN32 API中)

Ays*_*yse 5 c windows winapi textout

我想要一个正确的方法,我可以输出一个字符串并在创建的窗口上显示它.我一直在使用textout()函数,但由于它只绘制窗口,一旦窗口最小化并恢复,窗口上显示的数据就会消失.此外,当要显示的数据超过Window的大小时,仅显示等于窗口大小的数据,并截断其他数据.还有其他方法可以在Window上输出数据吗?

Dea*_*nna 10

您可以在窗口上放置一个Static或一个Edit控件(标签和文本框)来显示数据.

在以下期间拨打其中一个WM_CREATE:

HWND hWndExample = CreateWindow("STATIC", "Text Goes Here", WS_VISIBLE | WS_CHILD | SS_LEFT, 10,10,100,100, hWnd, NULL, hInstance, NULL);
Run Code Online (Sandbox Code Playgroud)

要么

HWND hWndExample = CreateWindow("EDIT", "Text Goes Here", WS_VISIBLE | WS_CHILD | ES_LEFT, 10,10,100,100, hWnd, NULL, hInstance, NULL);
Run Code Online (Sandbox Code Playgroud)

如果您使用,Edit那么用户也可以滚动,复制和粘贴文本.

在这两种情况下,都可以使用SetWindowText()以下方式更新文本:

SetWindowText(hWndExample, TEXT("Control string"));
Run Code Online (Sandbox Code Playgroud)

(Daboyzuk的Curtosy)

  • +1,我什至没有考虑到OP可能需要控件,正如提到的TextOut,我直接跳到绘制文本。这很可能就是OP实际要求的。 (2认同)
  • 这应该就是一个例子:`HWND St​​aticExample = CreateWindowEx("STATIC","Text Goes Here",WS_VISIBLE | WS_CHILD | SS_LEFT,10,10,100,100,hWnd,NULL,hInstance,NULL);`for static,和`HWND EditExample = CreateWindowEx("EDIT","Text Goes Here",WS_VISIBLE | WS_CHILD | ES_LEFT,10,10,100,100,hWnd,NULL,hInstance,NULL);`for edit (2认同)

Dab*_*zuk 5

TextOut应该可以正常工作,如果在WM_PAINT中完成,则应该每次都绘制它.(包括最小化和重新调整大小)

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_PAINT:
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

            TextOut(hdc, 10, 10, TEXT("Text Out String"),strlen("Text Out String"));

            EndPaint(hWnd, &ps);
            ReleaseDC(hWnd, hdc);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您可能也对DrawText感兴趣

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
        case WM_PAINT:
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hWnd, &ps);

            RECT rec;
            //       SetRect(rect, x ,y ,width, height)
            SetRect(&rec,10,10,100,100);
            //       DrawText(HDC, text, text length, drawing area, parameters "DT_XXX")
            DrawText(hdc, TEXT("Text Out String"),strlen("Text Out String"), &rec, DT_TOP|DT_LEFT);

            EndPaint(hWnd, &ps);
            ReleaseDC(hWnd, hdc);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将在给定的矩形中将文本绘制到窗口,


Draw Text将在给定的rect内部自动换行.
如果您想将整个窗口作为绘图区域,则可以使用GetClientRect(hWnd, &rec);而不是SetRect(&rec,10,10,100,100);

  • 是的,在开关内部编码很可怕,但我只想尝试一个最小的例子.事实上,正如你所指出的那样,我设法简化了返回值=)编辑得太小了!如果文本超出矩形,DrawText将包装文本,但我会添加一个脚注,谢谢你. (2认同)