static LRESULT CALLBACK ListViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { struct PickerInfo *pPickerInfo; LRESULT rc = 0; BOOL bHandled = FALSE; WNDPROC pfnParentWndProc; HWND hwndHeaderCtrl = NULL; HFONT hHeaderCtrlFont = NULL; pPickerInfo = GetPickerInfo(hWnd); pfnParentWndProc = pPickerInfo->pfnParentWndProc; switch(message) { case WM_MOUSEMOVE: if (MouseHasBeenMoved()) ShowCursor(TRUE); break; case WM_ERASEBKGND: if (GetBackgroundBitmap()) { rc = ListViewOnErase(hWnd, (HDC) wParam); bHandled = TRUE; } break; case WM_NOTIFY: bHandled = ListViewNotify(hWnd, (LPNMHDR) lParam); break; case WM_SETFONT: hwndHeaderCtrl = ListView_GetHeader(hWnd); if (hwndHeaderCtrl) hHeaderCtrlFont = GetWindowFont(hwndHeaderCtrl); break; case WM_CONTEXTMENU: bHandled = ListViewContextMenu(hWnd, lParam); break; case WM_DESTROY: // Received WM_DESTROY; time to clean up if (pPickerInfo->pCallbacks->pfnSetViewMode) pPickerInfo->pCallbacks->pfnSetViewMode(pPickerInfo->nCurrentViewID); Picker_Free(pPickerInfo); SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR) pfnParentWndProc); SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) NULL); break; } if (!bHandled) rc = CallParentWndProc(pfnParentWndProc, hWnd, message, wParam, lParam); // If we received WM_SETFONT, reset header ctrl font back to original font if (hwndHeaderCtrl) SetWindowFont(hwndHeaderCtrl, hHeaderCtrlFont, TRUE); return rc; }
int CListView::GetColumnCount() const { if (m_hwnd==nullptr) return 0; return Header_GetItemCount(ListView_GetHeader(m_hwnd)); }
/** * @brief Initialzes the object. * @param[in] hControl handle to target control. */ void WinListViewAdapter::Init(HWND hControl) { WinControlAdapter::Init(hControl); HWND hHeader = ListView_GetHeader(hControl); columnCount = Header_GetItemCount(hHeader); }
int Picker_GetNumColumns(HWND hWnd) { int nColumnCount = 0; int i = 0; HWND hwndHeader; int *shown; struct PickerInfo *pPickerInfo; pPickerInfo = GetPickerInfo(hWnd); shown = (int*)malloc(pPickerInfo->nColumnCount * sizeof(*shown)); if (!shown) return -1; pPickerInfo->pCallbacks->pfnGetColumnShown(shown); hwndHeader = ListView_GetHeader(hWnd); if (GetUseOldControl() || (nColumnCount = Header_GetItemCount(hwndHeader)) < 1) { nColumnCount = 0; for (i = 0; i < pPickerInfo->nColumnCount ; i++ ) { if (shown[i]) nColumnCount++; } } free(shown); return nColumnCount; }
//*********************************************************************** // apparently this only works for ComCtl version 6.0.0.0 // I would have to use a Manifest to specify that. // Linking a manifest requires adding a line to resource file: // CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "filename.manifest" //*********************************************************************** // http://www.gamedev.net/topic/569020-set-list-view-header-sort-arrow-c-win32/ BOOL CVListView::SetHeaderSortImage(int columnIndex, SHOW_ARROW showArrow) { HDITEM hdrItem = { 0 }; HWND hHeader = ListView_GetHeader(hwndVListView); if (hHeader) { hdrItem.mask = HDI_FORMAT; if ( Header_GetItem(hHeader, columnIndex, &hdrItem) ) { if (showArrow == SHOW_UP_ARROW) { hdrItem.fmt = (hdrItem.fmt & ~HDF_SORTDOWN) | HDF_SORTUP; } else if (showArrow == SHOW_DOWN_ARROW) { hdrItem.fmt = (hdrItem.fmt & ~HDF_SORTUP) | HDF_SORTDOWN; } else { hdrItem.fmt = hdrItem.fmt & ~(HDF_SORTDOWN | HDF_SORTUP); } return Header_SetItem(hHeader, columnIndex, &hdrItem); } } return FALSE; };
void MyListView_AddItemWithIcon(HWND hListView, TCHAR *ItemText, int ColumnIndex, int RowIndex, void *pData, int iIcon) { LV_ITEM ListViewItem; int ColumnWidth; int ItemWidth; HWND hHeader; hHeader = ListView_GetHeader(hListView); if (ColumnIndex == (Header_GetItemCount(hHeader)-1)) { RECT itemRect; RECT headerRect; // get rect of last column in header Header_GetItemRect(hHeader, (Header_GetItemCount(hHeader)-1), &itemRect); GetClientRect(hHeader,&headerRect); ItemWidth= headerRect.right - itemRect.left; } else { ItemWidth = ListView_GetStringWidth(hListView, ItemText) + (GetSystemMetrics(SM_CXEDGE)<<1)+(4<<1); } ColumnWidth = ListView_GetColumnWidth(hListView,ColumnIndex); ListViewItem.mask = LVIF_TEXT; if (iIcon!=-1) { ListViewItem.mask |= LVIF_IMAGE; ListViewItem.iImage = iIcon; } ListViewItem.iItem = RowIndex; ListViewItem.iSubItem = ColumnIndex; ListViewItem.pszText = ItemText; if (ColumnIndex == 0) { ListViewItem.mask |= LVIF_PARAM; ListViewItem.lParam = (LPARAM)pData; ListView_InsertItem(hListView, &ListViewItem); } else { ListView_SetItem(hListView, &ListViewItem); } if (ItemWidth>ColumnWidth) ListView_SetColumnWidth(hListView, ColumnIndex, ItemWidth); }
int ListView_MoveItem(HWND hwnd , int pos , int newPos) { char buff [2000]; int cols = Header_GetItemCount(ListView_GetHeader(hwnd)); LVITEM lvi; lvi.mask = LVIF_IMAGE|LVIF_INDENT|LVIF_PARAM|LVIF_TEXT|LVIF_STATE; lvi.iItem = pos; lvi.iSubItem = 0; lvi.stateMask= (UINT)-1; lvi.pszText = buff; lvi.cchTextMax = 2000; ListView_GetItem(hwnd , &lvi); int check = ListView_GetCheckState(hwnd , pos); if (newPos>pos) newPos++; else pos++; lvi.iItem = newPos; newPos = ListView_InsertItem(hwnd , &lvi); ListView_SetCheckState(hwnd , newPos , check); lvi.mask = LVIF_TEXT; for (int i=1; i<cols; i++) { lvi.iSubItem=i; lvi.iItem=pos; ListView_GetItem(hwnd , &lvi); lvi.iItem=newPos; ListView_SetItem(hwnd , &lvi); } // ListView_SetSelectionMark(hwnd , newPos); ListView_EnsureVisible(hwnd , newPos , 0); ListView_DeleteItem(hwnd , pos); return 1; }
void CSysLogQuery::SetHeaderCheckbox(void) { BOOL fChecked = TRUE; for(int nItem = 0;nItem < ListView_GetItemCount(m_Syslog_query);nItem++) { if(!ListView_GetCheckState(m_Syslog_query,nItem)) { fChecked = FALSE; break; } } HWND header = ListView_GetHeader(m_Syslog_query); HDITEM hdi = {0}; hdi.mask = HDI_FORMAT; Header_GetItem(header,0,&hdi); if (fChecked) { hdi.fmt |= HDF_CHECKED; } else { hdi.fmt &= ~HDF_CHECKED; } Header_SetItem(header, 0, &hdi); }
void Explorerplusplus::OnRightClick(NMHDR *nmhdr) { if(nmhdr->hwndFrom == m_hActiveListView) { POINT CursorPos; DWORD dwPos; dwPos = GetMessagePos(); CursorPos.x = GET_X_LPARAM(dwPos); CursorPos.y = GET_Y_LPARAM(dwPos); OnListViewRClick(&CursorPos); } else if(nmhdr->hwndFrom == ListView_GetHeader(m_hActiveListView)) { /* The header on the active listview was right-clicked. */ POINT CursorPos; DWORD dwPos; dwPos = GetMessagePos(); CursorPos.x = GET_X_LPARAM(dwPos); CursorPos.y = GET_Y_LPARAM(dwPos); OnListViewHeaderRClick(&CursorPos); } else if(nmhdr->hwndFrom == m_hMainToolbar) { OnMainToolbarRClick(); } }
LRESULT CpuFuncOnColumnClick( __in PDIALOG_OBJECT Object, __in NMLISTVIEW *lpNmlv ) { HWND hWndHeader; int nColumnCount; int i; HDITEM hdi; LISTVIEW_OBJECT *ListView; PCPU_FORM_CONTEXT Context; HWND hWndCtrl; HWND hWnd; Context = SdkGetContext(Object, CPU_FORM_CONTEXT); ListView = Context->ListView; if (ListView->SortOrder == SortOrderNone){ return 0; } if (ListView->LastClickedColumn == lpNmlv->iSubItem) { ListView->SortOrder = (LIST_SORT_ORDER)!ListView->SortOrder; } else { ListView->SortOrder = SortOrderAscendent; } hWnd = Object->hWnd; hWndCtrl = GetDlgItem(hWnd, IDC_LIST_FUNCTION); hWndHeader = ListView_GetHeader(hWndCtrl); ASSERT(hWndHeader); nColumnCount = Header_GetItemCount(hWndHeader); for (i = 0; i < nColumnCount; i++) { hdi.mask = HDI_FORMAT; Header_GetItem(hWndHeader, i, &hdi); if (i == lpNmlv->iSubItem) { hdi.fmt &= ~(HDF_SORTDOWN | HDF_SORTUP); if (ListView->SortOrder == SortOrderAscendent){ hdi.fmt |= HDF_SORTUP; } else { hdi.fmt |= HDF_SORTDOWN; } } else { hdi.fmt &= ~(HDF_SORTDOWN | HDF_SORTUP); } Header_SetItem(hWndHeader, i, &hdi); } ListView->LastClickedColumn = lpNmlv->iSubItem; ListView_SortItemsEx(hWndCtrl, CpuFuncSortCallback, (LPARAM)hWnd); return 0L; }
void CListViewOrder::InitList(HWND hwndList) { m_iColumnNumber = -1; m_bAscending = TRUE; _ASSERTE(g_pResManager != NULL); HWND hwndHeader = ListView_GetHeader(hwndList); Header_SetImageList(hwndHeader, g_pResManager->m_hSortArrows); }
void LoadColumnSizes(HWND hwndResults, const char *szProto) { HDITEM hdi; int columnOrder[NUM_COLUMNID]; int columnCount; char szSetting[32]; int i; FindAddDlgData *dat; bool colOrdersValid; defaultColumnSizes[COLUMNID_PROTO] = GetSystemMetrics(SM_CXSMICON) + 4; dat = (FindAddDlgData*)GetWindowLongPtr(GetParent(hwndResults), GWLP_USERDATA); columnCount = NUM_COLUMNID; colOrdersValid = true; for (i=0; i < NUM_COLUMNID; i++) { LVCOLUMN lvc; if (i < columnCount) { int bNeedsFree = FALSE; lvc.mask = LVCF_TEXT | LVCF_WIDTH; if (szColumnNames[i] != NULL) lvc.pszText = TranslateTS(szColumnNames[i]); else if (i == COLUMNID_HANDLE) { if (szProto) { bNeedsFree = TRUE; lvc.pszText = mir_a2t((char*)CallProtoServiceInt(NULL,szProto, PS_GETCAPS, PFLAG_UNIQUEIDTEXT, 0)); } else lvc.pszText = _T("ID"); } else lvc.mask &= ~LVCF_TEXT; mir_snprintf(szSetting, SIZEOF(szSetting), "ColWidth%d", i); lvc.cx = db_get_w(NULL, "FindAdd", szSetting, defaultColumnSizes[i]); ListView_InsertColumn(hwndResults, i, (LPARAM)&lvc); if (bNeedsFree) mir_free(lvc.pszText); } mir_snprintf(szSetting, SIZEOF(szSetting), "ColOrder%d", i); columnOrder[i] = db_get_b(NULL, "FindAdd", szSetting, -1); if (columnOrder[i] == -1 || columnOrder[i] >= NUM_COLUMNID) colOrdersValid = false; } if (colOrdersValid) ListView_SetColumnOrderArray(hwndResults, columnCount, columnOrder); dat->iLastColumnSortIndex = db_get_b(NULL, "FindAdd", "SortColumn", COLUMNID_NICK); if (dat->iLastColumnSortIndex >= columnCount) dat->iLastColumnSortIndex = COLUMNID_NICK; dat->bSortAscending = db_get_b(NULL, "FindAdd", "SortAscending", TRUE); hdi.mask = HDI_FORMAT; hdi.fmt = HDF_LEFT | HDF_STRING | (dat->bSortAscending ? HDF_SORTDOWN : HDF_SORTUP); Header_SetItem(ListView_GetHeader(hwndResults), dat->iLastColumnSortIndex, &hdi); }
void CFileBrowserListCtrl::PreSubclassWindow() { // if we were created from a dialog resource, OnCreate never gets called // because creation occurred before our CWnd was attached, so we must init // from here instead; we identify this case by existence of header control if (ListView_GetHeader(m_hWnd) != NULL) // if header control exists Init(); // assume OnCreate won't be called CListCtrl::PreSubclassWindow(); }
void CdllsDlg::OnBnClickedSave() { TCHAR app_path_buf[PATH_LEN]; memset(app_path_buf,0,sizeof(app_path_buf)); GetModuleFileName(NULL, app_path_buf,sizeof(app_path_buf)/sizeof(app_path_buf[0])); int pathlen = _tcslen(app_path_buf); int i = pathlen-1; while(i>0) { if(app_path_buf[i]==_T('\\') ) { app_path_buf[i+1] = 0; break; } i--; } TCHAR szFilters[] =_T("Text Files (*.txt)\0*.txt\0") _T("All Files (*.*)\0*.*\0"); CFileDialog fdlg (FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST |OFN_EXPLORER, szFilters, AfxGetMainWnd()); //CFileDialog ofdlg(FALSE); fdlg.m_ofn.lpstrFilter = szFilters; //CFileDialog fdlg(FALSE,_T(".txt"),_T("dlllist.txt")); fdlg.m_ofn.lpstrInitialDir =app_path_buf; if(IDOK!=fdlg.DoModal()) return; std::basic_string<TCHAR> savepathname = fdlg.m_ofn.lpstrFile; if(1==fdlg.m_ofn.nFilterIndex && !end_with(savepathname,_T(".txt"),true) ) { savepathname += _T(".txt"); } std::basic_fstream<TCHAR> ofile; ofile.open( (LPCSTR)_bstr_t(savepathname.c_str()),std::ios_base::out|std::ios_base::trunc); HWND hwndListView =GetDlgItem(IDC_LVW)->m_hWnd; int rows = 0; rows = ListView_GetItemCount(hwndListView); int cols = 0; HWND headerwnd = ListView_GetHeader(hwndListView); cols = Header_GetItemCount(headerwnd); for(int i=0;i<rows;i++) { for(int j=0;j<cols;j++) { app_path_buf[0] = 0; ListView_GetItemText(hwndListView,i,j,app_path_buf,ARRAY_SIZE(app_path_buf)); if(j<cols-1) ofile<<app_path_buf<<_T(" "); else { ofile<<app_path_buf<<(char)0xd<<(char)0xa; } } } ofile.close(); }
const CHeaderCtrl* CReportCtrl::GetHeaderCtrl() const { // Yes, CListCtrl already provides "GetHeaderCtrl", but not const. // I desperately need a "const" version of "GetHeaderCtrl" because that's the // only way to make "GetColumnCount" const, which, in turn, is being called by // A LOT of const member functions. So if "GetHeaderCtrl" is not const, there will // be almost no const member function at all in this class. Terrible. return (const CHeaderCtrl*)(CWnd::FromHandle(ListView_GetHeader(GetSafeHwnd()))); }
void CSearchDialog::UpdateListViewHeader() { HWND hHeader = ListView_GetHeader(GetDlgItem(m_hDlg,IDC_LISTVIEW_SEARCHRESULTS)); HDITEM hdItem; /* Remove the sort arrow from the column that was previously selected. */ if(m_iPreviousSelectedColumn != -1) { hdItem.mask = HDI_FORMAT; Header_GetItem(hHeader,m_iPreviousSelectedColumn,&hdItem); if(hdItem.fmt & HDF_SORTUP) { hdItem.fmt &= ~HDF_SORTUP; } else if(hdItem.fmt & HDF_SORTDOWN) { hdItem.fmt &= ~HDF_SORTDOWN; } Header_SetItem(hHeader,m_iPreviousSelectedColumn,&hdItem); } int iColumn = 0; for each(auto ci in m_sdps->m_Columns) { if(ci.SortMode == m_sdps->m_SortMode) { break; } iColumn++; } hdItem.mask = HDI_FORMAT; Header_GetItem(hHeader,iColumn,&hdItem); if(m_sdps->m_bSortAscending) { hdItem.fmt |= HDF_SORTUP; } else { hdItem.fmt |= HDF_SORTDOWN; } Header_SetItem(hHeader,iColumn,&hdItem); m_iPreviousSelectedColumn = iColumn; }
//---------------------------------------------------------------------------------------------------------------------- // INSERT IMAGE LISTS //---------------------------------------------------------------------------------------------------------------------- void cListViewComputers :: insert_image_lists ( HWND hwnd ) { HANDLE hStateBlue = 0; HANDLE hStateGold = 0; HANDLE hStateGray = 0; //----------------------------------- // INSERT IMAGES IN ORDER // 0 == GRAY == NO CONNECTIONS // 1 == GOLD == ONE-WAY CONNECTION // 2 == BLUE == TWO-WAY CONNECTION //----------------------------------- HANDLE hDeskStraightGray = LoadImage ( g_hInstance, MAKEINTRESOURCE ( IDI_COMPUTER_GRAY ), IMAGE_ICON, 85, 73, LR_CREATEDIBSECTION ); HANDLE hDeskStraightGold = LoadImage ( g_hInstance, MAKEINTRESOURCE ( IDI_COMPUTER_GOLD), // returns 0 on fail IMAGE_ICON, 85, 73, LR_CREATEDIBSECTION | LR_LOADTRANSPARENT ); HANDLE hDeskStraightBlue = LoadImage ( g_hInstance, MAKEINTRESOURCE ( IDI_COMPUTER_BLUE ), IMAGE_ICON, 85, 73, LR_CREATEDIBSECTION ); hStateGray = LoadImage ( g_hInstance, MAKEINTRESOURCE ( IDI_CONNECTION_STATE_GRAY ), IMAGE_ICON, 16,24, LR_CREATEDIBSECTION ); hStateGold = LoadImage ( g_hInstance, MAKEINTRESOURCE ( IDI_CONNECTION_STATE_GOLD ), IMAGE_ICON, 16,24, LR_CREATEDIBSECTION ); hStateBlue = LoadImage ( g_hInstance, MAKEINTRESOURCE ( IDI_CONNECTION_STATE_BLUE ), IMAGE_ICON, 16,24, LR_CREATEDIBSECTION ); hImageListLarge = ImageList_Create ( 85, 73, ILC_MASK | ILC_COLORDDB | ILC_COLOR32, 3, 0 ); HRESULT iResult = ImageList_AddIcon ( hImageListLarge, (HICON)hDeskStraightGray ); iResult = ImageList_AddIcon ( hImageListLarge, (HICON)hDeskStraightGold ); iResult = ImageList_AddIcon ( hImageListLarge, (HICON)hDeskStraightBlue ); hImageListState = ImageList_Create ( 16, 24, ILC_MASK | ILC_COLORDDB | ILC_COLOR32, 3, 0 ); iResult = ImageList_AddIcon ( hImageListState, (HICON)hStateGray); iResult = ImageList_AddIcon ( hImageListState, (HICON)hStateGold ); iResult = ImageList_AddIcon ( hImageListState, (HICON)hStateBlue ); HIMAGELIST hResult = ListView_SetImageList ( hwnd, hImageListLarge, LVSIL_NORMAL ); ListView_SetExtendedListViewStyle ( hwnd, LVS_EX_BORDERSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP ); hResult = ListView_SetImageList ( hwnd, hImageListState, LVSIL_STATE ); HWND hHeader = ListView_GetHeader ( hwnd ); RECT rect; GetWindowRect ( hHeader, & rect ); MoveWindow ( hHeader, rect.left, rect.top, 200, 100, TRUE ); ShowWindow ( hHeader, SW_NORMAL ); }
void VDUIRestoreListViewColumnsW32(HWND hwnd, const char *name) { HWND hwndHeader = ListView_GetHeader(hwnd); int count = Header_GetItemCount(hwndHeader); VDRegistryAppKey key("Window Placement"); if ((size_t)key.getBinaryLength(name) != sizeof(float) * count) return; vdfastvector<float> widths(count); if (!key.getBinary(name, (char *)widths.data(), sizeof(float) * count)) return; VDUISetListViewColumnsW32(hwnd, widths.data(), count); }
// CSysLogQuery 消息处理程序 BOOL CSysLogQuery::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始 CRect rect; m_Syslog_query.GetClientRect(&rect); m_Syslog_query.SetExtendedStyle(m_Syslog_query.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES ); CImageList img_list; img_list.Create(1,25,ILC_COLORDDB | ILC_MASK,0,0); m_Syslog_query.SetImageList(&img_list,LVSIL_SMALL); m_Syslog_query.InsertColumn(0,NULL,LVCFMT_CENTER,40); //添加列标题 m_Syslog_query.InsertColumn(1, _T("操作时间"), LVCFMT_CENTER,(rect.Width()-40)/3-90, 1); m_Syslog_query.InsertColumn(2, _T("主机名"), LVCFMT_CENTER, (rect.Width()-40)/3-100, 2); m_Syslog_query.InsertColumn(3, _T("消息内容"), LVCFMT_CENTER, (rect.Width()-40)/3+180, 3); //m_Syslog_query.InsertColumn(4, _T("消息内容"), LVCFMT_CENTER, (rect.Width()-40)/4+150, 4); HWND header = ListView_GetHeader(m_Syslog_query); DWORD dwHeaderStyle = ::GetWindowLong(header, GWL_STYLE); dwHeaderStyle |= HDS_CHECKBOXES; ::SetWindowLong(header, GWL_STYLE, dwHeaderStyle); // Store the ID of the header control so we can handle its notification by ID int m_HeaderId = ::GetDlgCtrlID(header); // Now, we can update the format for the first header item, // which corresponds to the first column HDITEM hdi = { 0 }; hdi.mask = HDI_FORMAT; Header_GetItem(header, 0, &hdi); hdi.fmt |= HDF_CHECKBOX | HDF_FIXEDWIDTH; Header_SetItem(header, 0, &hdi); isCheckbox_log = FALSE; memset(check_log,0,256); i_checked_log = 0; page = 1; current_page = 0; return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
/// Deletes the list view columns void MainWindow::delete_columns() { ListView_DeleteAllItems(m_hWndTable); // column 0 can't be deleted, so we gotta fake around it const int count = Header_GetItemCount(ListView_GetHeader(m_hWndTable)); LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = 0; ListView_InsertColumn(m_hWndTable, 0, &lvc); for(int i=0; i<count; ++i) ListView_DeleteColumn(m_hWndTable, 1); }
// Set the sort icons on the column header // Sort order can be defined by: 0 (neither), 1 (ascending), 2 (descending) void CSIPropertyPage::SetSortIcon(HWND listView, int col, int sortOrder) { int numColumns = 0; int curCol = 0; wchar_t headerText[MAX_BUFFER_LENGTH]; HWND headerRef; HDITEM itemHdr; // Retrieve reference to header control headerRef = ListView_GetHeader(listView); // Retrieve number of list view columns numColumns = Header_GetItemCount(headerRef); for (curCol = 0; curCol<numColumns; curCol++) { itemHdr.mask = HDI_FORMAT | HDI_TEXT; itemHdr.pszText = headerText; itemHdr.cchTextMax = MAX_BUFFER_LENGTH - 1; // Get the column SendMessage(headerRef, HDM_GETITEM, curCol, (LPARAM)&itemHdr); // Check the sort order and set the sort icon if ((sortOrder != 0) && (curCol == col)) { switch (sortOrder) { case 1: itemHdr.fmt &= !HDF_SORTUP; itemHdr.fmt |= HDF_SORTDOWN; break; case 2: itemHdr.fmt &= !HDF_SORTDOWN; itemHdr.fmt |= HDF_SORTUP; break; } } else { itemHdr.fmt &= !HDF_SORTUP & !HDF_SORTDOWN; } itemHdr.fmt |= HDF_STRING; itemHdr.mask = HDI_FORMAT | HDI_TEXT; SendMessage(headerRef, HDM_SETITEM, curCol, (LPARAM)&itemHdr); } }
static BOOL ListViewContextMenu(HWND hwndPicker, LPARAM lParam) { struct PickerInfo *pPickerInfo; POINT pt, headerPt; int i = 0, nViewID = 0, nColumn = -1; HWND hwndHeader; RECT rcCol; pPickerInfo = GetPickerInfo(hwndPicker); // Extract the point out of the lparam pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam); if (pt.x < 0 && pt.y < 0) GetCursorPos(&pt); // Figure out which header column was clicked, if at all nViewID = Picker_GetViewID(hwndPicker); if ((nViewID == VIEW_REPORT) || (nViewID == VIEW_GROUPED)) { hwndHeader = ListView_GetHeader(hwndPicker); headerPt = pt; ScreenToClient(hwndHeader, &headerPt); for (i = 0; Header_GetItemRect(hwndHeader, i, &rcCol); i++) { if (PtInRect(&rcCol, headerPt)) { nColumn = i; break; } } } if (nColumn >= 0) { // A column header was clicked if (pPickerInfo->pCallbacks->pfnOnHeaderContextMenu) pPickerInfo->pCallbacks->pfnOnHeaderContextMenu(pt, nColumn); } else { // The body was clicked if (pPickerInfo->pCallbacks->pfnOnBodyContextMenu) pPickerInfo->pCallbacks->pfnOnBodyContextMenu(pt); } return TRUE; }
// Set the UP / DOWN arrow image when a column header is clicked in the Favorite Games List void ListView_SetHeaderSortImage(HWND hLView, int nColIndex, bool bListViewAscending) { HWND hListViewHeader = ListView_GetHeader(hLView); BOOL isCommonControlVersion6 = IsCommCtrlVersion6(); int nColCount = Header_GetItemCount(hListViewHeader); for (int nIndex = 0; nIndex < nColCount; nIndex++) { HDITEM hi; // I only need to retrieve the format if i'm on windows xp. If not, then i need to retrieve the bitmap also. hi.mask = HDI_FORMAT | (isCommonControlVersion6 ? 0 : HDI_BITMAP); Header_GetItem(hListViewHeader, nIndex, &hi); // Set sort image to this column if(nIndex == nColIndex) { // Windows xp has a easier way to show the sort order in the header: i just have to set a flag and windows will do the drawing. No windows xp, no easy way. if (isCommonControlVersion6) { hi.fmt &= ~(HDF_SORTDOWN|HDF_SORTUP); hi.fmt |= bListViewAscending ? HDF_SORTUP : HDF_SORTDOWN; } else { UINT bitmapID = bListViewAscending ? IDB_UPARROW : IDB_DOWNARROW; // If there's a bitmap, let's delete it. if (hi.hbm) DeleteObject(hi.hbm); hi.fmt |= HDF_BITMAP|HDF_BITMAP_ON_RIGHT; hi.hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(bitmapID), IMAGE_BITMAP, 0,0, LR_LOADMAP3DCOLORS); } } else { // Remove sort image (if exists) from other columns. if (isCommonControlVersion6) { hi.fmt &= ~(HDF_SORTDOWN|HDF_SORTUP); } else { // If there's a bitmap, let's delete it. if (hi.hbm) DeleteObject(hi.hbm); // Remove flags that tell windows to look for a bitmap. hi.mask &= ~HDI_BITMAP; hi.fmt &= ~(HDF_BITMAP|HDF_BITMAP_ON_RIGHT); } } Header_SetItem(hListViewHeader, nIndex, &hi); } }
void CManageBookmarksDialog::OnRClick(NMHDR *pnmhdr) { HWND hListView = GetDlgItem(m_hDlg,IDC_MANAGEBOOKMARKS_LISTVIEW); HWND hTreeView = GetDlgItem(m_hDlg,IDC_MANAGEBOOKMARKS_TREEVIEW); if(pnmhdr->hwndFrom == hListView) { OnListViewRClick(); } else if(pnmhdr->hwndFrom == ListView_GetHeader(hListView)) { OnListViewHeaderRClick(); } else if(pnmhdr->hwndFrom == hTreeView) { } }
void MainWindow::OnSize(UINT state, int cx, int cy) { HWND hWndControl = GetDlgItem(handle(), IDC_VARIABLES_STATIC); ::MoveWindow(hWndControl, 10, 10, 96, 20, TRUE); ::MoveWindow(m_hWndVariables, 10, 30, 96, 20, TRUE); hWndControl = GetDlgItem(handle(), IDC_MODE_STATIC); ::MoveWindow(hWndControl, 10, 55, 96, 20, TRUE); ::MoveWindow(m_hWndFunction, 10, 75, 96, 20, TRUE); ::MoveWindow(m_hWndMinterms, 10, 75, 96, 20, TRUE); ::MoveWindow(m_hWndMaxterms, 10, 75, 96, 20, TRUE); ::MoveWindow(m_hWndGenerate, 10, 105, 64, 32, TRUE); ::MoveWindow(m_hWndTable, 128, 10, cx - 128 - 10, cy - 10 - 10, TRUE); ListView_SetColumnWidth(m_hWndTable, Header_GetItemCount(ListView_GetHeader(m_hWndTable)) - 1, LVSCW_AUTOSIZE_USEHEADER); }
//***************************************************************************** void CVListView::set_header_text(uint idx, char *msg) { HWND hwndHeader = ListView_GetHeader(hwndVListView); if (hwndHeader) { HDITEM item; item.mask = HDI_TEXT ; #ifdef UNICODE item.pszText = ascii2unicode(msg) ; item.cchTextMax = _tcslen(item.pszText) ; #else item.pszText = msg ; item.cchTextMax = strlen(msg) ; #endif item.fmt = HDF_STRING | HDF_CENTER ; Header_SetItem(hwndHeader, idx, &item); //lint !e522 } else { //lint !e550 Symbol 'item' (line 753) not accessed syslog("ListView_GetHeader: %s\n", get_system_message()) ; } }
/** * @param hwndList - list view control. * @param iImage - image index. */ void CListViewOrder::SetSortImage(HWND hwndList, int iImage) { _ASSERTE(m_iColumnNumber >= 0); HWND hwndHeader = ListView_GetHeader(hwndList); HDITEM hdi; ZeroMemory(&hdi, sizeof(hdi)); if (iImage >= 0) { hdi.mask = HDI_FORMAT | HDI_IMAGE; hdi.iImage = iImage; hdi.fmt = HDF_LEFT | HDF_STRING | HDF_IMAGE; } else { hdi.mask = HDI_FORMAT; hdi.fmt = HDF_LEFT | HDF_STRING; } Header_SetItem(hwndHeader, m_iColumnNumber, &hdi); }
BOOL ListView_SortEx(HWND hListView, int iSortingColumn, int iSortedColumn) { HWND hHeader; HDITEM hColumn; BOOL bSortAsc; Sort sort; if ((GetWindowLongPtr(hListView, GWL_STYLE) & ~LVS_NOSORTHEADER) == 0) return TRUE; hHeader = ListView_GetHeader(hListView); SecureZeroMemory(&hColumn, sizeof(hColumn)); if ( (iSortedColumn != -1) && (iSortedColumn != iSortingColumn) ) { hColumn.mask = HDI_FORMAT | HDI_LPARAM; Header_GetItem(hHeader, iSortedColumn, &hColumn); hColumn.fmt &= ~HDF_SORTUP & ~HDF_SORTDOWN; hColumn.lParam = 0; // 0: deactivated, 1: false, 2: true. Header_SetItem(hHeader, iSortedColumn, &hColumn); } hColumn.mask = HDI_FORMAT | HDI_LPARAM; Header_GetItem(hHeader, iSortingColumn, &hColumn); bSortAsc = !(hColumn.lParam == 2); // 0: deactivated, 1: false, 2: true. hColumn.fmt &= (bSortAsc ? ~HDF_SORTDOWN : ~HDF_SORTUP ); hColumn.fmt |= (bSortAsc ? HDF_SORTUP : HDF_SORTDOWN); hColumn.lParam = (LPARAM)(bSortAsc ? 2 : 1); Header_SetItem(hHeader, iSortingColumn, &hColumn); /* Sort the list */ sort.bSortAsc = bSortAsc; sort.hList = hListView; sort.nClickedColumn = iSortingColumn; return ListView_SortItemsEx(hListView, SortListView, (LPARAM)&sort); }
// put the arrow on the new sort column static void Picker_ResetHeaderSortIcon(HWND hwndPicker) { struct PickerInfo *pPickerInfo; HWND hwndHeader; HD_ITEM hdi; int i = 0, nViewColumn = 0; BOOL res = 0; pPickerInfo = GetPickerInfo(hwndPicker); hwndHeader = ListView_GetHeader(hwndPicker); // take arrow off non-current columns hdi.mask = HDI_FORMAT; hdi.fmt = HDF_STRING; for (i = 0; i < pPickerInfo->nColumnCount; i++) { if (i != pPickerInfo->pCallbacks->pfnGetSortColumn()) res = Header_SetItem(hwndHeader, Picker_GetViewColumnFromRealColumn(hwndPicker, i), &hdi); } if (GetUseXPControl()) { // use built in sort arrows hdi.mask = HDI_FORMAT; hdi.fmt = HDF_STRING | (pPickerInfo->pCallbacks->pfnGetSortReverse() ? HDF_SORTDOWN : HDF_SORTUP); } else { // put our arrow icon next to the text hdi.mask = HDI_FORMAT | HDI_IMAGE; hdi.fmt = HDF_STRING | HDF_IMAGE | HDF_BITMAP_ON_RIGHT; hdi.iImage = pPickerInfo->pCallbacks->pfnGetSortReverse() ? 1 : 0; } nViewColumn = Picker_GetViewColumnFromRealColumn(hwndPicker, pPickerInfo->pCallbacks->pfnGetSortColumn()); res = Header_SetItem(hwndHeader, nViewColumn, &hdi); res++; }
void VDUISaveListViewColumnsW32(HWND hwnd, const char *name) { HWND hwndHeader = ListView_GetHeader(hwnd); int count = Header_GetItemCount(hwndHeader); vdfastvector<float> widths(count); int sum = 0; for(int i=0; i<count; ++i) { int w = ListView_GetColumnWidth(hwnd, i); widths[i] = (float)w; sum += w; } if (sum > 0) { float invsum = 1.0f / sum; for(int i=0; i<count; ++i) widths[i] *= invsum; VDRegistryAppKey key("Window Placement"); key.setBinary(name, (const char *)widths.data(), count*sizeof(float)); } }