在WinAPI中的单词旁边画一条线

爱德华·卡拉克

在带有C的WinAPI中,如何在“ Counts”之类的单词旁边绘制一条这样的线?

https://drive.google.com/file/d/0B2XoQDQTCSrNbnlSVTFENDM0ZmM/view?usp=sharing

德鲁·查平

使用对话框资源


创建不包含高度为1或2像素的文本的静态文本控件,打开边框(WS_BORDER),然后将其样式设置为“静态边缘(WS_EX_STATICEDGE)”。然后在其中添加单词“ Counts”创建一个静态文本控件。然后使用CreateDialog()DialogBox()显示对话框。

IDD_DIALOG1 DIALOGEX 0, 0, 172, 63
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    LTEXT           "",IDC_STATIC,6,12,156,1,WS_BORDER,WS_EX_STATICEDGE
    LTEXT           "Counts ",IDC_STATIC,6,8,26,8
END

注意:这是Visual Studio使用对话框设计器生成的所有内容。


使用创建静态控件CreateWindow()(Jonathan Potter建议)


LRESULT OnCreate( HWND hWnd, LPCREATESTRUCT lpCreateStruct )
{
    // Get default gui font
    NONCLIENTMETRICS metrics;
    metrics.cbSize = sizeof(NONCLIENTMETRICS);
    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &metrics, NULL);
    HFONT hFont = CreateFontIndirect(&metrics.lfMessageFont);

    // Create the line
    CreateWindowEx(WS_EX_STATICEDGE, _T("STATIC"), NULL, WS_CHILD|WS_VISIBLE|WS_BORDER, 
        10, 17, 280, 1, hWnd, NULL, lpCreateStruct->hInstance, NULL);

    // Create the Counts label
    HWND hwndCounts = CreateWindow(_T("STATIC"), _T("Counts "), WS_CHILD|WS_VISIBLE,
        10, 10, 50, 26, hWnd, NULL, lpCreateStruct->hInstance, NULL);

    // Apply the default gui font
    SendMessage(hwndCounts, WM_SETFONT, (WPARAM)hFont, TRUE);

    // Cleanup the font object
    DeleteObject(hFont);
}


手动绘制WM_PAINT事件


void OnPaint( HWND hWnd )
{

    // Get the default font
    NONCLIENTMETRICS metrics;
    metrics.cbSize = sizeof(NONCLIENTMETRICS);
    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &metrics, NULL);
    HFONT hFont = CreateFontIndirect(&metrics.lfMessageFont);

    // Setup HDC
    RECT rect;
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);

    // Select the default font
    SelectObject(hdc, hFont);

    // Draw the line using the button shadow
    SelectObject(hdc, GetStockObject(DC_PEN));
    SetDCPenColor(hdc, GetSysColor(COLOR_BTNSHADOW));
    MoveToEx(hdc, 10, 17, NULL);
    LineTo(hdc, 280, 17);

    // Draw the word Counts overtop of the line
    SetRect(&rect, 10, 10, 280, 22);
    SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT));
    SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
    DrawText(hdc, TEXT("Counts "), -1, &rect, DT_NOCLIP);

    // Cleanup the font object
    DeleteObject(hFont);

    // Quit painting
    EndPaint(hWnd, &ps);
}

注意:在此示例中,我没有考虑的是默认字体的高度。您将需要为此调整代码。

这是此方法的输出的屏幕截图。

在此处输入图片说明

在您的示例中,它看起来像一条单像素线,这就是我绘制的内容,但是如果您想使该线看起来更像是“固定3D”或“降低的斜角线”(这就是组框)倾向于为其边界线绘制),然后可以使用按钮突出显示颜色在其下方绘制另一条线。

SetDCPenColor(hdc, GetSysColor(COLOR_BTNHIGHLIGHT));
MoveToEx(hdc, 10, 18, NULL);
LineTo(hdc, 280, 18);

正如Ben Voigt指出的那样,这样做可能会更好DrawEdge

RECT line;
SetRect(&line, 10, 17, 280,17);
DrawEdge(hdc, &line, EDGE_ETCHED, BF_TOP );


创建一个Group Box控件(由Hans Passant建议)


当我测试时,汉斯·帕桑特(Hans Passant)建议使用Group Box进行此操作。仍然绘制一个矩形,并且当您启用视觉样式时,很难看到它不过,如果您想尝试一下,这应该可以帮助您入门。

HWND hwndGroup = CreateWindow(_T("Button"), _T("Counts "), 
    WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 10, 10, 280, 2, hWnd, NULL, 
    lpCreateStruct->hInstance, NULL);
SendMessage(hwndGroup, WM_SETFONT, (WPARAM)hFont, TRUE);


附加说明


我想建议的其他事情是,您可以使用Visual Studio附带的Spy ++来分析您正在查看的窗口。这至少会告诉您它是一个子控件还是他们是手动绘制它。如果是子控件,您还可以看到应用于其的矩形和样式,以及许多其他信息。

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章