Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2602
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2262
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1318
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1406
Дата выхода:25.12.2010, 09:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:225 / 68
Вопросов / ответов:1 / 1

Вопрос № 181470: Здравствуйте, уважаемые эксперты! Помогите пожалуйста дописать работу. Проблема состоит в том что попытки сделать скролинг и выравнивание текста по ширине, выдает ошибку. "пытался через drawpointer (если не ошибаюсь)" Работа написано на ...



Вопрос № 181470:

Здравствуйте, уважаемые эксперты! Помогите пожалуйста дописать работу. Проблема состоит в том что попытки сделать скролинг и выравнивание текста по ширине, выдает ошибку. "пытался через drawpointer (если не ошибаюсь)"
Работа написано на масме.(32 битных)
весь перечень файлов http://rfpro.ru/upload/4093.

Отправлен: 20.12.2010, 07:46
Вопрос задал: Костя Горин (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Костя Горин!
Как правильно заметил Павел Юрьевич, выравнивание возможно только в редакторе RichEdit.
Кроме того, нормально прокомментировал...
Код:

.386 ;работаем с 32-битными регистрами, и, вообще, создаем программу под Windows
.model flat,stdcall ;необходимая модель памяти под Windows
option casemap:none ;чтобы различать большие и малые буковки
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD ;прототип используемой функции

;подключим необходимые файлы
include /masm32/include/windows.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc
include /masm32/include/comdlg32.inc
includelib /masm32/l ib/user32.lib
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/comdlg32.lib

;константы
.const
IDM_OPEN equ 1 ;пункт меню "open"
IDM_SAVE equ 2 ;пункт меню "save"
IDM_EXIT equ 3 ;пункт меню "exit"
MAXSIZE equ 260 ;размер буфера имени файла
MEMSIZE equ 65535 ;размер буфера в памяти для чтения файла

EditID equ 1 ;идентификатор органа управления "edit"

.data ;сегмент инициированных данных
RichEditDLL db "riched20.dll",0 ;имя dll-ки для поддержки richedit версии 2.0
NoRichEdit db "Cannot find riched20.dll",0
ClassName db "Win32ASMEditClass",0 ;имя класса окна
AppName db "Win32 ASM Edit",0 ;имя приложения
EditClass db "RichEdit20A",0 ;имя класса создаваемого органа управления
MenuName db "FirstMenu",0 ;имя меню из файла ресурсов
;Данные, необходимые для вызова стандартного диалога открытия файлаofn OPENFILENAME <> ;основная структура
FilterString db "All Files",0,"*.*",0
db "Text Files",0,"*.txt", 0,0 ;набор фильтров
buffer db MAXSIZE dup(0) ;буфер для приема имени файла

.data? ;сегмент неинициированных данных
hInstance HINSTANCE ? ;handle экземпляра программы
CommandLine LPSTR ? ;адрес командной строки
hwndEdit HWND ? ;handle редактора
hFile HANDLE ? ;handle файла
hMemory HANDLE ? ;handle блока памяти
pMemory DWORD ? ;указатель на блок памяти
SizeReadWrite DWORD ? ;размер буфера для операций чтения/записи
hRichEdit DWORD ?


.code ;сегмент кода
start: ;точка входа
invoke GetModuleHandle, NULL ;получим handle экземпляра программы
mov hInstance, eax
invoke GetCommandLine ;получим адрес командной строки

invoke LoadLibrary,addr RichEditDLL
.if eax!=0
mov hRichEdit,eax
invoke WinMain, hInstance ,NULL, CommandLine, SW_ SHOWDEFAULT ;вызов основной программы (в стандарте Windows)
invoke FreeLibrary,hRichEdit
.else
invoke MessageBox,0,addr NoRichEdit,addr AppName,MB_OK or MB_ICONERROR
.endif
invoke ExitProcess,eax ;выход из программы с кодом в EAX

WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
;локальные переменные
LOCAL wc:WNDCLASSEX ;структура для регистрации класса окна
LOCAL msg:MSG ;структура для обработки сообщений
LOCAL hwnd:HWND ;переменная для хранения handle окна

;заполним структуру wc
mov wc.cbSize,SIZEOF WNDCLASSEX ;размер структуры
mov wc.style, CS_HREDRAW or CS_VREDRAW ;стили класса
mov wc.lpfnWndProc, OFFSET WndProc ;функция окна
mov wc.cbClsExtra, NULL ;дополнительные данные класса окна
mov wc.cbWndExtra, NULL ; и для экземпляра окна нам не нужны
push hInst
pop wc.hInstance ;handle экземпляра программы
mov wc.hbrBackground, COLOR_WINDOW+1 ;фон
mov wc.lpszMenuName, OFFSET MenuName ;имя меню
mov wc.lpszClassName, OFFSET ClassName ;имя класса
invoke LoadIcon, NULL, IDI_APPLICATI ON ;стандартная иконка приложения
mov wc.hIcon, eax ; будет иконкой нашего приложения (32х32)
mov wc.hIconSm, eax ;16х16 тоже
invoke LoadCursor, NULL, IDC_ARROW ;указатель мыши на окне - стандартная стрелка
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc ;регистрируем класс окна

;создаем основное окно
INVOKE CreateWindowEx, WS_EX_CLIENTEDGE, ADDR ClassName, ADDR AppName,\
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,\
CW_USEDEFAULT, 300, 200, NULL, NULL, \
hInst, NULL
mov hwnd, eax ;сохраним handle окна

INVOKE ShowWindow, hwnd, SW_SHOWNORMAL ;покажем окно
INVOKE UpdateWindow, hwnd ;перерисуем

;цикл обработки сообщений
.WHILE TRUE ;бесконечный цикл
INVOKE GetMessage, ADDR msg, NULL, 0, 0 ;получаем сообщение из системной очереди
.BREAK .IF (!eax) ;если EAX = 0, то выход (после invoke PostQuitMessage, NULL)
INVOKE TranslateMessage, ADDR msg ;трансляция сообщений виртуальных кла виш в сообщения символов
INVOKE DispatchMessage, ADDR msg ;вызов функции окна для отработки сообщений
.ENDW
mov eax,msg.wParam ;код возврата
ret
WinMain endp

;функция окна
WndProc proc uses ebx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
local pf:PARAFORMAT
local hDC:HDC

;анализируем сообщения
.IF uMsg==WM_CREATE ;приходит во время создания окна
;создаем дочерний орган управления "richedit"
INVOKE CreateWindowEx, NULL, ADDR EditClass, NULL,\
WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or\
ES_AUTOHSCROLL or ES_AUTOVSCROLL or\
WS_HSCROLL or WS_VSCROLL, \ ;необходимо для скроллинга
0, 0, 0, 0, hWnd, EditID,\
hInstance, NULL
mov hwndEdit, eax ;сохраним handle редактора

;разрешим управление выравниванием
invoke SendMessage, hwndEdit, EM_SETTYPOGRAPHYOPTIONS, TO_ADVANCEDTYPOGRAPHY, TO_ADVANCEDTYPOGRAPHY
;установим выравнивание по ширине
mov pf.cbSize , SIZEOF PARAFORMAT ;размер
mov pf.dwMask, PFM_ALIGNMENT ;меняем выравнивание
mov pf.wAlignment, PFA_FULL_INTERWORD ;выравнивание по ширине
invoke SendMessage, hwndEdit, EM_SETPARAFORMAT, 0, addr pf

;установим WordWrap
invoke GetDC, hwndEdit ;контекст richedit-а
mov hDC, eax
invoke SendMessage, hwndEdit, EM_SETTARGETDEVICE, eax, 0
invoke ReleaseDC, hwndEdit, hDC

invoke SetFocus, hwndEdit ;дадим ему фокус ввода с клавиатуры
;подготовим структуру для чтения файла
mov ofn.lStructSize, SIZEOF ofn ;размер структуры
push hWnd
pop ofn.hWndOwner ;handle окна-родителя
push hInstance
pop ofn.hInstance ;handle экземпляра программы
mov ofn.lpstrFilter, OFFSET FilterString ;адрес строки-фильтра
mov ofn.lpstrFile, OFFSET buffer ;адрес строки, куда запишется имя файла
mov ofn.nMaxFile, MAXSIZE ;размер буфера для имени файла

.ELSEIF uMsg==WM_SIZE ;приходит во время изменения размера осн овного окна
mov eax, lParam ;новые размеры окна
mov edx, eax
shr edx, 16 ;высота окна
and eax, 0ffffh ;ширина окна
invoke MoveWindow, hwndEdit, 0, 0, eax, edx, TRUE ;растягиваем редактор по всему основному окну

.ELSEIF uMsg==WM_DESTROY ;приходит, когда надо закончить работу
invoke PostQuitMessage,NULL ;посылаем ноль в очередь сообщений

.ELSEIF uMsg==WM_COMMAND ;приходит после выбора пункта меню, нажатия на кнопки и т.д.
mov eax, wParam ;идентификатор команды
.if lParam==0 ;если не было нотификации...
.if ax==IDM_OPEN ;команда "open"
mov ofn.Flags, OFN_FILEMUSTEXIST or \ ;дооформляем поле структуры флагами
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetOpenFileName, ADDR ofn ;вызываем стандартную функцию выбора имени файла для открытия
.if eax==TRUE ;если что-то выбрано,
;то открываем файл с именем из buffer
i nvoke CreateFile, ADDR buffer,\
GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,\
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov hFile, eax ;сохраним handle файла

;выделим буфер в памяти для чтения файла
invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE ;запросим блок памяти
mov hMemory, eax ;сохраним handle блока
invoke GlobalLock, hMemory ;"захватим" блок памяти
mov pMemory, eax ;сохраним указатель на буфер в блоке памяти

;прочитаем файл в буфер максимум MEMSIZE-1 байт
invoke ReadFile, hFile, pMemory, MEMSIZE-1, ADDR SizeReadWrite, NULL

;отправим содержимое буфера в редактор для отображения
invoke SendMessage, hwndEdit, WM_SETTEXT, NULL, pMemory

invoke CloseHandle, hFile ;закрываем файл
invoke GlobalUnlock, pMemory ;разблокируем блок памяти
invoke GlobalFree, hMemory ;освободим блок памяти
.endif ;eax=TRUE
invoke SetFocus, hwndEdit ;дадим фокус ввода редактору

.elseif ax==IDM_SAVE ;команда "save"
mov ofn.Flags,OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
invoke GetSaveFileName, ADDR ofn ;вызываем стандартную функцию выбора имени файла для сохранения
.if eax==TRUE ;если что-то выбрано
;то открываем файл с именем из buffer
invoke CreateFile, ADDR buffer,\
GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE,\
NULL, CREATE_NEW, FILE_ATTRIBUTE_ARCHIVE,\
NULL
mov hFile, eax ;сохраним handle файла

;выделим буфер в памяти для чтения содержимого редактора и записи в файл
;строки без комментариев полностью аналогичны при "open"
invoke GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEMSIZE
mov hMemory, eax
invoke GlobalLock, hMemory
mov pMemory, eax
;получим данные из редактора (в EAX получим реальную длину)
invoke SendMessage, hwndEdit, WM_GETTEXT, MEMSIZE-1, pMemory
;пишем в файл
invoke WriteFile, hFile, pMemory, eax, ADDR SizeReadWrite, NULL
invoke CloseHandle, hFile
inv oke GlobalUnlock, pMemory
invoke GlobalFree, hMemory
.endif ;eax=TRUE
invoke SetFocus, hwndEdit

;все остальные команды приведут к уничтожению окна и завершению работы
.else
invoke DestroyWindow, hWnd
.endif ;анализ команды сообщения WM_COMMAND в AX
.endif ;if lParam==0 сообщения WM_COMMAND

.ELSE ;все остальные сообщения отрабатываюся стандартно
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.ENDIF ;анализ uMsg
xor eax, eax ;сообщаем, что нужные нам сообщения нами обработаны
ret
WndProc endp
end start ;задаем точку входа

rsrc.rc
Код:
#define IDM_OPEN 1
#define IDM_SAVE 2
#define IDM_EXIT 3
FirstMenu MENUEX MOVEABLE IMPURE LOADONCALL DISCARDABLE
BEGIN
POPUP "&File", , , 0
BEGIN
MENUITEM "&Open", IDM_OPEN
MENUITEM "&Save", IDM_SAVE
MENUITEM "&Exit", IDM_EXIT
END
END

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 22.12.2010, 13:17
Номер ответа: 264999
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264999 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.25 от 13.12.2010

    В избранное