diff options
Diffstat (limited to 'c/listview.cpp')
-rw-r--r-- | c/listview.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/c/listview.cpp b/c/listview.cpp new file mode 100644 index 0000000..9f24dc3 --- /dev/null +++ b/c/listview.cpp @@ -0,0 +1,76 @@ +#include <windows.h> +#include <commctrl.h> +#include <uxtheme.h> + +#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; +} |