列表框

来源:互联网 发布:数学工具书 知乎 编辑:程序博客网 时间:2024/05/21 22:23
下面是一个将环境变量放在列表框中,点击其中某个条目时,就会在一个静态文本中显示该环境变量的值,如图:

这里写图片描述

  环境变量吧,可以通过GetEnvironmentString函数获取,不过需要注意,windows的环境变量是存放在一个字符数组中,该函数返回指向该数组的第一个字符的指针   而且数组开头有一个特殊标志,会看到是这样的:"=::=::\\"

每个环境变量都是以”变量名=变量值”存放,所以数组中的内容是这样的:

"=::=::\\  变量1=变量值1 变量2=变量值2 ..."

这里看到的是空格,其实是字符串结束标志’\0’,所以要输出环境变量需要跳过’\0’和”=::=::\”
这里写图片描述

下面就是一个简单的列表框小程序了

//不知道为什么同样的代码在vc可以运行而vs2013就不可与,郁闷!!???# include<windows.h># define ID_LIST 1# define ID_TEXT 2LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain(HINSTANCE hInstance,    HINSTANCE hPrevInstance,    PSTR lpCmdLine,    int iCmdShow){    static TCHAR szAppName[] = TEXT("那又怎样");    WNDCLASS wndclass;    HWND hwnd;    MSG msg;    wndclass.cbClsExtra = 0;    wndclass.cbWndExtra = 0;    wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);//这里用NULL表示使用微软提供的图标    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //同上    wndclass.hInstance = hInstance;    wndclass.lpfnWndProc = WndProc;    wndclass.lpszClassName = szAppName;    wndclass.lpszMenuName = NULL;    wndclass.style = CS_HREDRAW | CS_VREDRAW;    if (!RegisterClass(&wndclass))//注册窗口类    {        MessageBox(NULL, TEXT("Program requires windows NT!"), szAppName, MB_ICONERROR);        return 0;    }    hwnd = CreateWindow(szAppName,  TEXT("Environment List Box"),         WS_OVERLAPPEDWINDOW,         CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,         NULL,NULL, hInstance, NULL);    ShowWindow(hwnd, iCmdShow);    UpdateWindow(hwnd);    while (GetMessage(&msg, NULL, 0, 0))    {        TranslateMessage(&msg);        DispatchMessage(&msg);    }    return 0;}void FillListBox(HWND hwndList){    int iLength;    TCHAR *pVarBlock, *pVarBeg, *pVarEnd, *pVarName,*p;    pVarBlock = GetEnvironmentStrings();//Get pointer to environment block    //环境变量是保存在一个字符数组里,开头有一个特殊标记,可以试一下,是字符串"=::=::\\"    //然后每隔一个环境变量后面都会有一个字符串结束标志(‘\0’),所以要绕过第一次的"=::=::\\"    //和'\0'    p = pVarBlock;//保存该指针,以后要释放    while (*pVarBlock)    {        if (*pVarBlock != '=')//Skip variable names beginning with '='        {            pVarBeg = pVarBlock; //Begining of variable name            while (*pVarBlock++ != '=');//Scan until '='            pVarEnd = pVarBlock-1;//points to '='sign            iLength = pVarEnd - pVarBeg;//Length of variable name            //Allocate memory for the variable name and terminating zero.            //Copy the variable name and append a zero            pVarName =new TCHAR[iLength+1];            CopyMemory(pVarName, pVarBeg, iLength*sizeof(TCHAR));            pVarName[iLength] = '\0';                    //Put the variable name in the list box and free menory            SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)pVarName);            delete []pVarName;        }        //当pVarBlock指向‘\0’时结束循环,pVarBlock++,就指向了下一个环境变量字符串        while (*pVarBlock++ != '\0');        //Scan until terminating zero    }    FreeEnvironmentStrings(p);}LRESULT CALLBACK WndProc(HWND hwnd,    UINT uMsg,    WPARAM wParam,    LPARAM lParam    ){    static HWND hwndList, hwndText;    int ilndex, iLength, cxChar, cyChar;    TCHAR *pVarName, *pVarValue;    switch (uMsg)    {    case WM_CREATE:        cxChar = LOWORD(GetDialogBaseUnits());        cyChar = HIWORD(GetDialogBaseUnits());                //Create listbox and static text windows        hwndList = CreateWindow(TEXT("listbox"), NULL,            WS_CHILD | WS_VISIBLE | LBS_STANDARD,            cxChar, cyChar * 3, cxChar * 16 + GetSystemMetrics(SM_CXVSCROLL), cyChar * 5,            hwnd, (HMENU)ID_LIST,            //这两种方法都可以获取父窗口的实例句柄,或者将其定义为全局变量            //(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),            ((LPCREATESTRUCT)lParam)->hInstance,            NULL);        //静态文本        hwndText = CreateWindow(TEXT("static"), NULL, WS_CHILD | WS_VISIBLE | SS_LEFT,             cxChar, cyChar,            GetSystemMetrics(SM_CXSCREEN), cyChar, hwnd, (HMENU)ID_TEXT,            (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);        FillListBox(hwndList);        return 0;    case WM_SETFOCUS:        SetFocus(hwndList);        return 0;    case WM_COMMAND:        if (LOWORD(wParam) == ID_LIST&&HIWORD(wParam) == LBN_SELCHANGE)        {            //Get currient selection            ilndex = SendMessage(hwndList, LB_GETCURSEL, 0, 0);            iLength = SendMessage(hwndList, LB_GETTEXTLEN, ilndex, 0) + 1;            pVarName =new TCHAR[iLength];            SendMessage(hwndList, LB_GETTEXT, ilndex, (LPARAM)pVarName);            //Get   environment string            iLength = GetEnvironmentVariable(pVarName, NULL, 0);            pVarValue = new TCHAR[iLength];;            GetEnvironmentVariable(pVarName, pVarValue, iLength);            //Show it in window            SetWindowText(hwndText, pVarValue);            delete[]pVarName;            delete[]pVarValue;        }        return 0;    case WM_CLOSE:        PostQuitMessage(0);        //DestroyWindow(hwnd);        return 0;  }        return DefWindowProc(hwnd, uMsg, wParam, lParam);}
0 0
原创粉丝点击