Главная страница
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.015 c
1-87383
msgipss
2003-02-17 20:36
2003.02.27
Помогите найти глюкв коде, что то глаз замылился, не могу понять


3-87300
lightix
2003-02-10 11:27
2003.02.27
Программное создание DBF для FoxPro...


1-87414
Артём К
2003-02-14 12:29
2003.02.27
Как сдвинуть значения массива на один элемент


14-87686
Павел
2003-02-11 16:25
2003.02.27
Программисты


3-87295
samson
2003-02-10 08:35
2003.02.27
ExcelApplication