列表框

下面是一个将环境变量放在列表框中,点击其中某个条目时,就会在一个静态文本中显示该环境变量的值,如图:

这里写图片描述

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

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

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

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

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


//不知道为什么同样的代码在vc可以运行而vs2013就不可与,郁闷!!???
# include<windows.h>

# define ID_LIST 1
# define ID_TEXT 2

LRESULT 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);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值