Помогите новичку

Applications development, KoOS API questions
  • 0CodErr wrote:Если окно не помещается на экране, то меняются ли его размеры и координаты,
    или же оно только так рисуется, чтобы уместиться?
    Размеры большого окна корректируются до размеров текущего видеорежима. Если выводится маленькое окно, но его тело вылазит за пределы физических координат, то корректируются начальные координаты такого окна.
    0CodErr wrote: Как можно сделать, чтобы окно не реагировало на события мыши,
    если над ним другое окно(либо частично перекрывается)?
    Если окно отслеживает является ли оно верхним в оконном стеке, то при нормально реализованной логике окно не должно реагировать на события мыши, когда оно не вверху.
    Если подразумевается режим "Stay On Top" (например, как в Виндовс), то такой функциональности в ядре не предусмотрено.
    0CodErr wrote: Хотелось бы обрабатывать события даже если окно не активно.
    Непонятно какие события.
  • SoUrcerer wrote:Текущая панель меняет рабочую область экрана, кстати. Это может помочь.
    Я бы не хотел так делать. Может так получиться, что моя панель будет не на всю ширину экрана, и тогда останется никогда неиспользуемое пространство. Это неправильно, я считаю.
    SoUrcerer wrote:...вид панели должен быть настраиваемым.
    Она в определённой степени настраивается: можно менять цвета, высоту, количество запускаемых программ, параметры командной строки для них, иконки к программам.
    Serge wrote:Память выделенная 68.12 не освобождается до завершения всех потоков приложения.
    Я хотел уточнить: здесь, ведь, не играет роли как именно поток завершён(насильственно или самостоятельно)?
    Mario wrote:Думается мне нужно сделать задержку 0,01 * 256 = 2,56 секунды, чтобы уж совсем надежно.
    256 - это максимальное число потоков в системе? Тогда, если в будущем их будет больше, надо корректировать это значение. Наверное, всё-таки 68.1 подойдёт лучше.
    Mario wrote:
    0CodErr wrote:Хотелось бы обрабатывать события даже если окно не активно.
    Непонятно какие события.
    События мыши.
    Mario wrote: Если окно отслеживает является ли оно верхним в оконном стеке, то при нормально реализованной логике окно не должно реагировать на события мыши, когда оно не вверху.
    Если подразумевается режим "Stay On Top" (например, как в Виндовс), то такой функциональности в ядре не предусмотрено.
    Нет, не "Stay On Top". Я бы вот как хотел:
    если над моим окном какое-то другое, но закрывает его не полностью, то
    в незакрытой области моё окно должно реагировать на события мыши(а в закрытой не должно).
  • 0CodErr wrote: если над моим окном какое-то другое, но закрывает его не полностью, то
    в незакрытой области моё окно должно реагировать на события мыши(а в закрытой не должно).
    События мыши все же отличаются по функциональности, например клик по области приложения однозначно приведет к его "активации", т.е. оно станет самым верхним в оконном стеке. Другое дело если подразумевается прокрутка скроллом или просто отслеживание координат. Можно сделать функции возвращающую из область оконного стека текущее значение для точки, которая находится под вершиной указателя мыши. Проверяя это значение узнать перекрыта ли данная точка окна точкой другого вышележащего окна. Возможно кто то предложит более выигрышную стратегию для реализации, но я такой не вижу пока.
  • 0CodErr wrote:Я хотел уточнить: здесь, ведь, не играет роли как именно поток завершён(насильственно или самостоятельно)?
    Абсолютно никакой.
  • Как можно установить координату "горячей точки" курсора? Смотрел функцию 37.5 (установить курсор), в ней этого параметра нет.
  • Горячая точка устанавливается до активации курсора функцией 37.5, т.е. при загрузке курсора по 37.4. Смотри описание.
  • Пока не работает 37.4, горячая точка получается в левом верхнем углу, хотя задал координату 16,16.

    Code: Select all

    mov edx,(16 shl 8)+16
    shl edx,16
    mov dx,2 ;LOAD_INDIRECT
    Вроди должно быть по центру, если весь размер 32*32. Буду разбиратся что не так, если не получится буду рисовать кривые курсоры.
  • Может баг в ядре, а может ты что то не так делаешь - надо разбираться и смотреть код.
  • IgorA
    Никакого криминала в ядре я не нашел. Мне нужен твой код для просмотра - скинь в личку, если тебе нужна помощь.
  • Я уже успел сделать ревизию 2482, в которой был мой код с курсорами. Есть файл (root)/programs/media/log_el/trunk/log_el.asm , в котором есть функция:

    Code: Select all

    1984	proc set_pen_mode uses eax ebx ecx edx, mode:dword, icon:dword
    там я изменил строки 1989-1990:

    Code: Select all

    1989	                ;mov edx,((cx shl 8) + cy) shl 16
    1990	                mov edx,2 ;LOAD_INDIRECT
    Раньше было так:

    Code: Select all

    mov edx,((16 shl 8) + 16) shl 16
    mov dx,2 ;LOAD_INDIRECT
    И при выборе карандаша (желательно синего) рисование всеравно происходит с левого верхнего угла курсора. Красный карандаш для тестирования лучше не брать, т. к. в нем я сделал выравнивание линий на первую прорисованую точку (что-бы провода не рисовались кривыми).
    Attachments
    cursor_cx_cy.png
    cursor_cx_cy.png (18.05 KiB)
    Viewed 3387 times
  • Исправил в SVN r. 2483

    Тот кто делал этот код в ядре, явно поленился проверить работоспособность реализации в этом конкретном случае. Впрочем не будем кидаться камнями - сами не без греха.
  • Здравствуйте, бона таго... Не уверен, что пишу туда, куда стоит, нотакой общий вопрос: как обстоят дела в КОС с базами данных? С работой с ними, то есть.
  • to Scampada
    Примерно так: viewtopic.php?f=24&t=1163
  • Еще такой вопрос, думаю, лучше всего сюда.
    Допустим, есть у меня массив данных:

    ; массив 5х5 в одномерном представлении
    c0 db 0
    c1 db 0
    c2 db 0
    c3 db 0
    c4 db 0
    ...
    c24 db 0
    c_end db 'eoa' ;end of array


    Могу я обрабатывать массив подобным образом:

    mov ax,c0 ;помещаем _адрес_ данных в ах

    do_smth_with_array:
    cmp ax,c_end ;сравниваем адрес, содержащийся в ах, с адресом переменной, символизирующей конец массива
    jae _break ;если содержимое ах большеравно адреса конца массива, то выходим из цикла
    mov [ax],1
    mov ax,ax+1
    jmp do_smth_with_array

    _break:
    int 20h


    Я мог ошибиться в строке "mov ax,ax+1", потому что не знаю точно, что нужно прибавлять, единицу или что-то другое, например, 8. ;) Но общий смысл понятен - так вот будет ли это работать? =?
    Знаю, можно попробовать и посмотреть :mrgreen: но здесь мне могут и ответить, что и почему может не работать :roll:
  • Who is online

    Users browsing this forum: No registered users and 29 guests