⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listview.c

📁 winNT技术操作系统,国外开放的原代码和LIUX一样
💻 C
📖 第 1 页 / 共 2 页
字号:

    plvdi->item.pszText = NULL;
    plvdi->item.cchTextMax = 0;

    switch (plvdi->item.iSubItem) {
    case 0:
        LoadString(hInst, IDS_DEFAULT_VALUE_NAME, buffer, sizeof(buffer)/sizeof(TCHAR));
	plvdi->item.pszText = buffer;
        break;
    case 1:
        switch (((LINE_INFO*)plvdi->item.lParam)->dwValType) {
        case REG_NONE:
            plvdi->item.pszText = _T("REG_NONE");
            break;
        case REG_SZ:
            plvdi->item.pszText = _T("REG_SZ");
            break;
        case REG_EXPAND_SZ:
            plvdi->item.pszText = _T("REG_EXPAND_SZ");
            break;
        case REG_BINARY:
            plvdi->item.pszText = _T("REG_BINARY");
            break;
        case REG_DWORD: /* REG_DWORD_LITTLE_ENDIAN */
            plvdi->item.pszText = _T("REG_DWORD");
            break;
        case REG_DWORD_BIG_ENDIAN:
            plvdi->item.pszText = _T("REG_DWORD_BIG_ENDIAN");
            break;
        case REG_LINK:
            plvdi->item.pszText = _T("REG_LINK");
            break;
        case REG_MULTI_SZ:
            plvdi->item.pszText = _T("REG_MULTI_SZ");
            break;
        case REG_RESOURCE_LIST:
            plvdi->item.pszText = _T("REG_RESOURCE_LIST");
            break;
        case REG_FULL_RESOURCE_DESCRIPTOR:
            plvdi->item.pszText = _T("REG_FULL_RESOURCE_DESCRIPTOR");
            break;
        case REG_RESOURCE_REQUIREMENTS_LIST:
            plvdi->item.pszText = _T("REG_RESOURCE_REQUIREMENTS_LIST");
            break;
        case REG_QWORD: /* REG_QWORD_LITTLE_ENDIAN */
            plvdi->item.pszText = _T("REG_QWORD");
            break;
        default: {
            TCHAR buf2[200];
	    LoadString(hInst, IDS_UNKNOWN_TYPE, buf2, sizeof(buf2)/sizeof(TCHAR));
	    wsprintf(buffer, buf2, ((LINE_INFO*)plvdi->item.lParam)->dwValType);
            plvdi->item.pszText = buffer;
            break;
          }
        }
        break;
    case 3:
        plvdi->item.pszText = _T("");
        break;
    }
}

static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    LINE_INFO*l, *r;
    UNREFERENCED_PARAMETER(lParamSort);

    l = (LINE_INFO*)lParam1;
    r = (LINE_INFO*)lParam2;

    if (g_columnToSort == ~0UL)
        g_columnToSort = 0;

    if (g_columnToSort == 1 && l->dwValType != r->dwValType)
        return g_invertSort ? (int)r->dwValType - (int)l->dwValType : (int)l->dwValType - (int)r->dwValType;
    if (g_columnToSort == 2) {
        /* FIXME: Sort on value */
    }
    return g_invertSort ? _tcscmp(r->name, l->name) : _tcscmp(l->name, r->name);
}

BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result)
{
    NMLVDISPINFO* Info;
    UNREFERENCED_PARAMETER(wParam);
    *Result = TRUE;
    switch (((LPNMHDR)lParam)->code) {
        case LVN_GETDISPINFO:
            OnGetDispInfo((NMLVDISPINFO*)lParam);
            return TRUE;
        case LVN_COLUMNCLICK:
            if (g_columnToSort == (DWORD)((LPNMLISTVIEW)lParam)->iSubItem)
                g_invertSort = !g_invertSort;
            else {
                g_columnToSort = ((LPNMLISTVIEW)lParam)->iSubItem;
                g_invertSort = FALSE;
            }

            (void)ListView_SortItems(hWnd, CompareFunc, (WPARAM)hWnd);
            return TRUE;
        case NM_DBLCLK:
        case NM_RETURN:
            {
                SendMessage(hFrameWnd, WM_COMMAND, MAKEWPARAM(ID_EDIT_MODIFY, 0), 0);
            }
            return TRUE;
        case NM_SETFOCUS:
            g_pChildWnd->nFocusPanel = 0;
            break;
        case LVN_BEGINLABELEDIT:
            {
              PLINE_INFO lineinfo;
              Info = (NMLVDISPINFO*)lParam;
              if(Info)
              {
                lineinfo = (PLINE_INFO)Info->item.lParam;
                if(!lineinfo->name || !_tcscmp(lineinfo->name, _T("")))
                {
                  *Result = TRUE;
                }
                else
                {
                  *Result = FALSE;
                }
              }
              else
                *Result = TRUE;
              return TRUE;
            }
        case LVN_ENDLABELEDIT:
            {
              PLINE_INFO lineinfo;
              Info = (NMLVDISPINFO*)lParam;
              if(Info && Info->item.pszText)
              {
                lineinfo = (PLINE_INFO)Info->item.lParam;
                if(!lineinfo->name || !_tcscmp(lineinfo->name, _T("")))
                {
                  *Result = FALSE;
                }
                else
                {
		  //if((ret = RenameValue(lineinfo->name, Info->item.pszText)) != ERROR_SUCCESS)
                  {
		    TCHAR msg[128], caption[128];

		    LoadString(hInst, IDS_ERR_RENVAL_CAPTION, caption, sizeof(caption)/sizeof(TCHAR));
		    if(_tcslen(Info->item.pszText) == 0)
		    {
		      LoadString(hInst, IDS_ERR_RENVAL_TOEMPTY, msg, sizeof(msg)/sizeof(TCHAR));
		      MessageBox(0, msg, NULL, 0);
		      *Result = TRUE;
		    }
		    else
			{
			  HKEY hKeyRoot;
			  LPCTSTR keyPath;
			  LONG lResult;
			  keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot);
			  lResult = RegRenameValue(hKeyRoot, keyPath, Info->item.pszText, lineinfo->name);
                          if (lineinfo->name)
                            LocalFree(lineinfo->name);
                          lineinfo->name = _tcsdup(Info->item.pszText);
		      *Result = TRUE;
		      return (lResult == ERROR_SUCCESS);
			}
		  }
                }
              }
              else
                *Result = TRUE;
              return TRUE;
            }
    }
    return FALSE;
}


