簡體   English   中英

在WinAPI中的單詞旁邊畫一條線

[英]Draw a line next to word in 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()創建靜態控件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 Control (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 ++來分析你正在看的窗口。 這至少會告訴你它是否是一個子控件,或者是否是手動繪制它。 如果它是一個子控件,您還可以看到應用於它的矩形和樣式,以及許多其他信息。

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM