Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
5 / 5 / 0
Регистрация: 16.07.2009
Сообщений: 87

Определить нажатие в listbox`e

10.03.2010, 22:26. Показов 5913. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть листбокс hlistbox1 = CreateWindow("listbox",NULL,WS_CHILD|WS_ VISIBLE|LBS_WANTKEYBOARDINPUT|LBS_STANDA RD, 20,100,300,200,wnd,(HMENU)ID_LISTBOX1,hI nst,0);
как определить в нём что было нажатие левой кнопкой мыши

case WM_LBUTTONDOWN работает по всей площади окна, но не догоняю как ограничиться одним только листбоксом?

Добавлено через 11 минут
кажется понял, нужно указать LBS_NOTIFY чтобы тот в свою очередь послал это в WM_COMMAND а там уже в зависимости от сообщения надо будет выполнить какое-то действие. так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.03.2010, 22:26
Ответы с готовыми решениями:

Определить нажатие клавиши delete, когда активен ListBox
Здравствуйте, господа программисты! Сейчас задам наверное тупой (для вас) вопрос: Как перехватить нажатие клавиши delete, когда активен...

ListBox выбор и нажатие
Какая процедура отвечает за выбор любого Item? Добавлено через 18 секунд И как узнать какая строчка выбрана?

Длительное нажатие на Listbox
Delphi xe10 android. Как можно отследить длительное нажатие на listboxitem для открытия меню. Если это возможно.

10
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
10.03.2010, 23:14
C
1
2
3
4
5
6
    case ID_LISTBOX:
      if (wmEvent == LBN_DBLCLK) /* например Двойной Клик */
      {
         /* наш код */
      }
      break;
создаем компонент так:

C
1
2
hList = CreateWindow(_T("LISTBOX"), NULL, WS_CHILD|WS_VISIBLE|LBS_STANDARD, 
                              10,10,200,80, hWnd, (HMENU)ID_LISTBOX, hInst, NULL);
0
5 / 5 / 0
Регистрация: 16.07.2009
Сообщений: 87
10.03.2010, 23:26  [ТС]
ругается на wmEvent, грит что не определена переменная.

заменил на такое:

C++
1
2
3
4
5
6
case ID_LISTBOX1: {
      if (HIWORD(wParam)==LBN_DBLCLK) /* например Двойной Клик */
      {
        MessageBox(wnd,"yaaaa","Сообщение",MB_OK);
      }
      return 0;
в таком случае компилируется но по двойному клику ничего не происходит
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
11.03.2010, 00:10
delias, ты какую-нибудь книжку по WinAPI читал? Я не читал.. Но зато я читал msdn, этого мне хватило чтобы изучить WinAPI.

Переменная wmEvent всегда определена, если ты используешь код генерируемые студие йпо-умолчанию. И вообще, покажи свою WndProc
0
5 / 5 / 0
Регистрация: 16.07.2009
Сообщений: 87
11.03.2010, 01:00  [ТС]
да я начал читать книгу по винапи но видимо слишком мало прочитал чтобы всё уловить.
вот что наваял:
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
#include <windows.h>
 
#define ID_BUTTON1 3000
#define ID_BUTTON2 3005
#define ID_LISTBOX1 3001
#define ID_EDIT1 3002
 
char className[80] = "window class 1";
HWND wnd;
HINSTANCE hInst;
HANDLE bmp1;
 
int n=0;
 
LRESULT CALLBACK MsgProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam){
int x = LOWORD(lParam);
int y = HIWORD(lParam);
    static HWND hbutton1, hbutton2;
    static HWND hlistbox1;
    static HWND hstatic1, hstatic2;
    static HWND hedit1;
 
    switch(msg){
 
    case WM_CREATE:{
 
        
            hlistbox1 = CreateWindow("listbox",NULL,WS_CHILD|WS_VISIBLE|LBS_WANTKEYBOARDINPUT|LBS_STANDARD,
                20,100,300,200,wnd,(HMENU)ID_LISTBOX1,hInst,0);
            SendMessage(hlistbox1, LB_ADDSTRING, DDL_READWRITE,(LPARAM) ".");
            SendMessage(hlistbox1, LB_ADDSTRING, DDL_READWRITE,(LPARAM) "..");
            SendMessage(hlistbox1, LB_DIR, DDL_READWRITE,(LPARAM) "*.cpp");
            SendMessage(hlistbox1, LB_DIR, DDL_READWRITE,(LPARAM) "*.bmp");
            
 
             hstatic1 = CreateWindow("static","",WS_CHILD|WS_VISIBLE,
                400,60,400,400,wnd,(HMENU)0,hInst,0);
            
 
            return 0;
        }
    
    case WM_SETFOCUS : {
        SetFocus(hlistbox1); 
        return 0; 
                       }
 
    case ID_LISTBOX1: {
      if (HIWORD(wParam)==LBN_DBLCLK) /* например Двойной Клик */
      {
        MessageBox(wnd,"yaaaa","Сообщение",MB_OK);
      }
      return 0; 
                     }
 
 
    case WM_COMMAND:{       
SendMessage(hlistbox1,LB_DIR,DDL_DIRECTORY|DDL_EXCLUSIVE,(LPARAM)"c:\\winxp\\*.*");
            return 0;
    }
 
    case WM_LBUTTONDOWN:
        {
            MessageBox(wnd,"sx","Сообщение",MB_OK);
            
        return 0;
        }
 
 
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
 
    return DefWindowProc(wnd,msg,wParam,lParam);
}
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,char * Cmd,int CmdShow){
 
    hInst = hInstance;
    MSG msg;
 
    WNDCLASS wc;
    wc.hInstance = hInstance;
    wc.lpszClassName = className;
    wc.lpfnWndProc = MsgProc;
    wc.lpszMenuName = NULL;
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.style = 0;
    int res = RegisterClass(&wc);
 
    wnd = CreateWindow(className,"Hello world!!!",WS_OVERLAPPEDWINDOW|WS_VISIBLE,
        20,20,1000,700,NULL,NULL,hInstance,0);
 
    if(!wnd) return 0;
 
    while(GetMessage(&msg,0,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 1;
}
в целом-то код работает но данная тобой рекомендация - нет.

Добавлено через 5 минут
кое-что исправил, ID_LISTBOX на WM_COMMAND - заработало!

кажется начинаю понимать.
думаю завтра будут ещё вопросы.
спасибо граф монте-кристо!
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
11.03.2010, 19:30
Цитата Сообщение от delias Посмотреть сообщение
в целом-то код работает но данная тобой рекомендация - нет.
потому что у тебя отлов ListBox должен осуществляться в WM_COMMAND:

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
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    static HWND hList;
 
    switch (message)
    {
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);
 
        switch (wmId)
        {
                   case ID_LISTBOX:
                      if (wmEvent == LBN_DBLCLK) /* например Двойной Клик */
                      {
                           /* наш код */
                      }
                      break;
 
        }
 
        break;
 
    case WM_CREATE:
        hList = CreateWindow(_T("LISTBOX"), NULL, WS_CHILD|WS_VISIBLE|LBS_STANDARD, 
                    10,10,200,80, hWnd, (HMENU)ID_LISTBOX, hInst, NULL);
 
        break;
 
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code here...
        EndPaint(hWnd, &ps);
        break;
 
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
2
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
11.03.2010, 19:48
Лучшее решение это пропаганда MFC...
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
11.03.2010, 21:17
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Лучшее решение это пропаганда MFC...
MFC - устарел. QT и .NET намного перспективней, проще и лучше.

Но умение программировать на чистов WinAPI тоже ценно - так как это приносит понимание о работе операционной системы в целом. Плюс, стоит не забывать о таком немаловажном факторе как "универ", в котором вполне может изучаться курс WinAPI.
1
5 / 5 / 0
Регистрация: 16.07.2009
Сообщений: 87
12.03.2010, 00:39  [ТС]
мы на винапи зацикливаться не будем, всего 4 недели (заочка)
однако надо это пройти по программе чтоб знать что да как.
вот так-то

а вообще конечно после чистого С++ как-то сложно для понимания - оч много новых терминов, в глазах рябит от непонятных аббревиатур %)
0
 Аватар для Monte-Cristo
2816 / 1408 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
12.03.2010, 00:59
delias, потому что WinAPI - это интерфейс программирования, и по своей сути - никак не связан с языком программирования

Да и то, что ты программируешь на С++ - это вообще-то больше язык Си )
2
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
12.03.2010, 20:11
MFC - устарел. QT и .NET намного перспективней, проще и лучше.
Кому как, меня не напрягает...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.03.2010, 20:11
Помогаю со студенческими работами здесь

Не работает нажатие на пункты ListBox
def reset(event): p=lis.curselection() if p=='0': Text_='''ButtonsABCWithAdditions -модуль, предназначенный для...

ListBox->Items двойное нажатие?
Как сделать что бы при двойном нажатии на Item Листбокса выполнялось какое-либо действие?

Отследить нажатие на вертикальный ScrollBar компонента ListBox
Здравствуйте!! Подскажите пожалуйста, как можно отследить прокрутку и нажатие на вертикальный ScrollBar компонента ListBox. Заранее...

Нажатие кнопки после инициализации формы с listbox
Добрый день! Подскажите, пожалуйста: имеем форму, на которой расположен listbox (с возможностью множественного выбора),в который...

Нажатие на listbox и вывод в Label, Picturebox сканирование папки
Доброго, возникла задача, пишу для брата что то типа лаунчера к играм для PSP есть папка с категориями игр и соответственно игры в папках...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru