使用MoveToEx和LineTo为窗口创建边框

时间:2018-02-25 20:44:29

标签: c winapi graphics

所以我开始使用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;

它的样子:

running the app

1 个答案:

答案 0 :(得分:4)

我将假设,pClient指向RECT结构,通过调用GetClientRect进行初始化。 documentation有以下内容:

  

根据RECT结构的约定,返回矩形的右下角坐标是独占的。换句话说,(底部)处的像素位于矩形之外。

措辞有点差。不仅是(正确底部)的像素位于矩形之外,而是整个列位于(右侧< ; y> )以及(< x> 底部)的整行。为了解释这一事实,坐标pClient->rightpClient->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,以遵循既定惯例。

奖金阅读: