Bad ASSERT in Wincore.cpp!?
Michel Robert -- michero@login.net
Wednesday, May 22, 1996
VC 4.0, Win95, MFC
At line 1938 of Wincore.cpp the ASSERT is causing me grief. I'm using int,
as I'm supposed to be allowed (and I need the whole range).
::GetScrollInfo(hWndBar, nBar, &info);
// Next line is causing intermittent problems
ASSERT(nPos == (short)info.nTrackPos);
nPos = info.nTrackPos;
Does anybody know if this is an MFC bug? Has it been fixed?
TIA
These are the lines that precede the ASSERT:
case AfxSig_vwwW:
case AfxSig_vwwx:
{
// special case for WM_VSCROLL and WM_HSCROLL for
// getting 32-bit scroll position
ASSERT(message == WM_VSCROLL || message == WM_HSCROLL ||
message == WM_VSCROLL+WM_REFLECT_BASE || message ==
WM_HSCROLL+WM_REFLECT_BASE);
int nScrollCode = (short)LOWORD(wParam);
int nPos = (short)HIWORD(wParam);
if (afxData.nWinVer >= 0x333 &&
(nScrollCode == SB_THUMBTRACK ||
nScrollCode == SB_THUMBPOSITION))
{
HWND hWndBar = (HWND)lParam;
int nBar = SB_CTL;
if (hWndBar == NULL)
{
hWndBar = m_hWnd;
nBar = (message == WM_VSCROLL ? SB_VERT : SB_HORZ);
}
static const TCHAR szScrollBar[] = _T("scrollbar");
if (nBar != SB_CTL ||
_AfxCompareClassName(hWndBar, szScrollBar))
{
SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_TRACKPOS;
::GetScrollInfo(hWndBar, nBar, &info);
ASSERT(nPos == (short)info.nTrackPos);
nPos = info.nTrackPos;
}
}
Dan Liliedahl -- lilied@adra.com
Tuesday, May 28, 1996
[Mini-digest: 3 responses]
Check out the docs for SetScrollRange. Even though the variable range is
an int (32-bits) you are limited to a
short (16-bits) because of a limitation of the WM_HSCROLL/WM_VSCROLL
position range.
-----From: "David W. Gillett"
On 22 May 96 at 12:36, Michel Robert wrote:
> VC 4.0, Win95, MFC
Thanks -- this is important. The underlying problem is a
difference between 95 and NT.
Although you'd like the range in 32 bits, and a comment in the code
(snipped) suggests that that range is supposed to be available, in
fact Win95's GDI only works in 16 bits. [This has been discussed
here, with particular reference to scroll bars, not very long ago.]
[Few users' screens offer more than about 10 bits of resolution in
horizontal or vertical, so 16 bits is more precision than the
position of the scrolling thumb can display. I would suggest that a
scrollbar alone is not sufficient for finer resolution; perhaps
something analogous to the "fine tuning" knob on many old radios is
called for.]
Dave
-----From: "David W. Gillett"
Michel Robert and I have been discussing/exploring the problem he
has encountered, and conclude that it doesn't appear to have anything
to do with the 16-bit GDI in Windows 95.
The WM_*SCROLL message contains only a 16-bit scroll position. The
MFC code handling this message is calling ::GetScrollInfo(), with a
flag parameter not documented as of the April MSDN version of the SDK
docs, to retrieve the 32-bit "tracking" position of the scroll thumb.
This much looks reasonable enough.
An assertion in that code checks that the bottom 16 bits of the
retrieved tracking position match the 16-bit position reported in the
message -- and it is this assertion which is sometimes failing.
[Sorry, I don't have Michel's original message in front of me. I
know that he's using 95 and MSVC/MFC 4.x. In 4.1, the relevant
assertion is at line 1948 in wincore.cpp, inside an #ifdef _AFXDLL
block.]
The only situation we have been able to imagine where this should
be able to fail is where the thumb has moved since the scroll message
was queued, perhaps because repainting the window to reflect a
previous scroll message took too long. Questions which suggest
themselves:
1. Is this a plausible situation? Are there other situations where
this condition might arise?
2. Is this a reasonable way for MFC to cope with the situation? If
not, can it be avoided without doing a private rebuild of the debug
MFC versions?
Dave
| Вернуться в корень Архива
|