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

📄 listview.c

📁 ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机理和API函数调用几乎相同。甚至可以兼容XP的程序。喜欢研究系统内核的人可以看一看。
💻 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:
            Info = (NMLVDISPINFO*)lParam;
            if(Info)
            {
                PLINE_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:
            Info = (NMLVDISPINFO*)lParam;
            if(Info && Info->item.pszText)
            {
                PLINE_INFO lineinfo = (PLINE_INFO)Info->item.lParam;
                if(!lineinfo->name || !_tcscmp(lineinfo->name, _T("")))
                {
                    *Result = FALSE;
                }
                else
                {
        		    if(_tcslen(Info->item.pszText) == 0)
		            {
                        TCHAR msg[128], caption[128];

                        LoadString(hInst, IDS_ERR_RENVAL_TOEMPTY, msg, sizeof(msg)/sizeof(TCHAR));
                        LoadString(hInst, IDS_ERR_RENVAL_CAPTION, caption, sizeof(caption)/sizeof(TCHAR));
                        MessageBox(0, msg, caption, 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);
                        lineinfo->name = realloc(lineinfo->name, (_tcslen(Info->item.pszText)+1)*sizeof(TCHAR));
                        if (lineinfo->name != NULL)
                            _tcscpy(lineinfo->name, 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;

    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;
    BOOL AddedDefault = FALSE;

    if (!hwndLV) return FALSE;

    (void)ListView_EditLabel(hwndLV, -1);

    SendMessage(hwndLV, WM_SETREDRAW, FALSE, 0);
    DestroyListView(hwndLV);

    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) {
            /* Remove unwanted path from key name */
            TCHAR *pLastBl = _tcsrchr(ValName, TEXT('\\'));
            if (pLastBl != NULL) ++pLastBl; else pLastBl = ValName;
            /* Add a terminating 0 character. Usually this is only necessary for strings. */
            ((TCHAR*)ValBuf)[dwValSize/sizeof(TCHAR)] = 0;
            AddEntryToList(hwndLV, pLastBl, 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 + -