#include #include #include #include "resource.h" #include "defs.h" extern HFONT HfNormal; extern HWND HWnd; WNDPROC LvPrevProc; static LRESULT CALLBACK LvProc(HWND, UINT, WPARAM, LPARAM); HWND LvCreate(HMENU hMenu) { HWND hLv; hLv = CreateWindowEx( WS_EX_CLIENTEDGE, WC_LISTVIEW, TEXT(""), WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP |LVS_REPORT|LVS_NOSORTHEADER, 0, 0, 0, 0, HWnd, hMenu, GetModuleHandle(NULL), NULL ); LvPrevProc = (WNDPROC)SetWindowLongPtr(hLv, GWLP_WNDPROC, (LONG_PTR)LvProc); ListView_SetExtendedListViewStyle(hLv, LVS_EX_FULLROWSELECT); SendMessage(hLv, WM_SETFONT, (WPARAM)HfNormal, MAKELPARAM(FALSE, 0)); return hLv; } LRESULT CALLBACK LvProc(HWND hLv, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_NOTIFY: switch (((LPNMHDR)lParam)->code) { case HDN_ENDTRACK: UpdateLayout(); return TRUE; } break; case WM_GETDLGCODE: { LRESULT lResult; extern HWND HElv; /* For the episode list view, the Enter key should not * be handled by the dialog manager, but instead be sent * along to the main window procedure, so that it may be * handled by the NM_RETURN case in ElvHandleNotify. */ if (hLv != HElv) break; lResult = CallWindowProc(LvPrevProc, hLv, uMsg, wParam, lParam); if (lParam && ((MSG *)lParam)->message == WM_KEYDOWN && ((MSG *)lParam)->wParam == VK_RETURN) return DLGC_WANTMESSAGE; return lResult; } } return CallWindowProc(LvPrevProc, hLv, uMsg, wParam, lParam); } /* Naively calculate height of list view. */ int LvHeight(HWND hLv) { int iCount; iCount = ListView_GetItemCount(hLv); return iCount? Dpi(27)+iCount*Dpi(19): 0; }