【问题标题】:c - win32 api rectangle is not drawn if hdc passed to methodc - 如果 hdc 传递给方法,则不会绘制 win32 api 矩形
【发布时间】:2011-02-12 08:10:10
【问题描述】:

我最近一直在玩 C 和 win32,以下让我犹豫不决:

     case WM_PAINT:
         g_crntRect = (RECT*) malloc(sizeof(RECT));
         GetWindowRect(hwnd, g_crntRect);

         hpen = CreatePen(PS_SOLID, 1, RGB(255,25,5));

         hdc = BeginPaint (hwnd, &ps) ;

         oldPen = SelectObject(hdc, hpen);
         drawRects(hwnd, hdc);
         //Rectangle(hdc, 0, 0, 840, 525);

         SelectObject(hdc,oldPen);
         DeleteObject(hpen);

         EndPaint (hwnd, &ps) ;
         return 0 ;

因此,如果我在上面调用我自己的方法来绘制矩形,它不会绘制任何内容,但是在我上面评论的 WM_PAINT 中绘制矩形的调用成功而没有问题。

这是我的方法:

BOOL drawRects(HWND hwnd, HDC hdc)
{

char buffer[50];
BOOL res = FALSE;
RECT tempRect = {0};
char quadStr[6] = "";
int i = 0;
quadStr[i]='*';
OutputDebugString("Going to draw");
for (i = 1; i <= 4; i++)
{
    //get rect for each quadrent from the parent
    OutputDebugString("inside for");
    getRect(g_crntRect, &tempRect, i);

    OutputDebugString("got rectr");;
    res = Rectangle(hdc, tempRect.right, tempRect.top, tempRect.right, tempRect.bottom);

    if (res == FALSE)
    {
        OutputDebugString("false");;
        sprintf(buffer, "Error: %ld", GetLastError());
        OutputDebugString(buffer);
    }
    else
    {
        OutputDebugString("drew");;
    }

    quadStr[i]='*';
    printRect(quadStr, &tempRect);
}

return TRUE;

}

查看调试输出,一切似乎都很好。正确的值被传递到 Rectangle 方法中。但是,我想知道我是否没有正确通过 HDC?

有什么想法吗?

【问题讨论】:

  • 当您在 wm_paint 处理程序之外调用 drawRects 时,您不会显示 HDC 的来源。
  • 目前还不清楚为什么没有定义 STRICT。一定要尝试使用项目模板来开始一个项目,你不应该处理编译器没有捕捉到这些编程错误。
  • @Larry 我不在 wm_paint 之外调用 drawRects,而是在内部调用它。
  • @pug,对不起,我误解了这个问题,我以为你是在绘图处理程序之外调用 drawRects。
  • 下一个问题:从drawRects内部调用Rectangle的结果是什么?

标签: c winapi


【解决方案1】:

看起来像一个简单的错字。在您的方法中,您有:

res = Rectangle(hdc, tempRect.right, tempRect.top, tempRect.right, tempRect.bottom);

第二个参数应该是tempRect.left 而不是tempRect.right。您正在尝试绘制一个宽度为零的矩形。

【讨论】:

  • 哦,伙计……就是这样……我已经用头撞墙这么久了。谢谢!
【解决方案2】:

改变

BOOL drawRects(HWND hwnd, HDC* hdc)

BOOL drawRects(HWND hwnd, HDC hdc)

Windows 句柄实际上是一个指针,因此无需通过引用传递它。但如果你这样做,你需要将你的函数称为drawRects(hwnd, &amp;hdc);

【讨论】:

  • 我尝试通过引用传递它,因为它不能正常工作。其实这两种方法我都试过了。
【解决方案3】:

一般来说,您不会在 WM_PAINT 处理程序之外进行绘制。如果要更新窗口,只需在要重绘的区域上调用 InvalidateRect 即可。这将触发 WM_PAINT 调用,然后重新绘制窗口。

是否有理由需要在绘制处理程序之外绘制窗口?

【讨论】:

  • 我在 WM_PAINT 内部作画,但只是调用一个函数而不是让处理程序变得笨拙。
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2021-12-05
  • 2012-05-08
相关资源
最近更新 更多