Смілянський форум

Ласкаво просимо

* Погода 
* Правила   * Учасники
* Вхід   * Реєстрація
Об'яви форума

Смілянський форум засвідчує свою підтримку українському народу. Ми засуджуємо дії російської влади, що нахабно ввела свої збройні сили на територію України.
Ми єдина, незалежна держава і вторгнення на нашу територію - це порушення суверенності України.
Слава Україні !


Сьогодні: 17 Грудня, 2018 6:41

Часовий пояс UTC + 2 годин [ DST ]




Створити нову тему Відповісти  [ 13 повідомлень ] 
Автор Повідомлення
 Тема повідомлення: Помогите с WinApi
ПовідомленняДодано: 04 Листопада, 2009 21:59 
Офлайн
Ветеран
Ветеран
Аватар користувача

З нами з: 07 Листопада, 2008 22:37
Повідомлення: 718
Репутація: 53
Нужно создать программы с помощью WinApi в Delphi используя callback-функции. Общая структура программы:

Код:
uses Messages, Windows;

procedure WndProc(...); stdcall; //Оконная процедура
begin
  case
    //........................ обработка WM_PAINT
    else
      result:=DefaultWindowProc(...);
  end; //case
end;

begin
  {регистрация оконного класса}
  {порождение окна}
  {вывод окна на экран}
  {цикл обработки сообщений}
end.


Задача приблизительно: масштабируемое окно без заголовка, в котором по центру нарисованы Декартовы оси координат с метками 0 и названием осей X и Y, размеры осей должны изменяться при изменении размеров окна.

Проблема в том, что с WinApi никогда не работал и понятия не имею, как использовать callback-функции. Кто что может подсказать, помочь, подобные примеры, любая помощь. Спасибо.

_________________
Появился новый вид "галерных рабов": сидят сверху, гребут к себе


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 09 Листопада, 2009 21:55 
Офлайн
Ветеран
Ветеран
Аватар користувача

З нами з: 07 Листопада, 2008 22:37
Повідомлення: 718
Репутація: 53
Что никто не знает WinAPI? :'(

_________________
Появился новый вид "галерных рабов": сидят сверху, гребут к себе


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 09 Листопада, 2009 22:04 
Офлайн
Анімешник
Анімешник

З нами з: 17 Січня, 2007 22:57
Повідомлення: 2337
Репутація: 156
Кое-что ещё помню с винапи, но только с «чистого» винапи, на чистом С (на котором он написан и на который рассчитан), без дельфишных биндингов.
Другими словами, могу написать это на сях, на паскакаль/дельфи будешь сам переводить. Идёт?


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 0:34 
Офлайн
Ветеран
Ветеран
Аватар користувача

З нами з: 07 Листопада, 2008 22:37
Повідомлення: 718
Репутація: 53
Можно и на С. Спасибо.

_________________
Появился новый вид "галерных рабов": сидят сверху, гребут к себе


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 11:46 
Офлайн
Місцевий
Місцевий
Аватар користувача

З нами з: 24 Жовтня, 2007 10:39
Повідомлення: 182
Звідки: РПЗ
Репутація: 34
arsi, зроби на Сях, а я перероблю в Обжект Паскаль))
Fighter4Freedom, я почав в Делфі, та не пойму завдання.
Треба форму без рамки?? Чи що значить без заголовка?
І яким таким макаром маштабування? Як воно має виглядіти?
Можливо чужий скріншот є?
Вже малює кординати от тільки не можу позбавитись рамки вікна, якби прибрав її зробив би вручну маштабування.


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 12:39 
Офлайн
Анімешник
Анімешник

З нами з: 17 Січня, 2007 22:57
Повідомлення: 2337
Репутація: 156
Код:
#include <windows.h>


#define CLASS_NAME  "WinApiTest001"


HINSTANCE hInst;

BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


int APIENTRY
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   MSG msg;
   
   if (!InitInstance (hInstance, nCmdShow))
      return FALSE;

   while (GetMessage(&msg, NULL, 0, 0)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

   return msg.wParam;
}

