↑右がリソースエディタで貼ったツリーコントロールで、
左が↓のコードで貼ったツリーコントロール。
// m_TreeはCTreeCtrl型
m_Tree.CreateEx(WS_EX_CLIENTEDGE, WS_CHILD | WS_VISIBLE | TVS_SHOWSELALWAYS, CRect(10, 10, 200, 200),
this, 0);
m_Tree.InsertItem(_T("ああああ"));
見てお判りの通りWS_EX_CLIENTEDGEが付きません。
CTreeCtrl::CreateExのソースを見てみると、変なことやってますので、そりゃ付かないですね。
BOOL CTreeCtrl::CreateEx(DWORD dwExStyle, DWORD dwStyle, const RECT& rect,
CWnd* pParentWnd, UINT nID)
{
BOOL bRet = Create(dwStyle, rect, pParentWnd, nID);
if (bRet && dwExStyle != 0)
{
bRet = ModifyStyleEx(0, dwExStyle);
}
return bRet;
}
かと言って
m_Tree.CreateEx(0, WS_CHILD | WS_VISIBLE | TVS_SHOWSELALWAYS, CRect(10, 10, 200, 200), this, 0);
m_Tree.ModifyStyleEx(0, WS_EX_CLIENTEDGE, SWP_FRAMECHANGED);
m_Tree.InsertItem(_T("ああああ"));
こんなコードにしても、↓のようにビジュアルテーマ(?)が適用されません。
(WS_BORDERだとちょっと濃い枠が付くため、これもちょっと違います。)
回避方法としては、
m_Tree.CWnd::CreateEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, _T(""), WS_CHILD | WS_VISIBLE | TVS_SHOWSELALWAYS, CRect(10, 10, 200, 200), this, 0);
m_Tree.InsertItem(_T("ああああ"));
というように、CWnd::CreateExを直接呼び出してしまう事ぐらいでしょうか。
これで一応リソースエディタで貼った物と同じ枠が付きます。
MFCのバグ一覧とかどっかにまとまってたりしないのかな・・・。