Главная страница
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.017 c
1-87406
Vitus
2003-02-18 10:33
2003.02.27
Как создать ярлык на рабочем столе?


1-87361
Alek_1
2003-02-16 21:01
2003.02.27
Image1


1-87562
Hint
2003-02-17 13:03
2003.02.27
Оптимизация поиска в файлах


1-87542
Udjin
2003-02-14 11:37
2003.02.27
работа с указателями


3-87272
anatolyk
2003-02-08 20:53
2003.02.27
Работа с БД.