BOOL
InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   WNDCLASSEX wcex;
   HWND hWnd;

   hInst = hInstance;

   wcex.cbSize         = sizeof(WNDCLASSEX);
   wcex.style          = CS_HREDRAW | CS_VREDRAW;
   wcex.cbClsExtra     = 0;
   wcex.cbWndExtra     = 0;
   wcex.hInstance      = hInstance;
   wcex.hbrBackground  = (HBRUSH) (COLOR_3DFACE+1);
   wcex.lpszMenuName   = NULL;
   wcex.hIcon          = NULL;
   wcex.hCursor        = LoadCursor(NULL, (LPCTSTR) IDC_ARROW);
   wcex.hIconSm        = NULL;
   wcex.lpfnWndProc    = (WNDPROC) WndProc;
   wcex.lpszClassName  = CLASS_NAME;

   if (!RegisterClassEx(&wcex)) {
      MessageBox(NULL, CLASS_NAME, "RegisterClassEx error", MB_ICONERROR);
      return FALSE;
   }

   hWnd = CreateWindow(CLASS_NAME, "WinApi Test", WS_POPUPWINDOW | WS_SIZEBOX,
      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
      NULL, NULL, hInstance, NULL);
   if (!hWnd) {
      MessageBox(NULL, CLASS_NAME, "CreateWindow error", MB_ICONERROR);
      return FALSE;
   }

   ShowWindow(hWnd, SW_SHOW);
   UpdateWindow(hWnd);
   
   return TRUE;
}


LRESULT CALLBACK
WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   PAINTSTRUCT ps;
   HDC hDC;
   RECT rect;
   int x0, y0;
   int i, imax;

   switch (message) {
   case WM_PAINT:
      hDC = BeginPaint(hWnd, &ps);
      SetBkMode(hDC, TRANSPARENT);
      GetClientRect(hWnd, &rect);
      x0 = (rect.left + rect.right) / 2;
      y0 = (rect.top + rect.bottom) / 2;

      MoveToEx(hDC, rect.left, y0, NULL);
      LineTo(hDC, rect.right, y0);
      LineTo(hDC, rect.right - 8, y0 - 3);
      LineTo(hDC, rect.right - 4, y0);
      LineTo(hDC, rect.right - 8, y0 + 3);
      LineTo(hDC, rect.right, y0);
      for (i = 1, imax = (rect.right - x0) / 20; i < imax; i++) {
         MoveToEx(hDC, x0 + i * 20, y0 - 5, NULL);
         LineTo(hDC, x0 + i * 20, y0 + 5);
         MoveToEx(hDC, x0 - i * 20, y0 - 5, NULL);
         LineTo(hDC, x0 - i * 20, y0 + 5);
      }
      SetTextAlign(hDC, TA_TOP | TA_RIGHT);
      TextOut(hDC, rect.right, y0 + 5, "x", 1);

      MoveToEx(hDC, x0, rect.bottom, NULL);
      LineTo(hDC, x0, rect.top);
      LineTo(hDC, x0 - 3, rect.top + 8);
      LineTo(hDC, x0, rect.top + 4);
      LineTo(hDC, x0 + 3, rect.top + 8);
      LineTo(hDC, x0, rect.top);
      for (i = 1, imax = (rect.bottom - y0) / 20; i < imax; i++) {
         MoveToEx(hDC, x0 - 5, y0 + i * 20, NULL);
         LineTo(hDC, x0 + 5, y0 + i * 20);
         MoveToEx(hDC, x0 - 5, y0 - i * 20, NULL);
         LineTo(hDC, x0 + 5, y0 - i * 20);
      }
      SetTextAlign(hDC, TA_TOP | TA_LEFT);
      TextOut(hDC, x0 + 5, rect.top, "y", 1);

      EndPaint(hWnd, &ps);
      break;

   case WM_DESTROY:
      PostQuitMessage(0);
      break;

   case WM_CLOSE:
      DestroyWindow(hWnd);
      break;

   default:
      return DefWindowProc(hWnd, message, wParam, lParam);
   }

   return 0;
}



Додано через 15 хвилин 26 секунд:

Упс, не дочитал, что должно быть без заголовка. Исправил.


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 14:31 
Офлайн
Ветеран
Ветеран
Аватар користувача

З нами з: 07 Листопада, 2008 22:37
Повідомлення: 718
Репутація: 53
RedHeaD, я вполне понимаю твое недоумение. Но дело в том, что преподаватели, по своей сути - это тупорылый народ. Отсюда и формулировка задачи такая же, как и отмазки нашего правительства. Если бы я знал, что там подразумевается, то сказал бы. Скриншота чужого нет, мало инфы по винапи, особенно по рисованию. А препод даже примера не дал, особенно, как работать с callback-функциями. Сейчас заочникам дают контрольные так, как будто мы уже ученые, а не студенты. Две остальные задачи еще похлеще:

2. В рабочей области окна существует единственный объект, представляющий собой геометрическую фигуру, отличную от прямоугольника (например, круг или треугольник). Нажатием цифровых клавиш 1..8 цвет объекта изменяется на один из 8 возможных. Стрелками осуществляется перемещение объекта на 1 пиксел в любую из 4 сторон. Предусмотреть также возможность перетаскивания объекта мышью.

3. "Регулятор цвета". Окно, содержащее три информационных (не модифицируемых) полосы прокрутки и три поля ввода для красной, зеленой и синей составляющей цвета. После ввода составляющей положение соответствующей полосы прокрутки должно изменяться. При неверном вводе значения должно выдаваться сообщение об ошибке. Заданный цвет должен произвольным образом отображаться в рабочей области главного окна. Каждая составляющая — число от 0 до 255.

Я нашел в нете визуальную среду разработки, называется APIx 2. Похожа на делфу, но всеравно нужно код писать. Тому, кто знает, как писать код, то это вообще лафа. Лабы на обычном делфи сделал с полраза. Еще раз спасибо за помощь.

_________________
Появился новый вид "галерных рабов": сидят сверху, гребут к себе


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 15:03 
Офлайн
Анімешник
Анімешник

З нами з: 17 Січня, 2007 22:57
Повідомлення: 2337
Репутація: 156
Две другие задачи совсем простые. И понятные. Без разницы, на винапи это реализовывать, или на компонентах делфи. Я такие ещё школьником за чашкой чая писал, не сцы ;)


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 17:30 
Офлайн
Місцевий
Місцевий
Аватар користувача

З нами з: 24 Жовтня, 2007 10:39
Повідомлення: 182
Звідки: РПЗ
Репутація: 34
Як і обіццяв, варіант на Обжект Паскалі:
Один баг, відмальовується тільки після першого ресайзу, в arsi, мабуть, так само, хз чого так)))
Код:
program WindowClearAPI;
uses
  Windows, Messages;

const
  AppName = 'WindowsAPI';   //Ім'я класу вікна

var
  hWindow: HWnd;   // Дескриптор вікна
  DC: HDC;         // Дескриптор області виведення

//
// Віконна процедура
//
function WndProc(Window: HWnd; AMessage, WParam, LParam: Longint): Longint;
stdcall; export;
var
  Rect: TRect;
  X, Y: Integer;
  i: Integer;
begin
  Result := 0;
  case AMessage of
    WM_PAINT:
      begin
        GetClientRect(hWindow, Rect);
        X := (Rect.Right - Rect.Left) div 2;
        Y := (Rect.Bottom - Rect.Top) div 2;
        MoveToEx(DC, Rect.left, Y, NIL);
        LineTo(DC, Rect.right, Y);
        LineTo(DC, Rect.right - 8, Y - 3);
        LineTo(DC, Rect.right - 4, Y);
        LineTo(DC, Rect.right - 8, Y + 3);
        LineTo(DC, Rect.right, Y);
        for i := 1 to (Rect.Right - X) div 20 do
          begin
            MoveToEx(DC, X + i * 20, Y - 5, NIL);
            LineTo(DC, X + i * 20, Y + 5);
            MoveToEx(DC, X - i * 20, Y - 5, NIL);
            LineTo(DC, X - i * 20, Y + 5);
          end;
        MoveToEx(DC, X, Rect.bottom, NIL);
        LineTo(DC, X, Rect.top);
        LineTo(DC, X - 3, Rect.top + 8);
        LineTo(DC, X, Rect.top + 4);
        LineTo(DC, X + 3, rect.top + 8);
        LineTo(DC, X, Rect.top);
        for i := 1 to (Rect.bottom - Y) div 20 do
          begin
            MoveToEx(DC, X - 5, Y + i * 20, NIL);
            LineTo(DC, X + 5, Y + i * 20);
            MoveToEx(DC, X - 5, Y - i * 20, NIL);
            LineTo(DC, X + 5, Y - i * 20);
          end;
        SetTextAlign(DC, TA_TOP or TA_RIGHT);
        TextOut(DC, X - 5, Y + 5, '0', 1);
        TextOut(DC, Rect.right, Y + 5, 'x', 1);
        TextOut(DC, X - 5, Rect.top, 'y', 1);
      end;
    WM_CLOSE:
      begin
        DestroyWindow(hWindow);
        Exit;
      end;
    WM_DESTROY:
      begin
        PostQuitMessage(0);
        Exit;
      end;
  end;
  Result := DefWindowProc(Window, AMessage, WParam, LParam);
end;

//
// Реєстрація класу вікна
//
function WinRegister: Boolean;
var
  WindowClass: TWndClass;
begin
  WindowClass.Style := CS_VREDRAW or CS_HREDRAW;
  WindowClass.lpfnWndProc := @WndProc;   // Зсилка на віконну процедуру
  WindowClass.cbClsExtra := 0;
  WindowClass.cbWndExtra := 0;
  WindowClass.hInstance := HInstance;
  WindowClass.hIcon := LoadIcon(0, idi_Application);
  WindowClass.hCursor := LoadCursor(0, idc_Arrow);
  WindowClass.hbrBackground := HBrush(Color_Window);
  WindowClass.lpszMenuName := nil;
  WindowClass.lpszClassName := AppName;
  Result := RegisterClass(WindowClass) <> 0;
end;

//
// Створення вікна
//
function WinCreate: HWnd;
var
  hWindow: HWnd;
begin
  hWindow := CreateWindow(AppName, 'Clear WinAPI Window',
    WS_POPUPWINDOW or WS_SIZEBOX, 100, 100,
    256, 256, 0, 0, HInstance, nil);
  if hWindow <> 0 then
  begin
    ShowWindow(hWindow, SW_SHOW);
    UpdateWindow(hWindow);
    //SendMessage(hWindow, WM_PAINT, 0, 0);
  end;
  Result := hWindow;
end;

//
// Основне тіло програми
//
var
  AMessage: TMsg;  // Змінна для збереження повідомлень з черги
begin
  if not WinRegister then
  begin
    MessageBox(0, 'Не вдалося зареєструвати клас вікна.', 'Помилка', mb_Ok or
      MB_ICONERROR);
    Exit;          // Виходимо, якщо не вдалося зареєструвати клас
  end;
  hWindow := WinCreate;
  if hWindow = 0 then
  begin
    MessageBox(0, 'Не вдалося створити вікно.', 'Помилка', mb_Ok or
      MB_ICONERROR);
    Exit;          // Виходимо, якщо не вдалося створити вікно
  end;
  DC := GetDC(hWindow);
  while GetMessage(AMessage, 0, 0, 0) do
  begin
    TranslateMessage(AMessage);
    DispatchMessage(AMessage);
  end;
  Halt(AMessage.wParam);
end.


У вас недостатньо прав для перегляду приєднаних до цього повідомлення файлів.


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 17:35 
Офлайн
Анімешник
Анімешник

З нами з: 17 Січня, 2007 22:57
Повідомлення: 2337
Репутація: 156
RedHeaD написав:
в arsi, мабуть, так само
См. вложение. Там есть экзешник.


У вас недостатньо прав для перегляду приєднаних до цього повідомлення файлів.


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 17:59 
Офлайн
Ветеран
Ветеран
Аватар користувача

З нами з: 07 Листопада, 2008 22:37
Повідомлення: 718
Репутація: 53
arsi написав:
Две другие задачи совсем простые. И понятные. Без разницы, на винапи это реализовывать, или на компонентах делфи. Я такие ещё школьником за чашкой чая писал, не сцы ;)


Значит ты лучше понимаешь программирование, чем я, хотя и отличник :(

_________________
Появился новый вид "галерных рабов": сидят сверху, гребут к себе


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 19:01 
Офлайн
Місцевий
Місцевий
Аватар користувача

З нами з: 24 Жовтня, 2007 10:39
Повідомлення: 182
Звідки: РПЗ
Репутація: 34
Зафіксив баг + форма з'являється в центрі екрану і переміщується.
Воно ще хоч актуально?:)


У вас недостатньо прав для перегляду приєднаних до цього повідомлення файлів.


Догори
 Профіль  
 
 Тема повідомлення:
ПовідомленняДодано: 10 Листопада, 2009 20:21 
Офлайн
Ветеран
Ветеран
Аватар користувача

З нами з: 07 Листопада, 2008 22:37
Повідомлення: 718
Репутація: 53
Да, актуально! Огромное спасибо :handclasp:

_________________
Появился новый вид "галерных рабов": сидят сверху, гребут к себе


Догори
 Профіль  
 
Показувати повідомлення за:  Сортувати за  
Створити нову тему Відповісти  [ 13 повідомлень ] 

Часовий пояс UTC + 2 годин [ DST ]


Хто зараз онлайн

Зараз переглядають цей форум: Немає зареєстрованих користувачів і 1 гість


Ви не можете створювати нові теми у цьому форумі
Ви не можете відповідати на теми у цьому форумі
Ви не можете редагувати ваші повідомлення у цьому форумі
Ви не можете видаляти ваші повідомлення у цьому форумі
Ви не можете додавати файли у цьому форумі

Вперед:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Український переклад © 2005-2011 Українська підтримка phpBB
*Мобільна версія