Вот зря не почитали самую последнюю страницу. То что я выложил, это маленькая demo-версия 0.1. Планируемая книга состоит из 11 частей. объем более 600 страниц.
в 5-й части, которую я сейчас выложил сырую как раз даны примеры вывода фактически всех объектов с нуля на рабочий стол. только она более 100 страниц.
В 6-й части разобраны окна RegisterClassEx, DialogBoxIndirectParam, CreateDialogIndirectParam и их схемы работы, согласно ollydbg
В 7-й части рассмотрено многослойное классическое программирование на подложку из окон, рассмотренных в 6-й части
В 8-й части будет рассмотрена работа в программе по прерыванию, которую вызывает Windows, особенности сообщений, раскраска элементов
В 9-й части нестандартный подход по работе с памятью, dll, запись данных
В 10-й части Демосцена из объектов Windows (сложные примеры программ).
В 11-й части ручная лепка .exe файлов, компиляция через .com, ручное создание ресурсов.
По случаю последних событий, выкладываю обновление v0.2, в которую вошла 5 глава. Она сырая, почти без комментариев, с одними примерами. В ней как раз объясняется создание всех известных объектов и это еще не дошел до обычных окон, с которых начинается знакомство. Размер новой версии увеличился более чем на 100 страниц.
Кроме того добавил обложку, исправил предисловие и поставил предупреждение о том, что мнение автора может не совпадать с мнением окружающих.
https://drive.google.com/open?id=0B8...lNTMEpCbDg1MjQ
Учтите, это не быстрое дело. Программы фактически все готовы, но нужно тестировать, верстать и приводить в порядок. На это может уйти год.
- - - Добавлено - - -
Меню, таблицы горячих клавиш и диалоговые окна без ресурсов делаются элементарно, моим "Рабоче-крестьянским" ассемблером:
Первое окно:
; Цветное окно DialogBoxIndirectParam со значком (C) EuroYura 2017
.686p
.model flat
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
.code
nachalo: MOV EBX, OFFSET nachalo-180h
PUSH 0
CALL GetModuleHandle
MOV ESI, EAX
; Построение массива данных в памяти с нужными значениями для создания диалогового окна
MOV DWORD PTR [EBX+20h], WS_OVERLAPPEDWINDOW
MOV DWORD PTR [EBX+24h], WS_EX_CLIENTEDGE
MOV WORD PTR [EBX+28h], 0
MOV WORD PTR [EBX+2Ah], 150
MOV WORD PTR [EBX+2Ch], 100
MOV WORD PTR [EBX+2Eh], 300
MOV WORD PTR [EBX+30h], 200
MOV WORD PTR [EBX+32h], 0
MOV WORD PTR [EBX+34h], 0
; Перенос текста заголовка в массив с переводом в UNICODE
PUSH OFFSET Zagolowok
CALL lstrlen
PUSH EAX
PUSH EBX
ADD DWORD PTR [ESP],36h
PUSH -1
PUSH OFFSET Zagolowok
PUSH MB_PRECOMPOSED
PUSH CP_ACP
CALL MultiByteToWideChar
; Создание диалогового окна
PUSH 0
PUSH OFFSET IzolProgr
PUSH 0
PUSH EBX
ADD DWORD PTR [ESP],20h
PUSH ESI
CALL DialogBoxIndirectParam
RET
; Изолированная сигналоприемная программа, в которую компьютер входит сразу после создания окна
IzolProgr: MOV EBP, ESP
CMP DWORD PTR [ESP+8], WM_INITDIALOG
JE Znachok
CMP DWORD PTR [ESP+8], WM_CTLCOLORDLG
JE CwetOkna
CMP DWORD PTR [ESP+8], WM_CLOSE
JE Wyhod
MOV EAX, 0
RET
; Установка цвета фона окна
CwetOkna: PUSH 0080FFh
CALL CreateSolidBrush
RET
; Установка значка в окно
Znachok: PUSH IDI_EXCLAMATION
PUSH 0
CALL LoadIcon
PUSH EAX
PUSH ICON_BIG
PUSH WM_SETICON
PUSH [EBP+4]
CALL SendMessage
RET
; Выход из программы изолированного цикла
Wyhod: PUSH 0
PUSH [EBP+4]
CALL EndDialog
RET
Zagolowok db "Цветное 0кно DialogBoxIndirectParam",0
end nachalo
Компиляция:
c:\masm32\bin\ml /c /Cp /Gz /coff 70.asm
c:\masm32\bin\link /SUBSYSTEM:WINDOWS /ALIGN:1024 70.obj
pause
Другой тип диалогового окна CreateDialogIndirectParam:
; Простейшее окно CreateDialogIndirectParam с классической постройкой массива (C) EuroYura 2016
.686p
.model flat
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
.code
nachalo: MOV EBX, OFFSET nachalo-180h
PUSH 0
CALL GetModuleHandle
MOV ESI, EAX
; Построение массива данных в памяти с нужными значениями для создания диалогового окна
MOV DWORD PTR [EBX+20h], WS_VISIBLE+WS_OVERLAPPEDWINDOW
MOV DWORD PTR [EBX+24h], WS_EX_CLIENTEDGE
MOV WORD PTR [EBX+28h], 0
MOV WORD PTR [EBX+2Ah], 150
MOV WORD PTR [EBX+2Ch], 100
MOV WORD PTR [EBX+2Eh], 300
MOV WORD PTR [EBX+30h], 200
MOV WORD PTR [EBX+32h], 0
MOV WORD PTR [EBX+34h], 0
; Перенос текста заголовка в массив с переводом в UNICODE
PUSH OFFSET Zagolowok
CALL lstrlen
PUSH EAX
PUSH EBX
ADD DWORD PTR [ESP],36h
PUSH -1
PUSH OFFSET Zagolowok
PUSH MB_PRECOMPOSED
PUSH CP_ACP
CALL MultiByteToWideChar
; Создание диалогового окна
PUSH 0
PUSH OFFSET IzolProgr
PUSH 0
PUSH EBX
ADD DWORD PTR [ESP],20h
PUSH ESI
CALL CreateDialogIndirectParam
MOV EDI, EAX
; Цикл повседневной жизни старения и утилизации окна после его смерти (закрытия окна)
ViznxOkna: PUSH 0
PUSH 0
PUSH 0
PUSH EBX
CALL GetMessage
CMP EAX, 0
JE SmertxOkna
PUSH EBX
PUSH EDI
CALL IsDialogMessage
CMP EAX, 0
JNE ViznxOkna
PUSH EBX
CALL DispatchMessage
JMP ViznxOkna
SmertxOkna: RET
; Изолированная сигналоприемная программа, в которую компьютер входит после входа в подпрограмму создания окна
IzolProgr: MOV EBP, ESP
CMP DWORD PTR [ESP+8], WM_INITDIALOG
JE Znachok
CMP DWORD PTR [ESP+8], WM_CTLCOLORDLG
JE CwetOkna
CMP DWORD PTR [ESP+8], WM_CLOSE
JE Wyhod
MOV EAX, 0
RET
Znachok: PUSH IDI_QUESTION
PUSH 0
CALL LoadIcon
PUSH EAX
PUSH ICON_BIG
PUSH WM_SETICON
PUSH [EBP+4]
CALL SendMessage
RET
CwetOkna: PUSH 0FF0080h
CALL CreateSolidBrush
RET
Wyhod: PUSH 0
CALL PostQuitMessage
MOV EAX, 0
RET
Zagolowok db "Цветное окно CreateDialogIndirectParam",0
end nachalo
Компиляция:
c:\masm32\bin\ml /c /Cp /Gz /coff 72.asm
c:\masm32\bin\link /SUBSYSTEM:WINDOWS /ALIGN:1024 72.obj
pause