リサイズ時のちらつきをなくす。PreCreateWindow を以下のようにする。
if(!CView::PreCreateWindow(cs))
{
return FALSE;
}
// CS_HREDRAW,CS_VREDRAW を外す
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS, AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)(COLOR_WINDOW + 1));
これをビューに対して行うときは,メインフレームにも追加すること。今回はこれをしないで悩んだ。
リストボックスに水平スクロールバーを表示させる。リストボックスは勝手に付けてくれないので,自分で大きさを計算する必要がある。
int nSize = 0;
CClientDC dc(&m_listboxFile);
CFont *pOldFont = dc.SelectObject(m_listbox.GetFont());
for(int i = 0; i < m_listbox.GetCount(); i++)
{
CString str;
m_listbox.GetText(i, str);
if(dc.GetTextExtent(str).cx > nSize)
{
nSize = dc.GetTextExtent(str).cx;
}
}
nSize += LIST_MARGIN;
m_listbox.SetHorizontalExtent(nSize);
dc.SelectObject(pOldFont);
こんな感じ。この際なかなかサイズが合わず,とりあえずフォントを設定したらやっとうまくいった。CClientDC では自動でフォントを合わせてくれないのね。
スクロールバーの右下のやつ。最初は自分で描画していたが,どうしても更新がうまくいかないので独立したウィンドウにしてしまう。しかし Spy++ で VS を調べると ScrollBar になっている。なんかもっとちゃんとした方法があるのだろうか。