HWND CreateListView(HWND hwndParent, HMENU id)
{
    RECT rcClient;
    HWND hwndLV;

    /* Get the dimensions of the parent window's client area, and create the list view control.  */
    GetClientRect(hwndParent, &rcClient);
    hwndLV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, _T("List View"),
                            WS_VISIBLE | WS_CHILD | WS_TABSTOP | LVS_REPORT | LVS_EDITLABELS,
                            0, 0, rcClient.right, rcClient.bottom,
                            hwndParent, id, hInst, NULL);
    if (!hwndLV) return NULL;

    /* Initialize the image list, and add items to the control.  */
    if (!CreateListColumns(hwndLV)) goto fail;
    if (!InitListViewImageLists(hwndLV)) goto fail;

    return hwndLV;
fail:
    DestroyWindow(hwndLV);
    return NULL;
}

void DestroyListView(HWND hwndLV) {
    INT count, i;
	LVITEM item;

    if (g_valueName)
        HeapFree(GetProcessHeap(), 0, g_valueName);

    count = ListView_GetItemCount(hwndLV);
    for (i = 0; i < count; i++) {
        item.mask = LVIF_PARAM;
        item.iItem = i;
        (void)ListView_GetItem(hwndLV, &item);
        free(((LINE_INFO*)item.lParam)->name);
        HeapFree(GetProcessHeap(), 0, (void*)item.lParam);
    }
 
}

BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath)
{
    DWORD max_sub_key_len;
    DWORD max_val_name_len;
    DWORD max_val_size;
    DWORD val_count;
    HKEY hNewKey;
    LONG errCode;
    INT count, i;
    LVITEM item;
    BOOL AddedDefault = FALSE;

    if (!hwndLV) return FALSE;

    (void)ListView_EditLabel(hwndLV, -1);

    SendMessage(hwndLV, WM_SETREDRAW, FALSE, 0);
    count = ListView_GetItemCount(hwndLV);
    for (i = 0; i < count; i++) {
        item.mask = LVIF_PARAM;
        item.iItem = i;
        (void)ListView_GetItem(hwndLV, &item);
        free(((LINE_INFO*)item.lParam)->name);
        HeapFree(GetProcessHeap(), 0, (void*)item.lParam);
    }
    g_columnToSort = ~0UL;
    (void)ListView_DeleteAllItems(hwndLV);

    if(!hKey) return FALSE;

    errCode = RegOpenKeyEx(hKey, keyPath, 0, KEY_READ, &hNewKey);
    if (errCode != ERROR_SUCCESS) return FALSE;

    /* get size information and resize the buffers if necessary */
    errCode = RegQueryInfoKey(hNewKey, NULL, NULL, NULL, NULL, &max_sub_key_len, NULL,
                              &val_count, &max_val_name_len, &max_val_size, NULL, NULL);

    if (errCode == ERROR_SUCCESS) {
        TCHAR* ValName = HeapAlloc(GetProcessHeap(), 0, ++max_val_name_len * sizeof(TCHAR));
        DWORD dwValNameLen = max_val_name_len;
        BYTE* ValBuf = HeapAlloc(GetProcessHeap(), 0, max_val_size + sizeof(TCHAR));
        DWORD dwValSize = max_val_size;
        DWORD dwIndex = 0L;
        DWORD dwValType;
        /*                if (RegQueryValueEx(hNewKey, NULL, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) { */
        /*                    AddEntryToList(hwndLV, _T("(Default)"), dwValType, ValBuf, dwValSize); */
        /*                } */
        /*                dwValSize = max_val_size; */
        while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) {
            /* Add a terminating 0 character. Usually this is only necessary for strings. */
            ((TCHAR*)ValBuf)[dwValSize/sizeof(TCHAR)] = 0;
            AddEntryToList(hwndLV, ValName, dwValType, ValBuf, dwValSize, -1, TRUE);
            dwValNameLen = max_val_name_len;
            dwValSize = max_val_size;
            dwValType = 0L;
            ++dwIndex;
            if(!_tcscmp(ValName, _T("")))
            {
              AddedDefault = TRUE;
            }
        }
        HeapFree(GetProcessHeap(), 0, ValBuf);
        HeapFree(GetProcessHeap(), 0, ValName);
    }
    if(!AddedDefault)
    {
      AddEntryToList(hwndLV, _T(""), REG_SZ, NULL, 0, 0, FALSE);
    }
    (void)ListView_SortItems(hwndLV, CompareFunc, (WPARAM)hwndLV);
    RegCloseKey(hNewKey);
    SendMessage(hwndLV, WM_SETREDRAW, TRUE, 0);

    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -