Главная страница
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.019 c
3-87310
Imshanya
2003-02-07 15:09
2003.02.27
Результат выполнения Query поместить в Список -без Цикла.


1-87557
Akim2
2003-02-17 13:10
2003.02.27
TMemo, Позиционирование курсора


14-87682
Михаил
2003-02-09 22:27
2003.02.27
Сервисы в Win2k


3-87306
Veronika
2003-02-07 13:26
2003.02.27
IB6, разница в работ c dialect 1 и dialect 3


1-87509
Ricks
2003-02-16 15:11
2003.02.27
Hide underlined letters for keyboard navigation....