Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > API научмте


Автор: ivan219 31.1.2006, 02:58
Вобщем хочу научится програмировать на WinAPI но с чего ночать незнаю, может вы поможете премером только полным а то я неразберуть если дадите только чать.

Также я незнаю как создовать эти преложения т.е. как простое Фаил - новые - приложение или по другому smile

Также может порекомендуете хорошую книгу по WinAPI smile

smile

Автор: RaIDeR 31.1.2006, 09:54
Цитата(ivan219 @ 31.1.2006, 02:58 Найти цитируемый пост)

Вобщем хочу научится програмировать на WinAPI но с чего ночать незнаю, может вы поможете премером только полным а то я неразберуть если дадите только чать.

Думаю следует начать с создания окон, вот пример минимальной проги на Api:
Код

program Project1;

uses
  Windows, Messages;

const
  WNDCaption   = 'Application caption';
  WNDClassName = 'Application name';

var
  WND: HWND;
  WNDMsg: tagMsg;
  WNDClass: TWNDClass;

{$R Icon.res} // Обычный ресурс -> "Project1.res" переименованный в -> "Icon.res"...
{$R WindowsXP.res}

function ExtractIcon(hInst: HINST; lpszExeFileName: PChar; nIconIndex: UINT) : HICON; stdcall; external 'shell32.dll' name 'ExtractIconA';

function WindowProc(hWnd: HWND; Msg: UINT; wParam, lParam: LongInt) : LongInt; stdcall;
begin
  Result := 0;
  case Msg of
    WM_DESTROY: PostQuitMessage(0);
  else
    Result := DefWindowProc(hWnd, Msg, wParam, lParam);
  end;
end;

procedure WindowToCenter;
var
  Rect: TRect;
begin
  if GetWindowRect(WND, Rect) then
    SetWindowPos(WND, HWND_TOP,
               GetSystemMetrics(SM_CXSCREEN) div 2 - (Rect.Right - Rect.Left) div 2,
               GetSystemMetrics(SM_CYSCREEN) div 2 - (Rect.Bottom - Rect.Top) div 2,
               0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);
end;

begin
  ZeroMemory(@WNDClass, SizeOf(TWNDClass));
  with WNDClass do
  begin
    Style         := CS_VREDRAW or CS_HREDRAW;
    lpfnWNDProc   := @WindowProc;
    hInstance     := GetModuleHandle(nil);
    hIcon         := ExtractIcon(0, PChar(ParamStr(0)), 0);
    hCursor       := LoadCursor(0, IDC_ARROW);
    hbrBackground := COLOR_BTNFACE + 1;
    lpszClassName := WNDClassName;
  end;

  if not Boolean(RegisterClass(WNDClass)) then 
  begin
    MessageBox(0, 'Ошибка регистрации класса !', nil, MB_ICONERROR or MB_SYSTEMMODAL);
    Halt;
  end;

  WND := CreateWindow(WNDClassName,
                      WNDCaption,
                      WS_OVERLAPPEDWINDOW,
                      Integer(CW_USEDEFAULT),
                      Integer(CW_USEDEFAULT),
                      Integer(CW_USEDEFAULT),
                      Integer(CW_USEDEFAULT),
                      0,
                      0,
                      hInstance, 
                      nil);

  WindowToCenter;

  while GetMessage(WNDMsg, 0, 0, 0) do
  begin
    TranslateMessage(WNDMsg);
    DispatchMessage(WNDMsg);
  end;
  Halt(WNDMsg.wParam);
end.

Со всеми используемыми ф-циями, предлагаю тебе разобраться самому ;)

Цитата(ivan219 @ 31.1.2006, 02:58 Найти цитируемый пост)

Также может порекомендуете хорошую книгу по WinAPI smile

WindowsSDK smile

Автор: ivan219 31.1.2006, 13:36
А адрес где купить можно неподскажеш а то я искал в инет магазинах а там нет такой smile

Автор: _hunter 31.1.2006, 13:54
www.microsoft.com...

Автор: ivan219 31.1.2006, 14:53
Я же книгу просил из бумаги а не электронную да ещё и на английском smile

Автор: Bose 31.1.2006, 14:55
http://msdn.microsoft.com/

Автор: ivan219 31.1.2006, 14:56
А как в эту фарму добавить кнопку smile
Код

program Project1;    
uses    
  Windows, Messages;    
const    
  WNDCaption   = 'Application caption';    
  WNDClassName = 'Application name';    
