Пустое окно на Win API
Пустое окно на Win API
Пустое окно на Win API 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. Автор: Сергей Источник: http://www.delphisources.ru