我是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()
但两者都没有帮助。 有人有个主意吗?
答案 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));
。这就是它!现在它就像一个魅力:-)
希望这对某人有帮助!