Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调整大小后重新绘制win32_C++_Winapi - Fatal编程技术网

C++ 调整大小后重新绘制win32

C++ 调整大小后重新绘制win32,c++,winapi,C++,Winapi,我还有下一个问题 我有基类“Shape”,它包含虚拟函数draw(HWND),我有子类“Line”,它包含相同的函数draw(HWND) 当我在WM_MOUSEMOVE中画线时,一切正常,但当我最小化或更改窗口大小时,我的线消失了 我需要做什么 我有一个指向基类的向量 向量ff; 形状*f case WM_LBUTTONDOWN: { IsDrawing = TRUE; StartX = LOWORD(lParam); StartY = HIWORD(lParam);

我还有下一个问题

我有基类“Shape”,它包含虚拟函数
draw(HWND)
,我有子类“Line”,它包含相同的函数
draw(HWND)

当我在
WM_MOUSEMOVE
中画线时,一切正常,但当我最小化或更改窗口大小时,我的线消失了

我需要做什么

我有一个指向基类的向量 向量ff; 形状*f

case WM_LBUTTONDOWN:
{

    IsDrawing = TRUE;

    StartX = LOWORD(lParam);
    StartY = HIWORD(lParam);
    EndX = LOWORD(lParam);
    EndY = HIWORD(lParam);

    switch(iShape)
    {
    case LINE:
            f=new Line();
        break;
    case  RECTANGLE:
        f=new MyRectangle();
        break;
    }

    f->SetBrushWidth(5);
    f->SetColor(RGB(255,0,0));
    f->SetStartCoord(StartX,StartY);
    f->SetEndCoord(EndX,EndY);
    f->SetMode(1);
    f->draw(hWnd);
    break;
}

case WM_MOUSEMOVE:
if( IsDrawing == TRUE )
{
    f->SetEndCoord(EndX,EndY);
    f->SetMode(2);
    f->draw(hWnd);
    EndX = LOWORD(lParam);
    EndY = HIWORD(lParam);
    f->SetEndCoord(EndX,EndY);
    f->SetMode(2);
    f->draw(hWnd);
}

break;

case WM_LBUTTONUP:


EndX = LOWORD(lParam);
EndY = HIWORD(lParam);

f->SetEndCoord(EndX,EndY);
f->SetMode(3);
f->draw(hWnd);
ff.push_back(f);

IsDrawing = FALSE;

break;

绘图正常,但当您根据问题更改窗口大小时,听起来好像您只画了一次线。每次重新绘制窗口时,都需要进行线条绘制。每当窗口需要重新验证时(例如调整大小时),都会重新绘制该窗口


如果您使用的是GDI,请在Paint上查找,这是一个函数,您应该在其中放置所有图形,因为当窗口重新绘制时,它将被重新绘制。

您在错误的位置绘制。应在收到
WM_PAINT
消息后在窗口上绘制。可以随时重新绘制窗口,并且您的程序必须能够完全重新绘制自身

您需要将所有绘图代码移动到
WM\u PAINT
的处理代码中。在
WM\u MOUSEMOVE
处理程序中,您需要记下必须在何处绘制线,然后调用
invalidate
。这将计划一个绘制周期,并且在该绘制周期发生时可以重新绘制窗口


这相当于Win32 101,我建议,如果您还没有这样做,您可以获得Petzold经典著作的副本。

-1 Windows API中没有
OnPaint
。将其称为“应该放置所有图形的函数”是非常误导的。GDI/+使用OnPaint函数绘制窗口。这是C++/CLI,以WinForms为目标。它既不是Windows API,也不是GDI,也不是本机代码。