#ifndef __MAINWINDOW_H__ #define __MAINWINDOW_H__ #include #include "atlbase.h" // must be before atlapp.h #include "atlapp.h" // must be before atlctrls.h #include "atlctrls.h" #include "atlwin.h" #include "tvn_debug.h" #include "treehandler.h" #include "treeitem.h" #include "debug.h" class MainWindow : public CWindowImpl, public TreeHandler { private: CTreeViewCtrlEx m_cTree; public: DECLARE_WND_CLASS("MainWindow"); BEGIN_MSG_MAP(MainWindow) MESSAGE_HANDLER(WM_CREATE, OnCreate) //MESSAGE_HANDLER(WM_CLOSE, OnClose) MESSAGE_HANDLER(WM_DESTROY, OnDestroy) NOTIFY_CODE_HANDLER(TVN_ITEMEXPANDING, OnItemExpanding) NOTIFY_CODE_HANDLER(TVN_ITEMEXPANDED, OnItemExpanded) NOTIFY_CODE_HANDLER(TVN_SELCHANGING, OnSelChanging) NOTIFY_CODE_HANDLER(TVN_SELCHANGED, OnSelChanged) NOTIFY_CODE_HANDLER(TVN_KEYDOWN, OnKeyDown) NOTIFY_CODE_HANDLER(TVN_DELETEITEM, OnDeleteItem) MESSAGE_HANDLER(WM_NOTIFY, OnNotify) END_MSG_MAP() MainWindow() { } virtual ~MainWindow() { } LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { NMTREEVIEW *nm= (NMTREEVIEW*)lParam; DWORD *pdw= (DWORD*)lParam; if (nm->hdr.code>=TVN_LAST && nm->hdr.code<=TVN_FIRST) { debug("notify(%08lx, %08lx), from=%08lx id=%08lx code=%s: ", wParam, lParam, nm->hdr.hwndFrom, nm->hdr.idFrom, notifyname(nm->hdr.code).c_str()); // from id code action old{ msk hitem state sm txt max img selimg chld lpar } new{ msk hitem state sm txt max img selimg chld lpar } x y debug("%s\n", hexdump((BYTE*)(pdw), sizeof(NMTREEVIEW)/4, 4).c_str()); } bHandled= false; return 0; } LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { debug("OnClose(%08lx, %08lx)\n", wParam, lParam); bHandled= true; return TRUE; } LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { debug("OnDestroy(%08lx, %08lx)\n", wParam, lParam); bHandled= true; PostQuitMessage(0); return 0; } LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { debug("OnCreate+ (%08lx)\n", m_hWnd); debug("tree: %s\n", m_cTree.GetWndClassName()); RECT clientrc; if (!GetClientRect(&clientrc)) return -1; if (0==m_cTree.Create(m_hWnd, /*RECT*/clientrc, _T("tree title"), WS_CHILD|WS_VISIBLE|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_HASLINES)) { error("m_cTree.Create"); return -1; } debug("tree=%08lx\n", m_cTree.m_hWnd); PopulateRoot(); debug("OnCreate-\n"); return 0; } private: ItemList rootitems; public: void PopulateRoot() { // populate tree with root items for (FieldInfoMap::iterator i= root.begin() ; i!=root.end() ; ++i) { rootitems.push_back(TreeItemPtr(new TreeItem(&m_cTree, NULL, *(*i).second, Pointer((*i).first)))); // TODO: change 'first' into readdword(_ptr+first) } } }; #endif