/* * FindDlgHandleNotify * * Purpose: * * WM_NOTIFY processing for FindDlg listview. * */ VOID FindDlgHandleNotify( LPNMLISTVIEW nhdr ) { INT c, k; LPWSTR lpItemText; LVCOLUMN col; if (nhdr == NULL) return; if (nhdr->hdr.idFrom != ID_SEARCH_LIST) return; switch (nhdr->hdr.code) { case LVN_ITEMCHANGED: if (!(nhdr->uNewState & LVIS_SELECTED)) break; lpItemText = supGetItemText(nhdr->hdr.hwndFrom, nhdr->iItem, 0, NULL); if (lpItemText) { ListToObject(lpItemText); HeapFree(GetProcessHeap(), 0, lpItemText); } break; case LVN_COLUMNCLICK: bFindDlgSortInverse = !bFindDlgSortInverse; FindDlgSortColumn = ((NMLISTVIEW *)nhdr)->iSubItem; ListView_SortItemsEx(FindDlgList, &FindDlgCompareFunc, FindDlgSortColumn); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; for (c = 0; c < 2; c++) ListView_SetColumn(FindDlgList, c, &col); k = ImageList_GetImageCount(ListViewImages); if (bFindDlgSortInverse) col.iImage = k - 2; else col.iImage = k - 1; ListView_SetColumn(FindDlgList, ((NMLISTVIEW *)nhdr)->iSubItem, &col); break; default: break; } }
static void ResizeListViewColumns(void) { RECT r; LV_COLUMN lvC; GetPropsTabRect(&r); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM ; lvC.cx = (r.right - r.left) / 2; lvC.iSubItem = 0; ListView_SetColumn(lvwindow, 0, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM; lvC.cx = (r.right - r.left) / 2; lvC.iSubItem = 1; ListView_SetColumn(lvwindow, 1, &lvC); }
void TableViewImpl::setColumn(int c, ColumnProperties columnProp) { LVCOLUMNW lvc = propertiesToColumn(c,columnProp); if( ListView_SetColumn(hWnd,c,&lvc) == FALSE ) { log::error("ListView_SetColumn returned FALSE for hWnd ",hWnd); } }
/* ** Resizes window and repositions controls. ** */ void CDialogAbout::CTabLog::Resize(int w, int h) { SetWindowPos(m_Window, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER); RECT r; HWND item = GetDlgItem(m_Window, IDC_ABOUTLOG_ERROR_CHECKBOX); GetClientRect(item, &r); SetWindowPos(item, NULL, 0, h - r.bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetDlgItem(m_Window, IDC_ABOUTLOG_WARNING_CHECKBOX); SetWindowPos(item, NULL, r.right, h - r.bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetDlgItem(m_Window, IDC_ABOUTLOG_NOTICE_CHECKBOX); SetWindowPos(item, NULL, r.right * 2, h - r.bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetDlgItem(m_Window, IDC_ABOUTLOG_DEBUG_CHECKBOX); SetWindowPos(item, NULL, r.right * 3, h - r.bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetDlgItem(m_Window, IDC_ABOUTLOG_ITEMS_LISTVIEW); SetWindowPos(item, NULL, 0, 0, w, h - r.bottom - 7, SWP_NOMOVE | SWP_NOZORDER); // Adjust third colum LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = w - 183; ListView_SetColumn(item, 2, &lvc); }
// Update a scaled column in the listview void UpdateColumn(HWND hwnd, int nCol, int nWidth) { // Set column LVCOLUMN col; col.cx = nWidth; col.mask = LVCF_WIDTH; ListView_SetColumn(hwnd, nCol, &col); }
/* * PNDlgHandleNotify * * Purpose: * * WM_NOTIFY processing for PNDialog listview. * */ VOID PNDlgHandleNotify( LPNMLISTVIEW nhdr ) { LVCOLUMNW col; INT c, k; if (nhdr == NULL) return; if (nhdr->hdr.idFrom != ID_NAMESPACELIST) return; switch (nhdr->hdr.code) { case LVN_COLUMNCLICK: PnDlgContext.bInverseSort = !PnDlgContext.bInverseSort; PnDlgContext.lvColumnToSort = ((NMLISTVIEW *)nhdr)->iSubItem; ListView_SortItemsEx(PnDlgContext.ListView, &PNListCompareFunc, PnDlgContext.lvColumnToSort); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; for (c = 0; c < PnDlgContext.lvColumnCount; c++) ListView_SetColumn(PnDlgContext.ListView, c, &col); k = ImageList_GetImageCount(ListViewImages); if (PnDlgContext.bInverseSort) col.iImage = k - 2; else col.iImage = k - 1; ListView_SetColumn(PnDlgContext.ListView, ((NMLISTVIEW *)nhdr)->iSubItem, &col); break; default: break; } }
/* * PipeDlgHandleNotify * * Purpose: * * WM_NOTIFY processing for Pipe Dialog listview. * */ VOID PipeDlgHandleNotify( LPARAM lParam ) { LVCOLUMN col; LPNMHDR nhdr = (LPNMHDR)lParam; if (nhdr == NULL) return; if (nhdr->idFrom != ID_PIPESLIST) return; switch (nhdr->code) { case LVN_COLUMNCLICK: PipeDlgContext.bInverseSort = !PipeDlgContext.bInverseSort; ListView_SortItemsEx(PipeDlgContext.ListView, &PipeDlgCompareFunc, 0); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; ListView_SetColumn(PipeDlgContext.ListView, 0, &col); if (PipeDlgContext.bInverseSort) col.iImage = 1; else col.iImage = 2; ListView_SetColumn(PipeDlgContext.ListView, 0, &col); break; case NM_DBLCLK: PipeDlgShowProperties(((LPNMITEMACTIVATE)lParam)->iItem); break; default: break; } }
/* ** Resizes window and repositions controls. ** */ void CDialogAbout::CTabPlugins::Resize(int w, int h) { SetWindowPos(m_Window, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER); HWND item = GetDlgItem(m_Window, IDC_ABOUTPLUGINS_ITEMS_LISTVIEW); SetWindowPos(item, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER); // Adjust third colum LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = w - 242; ListView_SetColumn(item, 2, &lvc); }
/* ** Resizes window and repositions controls. ** */ void DialogAbout::TabPlugins::Resize(int w, int h) { SetWindowPos(m_Window, nullptr, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER); HWND item = GetControl(Id_ItemsListView); SetWindowPos(item, nullptr, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER); // Adjust third colum LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = w - 20 - (ListView_GetColumnWidth(item, 0) + ListView_GetColumnWidth(item, 1)); ListView_SetColumn(item, 2, &lvc); }
/* ** Resizes window and repositions controls. ** */ void CDialogAbout::CTabSkins::Resize(int w, int h) { SetWindowPos(m_Window, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER); HWND item = GetDlgItem(m_Window, IDC_ABOUTSKINS_ITEMS_LISTBOX); int wList = (w < 650) ? (w - 373) : 277; SetWindowPos(item, NULL, 0, 0, wList, h, SWP_NOMOVE | SWP_NOZORDER); item = GetDlgItem(m_Window, IDC_ABOUTSKINS_ITEMS_LISTVIEW); SetWindowPos(item, NULL, (w < 650) ? (w - 365) : 285, 0, w - wList - 10, h, SWP_NOZORDER); // Adjust third column LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = w - wList - 243; ListView_SetColumn(item, 2, &lvc); }
void DoSort(INT iColumn, BOOL bAscendant = TRUE) { LV_COLUMN Column; ZeroMemory(&Column, sizeof(Column)); Column.mask = LVCF_IMAGE | LVCF_SUBITEM; Column.iImage = 2; Column.iSubItem = 0; ListView_SetColumn(g_hListView, 0, &Column); Column.iSubItem = 1; ListView_SetColumn(g_hListView, 1, &Column); switch (iColumn) { case 0: Column.iSubItem = 0; if (bAscendant) { std::sort(g_Items.begin(), g_Items.end(), ItemCompareByNameAscend); Column.iImage = 0; ListView_SetColumn(g_hListView, 0, &Column); } else { std::sort(g_Items.begin(), g_Items.end(), ItemCompareByNameDescend); Column.iImage = 1; ListView_SetColumn(g_hListView, 0, &Column); } break; case 1: Column.iSubItem = 1; if (bAscendant) { std::sort(g_Items.begin(), g_Items.end(), ItemCompareBySubAscend); Column.iImage = 0; ListView_SetColumn(g_hListView, 1, &Column); } else { std::sort(g_Items.begin(), g_Items.end(), ItemCompareBySubDescend); Column.iImage = 1; ListView_SetColumn(g_hListView, 1, &Column); } break; } g_iSortColumn = iColumn; g_bSortAscendant = bAscendant; InvalidateRect(g_hListView, NULL, TRUE); }
static void setlayout(struct datawindow_priv *datawindow) { LVCOLUMN lvc; lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; RECT winrect; GetWindowRect (datawindow->hwndList, &winrect); lvc.iSubItem = 1; lvc.cx = (winrect.right - winrect.left) - 52 ; lvc.fmt = LVCFMT_LEFT; // left-aligned column switch (datawindow->currentSearchState) { case attr_country_name: { Edit_SetText(datawindow->hwndLabel, TEXT("Country")); lvc.pszText = TEXT("Country"); } break; case attr_town_name: { Edit_SetText(datawindow->hwndLabel, TEXT("Postal or Town")); lvc.pszText = TEXT("Town"); } break; case attr_street_name: { Edit_SetText(datawindow->hwndLabel, TEXT("Street")); lvc.pszText = TEXT("Street"); } break; default: break; } (void)ListView_SetColumn(datawindow->hwndList, 1, &lvc); Edit_SetText(datawindow->hwndEdit, TEXT("")); SetFocus(datawindow->hwndEdit); }
/* ** Resizes window and repositions controls. ** */ void DialogAbout::TabLog::Resize(int w, int h) { SetWindowPos(m_Window, nullptr, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER); // FIXME: Temporary hack. short buttonWidth = (short)_wtoi(GetString(ID_STR_NUM_BUTTONWIDTH)); RECT r; LONG bottom; HWND item = GetControl(Id_ClearButton); GetClientRect(item, &r); bottom = r.bottom; SetWindowPos(item, nullptr, w - r.right, h - bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetControl(Id_ErrorCheckBox); GetClientRect(item, &r); SetWindowPos(item, nullptr, 0, h - bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetControl(Id_WarningCheckBox); SetWindowPos(item, nullptr, r.right, h - bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetControl(Id_NoticeCheckBox); SetWindowPos(item, nullptr, r.right * 2, h - bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetControl(Id_DebugCheckBox); SetWindowPos(item, nullptr, r.right * 3, h - bottom, 0, 0, SWP_NOSIZE | SWP_NOZORDER); item = GetControl(Id_ItemsListView); SetWindowPos(item, nullptr, 0, 0, w, h - bottom - 10, SWP_NOMOVE | SWP_NOZORDER); // Adjust 4th colum LVCOLUMN lvc; lvc.mask = LVCF_WIDTH; lvc.cx = w - 20 - (ListView_GetColumnWidth(item, 0) + ListView_GetColumnWidth(item, 1) + ListView_GetColumnWidth(item, 2)); ListView_SetColumn(item, 3, &lvc); }
BOOL CXTPHeaderCtrl::SetAlingment(int nFlag) { int iIndex = HitTest(m_pt); if (iIndex != -1) { CWnd* pParentWnd = GetParent(); if (pParentWnd && ( pParentWnd->IsKindOf(RUNTIME_CLASS(CListCtrl)) || pParentWnd->IsKindOf(RUNTIME_CLASS(CListView)))) { LVCOLUMN lvc; lvc.mask = LVCF_FMT; ListView_GetColumn(pParentWnd->m_hWnd, iIndex, &lvc); lvc.fmt &= ~LVCFMT_JUSTIFYMASK; lvc.fmt |= nFlag; ListView_SetColumn(pParentWnd->m_hWnd, iIndex, &lvc); ListView_SetWorkAreas(pParentWnd->m_hWnd, 0, NULL); } } return FALSE; }
/* * DesktopListHandleNotify * * Purpose: * * WM_NOTIFY processing for Desktop page listview. * */ VOID DesktopListHandleNotify( HWND hwndDlg, LPNMLISTVIEW nhdr ) { LVCOLUMNW col; INT c; SIZE_T sz, i, l; LPWSTR lpItemText, lpName; if (nhdr == NULL) { return; } if (nhdr->hdr.idFrom != ID_DESKTOPSLIST) { return; } switch (nhdr->hdr.code) { case LVN_COLUMNCLICK: bDesktopListSortInverse = !bDesktopListSortInverse; DesktopListSortColumn = ((NMLISTVIEW *)nhdr)->iSubItem; ListView_SortItemsEx(DesktopList, &DesktopListCompareFunc, DesktopListSortColumn); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; for (c = 0; c < 3; c++) { ListView_SetColumn(DesktopList, c, &col); } if (bDesktopListSortInverse) col.iImage = 1; else col.iImage = 2; ListView_SetColumn(DesktopList, ((NMLISTVIEW *)nhdr)->iSubItem, &col); break; case NM_DBLCLK: /* * A very basic support for this type * desktop described by win32k PDESKTOP structure which is totally undocumented */ sz = 0; lpItemText = supGetItemText(DesktopList, ListView_GetSelectionMark(DesktopList), 0, &sz); if (lpItemText) { l = 0; for (i = 0; i<sz; i++) if (lpItemText[i] == L'\\') l = i + 1; lpName = &lpItemText[l]; //hwndDlg set to mainwindow on purpose propCreateDialog(hwndDlg, lpName, T_ObjectNames[TYPE_DESKTOP], NULL); HeapFree(GetProcessHeap(), 0, lpItemText); } break; default: break; } }
BOOLEAN PhLoadListViewColumnSettings( _In_ HWND ListViewHandle, _In_ PPH_STRING Settings ) { #define ORDER_LIMIT 50 PH_STRINGREF remainingPart; ULONG columnIndex; ULONG orderArray[ORDER_LIMIT]; // HACK, but reasonable limit ULONG maxOrder; ULONG scale; if (Settings->Length == 0) return FALSE; remainingPart = Settings->sr; columnIndex = 0; memset(orderArray, 0, sizeof(orderArray)); maxOrder = 0; if (remainingPart.Length != 0 && remainingPart.Buffer[0] == '@') { PH_STRINGREF scalePart; ULONG64 integer; PhSkipStringRef(&remainingPart, sizeof(WCHAR)); PhSplitStringRefAtChar(&remainingPart, '|', &scalePart, &remainingPart); if (scalePart.Length == 0 || !PhStringToInteger64(&scalePart, 10, &integer)) return FALSE; scale = (ULONG)integer; } else { scale = PhGlobalDpi; } while (remainingPart.Length != 0) { PH_STRINGREF columnPart; PH_STRINGREF orderPart; PH_STRINGREF widthPart; ULONG64 integer; ULONG order; ULONG width; LVCOLUMN lvColumn; PhSplitStringRefAtChar(&remainingPart, '|', &columnPart, &remainingPart); if (columnPart.Length == 0) return FALSE; PhSplitStringRefAtChar(&columnPart, ',', &orderPart, &widthPart); if (orderPart.Length == 0 || widthPart.Length == 0) return FALSE; // Order if (!PhStringToInteger64(&orderPart, 10, &integer)) return FALSE; order = (ULONG)integer; if (order < ORDER_LIMIT) { orderArray[order] = columnIndex; if (maxOrder < order + 1) maxOrder = order + 1; } // Width if (!PhStringToInteger64(&widthPart, 10, &integer)) return FALSE; width = (ULONG)integer; if (scale != PhGlobalDpi && scale != 0) width = PhMultiplyDivide(width, PhGlobalDpi, scale); lvColumn.mask = LVCF_WIDTH; lvColumn.cx = width; ListView_SetColumn(ListViewHandle, columnIndex, &lvColumn); columnIndex++; } ListView_SetColumnOrderArray(ListViewHandle, maxOrder, orderArray); return TRUE; }
LRESULT CALLBACK BrowseProc(HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { static HFONT font; LV_ITEM item; POINT pt; LV_COLUMN lvC; RECT r; int i; LPNMHDR nmh; static LVITEM pressed; switch (iMessage) { case WM_USER+1: { DWINFO info; char *q; memset(&info,0, sizeof(info)); strcpy(info.dwName, browselist[pressed.lParam]->file); q = strrchr(info.dwName, '\\'); if (q) strcpy(info.dwTitle, q + 1); else strcpy(info.dwTitle, info.dwName); info.dwLineNo = TagNewLine(browselist[pressed.lParam]->file, browselist[pressed.lParam]->line); info.logMRU = FALSE; info.newFile = FALSE; CreateDrawWindow(&info, TRUE); break; } case WM_CTLCOLORSTATIC: { return (LRESULT)(HBRUSH)(COLOR_INACTIVECAPTION + 1); } case WM_CTLCOLORBTN: { return (LRESULT)GetStockObject(NULL_BRUSH); } case WM_NOTIFY: nmh = (LPNMHDR)lParam; if (nmh->code == NM_SETFOCUS) { PostMessage(hwndFrame, WM_REDRAWTOOLBAR, 0, 0); SendMessage(GetParent(hwnd), WM_ACTIVATEME, 0, 0); } else if (nmh->code == LVN_GETDISPINFO) { LV_DISPINFO *p = (LV_DISPINFO *)lParam; char name[512] = "", *q; switch (p->item.iSubItem) { case 1: /* id*/ sprintf(name,"%d", p->item.lParam +1); break; case 2: /*name*/ strcpy(name, browselist[p->item.lParam]->name); break; case 3: /* browse */ sprintf(name, "%d", browselist[p->item.lParam]->line); break; case 4: /*file*/ q = strrchr(browselist[p->item.lParam]->file, '\\'); if (!q) q = browselist[p->item.lParam]->file; else q++; strcpy(name, q); break; } if (name[0]) { p->item.mask |= LVIF_TEXT | LVIF_DI_SETITEM; p->item.mask &= ~LVIF_STATE; p->item.pszText = name; } } else if (((LPNMHDR)lParam)->code == NM_DBLCLK) { LVHITTESTINFO hittest; GetCursorPos(&hittest.pt); ScreenToClient(hwndLV, &hittest.pt); if (ListView_SubItemHitTest(hwndLV, &hittest) >= 0) { LVITEM lvitem; lvitem.iItem = hittest.iItem; lvitem.iSubItem = 0; lvitem.mask = LVIF_PARAM; ListView_GetItem(hwndLV, &lvitem); memcpy(&pressed, &lvitem, sizeof(pressed)); SendMessage(hwnd, WM_USER + 1, 0, 0); } } else if (nmh->code == LVN_KEYDOWN) { switch (((LPNMLVKEYDOWN)lParam)->wVKey) { case 'C': if (GetKeyState(VK_CONTROL) &0x80000000) { CopyText(hwnd); } break; case VK_UP: if (curSel > 0) SendMessage(hwnd, WM_USER, curSel-1, 0); break; case VK_DOWN: if (curSel < ListView_GetItemCount(hwndLV) - 1) SendMessage(hwnd, WM_USER, curSel + 1, 0); break; } } break; case WM_COMMAND: switch(wParam) { case IDC_RETURN: GetWindowText(hwndEdit, brsName, sizeof(brsName)); SendMessage(hwndCombo, WM_SAVEHISTORY, 0, 0); CreateUsageList(); return 0; case IDC_ESCAPE: SendMessage(hwndEdit, WM_SETTEXT, 0, (LPARAM)brsName); return 0; default: if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 300) { displayFull = !displayFull; PostMessage(hwnd, WM_USER, 0, 0); } if (HIWORD(wParam) == CBN_SELENDOK && LOWORD(wParam) == 500) { PostMessage(hwnd, WM_COMMAND, IDC_RETURN, 0); } break; } break; case WM_USER: { int k = 0; char buf[40]; sprintf(buf, "%d Usages", browsecount); SetWindowText(hwndButton, buf); ListView_DeleteAllItems(hwndLV); memset(&item, 0, sizeof(item)); for (i=0; i < browsecount; i++) { if (displayFull || browselist[i]->definition || browselist[i]->declaration) { item.iItem = k++; item.iSubItem = 0; item.mask = LVIF_IMAGE | LVIF_PARAM; item.lParam = i; item.iImage = browselist[i]->definition ? 0 : browselist[i]->declaration ? 1 : 2; ListView_InsertItem(hwndLV, &item); } } } break; case WM_DRAWITEM: { LPDRAWITEMSTRUCT pDis = (LPDRAWITEMSTRUCT)lParam; HDC memdc; char staticText[256]; BOOL state = !! displayFull; int len = SendMessage(pDis->hwndItem, WM_GETTEXT, sizeof(staticText), (LPARAM)staticText); SIZE sz; RECT r; POINT textpos, iconpos; GetClientRect(pDis->hwndItem, &r); GetTextExtentPoint32(pDis->hDC, staticText, len, &sz); SetBkMode(pDis->hDC, TRANSPARENT); iconpos.x = 4; iconpos.y = (r.bottom - r.top - 16)/2; textpos.x = r.right - 4 - sz.cx; textpos.y = (r.bottom - r.top - sz.cy)/2; DrawFrameControl(pDis->hDC, &pDis->rcItem, DFC_BUTTON, DFCS_BUTTONPUSH | (state ? DFCS_PUSHED : 0)); TextOut(pDis->hDC, pDis->rcItem.left+ textpos.x, pDis->rcItem.top+textpos.y, staticText, len); memdc = CreateCompatibleDC(pDis->hDC); SelectObject(memdc, buttonbmp); TransparentBlt(pDis->hDC, pDis->rcItem.left+ iconpos.x, pDis->rcItem.top+iconpos.y, 16, 16, memdc, 0, 0, 16, 16, 0xc0c0c0); DeleteDC(memdc); } return 0; case WM_CREATE: hwndBrowse = hwnd; GetClientRect(hwnd, &r); hwndBackground = CreateWindow("static", "", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 0,0, r.right - r.bottom, BUTTONHEIGHT + 4, hwnd, 0, hInstance, 0); hwndButton = CreateWindow("button", "0 Usages", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 2,2,BUTTONWIDTH,BUTTONHEIGHT, hwnd, (HMENU)300, hInstance, 0); ApplyDialogFont(hwndButton); hwndCombo = CreateWindow("COMBOBOX", "", WS_CHILD + WS_CLIPSIBLINGS + WS_BORDER + WS_VISIBLE + CBS_DROPDOWN + CBS_AUTOHSCROLL, BUTTONWIDTH + 10, 4, 200, 100, hwnd, (HMENU)500, hInstance, 0); ApplyDialogFont(hwndCombo); SubClassHistoryCombo(hwndCombo); SendMessage(hwndCombo, WM_SETHISTORY, 0, (LPARAM)varinfohist); pt.x = pt.y = 5; hwndEdit = ChildWindowFromPoint(hwndCombo, pt); oldproc = (WNDPROC)SetWindowLong(hwndEdit, GWL_WNDPROC, (int)EditHook); BringWindowToTop(hwndButton); BringWindowToTop(hwndCombo); font = CreateFontIndirect(&systemDialogFont); SendMessage(hwndErrButton, WM_SETFONT, (WPARAM)font, 0); SendMessage(hwndWarnButton, WM_SETFONT, (WPARAM)font, 0); hwndLV = CreateWindowEx(0, WC_LISTVIEW, "", LVS_REPORT | LVS_SINGLESEL | WS_CHILD | WS_VISIBLE | WS_BORDER, 0,BUTTONHEIGHT + 4,r.right-r.left, r.bottom - r.top-BUTTONHEIGHT-4, hwnd, 0, hInstance, 0); ListView_SetExtendedListViewStyle(hwndLV, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER); ApplyDialogFont(hwndLV); GetWindowRect(hwndLV, &r); lvC.mask = LVCF_WIDTH; lvC.cx = 50; lvC.iSubItem = 0; ListView_InsertColumn(hwndLV, 0, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 50; lvC.iSubItem = 1; lvC.pszText = "Id"; ListView_InsertColumn(hwndLV, 1, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 250; lvC.iSubItem = 2; lvC.pszText = "Name"; ListView_InsertColumn(hwndLV, 2, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = 50; lvC.iSubItem = 3; lvC.pszText = "Line"; ListView_InsertColumn(hwndLV, 3, &lvC); lvC.mask = LVCF_WIDTH | LVCF_SUBITEM | LVCF_TEXT; lvC.cx = r.right - r.left - 375; lvC.iSubItem = 4; lvC.pszText = "File"; ListView_InsertColumn(hwndLV, 4, &lvC); ListView_SetImageList(hwndLV, tagImageList, LVSIL_SMALL); break; case WM_RESETHISTORY: SendMessage(hwndCombo, WM_SETHISTORY, 0, (LPARAM)varinfohist); break; case WM_SIZE: r.left = r.top = 0; r.right = LOWORD(lParam); r.bottom = HIWORD(lParam); MoveWindow(hwndLV, r.left, r.top+BUTTONHEIGHT + 4, r.right - r.left, r.bottom - r.top-BUTTONHEIGHT - 4, 1); MoveWindow(hwndBackground, r.left, r.top, r.right - r.left, BUTTONHEIGHT + 4, 1); lvC.mask = LVCF_WIDTH; lvC.cx = r.right - r.left - 375; ListView_SetColumn(hwndLV, 4, &lvC); break; case WM_DESTROY: hwndBrowse = 0; break; case WM_SETFOCUS: break; case WM_KILLFOCUS: break; } return DefWindowProc(hwnd, iMessage, wParam, lParam); }
void CAddTracksDialog::OnInitDialog() { if (NULL == m_pModPlaylist) { PostMessage(m_hwndDlg, WM_COMMAND, IDCANCEL, 0); return; } m_hwndTitle = GetDlgItem(m_hwndDlg, IDC_ADD_TRACKS); m_hwndTrackList = GetDlgItem(m_hwndDlg, IDC_TRACK_LIST); // // Check to see if the screen is small // if (g_bSmallScreen) { RECT rcWorkArea; RECT rcWnd, rcList; GetWindowRect(m_hwndDlg, &rcWnd); GetWindowRect(m_hwndTrackList, &rcList); if (!SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0)) { HDC hdc = ::GetDC(NULL); rcWorkArea.left = 0; rcWorkArea.top = 0; rcWorkArea.right = GetDeviceCaps(hdc, HORZRES); rcWorkArea.bottom = GetDeviceCaps(hdc, VERTRES) - GetSystemMetrics(SM_CYMENU); ::ReleaseDC(NULL, hdc); } MoveWindow(m_hwndDlg, rcWorkArea.left, rcWorkArea.top, rcWorkArea.right, rcWorkArea.bottom, TRUE); rcWorkArea.left += rcList.left - rcWnd.left; rcWorkArea.right -= rcList.left - rcWnd.left; rcWorkArea.right += rcList.right - rcWnd.right - 2*GetSystemMetrics(SM_CXDLGFRAME); rcWorkArea.top += rcList.top - rcWnd.top - GetSystemMetrics(SM_CYCAPTION); rcWorkArea.bottom -= rcList.top - rcWnd.top; rcWorkArea.bottom += rcList.bottom - rcWnd.bottom; MoveWindow(m_hwndTrackList, rcWorkArea.left, rcWorkArea.top, rcWorkArea.right, rcWorkArea.bottom, TRUE); } ListView_SetExtendedListViewStyle(m_hwndTrackList, LVS_EX_CHECKBOXES); HRESULT hr; hr = CreateBars(); if (FAILED(hr)) { return; } if (m_himgLocationList) { ListView_SetImageList(m_hwndTrackList, m_himgLocationList, LVSIL_SMALL); } TCHAR szTitle[MAX_PATH]; ULONG cchTitleLength = SendMessage(m_hwndTitle, WM_GETTEXT, MAX_PATH, (LPARAM)szTitle); LPCTSTR pszShortName = NULL; if (NULL != m_pModPlaylist) { pszShortName = m_pModPlaylist->GetName(); } if (SUCCEEDED(hr) && NULL != pszShortName) { // cchTitleLength is the length of the string retrieved by WM_GETTEXT // to avoid overrunning szTitle, we limit the copy to the remaining room in the array StringCchCopy(&szTitle[cchTitleLength], MAX_PATH - cchTitleLength, pszShortName); szTitle[MAX_PATH - 1] = TEXT('\0'); } SendMessage(m_hwndTitle, WM_SETTEXT, 0, (LPARAM)szTitle); LVCOLUMN lvc; memset(&lvc, 0, sizeof (lvc)); lvc.mask = LVCF_FMT; lvc.fmt = LVCFMT_LEFT; ListView_InsertColumn(m_hwndTrackList, 0, &lvc); lvc.mask = LVCF_WIDTH | LVCF_FMT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.iSubItem = 1; lvc.cx = FILENAME_WIDTH; ListView_SetColumn(m_hwndTrackList, 0, &lvc); UpdateInfo(); SetFocus(m_hwndTrackList); }
BOOLEAN PhLoadListViewColumnSettings( _In_ HWND ListViewHandle, _In_ PPH_STRING Settings ) { #define ORDER_LIMIT 50 PH_STRINGREF remainingPart; ULONG columnIndex; ULONG orderArray[ORDER_LIMIT]; // HACK, but reasonable limit ULONG maxOrder; if (Settings->Length == 0) return FALSE; remainingPart = Settings->sr; columnIndex = 0; memset(orderArray, 0, sizeof(orderArray)); maxOrder = 0; while (remainingPart.Length != 0) { PH_STRINGREF columnPart; PH_STRINGREF orderPart; PH_STRINGREF widthPart; ULONG64 integer; ULONG order; LVCOLUMN lvColumn; PhSplitStringRefAtChar(&remainingPart, '|', &columnPart, &remainingPart); if (columnPart.Length == 0) return FALSE; PhSplitStringRefAtChar(&columnPart, ',', &orderPart, &widthPart); if (orderPart.Length == 0 || widthPart.Length == 0) return FALSE; // Order if (!PhStringToInteger64(&orderPart, 10, &integer)) return FALSE; order = (ULONG)integer; if (order < ORDER_LIMIT) { orderArray[order] = columnIndex; if (maxOrder < order + 1) maxOrder = order + 1; } // Width if (!PhStringToInteger64(&widthPart, 10, &integer)) return FALSE; lvColumn.mask = LVCF_WIDTH; lvColumn.cx = (ULONG)integer; ListView_SetColumn(ListViewHandle, columnIndex, &lvColumn); columnIndex++; } ListView_SetColumnOrderArray(ListViewHandle, maxOrder, orderArray); return TRUE; }
/* * MainWindowHandleWMNotify * * Purpose: * * Main window WM_NOTIFY handler. * */ LRESULT MainWindowHandleWMNotify( _In_ HWND hwnd, _In_ WPARAM wParam, _In_ LPARAM lParam ) { INT c, k; LPNMHDR hdr = (LPNMHDR)lParam; LPTOOLTIPTEXT lpttt; LPNMLISTVIEW lvn; LPNMTREEVIEW lpnmTreeView; LPWSTR str; SIZE_T lcp; LVITEM lvitem; LVCOLUMN col; TVHITTESTINFO hti; POINT pt; WCHAR item_string[MAX_PATH + 1]; UNREFERENCED_PARAMETER(wParam); if (hdr) { if (hdr->hwndFrom == g_hwndObjectTree) { switch (hdr->code) { case TVN_ITEMEXPANDED: case TVN_SELCHANGED: SetFocus(g_hwndObjectTree); supSetWaitCursor(TRUE); MainWindowTreeViewSelChanged((LPNMTREEVIEWW)lParam); SendMessage(hwndStatusBar, WM_SETTEXT, 0, (LPARAM)g_WinObj.CurrentObjectPath); ListObjectsInDirectory(g_WinObj.CurrentObjectPath); ListView_SortItemsEx(g_hwndObjectList, &MainWindowObjectListCompareFunc, SortColumn); supSetWaitCursor(FALSE); lpnmTreeView = (LPNMTREEVIEW)lParam; if (lpnmTreeView) { SelectedTreeItem = lpnmTreeView->itemNew.hItem; } break; case NM_RCLICK: GetCursorPos(&pt); hti.pt = pt; ScreenToClient(hdr->hwndFrom, &hti.pt); if (TreeView_HitTest(hdr->hwndFrom, &hti) && (hti.flags & (TVHT_ONITEM | TVHT_ONITEMRIGHT))) { SelectedTreeItem = hti.hItem; TreeView_SelectItem(g_hwndObjectTree, SelectedTreeItem); SendMessage(hwndStatusBar, WM_SETTEXT, 0, (LPARAM)g_WinObj.CurrentObjectPath); supHandleTreePopupMenu(hwnd, &pt); } break; } } if (hdr->hwndFrom == g_hwndObjectList) { switch (hdr->code) { case NM_SETFOCUS: if (ListView_GetSelectionMark(g_hwndObjectList) == -1) { lvitem.mask = LVIF_STATE; lvitem.iItem = 0; lvitem.state = LVIS_SELECTED | LVIS_FOCUSED; lvitem.stateMask = LVIS_SELECTED | LVIS_FOCUSED; ListView_SetItem(g_hwndObjectList, &lvitem); } break; case LVN_ITEMCHANGED: lvn = (LPNMLISTVIEW)lParam; RtlSecureZeroMemory(&item_string, sizeof(item_string)); ListView_GetItemText(g_hwndObjectList, lvn->iItem, 0, item_string, MAX_PATH); lcp = _strlen(g_WinObj.CurrentObjectPath); if (lcp) { str = supHeapAlloc((lcp + sizeof(item_string) + 4) * sizeof(WCHAR)); if (str == NULL) break; _strcpy(str, g_WinObj.CurrentObjectPath); if ((str[0] == '\\') && (str[1] == 0)) { _strcpy(str + lcp, item_string); } else { str[lcp] = '\\'; _strcpy(str + lcp + 1, item_string); } SendMessage(hwndStatusBar, WM_SETTEXT, 0, (LPARAM)str); supHeapFree(str); } break; //handle sort by column case LVN_COLUMNCLICK: bMainWndSortInverse = !bMainWndSortInverse; SortColumn = ((NMLISTVIEW *)lParam)->iSubItem; ListView_SortItemsEx(g_hwndObjectList, &MainWindowObjectListCompareFunc, SortColumn); RtlSecureZeroMemory(&col, sizeof(col)); col.mask = LVCF_IMAGE; col.iImage = -1; for (c = 0; c < 3; c++) ListView_SetColumn(g_hwndObjectList, c, &col); k = ImageList_GetImageCount(g_ListViewImages); if (bMainWndSortInverse) col.iImage = k - 2; else col.iImage = k - 1; ListView_SetColumn(g_hwndObjectList, ((NMLISTVIEW *)lParam)->iSubItem, &col); break; case NM_DBLCLK: MainWindowHandleObjectListProp(hwnd); break; default: break; } } //handle tooltip if (hdr->code == TTN_GETDISPINFO) { lpttt = (LPTOOLTIPTEXT)lParam; switch (lpttt->hdr.idFrom) { case ID_OBJECT_PROPERTIES: case ID_VIEW_REFRESH: case ID_FIND_FINDOBJECT: lpttt->hinst = g_WinObj.hInstance; lpttt->lpszText = MAKEINTRESOURCE(lpttt->hdr.idFrom); lpttt->uFlags |= TTF_DI_SETITEM; break; default: break; } } } return FALSE; }
void SortListView( HWND hListview, int iSubItem, LISTVIEW_COLUMN * ColumnList, bool Reverse ) { bool SortReversed = false; int PrevColumn = 0; // If column is negative then repeat the last sort if ( iSubItem < 0 ) { iSubItem = GetListViewSortColumn( ColumnList ); if ( iSubItem >= 0 ) SortListView( hListview, iSubItem, ColumnList, false ); return; } HCURSOR hSaveCursor = SetCursor( LoadCursor( NULL, IDC_WAIT ) ); // if sorting the same column twice in a row then reverse the sort order if ( ColumnList[ iSubItem ].SortDir == SORTDIR_UNDEF ) { // clicked on a new column for ( PrevColumn = 0; ColumnList[PrevColumn].Title; ++PrevColumn ) if ( ColumnList[PrevColumn].SortDir != SORTDIR_UNDEF ) break; ColumnList[PrevColumn].SortDir = SORTDIR_UNDEF; SortReversed = false; } else { // reverse sort direction if requested if ( Reverse ) SortReversed = ColumnList[ iSubItem ].SortDir == SORTDIR_UP; else SortReversed = ColumnList[ iSubItem ].SortDir != SORTDIR_UP; } ColumnList[ iSubItem ].SortDir = SortReversed ? SORTDIR_DOWN : SORTDIR_UP; // remove arrow from previously sorted column LVCOLUMN lvc; lvc.mask = LVCF_FMT; ListView_GetColumn( hListview, PrevColumn, &lvc ); lvc.fmt &= ~(LVCFMT_IMAGE | LVCFMT_COL_HAS_IMAGES | LVCFMT_BITMAP_ON_RIGHT); ListView_SetColumn( hListview, PrevColumn, &lvc ); // add arrow to sorted column lvc.mask = LVCF_FMT | LVCF_IMAGE; ListView_GetColumn( hListview, iSubItem, &lvc ); lvc.fmt |= LVCFMT_IMAGE | LVCFMT_COL_HAS_IMAGES | LVCFMT_BITMAP_ON_RIGHT; lvc.iImage = SortReversed ? LISTVIEW_IMG_DESCENDING : LISTVIEW_IMG_ASCENDING; ListView_SetColumn( hListview, iSubItem, &lvc ); // Perform sort LISTVIEW_SORT ctx; ctx.Column = iSubItem; ctx.ColumnList = ColumnList; ctx.hList = hListview; ctx.UsingEx = true; // Version 5.80 and later of Comctl32.dll BOOL ok = ListView_SortItemsEx( hListview, CompareListViewColumn, (LPARAM)&ctx ); if ( !ok ) { // Use old, slow way of sorting. ctx.UsingEx = false; ListView_SortItems( hListview, CompareListViewColumn, (LPARAM)&ctx ); } SetCursor( hSaveCursor ); }
LRESULT CALLBACK WndProcViewLog( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) { //LPNMHDR hdr; //TVITEM tvit; NMLVDISPINFO *lvdi; wchar_t buff[2048]; int buff_r; int buff_g; int buff_b; wchar_t* pos=0; DWORD dwStyle; UINT idButton; SCROLLBARINFO sbi; TBBUTTON tbButton={LOWORD(lParam)-70, 0, TBSTATE_ENABLED, BTNS_SEP, 0L, 0}; sbi.cbSize=sizeof(SCROLLBARINFO); switch(Msg) { case WM_DESTROY: mLogWnd[hWnd].exit = true; PostQuitMessage(0); break; break; case WM_COMMAND: if ((HWND)lParam==mLogWnd[hWnd].hToolBar) { switch (wParam) { case 123: //find button SendMessage(mLogWnd[hWnd].hFindText,WM_GETTEXT,2048,(LPARAM)buff); mLogWnd[hWnd].Find(buff); break; case 125: if (SendMessage(mLogWnd[hWnd].hToolBar,TB_ISBUTTONCHECKED,125,0)) { SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE); } else { SetWindowPos(hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE); } break; } } break; case WM_SIZE: MoveWindow(mLogWnd[hWnd].hListView,0,28,LOWORD(lParam),HIWORD(lParam)-28,TRUE); SetWindowPos(mLogWnd[hWnd].hFindText,0,LOWORD(lParam)-225,2,0,0,SWP_NOZORDER | SWP_NOSIZE); SetWindowPos(mLogWnd[hWnd].hProgressBar,0,LOWORD(lParam)-225,2,0,0,SWP_NOZORDER | SWP_NOSIZE); SendMessage(mLogWnd[hWnd].hToolBar,TB_DELETEBUTTON,0,0); SendMessage(mLogWnd[hWnd].hToolBar,TB_INSERTBUTTON,0,(LPARAM)&tbButton); SendMessage(mLogWnd[hWnd].hToolBar,TB_AUTOSIZE,0,0); LVCOLUMN lcol; lcol.mask = LVCF_WIDTH; dwStyle = (DWORD)GetWindowLong(mLogWnd[hWnd].hListView, GWL_STYLE); if (dwStyle & WS_VSCROLL) { GetScrollBarInfo(mLogWnd[hWnd].hListView,OBJID_VSCROLL,&sbi); lcol.cx = LOWORD(lParam)-sbi.dxyLineButton; } else {lcol.cx = LOWORD(lParam);} ListView_SetColumn(mLogWnd[hWnd].hListView,0,&lcol); break; case WM_NOTIFY: LPNMLISTVIEW pnm; pnm = (LPNMLISTVIEW)lParam; switch (pnm->hdr.code) { case NM_CUSTOMDRAW: NMLVCUSTOMDRAW *nmlvcd; nmlvcd = (NMLVCUSTOMDRAW *)lParam; switch (nmlvcd -> nmcd.dwDrawStage) { case CDDS_PREPAINT: return CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: // Determine colors if (mLogWnd[hWnd].vList.size()==0 || nmlvcd -> nmcd.dwItemSpec>mLogWnd[hWnd].vList.size()) { return CDRF_NEWFONT; } if (swscanf_s (mLogWnd[hWnd].vList[nmlvcd -> nmcd.dwItemSpec].c_str(), L"%[a-zA-Z?ΓΏ??_.]%*[:|]%d,%d,%d",buff,1024,&buff_r,&buff_g,&buff_b )==4) { nmlvcd -> clrTextBk = RGB(buff_r,buff_g,buff_b); } /*if ( nmlvcd -> nmcd.dwItemSpec & 1 ) { nmlvcd -> clrTextBk = RGB(200,200,200); //nmlvcd -> //nmlvcd -> clrText = 0xF0F0F0; SelectObject ( nmlvcd -> nmcd.hdc, GetStockObject (SYSTEM_FONT) ); //return CDRF_NEWFONT; } else { nmlvcd -> clrTextBk = RGB(230,230,230); }*/ return CDRF_NEWFONT; break; } break; case TTN_GETDISPINFO: LPTOOLTIPTEXT lpttt; lpttt = (LPTOOLTIPTEXT) lParam; lpttt->hinst = App.hIns; // Specify the resource identifier of the descriptive // text for the given button. idButton = lpttt->hdr.idFrom; switch (idButton) { case 123: lpttt->lpszText = MAKEINTRESOURCE(IDS_STRING_UFINDBUTTON); break; case 124: lpttt->lpszText = MAKEINTRESOURCE(IDS_STRING_UASCROLL); break; case 125: lpttt->lpszText = MAKEINTRESOURCE(IDS_STRING_UTOP); break; } break; case NM_DBLCLK: DialogBox(App.hIns,MAKEINTRESOURCE(IDD_DIALOGVIEWMSG),mLogWnd[hWnd].hWnd,(DLGPROC)DlgMsgProc); break; case LVN_GETDISPINFO: lvdi = (NMLVDISPINFO*) lParam; if (lvdi->item.mask & LVIF_TEXT) { //while (lvdi->item.pszText=wcscspn(mLogWnd[hWnd].vList[lvdi->item.iItem].c_str(),L":|:")) //wcscpy( buff,const_cast<LPWSTR>(mLogWnd[hWnd].vList[lvdi->item.iItem].c_str())); lvdi->item.pszText = const_cast<LPWSTR>(mLogWnd[hWnd].vList[lvdi->item.iItem].c_str()); // remove "Debug"... //while ((pos=wcsstr(lvdi->item.pszText,L":|:"))!=NULL) //{ // lvdi->item.pszText=pos+3; //} lvdi->item.cchTextMax = 1024; } break; }// switch break; // WM_NOTIFY default: return DefWindowProc(hWnd,Msg,wParam,lParam); } return(0); }