gpt4 book ai didi

c++ - Win32 API : How to avoid flickering of basic window controls?

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:51 25 4
gpt4 key购买 nike

我根据滚动条的当前 nPos 值通过使 WM_PAINT 内的所有内容无效并重绘来滚动父窗口。我想滚动而不闪烁,所以我处理 WM_ERASEBKGND 以避免重绘背景。我还为我的 TextOut 调用和一些显示的位图做了简单的双缓冲。它运作良好,除了我的 child 控制。它们闪烁严重,尤其是当 nPos == 0 且应用程序处理 SB_LINEUP 或 nPos == nMax 且应用程序处理 SB_LINEDOWN 或拖放滚动条时。我用 MoveWindow() 移动它们。我也尝试过 DeferWindowPos()。我已经在谷歌上搜索了闪烁的解决方案,但它不起作用或者我没有正确使用它。如何消除子控件的闪烁?

附言当我对主窗口使用 WS_CLIPCHILDREN 样式时,控件不会闪烁,但是当滚动窗口的某些部分时会变得困惑,尤其是我通过处理 WM_DRAWITEM 在其上绘制一些东西的静态控件。

编辑:(简化代码)我像这样在 WM_PAINT 中加倍缓冲:

case WM_PAINT: {
hDC = BeginPaint( hwnd, &PS );
hDCMem = CreateCompatibleDC( hDC );
hBMMem = CreateCompatibleBitmap( hDC, wnd_x, wnd_y );
SelectObject( hDCMem, hBMMem );

Font = CreateFont( 130, 50, 0, 0, FW_SEMIBOLD, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_MODERN, "Arial" );
SelectObject( hDCMem, Font );
SetTextColor( hDCMem, RGB( 30, 144, 255 ) );
SetBkColor( hDCMem, RGB( 192, 192, 192 ) );
TextOut( hDCMem, 650, 69 - scr_pos, "ABC", 3 );

MoveWindow( GetDlgItem( hwnd, ID_BUTT_START ), 720, 500 - scr_pos, 160, 150, TRUE );

BitBlt( hDC, 0, 0, wnd_x, wnd_y, hDCMem, 0, 0, SRCCOPY );
DeleteObject( hBMMem );
DeleteDC( hDCMem );
EndPaint( hwnd, &PS );
}

scr_pos 是从滚动条中获取的当前 nPos 值。

case WM_ERASEBKGND:
return 1;
break;

case WM_VSCROLL: {
SCROLLINFO sinfo;
ZeroMemory( &sinfo, sizeof( SCROLLINFO ) );
sinfo.cbSize = sizeof( SCROLLINFO );
sinfo.fMask = SIF_POS | SIF_PAGE | SIF_TRACKPOS;
GetScrollInfo( hwnd, SB_VERT, &sinfo );
scr_pos = sinfo.nPos;
switch( LOWORD( wParam ) ) {
case SB_TOP:
scr_pos = 0;
break;
case SB_BOTTOM:
scr_pos = 4000;
break;
case SB_LINEUP: {
scr_pos -= 200;
if ( scr_pos < 0 ) {
scr_pos = 0;
}
}
break;
case SB_LINEDOWN: {
scr_pos += 200;
if ( scr_pos > 4000 ) {
scr_pos = 4000;
}
}
break;
case SB_PAGEUP: {
scr_pos -= si.nPage;
if( scr_pos < 0 ) {
scr_pos = 0;
}
}
break;
case SB_PAGEDOWN: {
scr_pos += si.nPage;
if( scr_pos > 4000 ) {
scr_pos = 4000;
}
}
break;
case SB_THUMBPOSITION:
scr_pos = HIWORD(wParam);
break;
case SB_THUMBTRACK:
scr_pos = HIWORD(wParam);
break;
}
RedrawWindow( hwnd, NULL, NULL, RDW_INVALIDATE | RDW_INTERNALPAINT );
// InvalidateRect ( hwnd, NULL, true );
// UpdateWindow( hwnd );
ZeroMemory( & sinfo, sizeof( SCROLLINFO ) );
sinfo.cbSize = sizeof( SCROLLINFO );
sinfo.fMask = SIF_POS;
snfo.nPos = scr_pos;
SetScrollInfo( hwnd, SB_VERT, & sinfo, TRUE );
}
}
break;

除了子控件之外没有任何闪烁......

最佳答案

WS_CLIPCHILDREN 确实是解决方案。继续并激活它,您将不得不追查“我的部分窗口被弄乱”的原因,但您没有提供足够的详细信息。

您也可以查看 ScrollWindowEx .该文档专门描述了如何在滚动期间正确地重新定位子窗口。

关于c++ - Win32 API : How to avoid flickering of basic window controls?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9637950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com