Win32 ListBox 控件简单Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*----------------------------------------
    2020.10.11, by bo
  ----------------------------------------*/

#include <windows.h>

LRESULT CALLBACK WndProc    (HWND, UINT, WPARAM, LPARAM) ;

#define ID_LIST     1

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("List1") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;
     
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
     
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("Listbox Demo"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          200, 200,
                          NULL, NULL, hInstance, NULL) ;
     
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
     
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage  (&msg) ;
     }
     return msg.wParam ;
}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

     static HWND    hListBox;
     static int     value ;
     int    i;
     HINSTANCE      hInstance ;
     TCHAR          szBuffer[100] ;
     int          iIndex, iLength;
     TCHAR      * pVarName ;
     
     switch (message)
     {
     case WM_CREATE :
                hListBox = CreateWindow("LISTBOX",  
                NULL,  
                //WS_CHILD|WS_VSCROLL | WS_TABSTOP | LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS,  
                WS_CHILD | WS_VISIBLE | LBS_STANDARD,
                30, 20, 60, 80,  
                hwnd, (HMENU) ID_LIST, hInstance, NULL) ;
                //ShowWindow(hListBox,SW_SHOW);  
                SendMessage(hListBox,LB_ADDSTRING ,0,TEXT("你好"));  
                SendMessage(hListBox,LB_ADDSTRING ,0,(LPARAM)"我好");  
                SendMessage(hListBox,LB_ADDSTRING ,0,"他好");

          return 0 ;
     case WM_COMMAND :
          if (LOWORD (wParam) == ID_LIST && HIWORD (wParam) == LBN_SELCHANGE)
          {
                    // Get current selection.
               iIndex  = SendMessage (hListBox, LB_GETCURSEL, 0, 0) ;
               iLength = SendMessage (hListBox, LB_GETTEXTLEN, iIndex, 0) + 1 ;
               pVarName = calloc (iLength, sizeof (TCHAR)) ;
               SendMessage (hListBox, LB_GETTEXT, iIndex, (LPARAM) pVarName) ;
               MessageBox(hwnd,pVarName,"选择的内容",MB_OK);
               free (pVarName) ;
          }
          return 0 ;
         
     case WM_SIZE :
         return 0 ;                
               
     case WM_DESTROY :
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}

创建ListBox;单击选项弹出消息框显示选择的项;

如果单击了列表框,在收到WM_COMMAND 消息时,使用LOWORD (wParam)取出的是列表框id,使用HIWORD (wParam) 取出的是所产生的列表框消息;

暂时不知道为什么中文显示有问题;