Пустое окно на Win API
Содержание:
- Введение;
- Функция CreateWindowEx;
- Функция ShowWindow;
- Структура типа TWndClassEx;
- Обработка сообщений в Win API;
- Исходный текст программы;
- Размер программы на Win API;
- Заключение.
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.