Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517

"Поймать" сообщение от LISTBOX

09.11.2011, 11:40. Показов 4291. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Рассматриваю тут пример в книге и вот почему-то он у меня срабатывать не хочет - не могу изменять масштаб в диалоговом окне так как он тупо вообще не выбирается, может стиля какого не хватает при создании диалогового окна, или ещё чего, подскажите пожалуйста.
Собственно main.h (константы и объявления функций)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define MI_OPEN 101
#define MI_EXIT 102
#define MI_SETTINGS 103
#define ID_DOTS 201
#define ID_CURVE 202
#define ID_SCALE 203
 
//определение нового типа GrapgModes
enum GraphModes{DOTS=ID_DOTS,CURVE=ID_CURVE};
 
//прототипы функций для главного окна
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
void OnCommand(HWND,int,HWND,UINT);
void OnPaint(HWND);
void OnDestroy(HWND);
 
//прототипы функций для диалогового окна
BOOL CALLBACK DlgProc(HWND,UINT,WPARAM,LPARAM);
BOOL DlgOnInitDialog(HWND,HWND,LPARAM);
void DlgOnCommand(HWND,int,HWND,UINT);
main.rc (диалоговое окно и меню, возможно в диалоговом окне в элементе LISTBOX какраз и есть ошибка)
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
#include "main.h"
#include <windows.h>
 
Main MENU
{
    POPUP "&Файл"
    {
        MENUITEM "&Открыть...",MI_OPEN
        MENUITEM "&Режимы...",MI_SETTINGS
        MENUITEM SEPARATOR
        MENUITEM "&Выход",MI_EXIT
    }
}
 
SettingsDlg DIALOG 150,0,125,80
STYLE WS_VISIBLE | WS_SYSMENU | WS_POPUP
CAPTION "Режимы вывода данных"
{
    CONTROL "Вид",-1,"BUTTON",BS_GROUPBOX,10,10,65,45
    CONTROL "Точки",ID_DOTS,"BUTTON",BS_AUTORADIOBUTTON,15,20,45,14
    CONTROL "Огибающая",ID_CURVE,"BUTTON",BS_AUTORADIOBUTTON,15,35,55,14
    CONTROL "",ID_SCALE,"LISTBOX",BS_NOTIFY|WS_VSCROLL|WS_BORDER,85,15,30,50
    CONTROL "Масштаб",-1,"STATIC",SS_LEFT,85,3,40,10
    CONTROL "Закрыть",IDOK,"BUTTON",BS_PUSHBUTTON,25,60,40,14
}
ну и главный файл
main.cpp
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <windows.h>
#include <windowsx.h>
#include "main.h"
 
