首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AnimateWindow不调用WM_PAINT

AnimateWindow不调用WM_PAINT
EN

Stack Overflow用户
提问于 2022-03-06 21:39:00
回答 1查看 85关注 0票数 0

我需要对呈现窗口的显示进行动画化,我有一个WM_PRINTCLIENT和WM_PAINT事件,但是只有在动画显示后使用RedrawWindow时,才会在动画期间呈现窗口。

代码语言:javascript
复制
WNDCLASSW Wcc;
MSG Msg;
Wcc.style = CS_HREDRAW | CS_VREDRAW;
Wcc.lpfnWndProc = &this->_ChildWndProc;
Wcc.cbClsExtra = 0;
Wcc.cbWndExtra = 0;
Wcc.hInstance = (HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE);
hInst_ = (HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE);
Wcc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
Wcc.hCursor = LoadCursor(NULL, IDC_ARROW);
Wcc.hbrBackground = reinterpret_cast<HBRUSH> (CreateSolidBrush(RGB( 255, 255, 255)));
Wcc.lpszMenuName = NULL;
Wcc.lpszClassName = className;
this->className = className;
this->hParent = hWnd;
this->text = text;
this->title = title;
//this->title = title;
windowW = 450;
windowH = 300;

hChild = CreateWindowExW(0, Wcc.lpszClassName, 0, WS_POPUP | WS_MINIMIZEBOX, x, y,
    windowW, windowH, hWnd, NULL, (HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE), NULL);
loadResources(hChild);
SetWindowLongPtrW(hChild, GWLP_USERDATA, (LONG)this);
//SetTransparency(hChild, 0x0f);
//ShowWindow(hChild, SW_SHOW);

AnimateWindow(hChild, 1000, AW_ACTIVATE | AW_BLEND);

油漆:

代码语言:javascript
复制
case WM_PAINT:
{
    Paint(hDlg);
    break;
}
case WM_PRINTCLIENT:
{
    PaintA(hDlg);
    break;
}

Paint(HWND hwnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    Graphics graphics(hdc);

    Image image(L"g:\\_project\\image viewer\\ipcamera.jpg");
    graphics.DrawImage(&image, 0, 0);
    EndPaint(hwnd, &ps);
}
PaintA(HWND hwnd)
{
    
    HDC hdc = GetDC(hwnd);
    Graphics graphics(hdc);

    Image image(L"g:\\_project\\image viewer\\ipcamera.jpg");
    graphics.DrawImage(&image, 0, 0);
   
}

在这里输入图像描述

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-06 23:17:39

我采用了您的代码,这样我就可以单独运行它了。在动画期间,我确实获得了调试输出WM_PRINTCLIENT

代码语言:javascript
复制
void foo(HINSTANCE hInst, HWND hParent) {
    static const wchar_t* className = L"myClassName";
    WNDCLASSW Wcc = {};
    MSG Msg;
    Wcc.style = CS_HREDRAW | CS_VREDRAW;
    Wcc.lpfnWndProc = ChildWndProc;
    Wcc.cbClsExtra = 0;
    Wcc.cbWndExtra = 0;
    Wcc.hInstance = hInst;
    Wcc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    Wcc.hCursor = LoadCursor(NULL, IDC_ARROW);
    Wcc.hbrBackground = CreateSolidBrush(RGB(255, 0, 255));
    Wcc.lpszMenuName = NULL;
    Wcc.lpszClassName = className;

    RegisterClassW(&Wcc);

    HWND hChild = CreateWindowW(className, nullptr, WS_POPUP | WS_MINIMIZEBOX, 100, 200, 300, 400, nullptr, nullptr, hInst, nullptr);

    AnimateWindow(hChild, 2000, AW_ACTIVATE | AW_BLEND);
}

下面是我使用的窗口程序:

代码语言:javascript
复制
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_PAINT:
    {
        ::OutputDebugString(L"WM_PAINT\n");
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        EndPaint(hWnd, &ps);
    }
    case WM_PRINTCLIENT:
    {
        ::OutputDebugString(L"WM_PRINTCLIENT\n");
        HDC hdc = (HDC)wParam;
        ::MoveToEx(hdc, 10, 10, nullptr);
        ::LineTo(hdc, 100, 100);
    }
    case WM_ERASEBKGND:
    {
        ::OutputDebugString(L"WM_ERASEBKGND\n");
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

注:

有关详细信息,请参阅WM_PRINTCLIENT消息

窗口可以以与WM_PAINT相同的方式处理此消息,但不需要调用BeginPaint和EndPaint (提供了设备上下文),并且窗口应该绘制其整个工作区,而不仅仅是无效区域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71374433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档