Как на WinApi написать StringGrid

Предыдущая тема Следующая тема Перейти вниз

Как на WinApi написать StringGrid

Сообщение  electrik в Пн Окт 08, 2012 1:40 am

понадобилась мне такая штука как StringGrid. дело в том, что эта штука должна озвучиваться говорилками, поэтому и хочу на WinApi.
вот ссылка на игрушку, как оно выглядит. 664 кб, не поленитесь:
http://svalka-spb.narod.ru/games/sapper2.0.7z
говорят, что можно написать используя класс окна SysListView32.
мне не надо наворотов. просто хочу инструментарий к своим говорящим часикам сделать, чтоб собирать голоса было удобнее. вот и думаю, что таблица в самый раз подойдет.
можно на edit сделать, но лажа выйдет. мне надо, чтоб нажал стрелку вправо, а он на следующую клетку переместился.
я вручную не собираюсь вводить данные. в ячейках будут находится имена файлов.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  trew в Пн Окт 08, 2012 7:34 am

Серега, контрол, что ты озвучил кустарный, хоть и идет в поставке VB. Реализация кустарных контролов занимает значительно больше времени, чем реализация имеющихся. Для твоего случая мне кажется проще использовать контрол ListBox.

Вот как твоя задача решается с помощью disphelper и window9:

Код:

#DEFINE UNICODE
#Include Once "disphelper/disphelper.bi"
#Include "window9.bi"

Sub speak (ByRef text As String)
   Dim myt As WString * 256

   Dim As Integer isSpeaking
   Dim As HRESULT hr

   DISPATCH_OBJ(tts)

   dhInitialize(TRUE)
   dhToggleExceptions(FALSE)

   myt = "Sapi.SpVoice"
   hr = dhCreateObject(@myt, NULL, @tts)
   If hr <> 0 Then Exit Sub


   myt = text
   dhCallMethod(tts, ".Speak(%S)", @myt)

   SAFE_RELEASE(tts)
End Sub

Var hwnd = OpenWindow("",10,10,300,100)
AddKeyboardShortcut(hwnd,FVIRTKEY,VK_RETURN,1) 'Enter
ListBoxGadget(1,10,10,100,80)
AddListBoxItem(1,"one")
AddListBoxItem(1,"two")
AddListBoxItem(1,"three")

Do
   Var event=WaitEvent()
   If event=eventclose Then End
   If event=eventmenu Then
      If EventNumber()=1 Then
         ThreadCall speak(GetListBoxText(1,GetItemListBox(1)))
      EndIf
   EndIf
Loop

Кстати, я только сейчас заметил, что в поставке FreeBasic 0.24 , статическая либа дисхелпера не включена. Непонятно, чем она им мешала. В 0.23 была.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  electrik в Пн Окт 08, 2012 11:10 am

привет. спасибо, буду пробовать. а по поводу говорилок, это мне нужно не на сапи, а чтоб скринридерами читалось. если юзать winapi, специально писать ни чего не надо.
все-равно спасибо за наглядный пример.
да, FreeBasic 0.24 сделали все-таки отвратно. как можно забыть библиотеку, если она наверняка в проекте есть.


electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  electrik в Пн Окт 08, 2012 3:20 pm

привет. посмотрел. только пришлось ошибки в dsound.bi исправлять. перекачивать zlib.
первое. фокус не на listbox.
второе. я так понял, что бы сделать такую таблицу как в предлагаемом мною выше сапёре, нужно несколько лист box'ов?
блин, и скорее всего надо будет делать сабклассинг окон?
поясню еще раз что мне нужно. таблица как в экселе.

а1 б1 ц1
а2 б2 ц2

если делать на листбоксах, нужно что бы при нажатии стрелки вправо, он перемещался не на следующий элемент текущего листбокса, а на другой листбокс, причем с учетом позиции первого.
нажали вправо, переместились с а1 на б1. нажали вниз, переместились с б1 на б2.

