
Быстрый поиск
Введите фрагмент названия статьи для поиска
Подгонка размеров поля EDIT под используемый шрифт
07.12.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Много чего уже делали и с полями ввода, и со шрифтами. На очереди автоматическая подгонка высоты однострочного элемента EDIT в зависимости от размеров шрифта, который ему назначен. Это необходимо, чтобы при изменении шрифта текст в поле ввода смотрелся правильно. Высота EDIT считается по высоте выбранного шрифта плюс отступ толщиной в двойную рамку, чтобы текст при отображении эту рамку не перекрывал. В случае многострочных полей ввода высоту надо считать по высоте шрифта, умноженной на необходимое количество строк, плюс отступ.Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------
- ; Подгонка размера поля EDIT под заданный шрифт
- ;-------------------------------------------------------------
- ; Параметры:
- ; hEdit - хэндл поля EDIT
- ; hFont - хэндл шрифта
- ;-------------------------------------------------------------
- proc resize_edit hEdit:DWORD, hFont:DWORD
- locals
- rc RECT
- tm TEXTMETRIC
- endl
- pusha
- mov edi,[hEdit]
- ; Получить контекст устройства
- invoke GetDC,edi
- or eax,eax
- ; Поля ввода не существует, на выход
- jz .loc_exit
- xchg eax,esi
- ; Выбрать шрифт
- invoke SelectObject,esi,[hFont]
- or eax,eax
- jnz @f
- ; Шрифт не загружен, на выход
- invoke ReleaseDC,edi,esi
- jmp .loc_exit
- @@:
- ; Получить метрику выбранного шрифта
- lea ebx,[tm]
- invoke GetTextMetrics,esi,ebx
- invoke ReleaseDC,edi,esi
- ; Высота шрифта
- mov ebx,[ebx+TEXTMETRIC.tmHeight]
- ; Добавить к высоте размер рамки
- invoke GetSystemMetrics,SM_CYEDGE
- shl eax,2
- add ebx,eax
- ; Получить размеры поля EDIT
- lea esi,[rc]
- invoke GetWindowRect,edi,esi
- invoke GetParent,edi
- ; Отмасштабировать координаты окна
- invoke MapWindowPoints,HWND_DESKTOP,eax,esi,2
- ; Установить новые размеры поля EDIT
- mov eax,[esi+RECT.right]
- sub eax,[esi+RECT.left]
- invoke MoveWindow,edi,[esi+RECT.left],[esi+RECT.top],eax,ebx,TRUE
- .loc_exit:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 1467 | Комментариев: 1
Перемешивание массива на JavaScript
20.11.2020 | Категория: Web-мастеру и не только | Автор: ManHunter

Перемешивание массива на JavaScript
Несмотря на особенности сортировки массивов в JavaScript, которые нашли отражение даже в интернет-мемах, без этой самой сортировки не обойтись. Случайное перемешивание массива - тоже своеобразный вариант сортировки. Для его реализации в этих ваших интернетах обычно рекомендуют воспользоваться следующим или каким-то подобным кодом:
Code (JavaScript) : Убрать нумерацию
- var test_array=[1,2,3,4,5,6,7,8,9,10];
- test_array.sort(
- function() { return (Math.random()-0.5); }
- );
- // test_array -> перемешанный массив
Читать статью целиком »
Просмотров: 2026 | Комментариев: 1
Assembler: сейчас на сайте 2 гостей и 3 новостей
27.10.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Немного отдохнем от ковыряния во внутренностях системы. Переписал на Ассемблере свою PHP-шную функцию для правильного склонения языковых конструкций вида "число + слово". Всю суть вопроса и теорию можете почитать в статье по ссылке. Сама функция получилась вот такой:Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------
- ; Функция для получения индекса массива с вариантами
- ; склонений слова в зависимости от числового значения.
- ; Массив слов формируется по принципу "1-2-5", то есть
- ; ("гость", "гостя", "гостей")
- ;-------------------------------------------------------
- ; На входе:
- ; dNum - число
- ; На выходе:
- ; EAX = [0..2] - индекс элемента массива
- ;-------------------------------------------------------
- proc num2word dNum:DWORD
- push ecx edx
- mov eax,[dNum]
- cdq
- mov ecx,100
- idiv ecx
- cmp edx,19
- jb @f
- mov eax,edx
- cdq
- mov ecx,10
- idiv ecx
- @@:
- xor eax,eax
- or edx,edx
- jz .case2
- cmp edx,1
- jz .case0
- cmp edx,4
- jbe .case1
- .case2:
- inc eax
- .case1:
- inc eax
- .case0:
- pop edx ecx
- ret
- endp
Читать статью целиком »
Просмотров: 1242 | Комментариев: 0
Универсальное субклассирование окон на Ассемблере
05.12.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Тема субклассирования окон уже не один раз поднималась в статьях на этом сайте. Теперь пришло время навести порядок и сделать наиболее удобное и универсальное решение для этой задачи. Воспользуемся функциями SetProp и GetProp, чтобы хранить адреса обработчиков прямо в свойствах окна без заведения дополнительных переменных.Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------------
- ; Наименования свойств. Можно переименовать, если конфликтуют с другими
- ; строками в программе
- ;-------------------------------------------------------------------------
- szOld db 'OldWndProc', 0
- szNew db 'NewWndProc', 0
- ;-------------------------------------------------------------------------
- ; Функция субклассирования окна
- ;-------------------------------------------------------------------------
- ; hWnd - хэндл окна для субклассирования
- ; SubclassProc - адрес нового обработчика окна
- ;-------------------------------------------------------------------------
- proc SubclassWindow hWnd:DWORD,SubclassProc:DWORD
- pusha
- ; Получить старый обработчик окна
- invoke GetWindowLong,[hWnd],GWL_WNDPROC
- ; Сохранить его в свойствах окна
- invoke SetProp,[hWnd],szOld,eax
- ; Сохранить в свойствах новый обработчик окна
- invoke SetProp,[hWnd],szNew,[SubclassProc]
- ; Назначить окну универсальную функцию обработки
- invoke SetWindowLong,[hWnd],GWL_WNDPROC,CommonSubclassProc
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ; Субклассировать поле ввода
- invoke GetDlgItem,[hwnddlg],ID_HEX
- stdcall SubclassWindow,eax,EditWindowProc
- ; Субклассировать кнопку
- invoke GetDlgItem,[hwnddlg],ID_BTN
- stdcall SubclassWindow,eax,ButtonProc
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------------
- ; Функция снятия субклассирования с окна
- ;-------------------------------------------------------------------------
- ; hWnd - хэндл окна
- ;-------------------------------------------------------------------------
- proc UnSubclassWindow hWnd:DWORD
- pusha
- ; Получить сохраненный обработчик окна
- invoke GetProp,[hWnd],szOld
- or eax,eax
- ; Сохраненного обработчика нет
- jz .loc_ret
- ; Назначить окну старую функцию обработки
- invoke SetWindowLong,[hWnd],GWL_WNDPROC,eax
- ; Удалить сохраненные обработчики
- invoke RemoveProp,[hWnd],szOld
- invoke RemoveProp,[hWnd],szNew
- .loc_ret:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 1792 | Комментариев: 0
Преобразование символических ссылок в путь к файлу
08.02.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter

Преобразование символических ссылок в путь к файлу
"По следам наших публикаций". В одной из недавних статей я использовал код для преобразования символических ссылок на файл в привычный путь. Немного поразмыслив, я решил доработать его до полноценной универсальной функции, которая будет приводить любые "кривые" пути и символические ссылки к человекопонятному виду.
Читать статью целиком »
Просмотров: 2134 | Комментариев: 2