char szClassName[]="MainWindow";
char szTitle[]="Программа 6-5";
char szFile[128];//для спецификации выбранного файла
short nBuf[500];//Буфер для чтения массива из файла
BOOL bDataOK=FALSE;//Если TRUE - данные прочитаны в буфер nBuf
HINSTANCE hI;//дескриптор приложения
short nBufScaled[500];//Буфер для масштабированного массива
int nScales[8]={200,175,150,125,100,75,50,25};//Массив масштабов
int nScaleIndex=4;//Текущее (и начальное) значение индекса в массиве масштабов
float nCurrentScales=1;//текущее (и начальное) значение масштаба
HWND hSettingsBox;//дескриптор немодального диалога
GraphModes Mode=DOTS;//режим наблюдения и его начальное значение
HPEN hPen;//дескриптор нового пера
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
{
    MSG msg;
    hI=hInst;
    WNDCLASS wc;
     ZeroMemory(&wc,sizeof(wc));
     wc.style=CS_VREDRAW;
     wc.lpfnWndProc=WndProc;
     wc.hInstance=hInst;
     wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
     wc.hCursor=LoadCursor(NULL,IDC_ARROW);
     wc.hbrBackground=GetStockBrush(WHITE_BRUSH);
     wc.lpszMenuName="Main";
     wc.lpszClassName=szClassName;
    RegisterClass(&wc);
 
    HWND hwnd=CreateWindow(szClassName,szTitle,WS_OVERLAPPEDWINDOW,
                           0,0,600,400,HWND_DESKTOP,NULL,hInst,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);
    hPen=CreatePen(PS_SOLID,1,RGB(0,0,255));
    while(GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
 
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hwnd,WM_COMMAND,OnCommand);
        HANDLE_MSG(hwnd,WM_PAINT,OnPaint);
        HANDLE_MSG(hwnd,WM_DESTROY,OnDestroy);
 
        default:
         return DefWindowProc(hwnd,msg,wParam,lParam);
    }
}
 
 
//функция обработки сообщения WM_COMMAND от меню
void OnCommand(HWND hwnd, int id, HWND, UINT)
{
    OPENFILENAME ofn;//структура для функции GetOpenFileName
    char szFilter[]="Файлы данных (*:DAT)\0*.dat\0Все файлы(*.*)\0*.*\0";
    DWORD nCnt;//Вспомогательная переменная для файловых операций
 
    switch (id)
    {
        case MI_OPEN:
         ZeroMemory(&ofn,sizeof(OPENFILENAME));
         ofn.lStructSize=sizeof(OPENFILENAME);//размер структуры
         ofn.hwndOwner=hwnd;//дескриптор окна-владельца диалога
         ofn.lpstrFilter=szFilter;//строка с шаблонами имен искомых файлов
         ofn.lpstrFile=szFile;//буфер для имени файла
         ofn.nMaxFile=sizeof(szFile);//его размер
         ofn.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
         if(GetOpenFileName(&ofn))
         {
             HANDLE hFile=CreateFile(szFile,GENERIC_READ,0,0,OPEN_EXISTING,0,NULL);
             if(hFile==INVALID_HANDLE_VALUE) break;//если не удалось открыть файл
             ReadFile(hFile,nBuf,2*500,&nCnt,NULL);//чтение из файла
             CloseHandle(hFile);
             bDataOK=TRUE;//данные имеются, можно выводить
 
             for(int i=0;i<500;i++)//выполним начальное масштабирование спектра
              nBufScaled[i]=nBuf[i]*nCurrentScales;
             InvalidateRect(hwnd,NULL,TRUE);//инициируем WM_PAINT
             break;
         }
 
         else
          break;//если файл не выбран
 
        case MI_EXIT:
         DestroyWindow(hwnd);
         break;
 
        case MI_SETTINGS:
         if(hSettingsBox==NULL)//если диалог ещё не открыт, создадим его
          hSettingsBox=CreateDialog(hI,"SettingsDlg",hwnd,DlgProc);
         break;
    }
}
 
//функция обработки сообщения WM_PAINT
void OnPaint(HWND hwnd)
{
    RECT r;
    PAINTSTRUCT ps;
    HDC hdc=BeginPaint(hwnd,&ps);
     HPEN hOldPen=SelectPen(hdc,hPen);
     GetClientRect(hwnd,&r);//получение координат рабочей области
     if(bDataOK)
     {
         switch(Mode)
         {
             case DOTS:
             {
                 for(int i=0;i<500;i++)
                  SetPixel(hdc,i,r.bottom-5-nBufScaled[i],RGB(0,0,255));//вывод точек
                 break;
 
             }
 
             case CURVE:
             {
                 MoveToEx(hdc,0,r.bottom-5-nBufScaled[0],NULL);
                 for(int i=1;i<500;i++)
                  LineTo(hdc,i,r.bottom-5-nBufScaled[i]);//вывод отрезков
             }
         }
     }
     SelectPen(hdc,hOldPen);
     EndPaint(hwnd,&ps);
}
 
//функция обработки сообщения WM_DESTROY
void OnDestroy(HWND)
{
    DeleteObject(hPen);
    PostQuitMessage(0);
}
 
//оконная процедура немодального диалога
BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hwnd,WM_INITDIALOG,DlgOnInitDialog);
        HANDLE_MSG(hwnd,WM_COMMAND,DlgOnCommand);
 
        default:
         return FALSE;
    }
}
 
//функция обработки сообщения WM_INITDIALOG для диалогового окна
BOOL DlgOnInitDialog(HWND hwnd, HWND,LPARAM)
{
    char S[10];//строка для обмена данными со списком LISTBOX
    SendDlgItemMessage(hwnd,Mode,BM_SETCHECK,1,0L);//Нажать кнопку режима
 
    for(int i=0;i<8;i++)//заполнение списка LISTBOX строками текста
    {
        wsprintf(S,"%d%%",nScales[i]);//пересылка в строку числа и знака %
        SendDlgItemMessage(hwnd,ID_SCALE,LB_ADDSTRING,0,(LPARAM)S);
    }
    SendDlgItemMessage(hwnd,ID_SCALE,LB_SETCURSEL,nScaleIndex,0L);
    return TRUE;
}
 
//функция обработки сообщений WM_COMMAND для диалогового окна
void DlgOnCommand(HWND hwnd,int id,HWND,UINT codeNotify)
{
    switch(id)//код элемента управления
    {
        case IDOK://сообщение от кнопки закрыть
        case IDCANCEL://сообщение от системного меню диалога
         DestroyWindow(hwnd);//уничтожение окна немодального диалога
         hSettingsBox=NULL;//сбросим в нуль его дескриптор
         break;
 
        case ID_DOTS://сообщение от кнопки "Точки"
         Mode=DOTS;//устновим режим "Точки"
         InvalidateRect(GetParent(hwnd),NULL,TRUE);//инициируем WM_PAINT
         break;
 
        case ID_CURVE://сообщение от кнопки "Огибащая"
         Mode=CURVE;//установим режим "Огибающая"
         InvalidateRect(GetParent(hwnd),NULL,TRUE);//инициируем WM_PAINT
         break;
 
        case ID_SCALE://сообщение от списка, проанализируем извещение
         if(codeNotify==LBN_SELCHANGE)//если изменилось выделение в списке
         {
             nScaleIndex=(int)SendDlgItemMessage(hwnd,ID_SCALE,LB_GETCURSEL,0,0);
             nCurrentScales=(float)nScales[nScaleIndex]/100;//Преобразование строки в число
 
             for(int i=0;i<500;i++)//масштабирование спектра в соответствии
              nBufScaled[i]=nBuf[i]*nCurrentScales;//с новым масштабом
 
            InvalidateRect(GetParent(hwnd),NULL,TRUE);//инициируем WM_PAINT
         }
    }
}

Собственно в нём ошибка если есть то разве что в последней функции DlgOnCommand в case ID_SCALE (строка 197), так как именно там обрабатываются сообщения от моего LISTBOX с диалогового окна, все остальные функции работают корректно. Ну ещё возможно что есть ошибка при заполнении LISTBOX (это функция DlgOnInitDialog (строка 162)), хотя вроде заполнился он нормально и все 8 строк в нём присутствуют.

Сама программа,если интересно, выводит график, который она читает из dat файла (считывает первые 1000 байт). Файл dat с нормальным графиком могу предоставить, хотя можно тупо открыть любой файл чтобы программа считала с него 1000 байт, график только рандомный получится.

На скриншоте видно что ни один пункт в LISTBOX "Масштаб" не выбран и мышкой не выбирается.
Изображения
 
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2011, 11:40
Ответы с готовыми решениями:

Поймать двойной клик по строке в LISTBOX и выполнить указанное действие
Ниже привел код процедуры окна, в котором создан LISTBOX2. В нем заполнены строки улицами (5 улиц), надо при двойном нажатии на строку...

Как поймать событие скроллинга в listBox?
Кто-нибудь знает куда копать? События, отвечающего за скроллинг (как горизонтальный, так и вертикальный) у ListBox НЕТ. Тогда как можно...

Поймать сообщение wm_copy
Нужно ловить все wm_copy всех приложений. Я понимаю, что делать это через хук, но какой именно использовать? И какой параметр...

42
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.11.2011, 11:49
Gepar, в листе есть функция m_list.GetIttemState - проберайте в цикле все итемы от листа и когда выполнится условие
C++
1
if (LVIS_SELECTED == m_list.GetItemState (i,LVIS_SELECTED))
- знайте в i - номер выделеного в окне листа, ну а текст с него подобрать можно m_list.GetItemText

Добавлено через 1 минуту
Вот вам кусочек кода из моей програмки
C++
1
2
3
4
5
6
7
char *sPath = (char *)malloc(MAX_PATH);
    int nCount = m_list.GetItemCount();
    for(int i = 0; i < nCount; i++)
    {
        if (LVIS_SELECTED == m_list.GetItemState (i,LVIS_SELECTED))
        {
            m_list.GetItemText(0,0,sPath,MAX_PATH);
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 11:54  [ТС]
-=ЮрА=-, спасибо, сейчас попробую ещё с Вашим вариантом разобраться, но хотелось бы также найти ошибку что есть в коде этого примера, наверняка она маленькая в виде пропущенного стиля или небольшой строки так как судя по MSDN такая "ловля" сообщений как у меня в примере тоже должна работать.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.11.2011, 12:08
Gepar, я не очень люблю ковырятся в API там маханький косячок в CreateWindow и окна нет - так же и в остальном, притом у Вас не весь код не проанализируешь
Ещё забыл спросить как вы отлавливаете клик по итему листа??? К тому же если изначально у вас не установлено выделение на каком-либо итеме то вы не отловите LVIS_SELECTED, чтобы такого не было
в программах всегда предусматриваю m_list.SetItemState(0,LVIS_SELECTED); или же отлавливаю выбор при нажатии на лист...
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 12:14  [ТС]
Что-то не могу я разобраться с Вашей GetIttemState (да и в msdn что-то не находится она), как мне конкретизировать что у меня за LISTBOX ? В файле ресурсов он связан у меня с константой ID_SCALE, но как к нему теперь обратится с помощью этой функции? Если можно напишите чуть подробнее относительно моего примера, я ведь WINAPI только-только начал изучать.

Добавлено через 1 минуту
-=ЮрА=-, клик по пункту в листе должен отлавливаться так (конкретно case ID_SCALE)
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
//функция обработки сообщений WM_COMMAND для диалогового окна
void DlgOnCommand(HWND hwnd,int id,HWND,UINT codeNotify)
{
    switch(id)//код элемента управления
    {
        case IDOK://сообщение от кнопки закрыть
        case IDCANCEL://сообщение от системного меню диалога
         DestroyWindow(hwnd);//уничтожение окна немодального диалога
         hSettingsBox=NULL;//сбросим в нуль его дескриптор
         break;
 
        case ID_DOTS://сообщение от кнопки "Точки"
         Mode=DOTS;//устновим режим "Точки"
         InvalidateRect(GetParent(hwnd),NULL,TRUE);//инициируем WM_PAINT
         break;
 
        case ID_CURVE://сообщение от кнопки "Огибащая"
         Mode=CURVE;//установим режим "Огибающая"
         InvalidateRect(GetParent(hwnd),NULL,TRUE);//инициируем WM_PAINT
         break;
 
        case ID_SCALE:///сообщение от списка, проанализируем извещение
         if(codeNotify==LBN_SELCHANGE)//если изменилось выделение в списке
         {
             nScaleIndex=(int)SendDlgItemMessage(hwnd,ID_SCALE,LB_GETCURSEL,0,0);
             nCurrentScales=(float)nScales[nScaleIndex]/100;//Преобразование строки в число
 
             for(int i=0;i<500;i++)//масштабирование спектра в соответствии
              nBufScaled[i]=nBuf[i]*nCurrentScales;//с новым масштабом
 
            InvalidateRect(GetParent(hwnd),NULL,TRUE);//инициируем WM_PAINT
         }
    }
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.11.2011, 12:15
Цитата Сообщение от Gepar Посмотреть сообщение
GetIttemState
- я очепятался, но в коде всё норм, вы не то искали
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
GetItemState
CListCtrl::GetItemState

PS:Сейчас накидаю проектик в MFC, нужно немножко времени...
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 12:17  [ТС]
При этом мой LISTBOX сам связан с константой ID_SCALE, и изначально он был пуст, а потом уже из массива char заполнен значениями вот так:
C++
1
2
3
4
5
6
    for(int i=0;i<8;i++)//заполнение списка LISTBOX строками текста
    {
        wsprintf(S,"%d%%",nScales[i]);//пересылка в строку числа и знака %
        SendDlgItemMessage(hwnd,ID_SCALE,LB_ADDSTRING,0,(LPARAM)S);
    }
    SendDlgItemMessage(hwnd,ID_SCALE,LB_SETCURSEL,nScaleIndex,0L);
Так что кодов у конкретных строк нет и нужно определить какая строчка (номер её) выбрана в листе.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.11.2011, 12:18
Цитата Сообщение от Gepar Посмотреть сообщение
nScaleIndex=m_list.GetItemState();
- да нууу разве я так писал

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(int i = 0; i < nCount; i++)
* * * * {
* * * * * * * * if (LVIS_SELECTED == m_list.GetItemState (i,LVIS_SELECTED))
* * * * * * * * {
Добавлено через 46 секунд
Цитата Сообщение от Gepar Посмотреть сообщение
При этом мой LISTOX это ID_SCALE, и изначально он был пуст, а потом уже из массива char заполнен значениями вот так:
-
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
PS:Сейчас накидаю проектик в MFC, нужно немножко времени...
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 12:22  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- да нууу разве я так писал
Нет конечно, это я вытирал и недотёр код и скопировал по ошибке сюда то что осталось не стёртым, уже убрал его отсюда в коде.

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
PS:Сейчас накидаю проектик в MFC, нужно немножко времени...
Хорошо, я жду, хотя есть маленькая проблема - MFC мне начнут читать только с пн, я с ним совершенно незнаком, пока ознакомлен только с чистым WINAPI.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.11.2011, 12:33
Gepar, вот поклацайте
Вот обработчик смены выбранного в листбоксе
C++
1
2
3
4
5
6
7
void CSelListDlg::OnSelChangeList1() 
{
    // TODO: Add your control notification handler code here
    int index = m_list1.GetCurSel();
    m_list1.GetText(index,m_stat1);
    UpdateData(false);
}
Сам лист заполнил ещё до появоения окна
C++
1
2
3
4
5
6
7
8
9
10
    // TODO: Add extra initialization here
    for(int i = 1; i <= 10; i++)
    {
        m_stat1.Format("%d %%",i * 10);
        m_list1.AddString(m_stat1);
    }
    m_list1.SetCurSel(i - 1);
    OnSelChangeList1();
    UpdateData(true);
    return TRUE;  // return TRUE  unless you set the focus to a control
Прикладываю экзе скрин и проект
Изображения
 
Вложения
Тип файла: rar SelList.exe.rar (3.7 Кб, 9 просмотров)
Тип файла: rar SelList_proj.rar (11.1 Кб, 13 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.11.2011, 12:42
PS:Вначале топика я давал пример с расширенной версией CListBox - CListCtrl там и иконки можно вставить и многое что ещё, поєтому
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
m_list.GetItemState (i,LVIS_SELECTED)
относилось именно к CListCtrl
Для ListBox достаточно парсить
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
OnSelChangeList1()
Индекс выделенного получаем
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
int index = m_list1.GetCurSel();
Текст index - итема получаем
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
m_list1.GetText(index,m_stat1);
Добавлено через 2 минуты
Цитата Сообщение от Gepar Посмотреть сообщение
"Поймать" сообщение от LISTBOX
- вот то самое сообщение ON_LBN_SELCHANGE найди его в карте
C++
1
2
3
4
5
6
7
BEGIN_MESSAGE_MAP(CSelListDlg, CDialog)
    //{{AFX_MSG_MAP(CSelListDlg)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_LBN_SELCHANGE(IDC_LIST1, OnSelChangeList1)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
Добавлено через 1 минуту
Цитата Сообщение от Gepar Посмотреть сообщение
if(codeNotify==LBN_SELCHANGE)//если изменилось выделение в списке
* * * * *{
* * * * * * *nScaleIndex=(int)SendDlgItemMessage(hwn d,ID_SCALE,LB_GETCURSEL,0,0);
* * * * * * *nCurrentScales=(float)nScales[nScaleIndex]/100;//Преобразование строки в число
for(int i=0;i<500;i++)//масштабирование спектра в соответствии
* * * * * * * nBufScaled[i]=nBuf[i]*nCurrentScales;//с новым масштабом
InvalidateRect(GetParent(hwnd),NULL,TRUE );//инициируем WM_PAINT
* * * * *}
- думаю єто всё можно заменить на
C++
1
2
3
CString text;
int index = m_list1.GetCurSel();
m_list1.GetText(index,text);
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 12:50  [ТС]
Спасибо, но мне ничего непонятно из такого проекта, я WINAPI только начал изучать, а о MFC я пока знаю только что это такое так что Ваш MFC проект к сожалению мне непонятен

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
думаю єто всё можно заменить на
Возможно,точнее получение номера пункта -да, масштабирование - нет. Но что такое этот m_list1 ? Я не могу понять как мне обратиться к моему LISTOX этой функцией? Ну есть у меня константа для моего LISTBOX =ID_SCALE=203, но не через неё же обращаться мне .
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.11.2011, 12:50
Gepar, давай весь код, выложи в архиве и в личке напиша пароль, чтобі другие не могли смотреть без твоего согласия, не видя всего кода я помочь не могу. PS:Как видишь API код длиннее MFC-ного, поетому и не люблю API
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 12:52  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Gepar, давай весь код, выложи в архиве и в личке напиша пароль, чтобі другие не могли смотреть без твоего согласия, не видя всего кода я помочь не могу.
Так в первом же сообщении весь код, main.cpp под спойлером просто чтобы меньше места занимало, нажми на него и будет весь код. Смысл мне код прятать
0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 12:54  [ТС]
На всякий случай прикрепляю проект + там же тестовый файл с графиком.
Жирным (///) в main.cpp выделил то что относится к LISTBOX
Вложения
Тип файла: zip WinProjInCodeBlocks.zip (4.5 Кб, 17 просмотров)
0
09.11.2011, 12:54

Не по теме:

Цитата Сообщение от Gepar Посмотреть сообщение
ак в первом же сообщении весь код, main.cpp под спойлером просто чтобы меньше места занимало, нажми на него и будет весь код.
- ок возможно я невнимательно посмотрел...

0
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 12:57  [ТС]
-=ЮрА=-, прикрепил zip архивом, посмотри пожалуйста, очень хотелось бы всё же разобраться с этим LISTBOX.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
09.11.2011, 13:19
Цитата Сообщение от Gepar Посмотреть сообщение
-=ЮрА=-, прикрепил zip архивом, посмотри пожалуйста, очень хотелось бы всё же разобраться с этим LISTBOX.
У меня не кодблокс я уже и UseMFCAsSharedDLL ставил, всё рано лупит

Не по теме:

Deleting intermediate files and output files for project 'main - Win32 Debug'.
--------------------Configuration: main - Win32 Debug--------------------
Compiling...
main.cpp
d:\мои документы\downloads\winprojincodeblocks\ winprojincodeblocks\main.cpp(108) : warning C4244: '=' : conversion from 'float' to 'short', possible loss of data
d:\мои документы\downloads\winprojincodeblocks\ winprojincodeblocks\main.cpp(222) : warning C4244: '=' : conversion from 'float' to 'short', possible loss of data
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/main.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

main.exe - 2 error(s), 2 warning(s)



Добавлено через 1 минуту
PS: А разве 2 HISTANCE может быть WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
09.11.2011, 14:36
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
#include <windows.h>
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
HINSTANCE g_hinst;
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  HWND hwnd;
  MSG  msg ;
  WNDCLASS wc = {0};
  wc.lpszClassName = TEXT("programina");
  wc.hInstance     = hInstance ;
  wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
  wc.lpfnWndProc   = WndProc ;
  wc.hCursor       = LoadCursor(0,IDC_ARROW);
 
  g_hinst = hInstance;
 
  RegisterClass(&wc);
  hwnd = CreateWindow(wc.lpszClassName, TEXT("programina"),WS_OVERLAPPEDWINDOW | WS_VISIBLE,100, 100, 270, 170, 0, 0, hInstance, 0);
 
 
  while( GetMessage(&msg, NULL, 0, 0)) {
    DispatchMessage(&msg);
  }
  return (int) msg.wParam;
}
 
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
 
  static HWND hwndList, hwndStatic;
  const TCHAR *items[] = { TEXT("programina1"), TEXT("programina2"), TEXT("programina3"), TEXT("programina4") };
  int i;
  LRESULT sel = 0;
 
  switch(msg)
  {
      case WM_CREATE:
            hwndList = CreateWindow(TEXT("listbox"), NULL, WS_CHILD | WS_VISIBLE | LBS_NOTIFY,5, 5, 100, 100, hwnd,(HMENU) 1, g_hinst, NULL);
            hwndStatic = CreateWindow(TEXT("static"), TEXT(""),WS_CHILD | WS_VISIBLE,170, 50, 90, 25, hwnd, (HMENU) 2, g_hinst, NULL);
 
            for ( i = 0; i < 4; i++ ) {
                SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM) items[i]);
            }
            break;
 
      case WM_COMMAND:
            if (LOWORD(wParam) == 1) {
                if ( HIWORD(wParam) == LBN_SELCHANGE) {
                    sel = SendMessage(hwndList, LB_GETCURSEL, 0, 0);
                    SetWindowText(hwndStatic, items[sel]);
                    SetFocus(hwnd);
                }
            }
 
           break;
 
      case WM_DESTROY:
          PostQuitMessage(0);
          break;
  }
  return DefWindowProc(hwnd, msg, wParam, lParam);
}
Ноу МФСи
 Комментарий модератора 
Пункт 3.9 правил: Запрещено накручивать репутацию любым способом, включая создание пользователей-клонов, а также склонять (агитировать) других пользователей к ее повышению.
1
 Аватар для Gepar
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
09.11.2011, 18:40  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
PS: А разве 2 HISTANCE может быть WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
Что-то Вы меня пугаете.
http://msdn.microsoft.com/en-u... e-de).aspx
C++
1
2
3
4
5
6
int CALLBACK WinMain(
  __in  HINSTANCE hInstance,
  __in  HINSTANCE hPrevInstance,
  __in  LPSTR lpCmdLine,
  __in  int nCmdShow
);
Разве Вы видел WinMain с другим набором параметров? Просто не используемые параметры я не называл (а зачем их называть, я ведь ими пользоваться всё равно не буду).
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
У меня не кодблокс я уже и UseMFCAsSharedDLL ставил, всё рано лупит
У Вас же точно есть VS 6.0, код собственно для неё, VS2010 не захочет компилировать так как кое-где нужны приведения типов.
А VS 6.0 вот пожалуйста:
Code
1
2
3
4
C:\c++\VS PROJECTS\Finogenov\main.cpp(89) : warning C4244: '=' : conversion from 'float' to 'short', possible loss of data
C:\c++\VS PROJECTS\Finogenov\main.cpp(202) : warning C4244: '=' : conversion from 'float' to 'short', possible loss of data
 
main.obj - 0 error(s), 2 warning(s)
Это НЕ MFC проект кстати, это Win32 Application проект же.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Это какраз говорит что Вы создали неподходящее проект, MFC, Console Application либо ещё чего.

Добавлено через 6 минут
programina, Ваш пример работает вроде, но мне в нём кое что непонятно:
Цитата Сообщение от programina Посмотреть сообщение
wc.lpszClassName = TEXT("programina");
Во первых что делает макрос(?) TEXT перед строками текста в скобках? Примерно догадываюсь смысл, но хочу точно знать что он делает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.11.2011, 18:40
Помогаю со студенческими работами здесь

Как поймать сообщение об ошибке
Здравстуйте. Помогите, пожайлуста, со следующей проблемой. Есть DriveComboBox и DirectoryListBox на форме. У меня на ноутбуке есть...

Не могу поймать сообщение wm_copydata
Мне необходимо принять массив данных типа ushort от другого приложения. В С++ я принимал сообщения wm_copydata следующим образом: ...

Хук, который должен поймать сообщение WM_SIZE, его не ловит
Здравствуйте, у меня такая проблема: Есть хук, который должен поймать сообщение WM_SIZE, но он его не ловит :( я даже без понятия почему....

ListBox и всплывающее сообщение
Как можно сделать так чтобы когда в ListBox появился текст то всплывало сообщение??? На сайте информация появляется очень редко, и она...

Если в listbox есть определенное название,выводит сообщение
Моя программа делает индексацию файлов и по нажатию &quot;Поиск&quot; в листБокс выводит подозрительные файлы(по фильтру) И там выводится например...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru