Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11631
Последний выпуск: 19.06.2015

Пустое окно на Win API

Автор: Сергей
Дата: 12 октября 2005 года
Источник: www.delphisources.ru

Содержание:

  1. Введение;
  2. Функция CreateWindowEx;
  3. Функция ShowWindow;
  4. Структура типа TWndClassEx;
  5. Обработка сообщений в Win API;
  6. Исходный текст программы;
  7. Размер программы на Win API;
  8. Заключение.

1. Введение

Программы написанные на Win API имеют большую производительность и небольшой размер. С помощью функций Win API можно получить доступ к различным объектам Windows. Из этой статьи вы узнаете как создать окно на чистом Win API. Узнаете, как работают программы в Windows. Заметите какой размер имеет программа на Win API и программа с VCL.

Скачать исходник (zip, 2.2Кб)

2. Функция CreateWindowEx

Создает окно с заданными свойствами. Функция CreateWindowEx выглядит так:

function CreateWindowEx(
	dwExStyle: DWORD;
	lpClassName: PChar;
	lpWindowName: PChar;
	dwStyle: DWORD;
	X, Y, nWidth, nHeight: Integer;
	hWndParent: HWND;
	hMenu: HMENU;
	hInstance: HINST;
	lpParam: Pointer
	): HWND;

Параметры CreateWindowEx:

  • dwExStyle - определяет расширенный стиль окна, может быть комбинацией (при помощи оператора or):
    • WS_EX_ACCEPTFILES - на окно можно перетаскивать файлы из Проводника, когда пользователь опускает на окно с таким стилем файлы, посылается сообщение WM_DROPFILES;
    • WS_EX_APPWINDOW - на панели задач для окна с таким стилем появляется кнопка;
    • WS_EX_CLIENTEDGE - вокруг клиентской части будет рамка, причем клиентская часть будет вдавлена внутрь;
    • WS_EX_CONTEXTHELP - в заголовке окна появится кнопка контекстной помощи, это флаг не может использоваться одновременно с WS_MAXIMIZEBOX и WS_MINIMIZEBOX;
    • WS_EX_CONTROLPARENT;
    • WS_EX_DLGMODALFRAME;
    • WS_EX_LEFT;
    • WS_EX_LEFTSCROLLBAR;
    • WS_EX_LTRREADING;
    • WS_EX_MDICHILD;
    • WS_EX_NOINHERITLAYOUT;
    • WS_EX_NOPARENTNOTIFY;
    • WS_EX_OVERLAPPEDWINDOW;
    • WS_EX_PALETTEWINDOW;
    • WS_EX_RIGHT;
    • WS_EX_RIGHTSCROLLBAR;
    • WS_EX_RTLREADING;
    • WS_EX_STATICEDGE;
    • WS_EX_TOOLWINDOW - создается окно с маленьким заголовком, как у панели инструментов;
    • WS_EX_TOPMOST - создаваемое окно будет находиться поверх остальных;
    • WS_EX_TRANSPARENT;
    • WS_EX_WINDOWEDGE.

