Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
listat
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 11
1

Работа со списком в WinAPI.

26.11.2009, 17:03. Просмотров 3393. Ответов 5
Метки нет (Все метки)

Нада было написать програму суть которой заключаетса в том что создавалось окно, в нем два списка которые заполнены информацией ( в даном случае Государства в первом списке и их Столицы во втором), а также две кнопки ">>" и "<<", при нажатии на кнопку ">>" выдаетса сообщение что нажата кнопка ">>", при нажатии на кнопку "<<" выдаетса сообщение что нажата кнопка "<<", при выделении сторки в 1-ом или 2-ом списке выдаетса сообщение с текстом выделеной строки.

Вот
C++
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <windows.h>
#define ID_BUTTON1 1001
#define ID_BUTTON2 1002
#define ID_LISTBOX1 1003
#define ID_LISTBOX2 1004
 
BOOL RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInstance;
char szClassName[]="Class1";
 
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmdShow)
{
    MSG msg; HWND hwnd; hInstance=hInst;
    if(!RegClass(WndProc,szClassName,COLOR_WINDOW))
        return FALSE;
    hwnd=CreateWindow(szClassName,"Laboratory_Work_#14",
        WS_OVERLAPPEDWINDOW|WS_VISIBLE,340,252,600,300,
        0,0,hInstance,NULL);
    if(!hwnd) return FALSE;
    while(GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
    return msg.wParam;
}
 
BOOL RegClass(WNDPROC Proc,LPCTSTR szName, UINT brBakcground)
{
    WNDCLASS wc; wc.style=wc.cbClsExtra=wc.cbWndExtra=0;
    wc.lpfnWndProc=Proc; wc.hInstance=hInstance;
    wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    wc.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
    wc.lpszMenuName=(LPCTSTR)NULL;
    wc.lpszClassName=szName;
    return (RegisterClass(&wc)!=0);
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HWND hButton1,hButton2,hListBox1,hListBox2; RECT Rect;
    char Buf1[]="Russia",Buf2[]="Ukraine",Buf3[]="U.S.A",Buf4[]="France",Buf5[]="Germany",
    Buf6[]="Moscow",Buf7[]="Kiev",Buf8[]="Washington",Buf9[]="Paris",Buf10[]="Berlin",Buf[10];
    int ListItem1=NULL,ListItem2=NULL;
 
    switch(msg)
    {   
        case WM_CREATE:
        {   
            GetClientRect(hwnd,&Rect);
            hListBox1=CreateWindow("listbox",NULL,WS_CHILD|WS_VISIBLE|LBS_STANDARD,
            Rect.left+50,Rect.top+50,200,150,hwnd,(HMENU)ID_LISTBOX1,hInstance,NULL);
            SendMessage(hListBox1,LB_ADDSTRING,0,(LPARAM)Buf1);
            SendMessage(hListBox1,LB_ADDSTRING,0,(LPARAM)Buf2);
            SendMessage(hListBox1,LB_ADDSTRING,0,(LPARAM)Buf3);
            SendMessage(hListBox1,LB_ADDSTRING,0,(LPARAM)Buf4);
            SendMessage(hListBox1,LB_ADDSTRING,0,(LPARAM)Buf5);
            hListBox2=CreateWindow("listbox",NULL,WS_CHILD|WS_VISIBLE|LBS_STANDARD,
            Rect.left+350,Rect.top+50,200,150,hwnd,(HMENU)ID_LISTBOX2,hInstance,NULL);
            SendMessage(hListBox2,LB_ADDSTRING,0,(LPARAM)Buf6);
            SendMessage(hListBox2,LB_ADDSTRING,0,(LPARAM)Buf7);
            SendMessage(hListBox2,LB_ADDSTRING,0,(LPARAM)Buf8);
            SendMessage(hListBox2,LB_ADDSTRING,0,(LPARAM)Buf9);
            SendMessage(hListBox2,LB_ADDSTRING,0,(LPARAM)Buf10);
 
            
            hButton1=CreateWindow("button",">>",
            WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
            Rect.left+50,Rect.top+205,200,50,hwnd,(HMENU)ID_BUTTON1,hInstance,NULL);
            hButton2=CreateWindow("button","<<",
            WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,Rect.top+350,Rect.top+205,200,50,hwnd,
            (HMENU)ID_BUTTON2,hInstance,NULL);
            return 0;
        }
        case WM_COMMAND:
        {
            switch(LOWORD(wParam))
            {
                case ID_LISTBOX1:
                {
                    
                        if(HIWORD(wParam)==LBN_DBLCLK)
                        {
                            ListItem1=(int)SendMessage(hListBox1,LB_GETCURSEL,0,0);
                            if(ListItem1!=LB_ERR)
                                SendMessage(hListBox1,LB_GETTEXT,ListItem1,(LPARAM)Buf);
                                MessageBox(hwnd,Buf,"ListBox1",MB_OK);
                            return 0;
                        }
                    
                }
 
                case ID_LISTBOX2:
                {
                    
                        if(HIWORD(wParam)==LBN_DBLCLK)
                        {
                                 ListItem1=(int)SendMessage  (hListBox2,LB_GETCURSEL,0,0);
                            if(ListItem1!=LB_ERR)
                                SendMessage(hListBox2,LB_GETTEXT,ListItem1,(LPARAM)Buf);
                                MessageBox(hwnd,Buf,"ListBox2",MB_OK);
                            return 0;
                        }
                }
                
                case ID_BUTTON1:
                {
                    MessageBox(hwnd,"Button >> is pressed","Button >>",MB_OK);
                    
                    return 0;
                }
                case ID_BUTTON2:
                {
                    MessageBox(hwnd,"Button << is pressed","Button <<",MB_OK);
 
                    return 0;
                }
            }
            return 0;
            
        }
        case WM_DESTROY:{PostQuitMessage(0); return 0;}
    }
    return DefWindowProc(hwnd,msg,wParam,lParam);
}
ListItem1,ListItem2 переменные хранящие номер выделеной строки соответствено первого и второго списков.
При запуске все создаетса, списки заполняютса...
Но 1) Почему списки запалняютса хаотично, а не в том порядке в котором я заношу туда названия.Тобиш по идее должно ити Russia-Ukraine-USA-France-Paris-Germany а выходит USA-France-Russia-Germany-Ukraine/
2) При двойном клике на строке спика№1 или строке списка№2 должно выскочить окно с текстом в строке, а выскакует два окна с надписью "Button >> is pressed"(((
Тобиш вместо того шоб обрабатывать сообения от списков обрабатываетса кнопка ">>". помогите плиз.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2009, 17:03
Ответы с готовыми решениями:

Winapi работа с файлами
Возник такой вопрос, есть функция FindFirstFile( LPCTSTR ...

C++ и WinAPI Работа с графикой
Пишу игру на подобии agario.Прошу помощи как сделать чтоб круг сам двигался а...

Работа с файлами WinAPI (C++)
Всем привет, с недавнего времени начал осваивать WinApi и в ходе выполнения...

Прямая работа с памятью WinAPI
Выделяю блок памяти (10000 байт) и напрямую заполняю его значениями (123). Есть...

Работа в WinAPI с дробными числами
Добрый день! Уважаемые форумчане.... Возник такой вопрос, какой принцип...

5
Destructor
11 / 11 / 0
Регистрация: 25.11.2009
Сообщений: 32
26.11.2009, 18:31 2
Чтобы строки в списке отображались в том порядке, в котором ты их туда записываешь, нужно отключить у LISTBOX-ов свойство Sort. По умолчанию оно имеет значение TRUE, поэтому строки отсортированы в алфавитном порядке с учётом регистра букв.
1
listat
0 / 0 / 0
Регистрация: 25.11.2009
Сообщений: 11
26.11.2009, 20:31  [ТС] 3
Пасиб за ответ. А насчет второго вопроса.... какие могут быть причины?
0
Destructor
11 / 11 / 0
Регистрация: 25.11.2009
Сообщений: 32
26.11.2009, 20:47 4
В конце каждого case поставь break. Тогда ты сможешь кликнуть второй раз по элементу списка.

В данный момент происходит следующее:

- Ты кликаешь по элементу списка первый раз
- WndProc сразу же вызывается с нотификацией LBN_SELCHANGE
- В обработчике проверяется условие HIWORD(wParam)==LBN_DBLCLK - оно ложно и код внутри не выполняется
- Так, как перед завешающим }, который принадлежит case отсутствует break, выполнение продолжается со строки MessageBox(hwnd,"Button >> is pressed","Button >>",MB_OK);
0
5150
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 21
17.07.2013, 16:07 5
Цитата Сообщение от Destructor Посмотреть сообщение
Чтобы строки в списке отображались в том порядке, в котором ты их туда записываешь, нужно отключить у LISTBOX-ов свойство Sort. По умолчанию оно имеет значение TRUE, поэтому строки отсортированы в алфавитном порядке с учётом регистра букв.
Destructor, не могли бы подсказать где Sort отключается, это 3 параметр SendMessage?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26368 / 17692 / 7005
Регистрация: 22.10.2011
Сообщений: 31,142
Записей в блоге: 6
18.07.2013, 00:18 6
5150, LBS_STANDARD включает и автоматическую сортировку, поэтому для ее отмены надо убрать LBS_SORT из стилей при создании списка:

C++
1
2
3
4
            hListBox1 = CreateWindow("LISTBOX", NULL,
                                     WS_CHILD | WS_VISIBLE | LBS_STANDARD & (~LBS_SORT),
                                     Rect.left + 50, Rect.top + 50, 200, 150,
                                     hwnd, (HMENU)ID_LISTBOX1, hInstance, NULL);
1
18.07.2013, 00:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2013, 00:18

Работа с контролом List в WinApi
огромная просьба помочь с созданием Listctrl в WinaApi , компилятор даже не...

Работа с директорями через WinApi
запрашивается имя каталога у пользователя.Составить .txt файл, описывающий...

Работа с базами данных в WinAPI
С базами данных в WinAPI можно работать и с помощью ODBC и с помощью OLE DB?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru