gpt4 book ai didi

c - 使用 MoveToEx 和 LineTo 为窗口制作边框

转载 作者:太空宇宙 更新时间:2023-11-04 05:49:05 25 4
gpt4 key购买 nike

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

最佳答案

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

In conformance with conventions for the RECT structure, the bottom-right coordinates of the returned rectangle are exclusive. In other words, the pixel at (right, bottom) lies immediately outside the rectangle.

这话说得有点不对劲。不仅仅是 (right, bottom) 处的像素位于矩形之外,而是 (right, y>) 和 ( , bottom) 处的整行。考虑到坐标 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 的第五次调用没有意义。它已被删除。
  • 在调用 SelectObject 时,hDc 的间接寻址无效(假定它的类型为 HDC)。
  • 在退出时正确恢复设备上下文。
  • 正确删除代码创建和拥有的笔。
  • 调整了返回值的类型和计算。仅当所有 调用成功时,它才应返回TRUE
  • 已将 pPen 重命名为 hPen 以遵循既定惯例。

额外阅读:

关于c - 使用 MoveToEx 和 LineTo 为窗口制作边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48978266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com