Определения других констант вы сможете найти в справке по win32api.

  • lpClassName - Имя класса окна. Вы можете создавать свои классы при помощи функции RegisterClassEx или использовать предопределённые: edit, button, static, scrollbar, combobox и другие;
  • lpWindowName - текст, который появится в заголовке окна (если окно с заголовком), на кнопке (если класс окна button), в поле ввода текста (если класс окна edit);
  • dwStyle - список основных стилей окна. Содержит несколько следующих констант, соединённых оператором or:
    • WS_BORDER - окно будет иметь тонкую рамку;
    • WS_CAPTION - окно будет иметь заголовок;
    • WS_CHILD или WS_CHILDWINDOW - окно будет дочерним, то есть целиком располагаться внутри некоторого другого окна;
    • WS_CLIPCHILDREN - площадь занимаемая дочерними окнами не будет перерисовываться;
    • WS_CLIPSIBLINGS - перерисовка одного дочернего окна не влияет на другие;
    • WS_DISABLED - окно создается недоступным, его можно разблокировать при помощи функции EnableWindow;
    • WS_DLGFRAME - создается окно с рамкой как у диалоговых окон;
    • WS_GROUP - для дочернего окна (со стилем WS_CHILD) определяет первый элемент в группе, при нажатии на Tab именно он получит фокус, группа простирается до следующего дочернего окна с тем же стилем, внутри группы можно перемещаться при помощи клавиш управления курсором;
    • WS_HSCROLL - создается окно с горизонтальной полосой прокрутки;
    • WS_ICONIC или WS_MINIMIZE - создаваемое окно изначально минимизировано;
    • WS_MAXIMIZE - создаваемое окно изначально максимизировано;
    • WS_MAXIMIZEBOX - создаваемое окно имеет кнопку максимизации;
    • WS_MINIMIZEBOX - создаваемое окно имеет кнопку минимизации;
    • WS_OVERLAPPED - создается перекрывающееся окно, имеет заголовок и рамку;
    • WS_OVERLAPPEDWINDOW - комбинация флагов WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX;
    • WS_POPUP - создается окно не имеющее изначально рамки и заголовка, не может использоваться со стилем WS_CHILD;
    • WS_SIZEBOX или WS_THICKFRAME - создается окно, размер которого можно изменять;
    • WS_SYSMENU - создается окно со значком системного меню, должен употребляться с флагом WS_CAPTION;
    • WS_TABSTOP - создается дочернее окно, которое может получать фокус ввода при нажатии на Tab;
    • WS_TILEDWINDOW - комбинация флагов WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX;
    • WS_VISIBLE - создается окно, которое изначально видимо. Если вы не укажете это флаг для окна, то вы его никогда не увидите (если только не воспользуетесь функцией ShowWindow);
    • WS_VSCROLL - создаваемое окно будет иметь вертикальную полосу прокрутки;
  • X - горизонтальная координата верхнего левого угла окна; если вы хотите предоставить windows возможность расположить окно по умолчанию, укажите здесь CW_USEDEFAULT, в этом случае следующий параметр игнорируется;
  • Y - вертикальная координата верхнего левого угла окна.
  • nWidth - ширина окна (в единицах устройства, для монитора - в пикселах), если вы хотите предоставить Windows выбрать положение окна, то выставите здесь CW_USEDEFAULT, в этом случае следующий параметр игнорируется;
  • nHeight - высота окна (в единицах устройства, для монитора - в пикселах);
  • hWndParent - описатель родительского окна, если окно создается со стилем WS_CHILD, то здесь обязательно долден стоять корректный описатель;
  • для дочернего окна (с флагом стиля WS_CHILD) определяет идентификатор этого дочернего окна, для обычного окна определяет описатель главного меню окна (если равен нулю, то используется меню из определения класса окна);
  • hInstance - описатель приложения, с которым окно связывается (для Windows NT/2000/XP игнорируется);
  • lpParam - указатель на что-нибудь, он передается в сообщении WM_CREATE при создании окна, и в нем могут быть переправлены какие-либо данные для копии окна.

3. Функция ShowWindow

Эта функция показывает или прячет окно.

function ShowWindow(
	hWnd: HWND; 
	nCmdShow: Integer
	): BOOL;

Параметры функции:

  • hWnd - Описатель нужного окна;
  • nCmdShow - Константа, определяющая, что будет сделано с окном:
    • SW_HIDE - окно будет скрыто;
    • SW_SHOWNORMAL - окно будет показано и активировано, если окно было минимизировано или максимизировано, то оно будет восстановлено в исходную позицию и размер;
    • SW_SHOWMINIMIZED - активизирует и сворачивает (минимизирует) окно;
    • SW_SHOWMAXIMIZED - активизирует и максимизирует окно;
    • SW_MAXIMIZE - максимизирует окно;
    • SW_SHOWNOACTIVATE - то же самое, что SW_SHOWNORMAL, только окно не активизируется;
    • SW_SHOW - отображает окно в его текущей позиции;
    • SW_MINIMIZE - минимизирует окно и активизирует следующее по Z-списку;
    • SW_SHOWMINNOACTIVE - то же самое, что и SW_SHOWMINIMIZED, только окно не активизируется;
    • SW_SHOWNA - то же самое, что SW_SHOW, только окно не активизируется;
    • SW_RESTORE - восстанавливает окно из максимизированного или минимизированного состояния;
    • SW_SHOWDEFAULT - отображает окно так, как оно было отображено при старте соответствующего приложения;
    • SW_MAXIMIZE - максимизирует окно.

