Vitamin | Дата: Вторник, 06.09.2022, 11:42 | Сообщение # 65 |
Лейтенант
Группа: Пользователи
Сообщений: 59
Статус: Offline
| zamabuvaraeu, спасибо буду изучать, а то не знал даже как это называется. А в рамках Window9 мне пришло на ум 2 варианта с дополнительным окном ввода:
№1
Код #Include "window9.bi" Dim As integer i, event Dim Shared As HWND hwnd Dim As String setting = GetCurrentSettingsDisplay ' получаем параметры экрана
hwnd = OpenWindow("окно",GetWidthDesktop(setting)/2-250,GetHeightDesktop(setting)/2-180,280,200) StringGadget(1,10,10,64,16,"00:00:00",ES_READONLY Or ES_CENTER,WS_EX_STATICEDGE) SetGadgetFont(1,LoadFont("Arial",9)) ButtonGadget(2,180,10,60,30,"button")
Sub PozVvoda(nTxt As Integer, x As Integer, y As Integer) Dim As Integer i, event : Var s = GetGadgetText(nTxt) ' читаем строку "00:00:00"; x, y - смещение в главном окне немного правее строки ввода времени(+10,+10) #Define parOkna WS_VISIBLE Or WS_BORDER Or WS_CAPTION Or WS_POPUPWINDOW,WS_EX_TOPMOST ' координаты главного окна Var hwnd2 = OpenWindow("Время",WindowX(hwnd)+x,WindowY(hwnd)+y,138,100,parOkna) ' коорднГлОкна+сдвгПравКраюТекстГаджета #Define SpinGdgtFlg UDS_SETBUDDYINT Or UDS_ALIGNRIGHT Or UDS_WRAP Or UDS_ARROWKEYS ' флаги для SpinGadget SpinGadget(100,4,12,42,20,23,0,ValInt(Left(s,2)),SpinGdgtFlg,ES_CENTER Or ES_NUMBER) ' id,x,y,w,h,maxVal,minVal,curVal,flg1,flg2 SetGadgetColor(100,16777215,0,1) : SetGadgetFont(100,LoadFont("Arial",9)) SpinGadget(101,42+4,12,42,20,59,0,ValInt(Mid(s,4,2)),SpinGdgtFlg,ES_CENTER Or ES_NUMBER) SetGadgetColor(101,16777215,0,1) : SetGadgetFont(101,LoadFont("Arial",9)) SpinGadget(102,84+4,12,42,20,59,0,ValInt(Right(s,2)),SpinGdgtFlg,ES_CENTER Or ES_NUMBER) SetGadgetColor(102,16777215,0,1) : SetGadgetFont(102,LoadFont("Arial",9)) ButtonGadget(103,4,38,60,26,"Отмена") : SetGadgetFont(103,LoadFont("Arial",9)) ButtonGadget(104,68,38,60,26,"Ввод") : SetGadgetFont(104,LoadFont("Arial",9)) AddKeyboardShortcut(hwnd2,FVIRTKEY,VK_ESCAPE,1001) ' нажата клавиша ESC AddKeyboardShortcut(hwnd2,FVIRTKEY,VK_RETURN,1002) ' нажата клавиша Enter Do event = WaitEvent() If event = EventClose AndAlso EventHwnd() = hwnd2 Then Exit Do ' если зарыли миниОкно - выход без сохранения If event = EventMenu Then Select Case EventNumber Case 1001 : Exit Do ' нажата клавиша ESC = Выход Case 1002 : i = 1 : Exit Do ' нажата клавиша Enter = команда закончить ввод и сохранить значение End Select EndIf If event = EventGadget Then Select Case EventNumber() ' в зависимости от нажатой Кнопки Case 103 : Exit Do ' нажата кнопка Отменить Case 104 : i = 1 : Exit Do ' команда закончить ввод и сохранить значение End Select EndIf Loop #Define ModZn(nGdg) IIf(Len(Str(GetGadgetState(nGdg)))=2,Str(GetGadgetState(nGdg)),"0" & GetGadgetState(nGdg)) If i Then SetGadgetText(nTxt,ModZn(100) & ":" & ModZn(101) & ":" & ModZn(102)) For i = 100 To 104 : FreeGadget(i) : Next ' освобождаем ресурсы Close_Window(hwnd2) : SetFocus(hwnd) ' закрываем миниОкно ввода и переводим фокус на главное (блокПовтЗапуск) End Sub
Do event = WaitEvent() If event = EventClose AndAlso EventHwnd() = hwnd Then End If event = EventGadget Then If EventNumber() = 1 Then PozVvoda(1,74,36) ' выбрано поле строки времени EndIf Loop
№2Код #Include "window9.bi" Dim As integer i, event Dim Shared As HWND hwnd Dim As String setting = GetCurrentSettingsDisplay ' получаем параметры экрана
hwnd = OpenWindow("окно",GetWidthDesktop(setting)/2-250,GetHeightDesktop(setting)/2-180,280,200) StringGadget(1,10,10,64,16,"00:00:00",ES_READONLY Or ES_CENTER,WS_EX_STATICEDGE) SetGadgetFont(1,LoadFont("Arial",9)) ButtonGadget(2,180,10,60,30,"button")
Function VvodZnah(nomer As Integer) As Integer ' добавление 1-го числа Var s = GetGadgetText(110) ' читаем строку "_0:00:00" s = Left(s,2) & Mid(s,4,2) & Right(s,2) ' убираем разделители ":" Var poz = InStr(s,"_") ' находим позицию слеша в строке "_00000" Mid(s,poz) = IIf(nomer = -1,"000000",Str(nomer)) & "_" ' Замена подстроки If nomer = -1 Then poz = 6 If poz = 6 Then ' строка заполнена - делаем проверку корректности всего значения If ValInt(Left(s,2)) > 23 Or ValInt(Mid(s,3,2))> 59 Or ValInt(Right(s,2)) > 59 Then s = "_00000" : poz = 1 ' если не корректно - сбрасываем в начальное состояние EndIf EndIf s = Left(s,2) & ":" & Mid(s,3,2) & ":" & Right(s,2) ' добавляем разделители SetGadgetText(110,s) : Return poz ' отображаем строку "0_:00:00" End Function
Function VvodZnahRev() As Integer ' удаление 1-го элемента Var s = GetGadgetText(110) ' читаем строку "_0:00:00" s = Left(s,2) & Mid(s,4,2) & Right(s,2) ' убираем разделители ":" Var poz = InStr(s,"_") ' находим позицию слеша в строке "_00000" If poz = 1 Then Return 1 ' если находимся вначале Mid(s,poz-1) = "_0" ' Замена подстроки s = Left(s,2) & ":" & Mid(s,3,2) & ":" & Right(s,2) ' добавляем разделители SetGadgetText(110,s) : Return 1 ' отображаем строку "0_:00:00" End Function
Sub OknoVvoda(nTxt As Integer, x As Integer, y As Integer) Dim As Integer i, poz, event ' x, y - смещение в главном окне немного правее строки ввода времени(+10,+10) #Define parOkna WS_VISIBLE Or WS_BORDER Or WS_CAPTION Or WS_POPUPWINDOW,WS_EX_TOPMOST Var hwnd2 = OpenWindow("Время",WindowX(hwnd)+x,WindowY(hwnd)+y,124,190,parOkna) ' коорднГлОкна+сдвгПравКраюТекстГаджета TextGadget(110,26,6,90,18,"_0:00:00") : SetGadgetFont(110,LoadFont("Arial",10)) ' поле для вводимого текста ButtonGadget(100,8,128,30,26,"0") : ButtonGadget(101,8,96,30,26,"1") ' цифровые кнопки 0--9 ButtonGadget(102,44,96,30,26,"2") : ButtonGadget(103,80,96,30,26,"3") ButtonGadget(104,8,64,30,26,"4") : ButtonGadget(105,44,64,30,26,"5") ButtonGadget(106,80,64,30,26,"6") : ButtonGadget(107,8,32,30,26,"7") ButtonGadget(108,44,32,30,26,"8") : ButtonGadget(109,80,32,30,26,"9") For i = 100 To 109 : SetGadgetFont(i,LoadFont("Arial",14)) : Next ' установка шрифта всем цифровым кнопкам ButtonGadget(111,42,128,30,26,"<<") : SetGadgetFont(111,LoadFont("Arial",12)) ButtonGadget(112,76,128,34,26,"Ввод") : SetGadgetFont(112,LoadFont("Arial",8)) #Define DobGorKlv(knst,id) AddKeyboardShortcut(hwnd2,FVIRTKEY,knst,id) ' нажатаКлавиша(конст.,идентиф.) DobGorKlv(VK_ESCAPE,1001) : DobGorKlv(VK_RETURN,1002) : DobGorKlv(VK_BACK,1003)' клавиши ESC,Enter,BACK DobGorKlv(VK_0,1010) : DobGorKlv(VK_1,1011) : DobGorKlv(VK_2,1012) ' активация обычных цифр клавиатуры DobGorKlv(VK_3,1013) : DobGorKlv(VK_4,1014) : DobGorKlv(VK_5,1015) DobGorKlv(VK_6,1016) : DobGorKlv(VK_7,1017) : DobGorKlv(VK_8,1018) DobGorKlv(VK_9,1019) : DobGorKlv(VK_NUMPAD0,1020) : DobGorKlv(VK_NUMPAD1,1021) ' активация Num цифр клавиатуры DobGorKlv(VK_NUMPAD2,1022) : DobGorKlv(VK_NUMPAD3,1023) : DobGorKlv(VK_NUMPAD4,1024) DobGorKlv(VK_NUMPAD5,1025) : DobGorKlv(VK_NUMPAD6,1026) : DobGorKlv(VK_NUMPAD7,1027) DobGorKlv(VK_NUMPAD8,1028) : DobGorKlv(VK_NUMPAD9,1029) Do event = WaitEvent() If event = EventClose AndAlso EventHwnd() = hwnd2 Then Exit Do ' если зарыли это миниОкно If event = EventMenu Then Select Case EventNumber() Case 1001 : Exit Do ' нажата клавиша ESC = Выход Case 1002 : poz = VvodZnah(-1) ' нажата клавиша Enter = команда закончить ввод Case 1003 : poz = VvodZnahRev() ' нажата клавиша BACK = команда убрать 1 элемент справа Case 1010 To 1029 : poz = VvodZnah(ValInt(Right(Str(EventNumber()),1))) ' введено число 0--9 End Select EndIf If event = EventGadget Then Select Case EventNumber() ' в зависимости от нажатой Кнопки Case 100 To 109 : poz = VvodZnah(EventNumber()-100) ' введено число 0--9 Case 111 : poz = VvodZnahRev() ' команда убрать 1 элемент справа Case 112 : poz = VvodZnah(-1) ' команда закончить ввод End Select EndIf If poz = 6 Then Exit Do ' если дошли до конца - выходим из цикла Loop If poz = 6 Then SetGadgetText(nTxt,GetGadgetText(110)) ' если дошли до конца, то копируем в основное поле For i = 100 To 112 : FreeGadget(i) : Next ' освобождаем ресурсы Close_Window(hwnd2) : SetFocus(hwnd) ' закрываем миниОкно ввода и переводим фокус на главное (блокПовтЗапуск) End Sub
Do event = WaitEvent() If event = EventClose AndAlso EventHwnd() = hwnd Then End If event = EventGadget Then If EventNumber() = 1 Then OknoVvoda(1,74,36) ' выбрано поле строки времени EndIf Loop
Сообщение отредактировал Vitamin - Вторник, 06.09.2022, 12:19 |
|
| |