做了一个ListBox,光标条跟着鼠标点击的位置移动.可是前一个位置的光标条却没有擦除.
OnPaint是通过MouseClick中调用InvalidateRect(hwnd, NULL, true)触发的.
代码如下:
void ImageListBox::OnPaint(HDC hdc)
{
RECT rt, rtText;
int i;
TEXTMETRIC tm;
TCHAR szText[MAX_PATH];

GetTextMetrics(hdc, &tm); LineHeight = tm.tmHeight + tm.tmExternalLeading;
PageSize = Height / LineHeight; GetClientRect(hWnd, &rt); SetBkMode(hdc, BackMode);
SetBkColor(hdc, BackColor);
SetTextColor(hdc, ForeColor); for(i = 0; i < PageSize; i++)
{
memset(szText, 0, sizeof(szText));
lstrcat(szText, TEXT("ListBox Item")); rtText.left = 0;
rtText.top = i * LineHeight;
rtText.right = rtText.left + Width;
rtText.bottom = rtText.top + LineHeight; if(i == SelectedIndex)
{
FillRect(hdc, &rtText, (HBRUSH)FocusedBackColor);
}
DrawText(hdc, szText, -1, &rtText, DT_LEFT | DT_VCENTER);
}
}

解决方案 »

  1.   

    if(i == SelectedIndex)
    {
    FillRect(hdc, &rtText, (HBRUSH)FocusedBackColor);
    }后面加一个
                    else
                    {
                          FillRect(hdc, &rtText, (HBRUSH)UnfocusedBackColor);
                     }
      

  2.   

    我没有定义UnfocusedBackColor,再者i != SelectedIndex的行可能被点击也可能没有被点击过.
      

  3.   

    没定义就定义个贝。
    if(i == SelectedIndex)
    {
    FillRect(hdc, &rtText, (HBRUSH)FocusedBackColor);
    }
    这样写会把刷新过的所有项目变成焦点色。必须有else语句
      

  4.   

    背景要求是透明的,UnfocusedBackColor应该定义成什么呢?
      

  5.   

    而且在每次调用OnPaint之前都是会重绘背景的,应该不会把所有项目变成焦点色.
      

  6.   

    setbkcolor设置的字体的背景色.
    将SetBkMode设置为透明,或将setbkcolor设置为返回brush的颜色.
    在onctlcolor中改