#include #include #include #include "resource.h" #include "defs.h" extern HFONT g_hfNormal; extern HWND g_hWnd; static LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void ListView::Create(HMENU hMenu, DWORD dwStyle) { m_hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, WC_LISTVIEW, TEXT(""), dwStyle |WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|LVS_REPORT|LVS_SHOWSELALWAYS, 0, 0, 0, 0, g_hWnd, hMenu, GetModuleHandle(NULL), this ); if (SetProp(m_hWnd, TEXT("this"), (HANDLE)this)) m_prevProc = (WNDPROC)SetWindowLongPtr(m_hWnd, GWLP_WNDPROC, (LONG_PTR)::WndProc); ListView_SetExtendedListViewStyle(m_hWnd, LVS_EX_FULLROWSELECT); SendMessage(m_hWnd, WM_SETFONT, (WPARAM)g_hfNormal, MAKELPARAM(FALSE, 0)); } /* Naively calculate height of list view. */ int ListView::Height(int bHeader) { int iCount; iCount = ListView_GetItemCount(m_hWnd); return iCount? Dpi(bHeader? 27: 4)+iCount*Dpi(19): 0; } HWND ListView::HWnd() { return m_hWnd; } LRESULT CALLBACK ListView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case HDN_ENDTRACK: UpdateLayout(); return TRUE; } break; } return CallWindowProc(m_prevProc, hWnd, uMsg, wParam, lParam); } static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: RemoveProp(hWnd, TEXT("this")); break; } ListView *lpThis = (ListView *)GetProp(hWnd, TEXT("this")); return lpThis? lpThis->WndProc(hWnd, uMsg, wParam, lParam): FALSE; }