CScrollViewで32767を超えたスクロールをするには

このまえの
SetWindowPosではSHRT_MAX以上の位置に移動できない
ってエントリでも触れましたが
通常だとCScrollViewで32767を超えたスクロールをしようとすると失敗しちゃいます。

ドキュメントの幅または高さが 32,767 ピクセルを超える場合は、OnScrollBy は無効な sizeScroll 引数で呼び出されるので、32,767 を超えるスクロールは失敗します。
http://msdn.microsoft.com/ja-jp/library/h3t18ydf(VS.80).aspx


でも解決方法がありました。
ってか、マイクロソフト サポート オンライン にありました。

32 K に PRB: CScrollView スクロール範囲制限
この動作は仕様です。 32 KB より大きい範囲を処理するコードがプログラム内容をスクロールするビューに WM_xSCROLL メッセージが送信される場合、失敗、でしたので CScrollView に追加されません。 Visual C++ では Windows NT Version 6.0、制限がする 2 GB 拡張されています。
http://support.microsoft.com/kb/166473/ja


あいかわらず日本語がおかしいですが、とにかく動き的には仕様だよ。と。
んで、解決方法も書いてありました。

操作の問題を回避簡単 CScrollView 派生クラスに 32 KB より大きいスクロール範囲を処理するサポートを追加できます。 次の関数をオーバーライド:

BOOL CMyScrollView::OnScroll(UINT nScrollCode, UINT nPos, BOOL
bDoScroll)
{
SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_TRACKPOS;

if (LOBYTE(nScrollCode) == SB_THUMBTRACK)
{
GetScrollInfo(SB_HORZ, &info);
nPos = info.nTrackPos;
}

if (HIBYTE(nScrollCode) == SB_THUMBTRACK)
{
GetScrollInfo(SB_VERT, &info);
nPos = info.nTrackPos;
}

return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
}

OnScrollをオーバーライドしてこれを足せと。
なるほど。SCROLLINFOはlongだからね。
これでスクロール問題解決。
そろそろavi_libraryをアップデートしようかな。
関連記事

tag : MFC


comment

Secret

 

Ads
プロフィール

はち

はち

最新記事
最新コメント
最新トラックバック
カテゴリ
検索フォーム
RSSリンクの表示
タグクラウド
QRコード
QRコード
月別アーカイブ
カウンター