itagagaki
@itagagaki (板垣 史彦)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

CTreeCtrlのスクロールバーの表示・非表示制御がおかしい

WindowsのMFCアプリをメンテナンスしています。
ダイアログウィンドウの中にCTreeCtrlコントロールがあります。
ダイアログウィンドウのサイズが変更されたときに呼ばれるOnSizeハンドラから、そのコントロールからの派生クラスのsetScrollbarメソッドを呼び、そこでWin32 APIのShowScrollBarをコールして垂直スクロールバーおよび水平スクロールバーの表示・非表示を制御しています。
しかし、それがちょっとどうもおかしいケースがあり、突き詰めていくと、下記の現象を捕らえました。

class CMyTreeCtrl : public CTreeCtrl
{
public:
    void SetScrollbar();
};

void CMyTreeCtrl::SetScrollbar()
{
    ShowScrollBar(SB_VERT, false);
    ShowScrollBar(SB_HORZ, true);
}

class CMyDialog : public CDialog
{
public:
    CMyTreeCtrl* m_pTreeCtrl;
    afx_msg void OnSize(UINT nType, int cx, int cy);
};

void CMyDialog::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);
    m_pTreeCtrl->SetScrollbar();
}

コードはこんな感じなのですが、ウィンドウの幅をドラッグするとこうなります。

k1wy1-ohzkb.gif

幅を拡げていく途中で垂直スクロールバーが表示されてしまっている区間があります。
ShowScrollBarを呼んでいるのはアプリ全体で上記の箇所だけです。
これはCTreeCtrlコントロールのバグもしくは仕様でしょうか・・・?
回避方法があれば教えてください。

0

1Answer

他の言語で同じようなサイズ・外観でツリービューを作ってみて現象が再現されるか確認してみた方がいいかもしれませんね。
それでも同じように発生するなら、コントロール固有のバグの可能性はあります。

0Like

Comments

  1. @itagagaki

    Questioner

    Windowsコモンコントロールの問題なのかMFCラッパーの問題なのかを切り分けるということでしょうか。直接Win32 APIでコントロールを使ってみるとか、C#でcomctl32.dllをインポートして呼んでみるとかですかね。いずれにしてもちょっと手間ですが、考えてみます。助言ありがとうございます。

  2. Windowsコモンコントロールの問題なのかMFCラッパーの問題なのかを切り分けるということでしょうか。

    そうですね、問題の切り分けをした方がいいと思います。C#でやるなら、WindowsFormsプロジェクトのTreeViewがまさにツリービュー(SysTreeView32)のラッパーなので、これで同じ現象が発生するならコモンコントロール側の問題なので、解決は難しいかもしれません。

  3. @itagagaki

    Questioner

    なるほど、良いヒントをありがとうございます。

Your answer might help someone💌