Сергей
Содержание:
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.
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.
Ссылки по теме