var    
  WND: HWND;    
  WNDMsg: tagMsg;    
  WNDClass: TWNDClass;    
{$R Icon.res} // Обычный ресурс -> "Project1.res" переименованный в -> "Icon.res"...    
{$R WindowsXP.res}    
function ExtractIcon(hInst: HINST; lpszExeFileName: PChar; nIconIndex: UINT) : HICON; stdcall; external 'shell32.dll' name 'ExtractIconA';    
function WindowProc(hWnd: HWND; Msg: UINT; wParam, lParam: LongInt) : LongInt; stdcall;    
begin    
  Result := 0;    
  case Msg of    
    WM_DESTROY: PostQuitMessage(0);    
  else    
    Result := DefWindowProc(hWnd, Msg, wParam, lParam);    
  end;    
end;    
procedure WindowToCenter;    
var    
  Rect: TRect;    
begin    
  if GetWindowRect(WND, Rect) then    
    SetWindowPos(WND, HWND_TOP,    
               GetSystemMetrics(SM_CXSCREEN) div 2 - (Rect.Right - Rect.Left) div 2,    
               GetSystemMetrics(SM_CYSCREEN) div 2 - (Rect.Bottom - Rect.Top) div 2,    
               0, 0, SWP_NOSIZE or SWP_SHOWWINDOW);    
end;    
begin    
  ZeroMemory(@WNDClass, SizeOf(TWNDClass));    
  with WNDClass do    
  begin    
    Style         := CS_VREDRAW or CS_HREDRAW;    
    lpfnWNDProc   := @WindowProc;    
    hInstance     := GetModuleHandle(nil);    
    hIcon         := ExtractIcon(0, PChar(ParamStr(0)), 0);    
    hCursor       := LoadCursor(0, IDC_ARROW);    
    hbrBackground := COLOR_BTNFACE + 1;    
    lpszClassName := WNDClassName;    
  end;    
  if not Boolean(RegisterClass(WNDClass)) then    
  begin    
    MessageBox(0, 'Ошибка регистрации класса !', nil, MB_ICONERROR or MB_SYSTEMMODAL);    
    Halt;    
  end;    
  WND := CreateWindow(WNDClassName,    
                      WNDCaption,    
                      WS_OVERLAPPEDWINDOW,    
                      Integer(CW_USEDEFAULT),    
                      Integer(CW_USEDEFAULT),    
                      Integer(CW_USEDEFAULT),    
                      Integer(CW_USEDEFAULT),    
                      0,    
                      0,    
                      hInstance,    
                      nil);    
  WindowToCenter;    
  while GetMessage(WNDMsg, 0, 0, 0) do    
  begin    
    TranslateMessage(WNDMsg);    
    DispatchMessage(WNDMsg);    
  end;    
  Halt(WNDMsg.wParam);    
end.


И может ктонебудь распишит где што означает smile

Автор: Bose 31.1.2006, 15:11
В дельфи, в меню Хелп, есть подпункт Windows SDK - там довольно подробно описано большинство функций. Обязательно смотри в http://msdn.microsoft.com/

Если с английским уже совсем никак, то спроси http://www.google.com/search?client=opera&rls=en&q=%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA+WinAPI&sourceid=opera&ie=utf-8&oe=utf-8.

p.s. exb fk,fycrbq

Автор: Alexeis 31.1.2006, 15:51
ivan219 есть такой набор компонентов acl - практически голый
Api ни какого визуального програмирования все компоненты очень простые и их можно самому исследовать.
Там есть combobx, Button, Edit, ListBox, CheckBox, форма кроме того имеются дополнительные библиотеки легкий Sysutils (aclUtils) RegIni
IniFiles, и много не визуальных классов.
Что хорошо все классы - ультралегкие.
Правда memo - там нет, но я сейчас как раз сам его пишу.
Пока мой мемо в результирующий проект добавляет 0,5 кБ!!!

В качестве helpa можно пользоваться Microsoft Api Help (тот что идет с delphi) кроме того есть много статей на русском языке.

Автор: ivan219 31.1.2006, 17:49
А вот такой вопрос возможно исползовать в API компонент XPManifest и намноголи это повлияет на размер а то мне этот стиль нравится красиво получается smile smile

Автор: Guedda 31.1.2006, 17:54
Можно не компонент юзать, а написать манифест, и подкрепить его к программе. Воспользуйся поиском, и увидишь, что тема уже была затронута.

Автор: Alexeis 31.1.2006, 18:30
Создается xml файлик специальной структуры
Помещается в ресурс и все.

Автор: Voyager 2.2.2006, 07:51
http://voyager.alfamoon.com/forum/topic.php?forum=3&topic=1
На сайте есть еще несколько примеров/исходников.

Автор: Guedda 2.2.2006, 09:01
Скачай http://drkb.ru, http://delphiworld.narod.ru/dw.html, там очень много статей. Сам учился по ним.
А на форуме задавай вопросы по существу, а не риторические.

Автор: ivan219 2.2.2006, 09:04
Всё понял будем по существу.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)