在ScrollWindow()之后更新窗口。WinAPI
我想滚动我的窗口,但当我这样做时,前面的图像仍然存在。我怎样才能修好它 我的代码,可能有一些问题: 开关低或低参数 { 案例SB_系列: IVINC=1; 打破 案例SB_阵容: IVINC=-1; 打破 案例SB_THUMBTRACK: iVScrollInc=HIWORDwParam-iVScrollPos; 打破 违约: ivc=0; 打破 } iVScrollInc=最大iVScrollPos,最小VScrollinc,iVScrollMax-iVScrollPos; 如果公司0 { iVScrollPos+=iVScrollInc; ScrollWindowhWnd,0,-cyChar*iVScrollInc,NULL,NULL; 设置crollposhwnd,SB_VERT,iVScrollPos,TRUE; 更新内部wwnd; } 对于int i=0;i在ScrollWindow()之后更新窗口。WinAPI,winapi,Winapi,我想滚动我的窗口,但当我这样做时,前面的图像仍然存在。我怎样才能修好它 我的代码,可能有一些问题: 开关低或低参数 { 案例SB_系列: IVINC=1; 打破 案例SB_阵容: IVINC=-1; 打破 案例SB_THUMBTRACK: iVScrollInc=HIWORDwParam-iVScrollPos; 打破 违约: ivc=0; 打破 } iVScrollInc=最大iVScrollPos,最小VScrollinc,iVScrollMax-iVScrollPos; 如果公司0 {
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth,
iVscrollPos, iVscrollMax;
HDC hdc;
int i, y, iPaintBeg, iPaintEnd, iVscrollInc;
PAINTSTRUCT ps;
TEXTMETRIC tm;
switch (iMsg)
{
case WM_CREATE:
hdc = GetDC(hwnd);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
cyChar = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(hwnd, hdc);
iMaxWidth = 40 * cxChar + 22 * cxCaps;
return 0;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
iVscrollMax = max(0,buffer.size() + 2 - cyClient / cyChar);
iVscrollPos = min(iVscrollPos, iVscrollMax);
SetScrollRange(hwnd, SB_VERT, 0, iVscrollMax, FALSE);
SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
return 0;
case WM_VSCROLL:
switch (LOWORD(wParam))
{
case SB_TOP:
iVscrollInc = -iVscrollPos;
break;
case SB_BOTTOM:
iVscrollInc = iVscrollMax - iVscrollPos;
break;
case SB_LINEUP:
iVscrollInc = -1;
break;
case SB_LINEDOWN:
iVscrollInc = 1;
break;
case SB_PAGEUP:
iVscrollInc = min(-1, -cyClient / cyChar);
break;
case SB_PAGEDOWN:
iVscrollInc = max(1, cyClient / cyChar);
break;
case SB_THUMBTRACK:
iVscrollInc = HIWORD(wParam) - iVscrollPos;
break;
default:
iVscrollInc = 0;
}
iVscrollInc = max(-iVscrollPos,
min(iVscrollInc, iVscrollMax - iVscrollPos));
if (iVscrollInc != 0)
{
iVscrollPos += iVscrollInc;
ScrollWindow(hwnd, 0, -cyChar * iVscrollInc, NULL, NULL);
SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
UpdateWindow(hwnd);
}
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
iPaintBeg = max(0, iVscrollPos + ps.rcPaint.top / cyChar - 1);
iPaintEnd = min(buffer.size(),
iVscrollPos + ps.rcPaint.bottom / cyChar);
for (i = iPaintBeg; i < iPaintEnd; i++)
{
y = cyChar * (1 - iVscrollPos + i);
TextOut(hdc, 0, y,
buffer[i].c_str(),
buffer[i].length());
SetTextAlign(hdc, TA_LEFT | TA_TOP);
}
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, iMsg, wParam, lParam);
}
代码可能无法正确擦除窗口。默认为WNDCLASSEX.hbrBackground成员。请解释一下,好吗?Charlz Petsell。我现在读了。在我看来,我写的代码和他的一样,但我不明白为什么我的代码是错的。是的,我可以,但真的很抱歉,我没有笔记本电脑。后来为什么我们在TextOut之后写入SetTextAlign?请参阅SetTextAlign的说明它与iPainBeg和iPaIntellent一起工作,但我不明白如果iPainBeg和iPaIntellent告诉我们从缓冲区的哪个元素开始绘制,为什么我们需要滚动窗口。如果我想按像素滚动,而不是按字体高度滚动,该怎么办