ладно, буду думать. блин, я то думал, что есть какой-нибудь класс, в который просто элементы добавлять можно.
везет delphi'рам, у них такое встроено, называется TStringGrid.
надо посмотреть как сделано, и на fb соорудить.
вещь иногда нужная.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  trew в Пн Окт 08, 2012 3:39 pm

Извиняй, не понял. Я думал тебе просто перечисления их нужно. Тогда только свой контрол городить. С ListView ... я бы не стал. Там хоть и есть табличка, но выделяется только первая колонка, остальные может и можно сделать, но помудрить придется. Лучше из нескольких edit сварганить.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  electrik в Пн Окт 08, 2012 4:14 pm

в 31 уроке туториалов ицзелиона, обнаружил описание про ListView.
поскольку я не адаптировал этот урок под FreeBasic, уже забыл что там такое есть.
там рассказывается, что можно добавлять колонки при помощи LVM_INSERTCOLUMN , может оно лучше будет? пойду почитаю.
по поводу едитов, надо будет и едиты расковыривать, так как при нажатии стрелок влево/вправо, оно по символам перемещается. а надо чтоб на другоой едит прыгал

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  trew в Пн Окт 08, 2012 4:41 pm

electrik пишет:в 31 уроке туториалов ицзелиона, обнаружил описание про ListView.
поскольку я не адаптировал этот урок под FreeBasic, уже забыл что там такое есть.
там рассказывается, что можно добавлять колонки при помощи LVM_INSERTCOLUMN , может оно лучше будет? пойду почитаю.
по поводу едитов, надо будет и едиты расковыривать, так как при нажатии стрелок влево/вправо, оно по символам перемещается. а надо чтоб на другоой едит прыгал

Про listView можешь почитать здесь:

http://freebasic.narod.ru/api_206.html

Или здесь:

http://freebasic.narod.ru/api_16.html

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  trew в Пн Окт 08, 2012 5:06 pm

Я тут на коленке написал черновик так сказать. Если уж и это не подойдет, тогда сам ищи Very Happy

Код:

#DEFINE UNICODE
#Include Once "disphelper/disphelper.bi"
#Include "window9.bi"

Dim As Integer event,i=1,array(10,20)={{1}}, curent = 1
Dim as HWND hwnd

Sub speak (ByRef text As String)
   Dim myt As WString * 256

   Dim As Integer isSpeaking
   Dim As HRESULT hr

   DISPATCH_OBJ(tts)

   dhInitialize(TRUE)
   dhToggleExceptions(FALSE)

   myt = "Sapi.SpVoice"
   hr = dhCreateObject(@myt, NULL, @tts)
   If hr <> 0 Then Exit Sub


   myt = text
   dhCallMethod(tts, ".Speak(%S)", @myt)

   SAFE_RELEASE(tts)
End Sub



hwnd=OpenWindow("Ïðèâåò",10,10,583,500) : CenterWindow(hwnd)
AddKeyboardShortcut(hwnd,FVIRTKEY,VK_UP,1)
AddKeyboardShortcut(hwnd,FVIRTKEY,VK_DOWN,2)
AddKeyboardShortcut(hwnd,FVIRTKEY,VK_LEFT,3)
AddKeyboardShortcut(hwnd,FVIRTKEY,VK_RIGHT,4)
For y As Integer = 0 To 20
   For x As Integer = 0 To 10
      TextGadget(i,x*50+10,y*20+20,45,15,Str(i))
      SetGadgetColor(i,&h505050,255,3)
      i+=1
   Next
