SetPixel在大量像素后崩溃

时间:2015-03-05 17:45:22

标签: c++ mfc

我是MFC / C ++的新手,我试图用像素填充我的窗户。我发现有一个叫做的函数:

  

SetPixel(X,Y,RGB(,,));

在我尝试在循环中使用它后,我发现此功能在一定量的像素后停止。所以它不会给我实际想要达到的结果。 这是我的代码:

void PIXELPROG::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this);

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);


        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;



        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }


        CStatic * XText = (CStatic *)GetDlgItem(IDC_X);
        CStatic * YText = (CStatic *)GetDlgItem(IDC_YWERT);

        CString XYWert;

    for (int x=0,y=0;;)
    {
        GetDC()->SetPixelV(x, y, RGB(y,x,y));
        XYWert.Format(L"%d",y);

        XText->SetWindowTextW(XYWert);

        ++x;
        if (x == 500)
        {
            ++y;
            x = 0;
        }
        if (y == 100)
        {
            break;
        }
    }
}

我也没有任何错误。它只是停下来。 我也试过

  

SetPixelV()

但两者都没有帮助。 有人有个主意吗?

2 个答案:

答案 0 :(得分:2)

来自CWnd::GetDC的文档:

  

除非设备上下文属于窗口类,否则必须调用ReleaseDC成员函数以在绘制后释放上下文。

由于您未将GetDC的返回值分配给任何内容,因此您无法拨打ReleaseDC。由于它们尚未发布,因此它们会建立起来 - 应用程序可以使用的GDI对象总数有限制,请参阅GDI Objects。一旦达到这个限制,事情会变得非常快(不要问我怎么知道)。

如果这是对WM_PAINT消息的回应,那么你不应该首先调用GetDC。您应该使用您创建的CPaintDC对象。作为一般规则,请勿在您自己的OnPaint处理程序中调用父OnPaint方法,因为您只能生成一个CPaintDC

答案 1 :(得分:0)

我找到了解决方案。您必须先初始化DC。所以不要使用GetDC()->SetPixelV(x, y, RGB(y,x,y));。在f.x CDC *pDC = GetDC();之前创建一个对象,然后使用pDC->SetPixelV(x, y, RGB(y,x,y));。这就是它!现在它就像一个魅力:-)

希望这对某人有帮助!