所以我开始使用win32图形,因为我想在我正在制作的应用程序的UI上工作。我基本上想在它上画一个边框,但由于某种原因,这条线只画在顶部和左边。如果有人知道该怎么做,那就会有所帮助。
代码:
bool bRet = false;
HPEN pPen = CreatePen(PS_SOLID, Thickness, pColor);
HGDIOBJ hObj = SelectObject(*hDc, pPen);
bRet = MoveToEx(*hDc, pClient->left, pClient->top, 0);
bRet = LineTo(*hDc, pClient->right, pClient->top);
bRet = LineTo(*hDc, pClient->right, pClient->bottom);
bRet = LineTo(*hDc, pClient->left, pClient->bottom);
bRet = LineTo(*hDc, pClient->left, pClient->top);
bRet = LineTo(*hDc, pClient->bottom, pClient->top);
DeleteObject(hObj);
return bRet;
它的样子:
答案 0 :(得分:4)
我将假设,pClient
指向RECT
结构,通过调用GetClientRect
进行初始化。 documentation有以下内容:
根据
RECT
结构的约定,返回矩形的右下角坐标是独占的。换句话说,(右,底部)处的像素位于矩形之外。
措辞有点差。不仅是(正确,底部)的像素位于矩形之外,而是整个列位于(右侧,< ; y> )以及(< x> ,底部)的整行。为了解释这一事实,坐标pClient->right
和pClient->bottom
处的像素不是矩形的一部分,在绘制时从每个像素中减去1:
BOOL bRet = FALSE;
HPEN hPen = CreatePen(PS_SOLID, Thickness, pColor);
bRet = hPen != NULL;
HPEN hOldPen = (HPEN)SelectObject(hDc, hPen);
bRet &= MoveToEx(hDc, pClient->left, pClient->top, 0);
bRet &= LineTo(hDc, pClient->right - 1, pClient->top);
bRet &= LineTo(hDc, pClient->right - 1, pClient->bottom - 1);
bRet &= LineTo(hDc, pClient->left, pClient->bottom - 1);
bRet &= LineTo(hDc, pClient->left, pClient->top);
SelectObject(hDc, hOldPen);
DeleteObject(hPen);
return bRet;
请注意代码的以下其他修复:
LineTo
的第五次电话没有意义。它已被删除。hDc
调用中HDC
的间接无效(假设其类型为SelectObject
)。TRUE
。pPen
重命名为hPen
,以遵循既定惯例。奖金阅读: