Голосование

Собираетесь ли Вы поменять работу в ближайшее время?

Не знаю
Еще поработаю
Никогда не поменяю
Собираюсь (полгода)
Собираюсь (год)
Уже поменял



Посмотреть результаты
Другие опросы ...

 

Лента RSS, новости сайта Новости сайта
Лента RSS, новости форума Новости форума
  Bookmark and Share

Архив исходников

   
  Базы данных
  Графика & Мультимедиа
  Сети & Интернет
  Система
  Разное
   

Кнопки, Ссылки и Баннеры ...

 


Automatic translation


English German French Italian Spanish
Portuguese Greece Japan Chinese Korean


Ссылки и Баннеры


скрыть

 

Delphi Sources

Delphi Sources

СТАТЬИ

 

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

 

Содержание:
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.
 

Дата: 12.10.2005, Автор: Сергей.






Назад

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

   

 




























































































































































































 

© 2004-2017 "DS"

E-mail: Отправить письмо


ВКонтакте   Twitter   Facebook