(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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

Источник: delphisources
Сергей

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

 

Программа на 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.
 

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 27.04.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Delphi Professional Named User
Enterprise Connectors (1 Year term)
Quest Software. Toad for DBA Suite for Oracle
Microsoft Windows Professional 10, Электронный ключ
ABViewer Enterprise пользовательская
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Мастерская программиста
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100