#include <windows.h>
#include "resource.h"#define ID_LIST 1
#define ID_TEXT 2LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void fillList(HWND);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
static TCHAR szAppName[]=TEXT("ListBox");
HWND hwnd;
MSG msg;
WNDCLASS wndclass; wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.lpfnWndProc=WndProc;
wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(EDIT));
wndclass.hInstance=hInstance;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW; if(!RegisterClass(&wndclass)){
MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
return 0;
} hwnd=CreateWindow(szAppName,TEXT("ListBox"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nShowCmd);
UpdateWindow(hwnd); while(GetMessage(&msg,NULL,NULL,NULL)){
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
}void fillList(HWND hwndList){
int iLength;
TCHAR *pVarBlock,*pVarBeg,*pVarEnd,*pVarName; pVarBlock=GetEnvironmentStrings();

if(pVarBlock==NULL){
MessageBox(NULL,TEXT("Function Error!"),TEXT("ERROR"),MB_ICONERROR);
return ;
} while(*pVarBlock){
if(*pVarBlock!='='){
pVarBeg=pVarBlock;
while(*pVarBlock++!='=') ;
pVarEnd=pVarBlock-1;
iLength=pVarEnd-pVarBeg;
pVarName=(TCHAR*)calloc(iLength+1,sizeof(TCHAR));
CopyMemory(pVarName,pVarBeg,iLength*sizeof(TCHAR));
pVarName[iLength]='\0';
SendMessage(hwndList,LB_ADDSTRING,0,(LPARAM)pVarName);
free(pVarName);
}
while(*pVarBlock++!='\0') ;
}
FreeEnvironmentStrings(pVarBlock);
}LRESULT CALLBACK WndProc(HWND hwnd,UINT  message,WPARAM wParam,LPARAM lParam){
static HWND hwndList,hwndText;
int iIndex,iLength,cxChar,cyChar;
TCHAR *pVarName,*pVarValue; switch(message){
case WM_CREATE:
cxChar=LOWORD(GetDialogBaseUnits());
cyChar=HIWORD(GetDialogBaseUnits()); hwndList=CreateWindow(TEXT("listbox"),NULL,
WS_CHILD|WS_VISIBLE|LBS_STANDARD,
cxChar,cyChar*3,
cxChar*32+GetSystemMetrics(SM_CXVSCROLL),
cyChar*10,
hwnd,(HMENU)ID_LIST,
(HINSTANCE)GetWindowLong(hwnd,GWL_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); fillList(hwndList);
return 0; case WM_SETFOCUS:
SetFocus(hwndList);
return 0; case WM_COMMAND:
if(LOWORD(wParam)==ID_LIST&&HIWORD(wParam)==LBN_SELCHANGE){
iIndex=SendMessage(hwndList,LB_GETCURSEL,0,0);
iLength=SendMessage(hwndList,LB_GETTEXTLEN,iIndex,0)+1;
pVarName=(TCHAR*)calloc(iLength,sizeof(TCHAR));
SendMessage(hwndList,LB_GETTEXT,iIndex,(LPARAM)pVarName); iLength=GetEnvironmentVariable(pVarName,NULL,0);
pVarValue=(TCHAR*)calloc(iLength,sizeof(TCHAR));
GetEnvironmentVariable(pVarName,pVarValue,iLength); SetWindowText(hwndText,pVarValue);
free(pVarName);
free(pVarValue);
}
return 0; case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,message,wParam,lParam);
}

解决方案 »

  1.   

    确实很奇怪,我调了好久也没有找出原因;不过你可以换用ComboBox,在ComboBox下测试是没有问题的,编译我之后贴的源代码就可以看到,其实它的效果和ListBox是差不多的。之前先说下你代码的一个问题:
               hwndList=CreateWindow(TEXT("listbox"),NULL,
                    WS_CHILD|WS_VISIBLE|LBS_STANDARD,
                    cxChar,cyChar*3,
                    cxChar*32+GetSystemMetrics(SM_CXVSCROLL),
                    cyChar*10,
                    hwnd,(HMENU)ID_LIST,
                    (HINSTANCE)GetWindowLong(hwnd,GWL_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);
    //CreateWindow是会触发WM_CREATE消息的,所以不能放在回调函数里做,这样的话每一次执行到CreateWindow都会发送WM_CREATE消息给窗口,这样窗口又会从case WM_CREATE:这里开始执行,
    于是造成了递归的效果,这就是为什么你的ListBox的创建出来一层套一层的原因。
    我把他们都转移到主窗口的创建的后面,也就是主窗口ShowWindow之前去执行了。代码:
    #include <windows.h>#define ID_LIST 1
    #define ID_TEXT 2LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);void fillList(HWND);    static HWND hwndList,hwndText;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
        static TCHAR szAppName[]=TEXT("ListBox");
        HWND hwnd;
        MSG msg;
        WNDCLASS wndclass;    wndclass.cbClsExtra=0;
        wndclass.cbWndExtra=0;
        wndclass.lpfnWndProc=WndProc;
        wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
        wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
        wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
        wndclass.hInstance=hInstance;
        wndclass.lpszClassName=szAppName;
        wndclass.lpszMenuName=NULL;
        wndclass.style=CS_HREDRAW|CS_VREDRAW;    if(!RegisterClass(&wndclass)){
            MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
            return 0;
        }    hwnd=CreateWindow(szAppName,TEXT("ListBox"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,CW_USEDEFAULT,
            CW_USEDEFAULT,CW_USEDEFAULT,
            NULL,NULL,hInstance,NULL);
    //////////////////////////////////////+++++++++++++++++++++++++++
    int cxChar,cyChar;    cxChar=LOWORD(GetDialogBaseUnits());
        cyChar=HIWORD(GetDialogBaseUnits());    hwndList=CreateWindow(TEXT("combobox"),NULL,
                WS_CHILD|WS_VISIBLE,
                cxChar,cyChar*3,
                cxChar*32+GetSystemMetrics(SM_CXVSCROLL),
                cyChar*10,
                hwnd,(HMENU)ID_LIST,
                (HINSTANCE)GetWindowLong(hwnd,GWL_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);    fillList(hwndList);
    ////////////////////////////////////++++++++++++++++++++    ShowWindow(hwnd,nShowCmd);
        UpdateWindow(hwnd);    while(GetMessage(&msg,NULL,NULL,NULL)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }    return msg.wParam;
    }void fillList(HWND hwndList){
        int iLength;
        TCHAR *pVarBlock,*pVarBeg,*pVarEnd,*pVarName;    pVarBlock=GetEnvironmentStrings();
        
        if(pVarBlock==NULL){
            MessageBox(NULL,TEXT("Function Error!"),TEXT("ERROR"),MB_ICONERROR);
            return ;
        }    while(*pVarBlock){
            if(*pVarBlock!='='){
                pVarBeg=pVarBlock;
                while(*pVarBlock++!='=') ;
                pVarEnd=pVarBlock-1;
                iLength=pVarEnd-pVarBeg;
                pVarName=(TCHAR*)calloc(iLength+1,sizeof(TCHAR));
                CopyMemory(pVarName,pVarBeg,iLength*sizeof(TCHAR));
                pVarName[iLength]='\0';
    ///////////////////////////////////////////////////
                SendMessage(hwndList,CB_ADDSTRING,0,(LPARAM)pVarName);
    /////////////////////CB_ADDSTRING->CB_ADDSTRING//////////////////////////
                free(pVarName);
            }
            while(*pVarBlock++!='\0') ;
        }
        FreeEnvironmentStrings(pVarBlock);
    }LRESULT CALLBACK WndProc(HWND hwnd,UINT  message,WPARAM wParam,LPARAM lParam){
        int iIndex,iLength;
        TCHAR *pVarName,*pVarValue;    switch(message){
    ////////////////////////////////////////////------------------------
            case WM_SETFOCUS:
                SetFocus(hwndList);
                return 0;        case WM_COMMAND:
                if(LOWORD(wParam)==ID_LIST&&HIWORD(wParam)==CBN_SELCHANGE){
                    iIndex=SendMessage(hwndList,CB_GETCURSEL,0,0);
                    iLength=SendMessage(hwndList,CB_GETLBTEXTLEN,iIndex,0)+1;
                    pVarName=(TCHAR*)calloc(iLength,sizeof(TCHAR));
                    SendMessage(hwndList,CB_GETLBTEXT,iIndex,(LPARAM)pVarName);                iLength=GetEnvironmentVariable(pVarName,NULL,0);
                    pVarValue=(TCHAR*)calloc(iLength,sizeof(TCHAR));
                    GetEnvironmentVariable(pVarName,pVarValue,iLength);                SetWindowText(hwndText,pVarValue);
                    free(pVarName);
                    free(pVarValue);
                }
                return 0;        case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
        return DefWindowProc(hwnd,message,wParam,lParam);
    }//另外所有的LB_...等ListBox属性我也改成了相应的CB_...ComboBox属性。
      

  2.   

    抱歉,有一处内存泄露
    #include <windows.h>#define ID_LIST 1
    #define ID_TEXT 2LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);void fillList(HWND);  static HWND hwndList,hwndText;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
      static TCHAR szAppName[]=TEXT("ListBox");
      HWND hwnd;
      MSG msg;
      WNDCLASS wndclass;  wndclass.cbClsExtra=0;
      wndclass.cbWndExtra=0;
      wndclass.lpfnWndProc=WndProc;
      wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
      wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
      wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
      wndclass.hInstance=hInstance;
      wndclass.lpszClassName=szAppName;
      wndclass.lpszMenuName=NULL;
      wndclass.style=CS_HREDRAW|CS_VREDRAW;  if(!RegisterClass(&wndclass)){
      MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);
      return 0;
      }  hwnd=CreateWindow(szAppName,TEXT("ListBox"),
      WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT,CW_USEDEFAULT,
      CW_USEDEFAULT,CW_USEDEFAULT,
      NULL,NULL,hInstance,NULL);
    //////////////////////////////////////+++++++++++++++++++++++++++
    int cxChar,cyChar;  cxChar=LOWORD(GetDialogBaseUnits());
      cyChar=HIWORD(GetDialogBaseUnits());  hwndList=CreateWindow(TEXT("combobox"),NULL,
      WS_CHILD|WS_VISIBLE,
      cxChar,cyChar*3,
      cxChar*32+GetSystemMetrics(SM_CXVSCROLL),
      cyChar*10,
      hwnd,(HMENU)ID_LIST,
      (HINSTANCE)GetWindowLong(hwnd,GWL_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);  fillList(hwndList);
    ////////////////////////////////////++++++++++++++++++++  ShowWindow(hwnd,nShowCmd);
      UpdateWindow(hwnd);  while(GetMessage(&msg,NULL,NULL,NULL)){
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }  return msg.wParam;
    }void fillList(HWND hwndList){
      int iLength;
      TCHAR *pVarBlock,*pVarBeg,*pVarEnd,*pVarName;  pVarBlock=GetEnvironmentStrings();
        
      if(pVarBlock==NULL){
      MessageBox(NULL,TEXT("Function Error!"),TEXT("ERROR"),MB_ICONERROR);
      return ;
      }  while(*pVarBlock){
      if(*pVarBlock!='='){
      pVarBeg=pVarBlock;
      while(*pVarBlock++!='=') ;
      pVarEnd=pVarBlock-1;
      iLength=pVarEnd-pVarBeg;
      pVarName=(TCHAR*)calloc(iLength+1,sizeof(TCHAR));
      CopyMemory(pVarName,pVarBeg,iLength*sizeof(TCHAR));
      pVarName[iLength]='\0';
    ///////////////////////////////////////////////////
      SendMessage(hwndList,CB_ADDSTRING,0,(LPARAM)pVarName);
    /////////////////////CB_ADDSTRING->CB_ADDSTRING//////////////////////////
      free(pVarName);
      }
      while(*pVarBlock++!='\0') ;
      }
      //FreeEnvironmentStrings(pVarBlock);//Memory Leak Here.
    }LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
      int iIndex,iLength;
      TCHAR *pVarName,*pVarValue;  switch(message){
    ////////////////////////////////////////////------------------------
      case WM_SETFOCUS:
      SetFocus(hwndList);
      return 0;  case WM_COMMAND:
      if(LOWORD(wParam)==ID_LIST&&HIWORD(wParam)==CBN_SELCHANGE){
      iIndex=SendMessage(hwndList,CB_GETCURSEL,0,0);
      iLength=SendMessage(hwndList,CB_GETLBTEXTLEN,iIndex,0)+1;
      pVarName=(TCHAR*)calloc(iLength,sizeof(TCHAR));
      SendMessage(hwndList,CB_GETLBTEXT,iIndex,(LPARAM)pVarName);  iLength=GetEnvironmentVariable(pVarName,NULL,0);
      pVarValue=(TCHAR*)calloc(iLength,sizeof(TCHAR));
      GetEnvironmentVariable(pVarName,pVarValue,iLength);  SetWindowText(hwndText,pVarValue);
      free(pVarName);
      free(pVarValue);
      }
      return 0;  case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
      }
      return DefWindowProc(hwnd,message,wParam,lParam);
    }//另外所有的LB_...等ListBox属性我也改成了相应的CB_...ComboBox属性。