Next
SetGadgetColor(curent,&hb0b0b0,255,3)
Do
   event=WaitEvent()
   Select Case event
      Case eventmenu
         select Case EventNumber
            Case 1
               If curent - 11>0 Then
                  curent-=11
                  SetGadgetColor(curent+11,&h505050,255,3)
                  SetGadgetColor(curent,&hb0b0b0,255,3)
                  ThreadCall speak(Str(curent))
               EndIf
            Case 2
               If curent + 11<232 Then
                  curent+=11
                  SetGadgetColor(curent-11,&h505050,255,3)
                  SetGadgetColor(curent,&hb0b0b0,255,3)
                  ThreadCall speak(Str(curent))
               EndIf
            Case 3
               If curent - 1>0 Then
                  curent-=1
                  SetGadgetColor(curent+1,&h505050,255,3)
                  SetGadgetColor(curent,&hb0b0b0,255,3)
                  ThreadCall speak(Str(curent))
               EndIf
            Case 4
               If curent + 1<232 Then
                  curent+=1
                  SetGadgetColor(curent-1,&h505050,255,3)
                  SetGadgetColor(curent,&hb0b0b0,255,3)
                  ThreadCall speak(Str(curent))
               EndIf
         End Select
   End Select
   If Event=EventClose Then End
Loop

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  electrik в Пн Окт 08, 2012 6:26 pm

спасибо огрромнейшее! этот пример работает. правда в скринридере не читает, из-за не стандартного класса окна.
я в скринридер добавил цвет выделения, вроде зачитал.
буду ковырять, может и на основе window9 реализую свою прогу.
очень жаль, что в современных приложениях народ все больше реализует не стандартные классы окон.
в нашем случае все хорошо, не сложно прогнуться. простой пример и не на рисованной картинке.
а вот бывают проги, которые запускаешь, а на экране читалка вообще ни чего не видит.
мало того, еще и управление с клавиатуры вообще на нуле.
всеми не любимый билгейц сказал, чтоб программисты в своих программах обязательно делали поддержку управления с клавиатуры.
возьмем vst плагины. мрак, все графическое, а клаву вообще выбросить можно.
это я не в коем случае не в обиду говорю, просто людям с ограниченными возможностями бывает очень сильно приходится прогибаться.
за место того, чтобы работать за компьютером, сидишь и пишешь скрипт, как бы эту программу под себя прогнуть.
хорошо если умеешь написать скрипт...

если чего-нибудь новое придумаю, солью.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  trew в Пн Окт 08, 2012 7:43 pm

electrik пишет:спасибо огрромнейшее! этот пример работает. правда в скринридере не читает, из-за не стандартного класса окна.
я в скринридер добавил цвет выделения, вроде зачитал.
буду ковырять, может и на основе window9 реализую свою прогу.
очень жаль, что в современных приложениях народ все больше реализует не стандартные классы окон.
в нашем случае все хорошо, не сложно прогнуться. простой пример и не на рисованной картинке.
а вот бывают проги, которые запускаешь, а на экране читалка вообще ни чего не видит.
мало того, еще и управление с клавиатуры вообще на нуле.
всеми не любимый билгейц сказал, чтоб программисты в своих программах обязательно делали поддержку управления с клавиатуры.
возьмем vst плагины. мрак, все графическое, а клаву вообще выбросить можно.
это я не в коем случае не в обиду говорю, просто людям с ограниченными возможностями бывает очень сильно приходится прогибаться.
за место того, чтобы работать за компьютером, сидишь и пишешь скрипт, как бы эту программу под себя прогнуть.
хорошо если умеешь написать скрипт...

если чего-нибудь новое придумаю, солью.

То есть как нестандартный класс? Самый стандартный и есть (Static) Изменение цвета контрола я сделал только для визуального восприятия того, кто может тебе дома помочь. А так можно цвет вообще не менять, только текст при желании.

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  electrik в Пн Окт 08, 2012 10:02 pm

теперь ты меня извиняй. я не правильно посмотрел. тот класс который я увидел это был класс не статиков, а класс главного окна CLASSCLASS_1.
вот я и подумал, что он не стандартный. но все-равно почему-то цвет добавлять в говорилку приходится.
это ладно, тут уж разберусь. возможно, что она понимает определенный набор цветов, который выясним путём поддбора.
насамом деле, у меня была идея на статиках сделать, но я почему-то думал, что так можно, но так ни кто не делает.
видимо можно. и вообще я прихожу к такому мнению, что надо использовать всё так как тебе удобно.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Как на WinApi написать StringGrid

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения