2016-03-15 42 views
1

Line joins笔加入不应用于形状

形状画成与Polyline()功能的各个角落风格。 相关的代码是在这里:

void DoDrawing(HWND hwnd) { 

    LOGBRUSH brush; 
    COLORREF col = RGB(0, 0, 0); 
    DWORD pen_style = PS_SOLID | PS_JOIN_MITER | PS_GEOMETRIC; 

    brush.lbStyle = BS_SOLID; 
    brush.lbColor = col; 
    brush.lbHatch = 0;  

    PAINTSTRUCT ps; 

    HDC hdc = BeginPaint(hwnd, &ps); 

    HPEN hPen1 = ExtCreatePen(pen_style, 8, &brush, 0, NULL); 
    HPEN holdPen = SelectObject(hdc, hPen1); 

    POINT points[5] = { { 10, 30 }, { 100, 30 }, { 100, 100 }, { 10, 100 }, {10, 30}}; 
    Polyline(hdc, points, 5); 
    DeleteObject(hPen1); 

    SelectObject(hdc, holdPen); 

    EndPaint(hwnd, &ps); 
} 

PS_JOIN_MITER是在三个角,但不是在左上角应用。在那个角落使用默认的PS_JOIN_ROUND。如何解决这个问题?

下面是一个完整的工作示例:

#include <windows.h> 

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
void DoDrawing(HWND); 

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    PWSTR lpCmdLine, int nCmdShow) { 

    MSG msg; 
    WNDCLASSW wc = {0}; 

    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpszClassName = L"Pens"; 
    wc.hInstance  = hInstance; 
    wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
    wc.lpfnWndProc = WndProc; 
    wc.hCursor  = LoadCursor(0, IDC_ARROW); 

    RegisterClassW(&wc); 
    CreateWindowW(wc.lpszClassName, L"Line joins", 
      WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
      100, 100, 250, 180, NULL, NULL, hInstance, NULL); 

    while (GetMessage(&msg, NULL, 0, 0)) { 

     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return (int) msg.wParam; 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, 
    WPARAM wParam, LPARAM lParam) { 

    switch(msg) { 

     case WM_PAINT: 

      DoDrawing(hwnd); 
      break; 

     case WM_DESTROY: 

      PostQuitMessage(0); 
      return 0; 
    } 

    return DefWindowProcW(hwnd, msg, wParam, lParam); 
} 

void DoDrawing(HWND hwnd) { 

    LOGBRUSH brush; 
    COLORREF col = RGB(0, 0, 0); 
    DWORD pen_style = PS_SOLID | PS_JOIN_MITER | PS_GEOMETRIC; 

    brush.lbStyle = BS_SOLID; 
    brush.lbColor = col; 
    brush.lbHatch = 0;  

    PAINTSTRUCT ps; 

    HDC hdc = BeginPaint(hwnd, &ps); 

    HPEN hPen1 = ExtCreatePen(pen_style, 8, &brush, 0, NULL); 
    HPEN holdPen = SelectObject(hdc, hPen1); 

    POINT points[5] = { { 10, 30 }, { 100, 30 }, { 100, 100 }, { 10, 100 }, {10, 30}}; 
    Polyline(hdc, points, 5); 
    DeleteObject(hPen1); 

    SelectObject(hdc, holdPen); 

    EndPaint(hwnd, &ps); 
} 
+0

GDI中的圆角矩形......如果你像我一样关注像素完美,那么这只是你的第一个问题,相信我。 (看看我的一些问题......我也问过一些关于矩形舍入的问题,但是来自C#) – series0ne

+0

它应该是线路如何工作的教育示例。绘制三角形时会发生同样的情况 - 连接样式不适用于第一个角落。 –

+0

你确定这是第一个角落还是最后一个角落?这是一个重要的问题(它与图形关闭行为有关)。 – andlabs

回答

1

Polyline不加入第一个和最后一个点。的Polyline

而且

使用Polygon(hdc, points, 5)代替,删除现有笔之前到DC选择oldPen,顺序如下:

SelectObject(hdc, holdPen); 
DeleteObject(hPen1); 

(尽管Windows会原谅你,如果你不这样做它以正确的顺序)

相关问题