« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга

Тестирование 64-битных приложений

ПнВтСрЧтПтСбВс
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
    Популярное
Экран и окно в графическом режиме

Включение в запрос итоговых значений

Класс TraceListener

Комплексные числа в .NET

Преобразование данных XML в формат SQL: применение функции SQLXML Bulkload в структуре .NET Framework

Отладка программ пользователя в Tubro Pascal

SlideShow на JavaScript

Группировка данных в отчете

Обмен данными с Excel

Функции Windows API для работы с посторонними окнами




    Архив файлов



    Сообщества



    Документация

Статьи:: Assembler :: Создание окна


отправить ссылку другу версия для печати  Обсудить на форуме

Создание окна





Основные шаги при создании окна:

  1. Получить дискриптор Вашей программы(обязательно)
  2. Получить указатель на командную строку(не обязательно)
  3. Зарегистрировать класс окна(не требуется, если Вы используете встроенный тип окна, например MessageBox)
  4. Создать окно(обязательно)
  5. Показать окно(если хотите немедленно показать окно)
  6. Обновить окно
  7. Образовать бесконечный цикл, обрабатывающий сообщения окна
  8. Если есть сообщения, то обработать специализированной функцией ответственной за окно
  9. Выйти из программы, если пользователь закрыл окно

Разберем простую программу, которая выводит только окно.

Я взял пример программы Wap32.asm из пакета TASM и несколько упостил ее.

.386
.model flat, stdcall
include win32.inc
Файл win32.inc содержит некоторые нужные константы и структуры

extrn CreateWindowExA:PROC
extrn DefWindowProcA:PROC
extrn DispatchMessageA:PROC
extrn ExitProcess:PROC
extrn GetMessageA:PROC
extrn GetModuleHandleA:PROC
extrn LoadCursorA:PROC
extrn LoadIconA:PROC
extrn PostQuitMessage:PROC
extrn RegisterClassA:PROC
extrn ShowWindow:PROC
extrn TranslateMessage:PROC
extrn UpdateWindow:PROC


.data

newhwnd		dd 0
msg		MSGSTRUCT <?>
wc		WNDCLASS <?>
hInst 		dd 0
szTitleName 	db 'Win32 Assembly Program',0
szClassName 	db 'ASMCLASS32',0

.code
start:

	push	0
	call	GetModuleHandleA
	mov	[hInst], eax

Получим дискриптор программы.

Далее инициализируем структуру WndClass для регистрации окна

	mov	[wc.clsStyle], CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

clsStyle - определяет стиль класса

	mov	[wc.clsLpfnWndProc], offset WndProc

clsLpfnWndProc - указывает на процедуру окна

	mov	[wc.clsCbClsExtra], 0
	mov	[wc.clsCbWndExtra], 0

	mov	eax, [hInst]
	mov	[wc.clsHInstance], eax

clsHInstance - содержит дискриптор программы

	push	IDI_APPLICATION
	push	0
	call	LoadIconA
	mov	[wc.clsHIcon], eax

	push	IDC_ARROW
	push	0
	call	LoadCursorA
	mov	[wc.clsHCursor], eax

	mov	[wc.clsHbrBackground], COLOR_WINDOW + 1
	mov	dword ptr [wc.clsLpszMenuName], 0
	mov	dword ptr [wc.clsLpszClassName], offset szClassName

clsLpszClassName - определяет имя класса окна

	push	offset wc
	call	RegisterClassA

Создаем окно:

	push	0
	push	[hInst] ; дискриптор окна
	push	0
	push	0
	push	CW_USEDEFAULT ; высота
	push	CW_USEDEFAULT ; ширина
	push	CW_USEDEFAULT ; y
	push	CW_USEDEFAULT ; x
	push	WS_OVERLAPPEDWINDOW ; стиль
	push	offset szTitleName ; заголовок окна
	push	offset szClassName ; имя класса
	push	0 ; дополнительный стиль

	call	CreateWindowExA

	mov	[newhwnd], eax

newhwnd - дискриптор окна

Покажем окно:

	push	SW_SHOWNORMAL
	push	[newhwnd]
	call	ShowWindow

Обновим окно:

	push	[newhwnd]
	call	UpdateWindow

Создаем цикл для обработки сообщений окна

msg_loop:
	push	0
	push	0
	push	0
	push	offset msg
	call	GetMessageA

	cmp	ax, 0
	je	end_loop

	push	offset msg
	call	TranslateMessage

	push	offset msg
	call	DispatchMessageA

	jmp	msg_loop

end_loop:

выход из программы: push [msg.msWPARAM] call ExitProcess

Процедура окна:

WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD

Win32 требует, чтобы EBX, EDI, и ESI были сохранены

	cmp	[wmsg], WM_DESTROY
	je	wmdestroy

	push	[lparam]
	push	[wparam]
	push	[wmsg]
	push	[hwnd]
	call	DefWindowProcA
	jmp	finish

wmdestroy:
	push	0
	call	PostQuitMessage
	mov	eax, 0
finish:
	ret
WndProc endp
ends
end start

На первый взгляд кажется, что слишком много написано для простой программы. На самом же деле писать все полностью не нужно, достаточно написать файл один раз, а потом использовать его как шаблон для своих новых программ. Можно создать объектный файл и использовать его как загрузочный код, а писать только процедуру окна(WinProc).




Рубрика: Assembler




Google Developer Day 2008 в Москве.

Мероприятия

Дата проведения: 28 октября 2008 г.; Место проведения: Амбер Плаза, Москва, Россия. Конференция для веб-разработчиков и разработчиков мобильных приложений в Москве. Узнайте, как наилучшим образом использовать инструменты разработки и API от Google, чтобы создавать социальные, мобильные и картографические приложения, как использовать AJAX/JavaScript инструменты и библиотеки от Google и многое другое из первых уст.


Подробнее... | Рубрика: Мероприятия | Добавлено: 05.09.2008

ТОП 10 самых раздражающих факторов для программиста.

Разное

Совсем недавно наткнулся в интернете на забавный "хит-парад" наиболее раздражающих вещей для программиста. Поскольку он был на английском — решил перевести текст и несколько адаптировать к нашим реалиям…


Подробнее... | Рубрика: Разное | Добавлено: 03.09.2008

Windows Server 7, 8 и 9.

Windows Server 2003

К написанию этой статьи меня побудили недавние изыскания Мэри Джо Фоли (Mary Jo Foley) по поводу Windows 7 Server и Windows Server 2008 R2. Если бы не она, я, наверное, и не вспомнил бы о массе информации, имеющейся по этому поводу у меня. Если вы не слышали, Microsoft удалось смутить львиную долю пользователей своим заявлением о том, что Windows Server 2008 R2, чей релиз должен состояться в 2010 году, есть ничто иное, как Windows 7 Server.


Подробнее... | Рубрика: Windows Server 2003 | Добавлено: 03.09.2008

Остальные статьи:

jQuery для JavaScript-программистов
Инновационный веб-броузер Google Chrome стартует уже сегодня
Windows 7: подход к производительности системы
Trac + Subversion @ Ubuntu: Revisited
[g]Vim в режиме Python: Рекомпиляция в Windows
Java + JSON. Пути к дружбе
Драйвер SQL Server 2005 для PHP
Типы данных в MySQL (сжатый справочник для PHP программиста)
PHP класс для работы с Яндекс.XML
Ошибки начинающих PHP разработчиков
Наследование шаблонов в Smarty
Особенности хранения сессий PHP в memcached
Internet Explorer 8 beta 2
9 правил для начинающего Ajax-разработчика
ExtJS 2.2 - полная поддержка Firefox 3, новые виджеты и другие нововведения
Windows 7: под покровом тайны


Цитата дня (все,добавить):



    Рубрикатор

Программирование

C/С++
Обучение
Windows API
XAML
Моделирование
Паттерны
Visual Basic 7 .NET
WxWidgets
Функции WinApi
Функции С++
Разработка под Mac OS
Eiffel
Visual Studio 2008
UI дизайн
Алгоритмы
Конкурсные статьи
Turbo Pascal
Visual Studio
CASE-средства
Visual Studio 2005
Без VCL
Delphi
Тех. документация
Тестирование
Software Testing
ООП
TCP/IP
Google Android
Windows Installer
.NET Framework
Драйвера
C# C Sharp
Справка
Проектирование
Информ. системы
Visual Basic
Assembler
Оптимизация кода
Gtk+
Компоненты
Реинжиниринг
Управление проектами
Extreeme programming
Lotus Notes
Алгебраическое проектирование

Интернет технологии

PHP
Perl
ASP
WAP
Cookies
SSI
CGI
Web Servers
VB Script
DNS
CSS
XML
Html
Java Script
Java2ME
Firewall
Flash
.htaccess
Apache
VRML
Протоколы
Поисковые системы
Технология JAVA
Учебник по PHP
Учебник по JavaScript
Учебник по XML
Java Q&A
AJAX
DHTML
XHTML
Dreamweaver
Web 2.0
Python
Вебмастеру
Cisco
Ruby on Rails
Silverlight

Базы данных

Access
InterBase
MySQL
Oracle
ADO .NET
Основы SQL
Учебник по Access 2002
MS
Microsoft FoxPro
Доступ к данным
XML в MS SQL Server 2000
ODBC и MyODBC
Обучение
Caché
DB2
PostgresSQL
Sybase
Теория
Хранилища данных
Безопасность
Реляционные данные
MySQL и mSQL

Остальное:

Разное
Обзоры книг
Безопасность
Графика и дизайн
Юмор
Linux
Фракталы
Microsoft Axapta
Многоядерность
Сети
Microsoft Office
Работа
MS-DOS
Криптография
Графика и игроделание
Новости SDK
Системы защиты
Учебник по AutoCad
CVS
Windows XP
Windows Server 2003
Windows Vista
Windows 7
Мероприятия

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 109
Пользователей: 0