Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.27;
Скачать: CL | DM;

Вниз

Проблемы с UpDown   Найти похожие ветки 

 
Darts   (2003-01-13 11:39) [0]

Есть файл ресурсов. Вот состав диалога:

#define ID_EDIT1 4003
#define ID_EDIT2 4004
#define IDC_SPIN1 4006
#define IDC_SPIN2 4007


EDITTEXT ID_EDIT1,40,7,36,11,ES_NUMBER
CONTROL "UpDown1",IDC_SPIN1,"msctls_updown32", UDS_WRAP |
UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
UDS_ARROWKEYS,76,8,11,11

EDITTEXT ID_EDIT2,40,22,36,11,ES_NUMBER
CONTROL "UpDown2",IDC_SPIN2,"msctls_updown32", UDS_WRAP |
UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY |
UDS_ARROWKEYS,76,22,11,11


Диалог открывается. Подготавливаем данные:

WM_INITDIALOG:
begin
// UpDown #1, set range from upper to lower
SendDlgItemMessage(Window, 4006, UDM_SETRANGE, 0, MakeLong(99, 3));
// UpDown #1, accelerators values
aUDACCEL[0].iInc := 2;
aUDACCEL[0].iSec := 0;
SendDlgItemMessage(Window, 4006, UDM_SETACCEL, 1, Longint(@aUDACCEL));
// UpDown #1, set start position
SendDlgItemMessage(Window, 4006, UDM_SETPOS, 0, MakeLong(5, 0));
SendDlgItemMessage(Window, 4001, WM_SETFOCUS, Window, 0);
//SendDlgItemMessage(Window, 4004, WM_SETTEXT, 0, Longint(IntToStr(34)));
.......
end;

Требуется: получить в ID_EDIT1 (который связан с IDC_SPIN1) интервал 3,5,7 и т.д.
К сожалению, ID_EDIT1 показывает только ЦЕЛЫЕ числа. Решил подправить эту
ситуацию.

Итак, я открываю диалог, щелкаю по IDC_SPIN1 и перехватыю от него WM_NOYIFY.

WM_NOTIFY:
begin
case wParam of
// UpDown #1
4006:
begin
CurrentValue := PNMUpDown(lParam)^.iPos + PNMUpDown(lParam)^.iDelta;
//MessageBox(Window, PChar(IntToStr(CurrentValue)), "OldCurrentValue", 0);
//MessageBox(Window, PChar(IntToStr(PNMUpDown(lParam)^.iPos)), "iPos", 0);
//MessageBox(Window, PChar(IntToStr(PNMUpDown(lParam)^.iDelta)), "iDelta", 0);
if (CurrentValue mod 2 = 0) then //begin
Dec(CurrentValue);
// PNMUpDown(lParam)^.iPos := CurrentValue;
//end;
//MessageBox(Window, PChar(IntToStr(CurrentValue)), "NewCurrentValue", 0);
SendDlgItemMessage(Window, 4003, WM_SETTEXT, 0, Longint(IntToStr(CurrentValue)));
end;
end; // case
//MessageBox(Window, PChar(IntToStr(wParam)), "WM_NOTIFY", 0);
end;

Проблема в том, что после SendDlgItemMessage(Window, 4003, WM_SETTEXT, 0, Longint(IntToStr(CurrentValue))),
которое инициирует сообщение WM_SETTEXT и устанавливает правильные данные,
появляется еще одно WM_SETTEXT (появляется всегда, и очевидно, от IDC_EDIT1), которое
устанавливает полученный результат уже ЦЕЛЫМ. Это видно в WinSight.

Если я пошлю SendDlgItemMessage(Window, 4004, WM_SETTEXT, ...),
т.е. я посылаю IDC_EDIT2, то все OK.

Вопросы:
1. Как обойти эту проблему, предложите варианты (сделать сабклассинг для IDC_EDIT1)?
2. Почему итоговое значение ЧЕТНОЕ?

В Delphi то же самое. Можно кинуть Edit1, UpDown1, связать UpDown1 c Edit1, установить
минимум (3), максимум (99), шаг (2) и полюбоваться на результат.


 
Darts   (2003-01-14 11:52) [1]

Up



Страницы: 1 вся ветка

Текущий архив: 2003.02.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.014 c
3-87287
Skif_1
2003-02-08 00:44
2003.02.27
BDE


14-87659
Кен
2003-01-24 06:53
2003.02.27
Как моделируются физические законы ? Например, падение шарика на


1-87431
Дима2003
2003-02-17 10:11
2003.02.27
iif ?


14-87638
gn
2003-02-06 06:09
2003.02.27
Эгоисты!!!!!!!1


1-87411
Guerrillero
2003-02-17 17:51
2003.02.27
Вывод текста в TreeView