4. Структура типа TWndClassEx

Структура типа TWndClassEx имеет следующий вид: tagWNDCLASSEXA = packed record cbSize: UINT; style: UINT; lpfnWndProc: TFNWndProc; cbClsExtra: Integer; cbWndExtra: Integer; hInstance: HINST; hIcon: HICON; hCursor: HCURSOR; hbrBackground: HBRUSH; lpszMenuName: PAnsiChar; lpszClassName: PAnsiChar; hIconSm: HICON; end;

5. Обработка сообщений в Win API

Сообщение - информация о некотором изменении в пользовательском интерфейсе, например перемещение окна или нажатие клавиши на клавиатуре. Сообщения также могут рассылаться другими приложениями.

Цикл обработки сообщений выглядеть так:

while GetMessage(Mmsg,0,0,0) do 
	begin
		TranslateMessage(Mmsg);
		DispatchMessage(Mmsg);
	end;

TranslateMessage - эта функция переводит сообщения виртуальных клавиш в символьные сообщения.

DispatchMessage - эта функция сообщения оконному обработчику событий.

В качестве оконного обработчика событий служит функция WindowProc.

6. Исходный текст программы

С теорией мы разобрались, давайте приступим к реализации нашей идеи "Сделать окно на Win API".

1. Запускаем Delphi. Появится пустое окно.

2. Project - View Source.

3. Удаляем всё кроме : Program, Uses, Var, Begin , End.

4. Пишем код.

Program Api;
uses
	windows, messages;
var
	window:TWndClassEx;
	Mwindow: HWND;
	Mmsg: MSG;

// Процедура обработки сообщений
function WindowProc (wnd: HWND; msg: integer; wparam: WPARAM; lparam: LPARAM):LRESULT;STDCALL;
	begin
		case msg of
			WM_Destroy:
				begin
					PostQuitMessage (0);
					Result := 0;
					Exit;
				end;
			else
				Result := DefWindowProc(wnd,msg,wparam,lparam);
		end;
	end;

// Ристрация класса окна
begin
	window.cbSize := sizeof (window);
	window.style := CS_HREDRAW or CS_VREDRAW;
	window.lpfnWndProc := @WindowProc;
	window.cbClsExtra := 0;
	window.cbWndExtra := 0;
	window.hInstance := HInstance;
	window.hIcon := LoadIcon (0,IDI_APPLICATION);
	window.hCursor := LoadCursor (0,IDC_ARROW);
	window.hbrBackground:=Color_BtnFace+12;
	window.lpszMenuName := nil;
	window.lpszClassName := 'Main_Window';
	RegisterClassEx (window);

	// Создание окна на основе созданного класса
	Mwindow := CreateWindowEx(0,'Main_Window','First_WinAPI_Programm',
	WS_OVERLAPPEDWINDOW,100,100,300,300,0,0,Hinstance,nil);

	// Показать созданное окно
	SHOWWINDOW (Mwindow,SW_Show);

	// Цикл обработки сообщений
	while GetMessage (Mmsg,0,0,0) do
		begin
			TranslateMessage (Mmsg);
			DispatchMessage (Mmsg);
		end;
	end.

7. Размер программы на Win API

Теперь когда программа у нас готова. Компилируем и запускаем программу. Появится окошко синего цвета.

Узнаем размер приложения. Для этого заходим в меню Project - Information for "имя программы".

Смотрим, размер файла (File size) равен 8704 байт. или 8,5 килобайт. Теперь запускаем создаём новое приложение.

Компилируем и запускаем. Заходим в меню Project - Information for "имя программы".

Смотрим, размер файла (File size) равен 359454 байт или 351 килобайт.

Вы увидели, что пустая форма на Win API имеет гораздо меньший размер чем с VCL.

8. Заключение

Писать большие программы на чистом Win API очень сложно, хотя они и имеют маленький размер. Но с использованием функций Win API можно получить доступ к различным объектам Windows. Win API может показаться сложным для начинающих программистов, но не стоит боятся. Учите, исправляйте ошибки, не останавливайтесь на половине пути. Если у вас, что то не получается то не останавливайтесь, ищите пути решения.

Надеюсь, что этот материал поможет вам в первом знакомстве с Win API.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог