powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Что такое ООП (объектно-ориентированное программирование)
9 сообщений из 9, страница 1 из 1
Что такое ООП (объектно-ориентированное программирование)
    #40139673
EvgenyKh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое ООП (объектно-ориентированное программирование)

Тут вот какое дело, понимаю, что написаны тысячи, если не миллионы, книг и статей на тему... Сам я безработный разработчик предпенсионного возраста, нахожусь в поиске, и меня, хотя и редко, но приглашают на собеседование, где меня обязательно спросят про "основные принципы ООП", чем всегда ставят меня в тупик, я не знаю, что отвечать на этот вопрос.

Когда-то, лет 30 назад, мне посчастливилось поработать в одном очень продвинутом коллективе известного ВУЗа, и там один из научных руководителей регулярно приходил в бешенстве с конференций, на которых обсуждались видения ООП и подходы к реализациям, потому что его понимание сильно отличалось от коллег-участников конференций с других кафедр. Кстати сказать, он написал java-подобный язык, который вроде до сих пор с успехом используют. Этим воспоминанием я хочу подчеркнуть, что проблема не такая уж и новая, и не такая уж и надуманная.

В современных источниках об ООП-принципах вы непременно найдете тезис об инкапсуляции, наследовании и полиморфизме, тогда как на заре компьютерных наук ни один из разработчиков или компьютерных ученых ничего подобного вам бы не заявил. Наверняка здесь есть какая-то путаница.

Ну, посудите сами, парадигмы процедурного программирования основанные на теореме структурного программирования окончательно сформировались только к началу 70-х годов прошлого века, а первые языки ООП появились еще в начале 60-х годов. Но современное поколение, в основной своей массе, почему-то считает, что ООП - это что-то новое, и к тому же неудачное, и поэтому его надо срочно заменить чем-то типа Питона или на худой конец Скалы итп.

В этой связи встает вопрос: как же компьютерные ученые, разработчики первых языков ООП, представляли себе постановку задачи, и вообще, что это такое ООП?

Идея состояла в том, что мы в реальном мире каким-то образом манипулируем объектами, и пришли к выводу, что все, что мы для этого делаем - мы передаем сообщения объектам, и самое интересное, что нам совершенно все равно, что там дальше происходит с этим сообщением, но мы уверены, что оно будет обработано и нами будет получен результат обработки. Тогда ученые и задумались, как бы нам создать такие языки программирования, чтобы и в виртуальной среде можно было решать задачи используя подобный подход.

Например, когда еще не было электронной почты (многие даже не представляют, что такое было), люди писали письмо другу на бумаге, потом запечатывали его в конверт, писали на конверте адрес получателя и отправителя, потом несли конверт к почтовому ящику, опускали его туда, и ждали результат - либо "доставлено", либо "возврат отправителю". В данном примере мы имеем дело с объектом "почтовый ящик", мы передаем ему сообщение - опускаем письмо, другими словами: вызываем метод Result postBox.send(Letter letter);

Это и есть первый принцип ООП — он так и называется: Message Passing.

Нам абсолютно все равно, какие действия будут совершены после того, как мы опустим письмо в ящик, а их невероятно много: придет почтальон и заберет все письма из ящика, на почте отсортируют, отвезут к правильному самолету и тд, и тп.

Дальше нам бы хотелось, чтобы почтовый ящик был таким, что в него можно было бы опускать письма любого типа: закзаные, открытки, микро бандероли …. типа того.. И мы бы не соверашали дополнительных действий, а просто бросали письмо любого типа в один и тот же ящик и ни о чем не задумывались, не задумывались, как этот ящик будет обрабатывать разные типы. Т.е. на этапе создания почтового ящика мы не знаем какого типа письма будут в него опускать, ящик должен уметь обрабатывать любой тип письма без дополнительных на то уведомлений.

Переходя к программированию мы говорим, что на этапе компиляции тип объекта сообщения нам неизвестен, а узнаем мы этот тип только в рантайме — этот принцип ООП называется Late Binding, а никакой не полиморфизм. А полиморфизм — это всего лишь определенное поведение переменной.

Ну и наконец подходим к главному. В реальной жизни мы и понятия не имеем, как создается и как работает почтовый ящик, мы просто находим уже готовый объект и опускаем туда письмо. Надо сказать, что этот подход довольно долго не удавалось сформулировать и как-то его осмыслить, и только в середине 70-х годов английский компьютерный ученый Майкл Джексон (кстати Java-разработчики обязательно знают библиотеку для JSON-процессинга Jackson – она названа в его честь) описал паттерн, который мы знаем как IoC.

Вот мы и сформулировали три основных принципа ООП:

1. Message Passing

2. Late Binding

3. IoC

А то, о чем все говорят, - это просто приемы проектирования приложений с использованием языков объектно-ориентированного программирования.

Надеюсь, что интервьюеры прочитают этот мой опус и не будут больше задавать этот вопрос.
...
Рейтинг: 0 / 0
Что такое ООП (объектно-ориентированное программирование)
    #40139674
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
со мной соглашаться не обязательно. [:smoking]
EvgenyKh  17.01.2025, 10:21
[игнорируется]
Это и есть первый принцип ООП — он так и называется: Message Passing.
пурга это.

1)
Язык объектно - ориентированный тогда и только тогда, когда в языке есть синтаксическая конструкция наследования. Точка.

2)
Инкапсуляция и полифорфизм никакого отношения к ООП не имеют.
Если шо, это не я, это
КарделлиАбади Теория Объектов
Инкапсуляция и специальный полиморфизм преобразования был еще в фортране4, например.
3)
Таксономическую идею наследования (мощность множества объектов каждого следующего производного класса меньше,
чем мощность базового) - конструкция наследования не может реализовать в принципе.
Как только появляется действие над объектами (метод соответствующий) -- все портится, в частности, изза одновременной ковариантности - контравариантости
таких методов (Карделли и Б.Мейер в своих контрактах это разбирают). А не в частности ее (контракт) можно портить и любыми другими способами
4)
Наследовать можно уменьшая, увеличивая, не изменяя мощность множества объектов производного класса.

5)
"Все портится" == тип производного класса не является производным типом от типа базового класса.
Самый простой пример (проще чем квадраты и прямоугольники анкла Боба) который можно выродить -- это наследование между
полугруппой натуральных чисел - группой целых чисел.
Переопределение сложения: небезопасное наследование в группе целых

6)
Любая функция P, в которую передается объект -- это функция высшего порядка, как как вместе с объектом в P передаются функции.

7)
понятие объекта надо заменить понятием автомата. Это тоже самое, но это математика и имеет понятное определение.

8)
на интервью это рассказыавть не надо, религиозные фанатики не возьмут на работу.
...
Рейтинг: 0 / 0
Что такое ООП (объектно-ориентированное программирование)
    #40139677
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аа.
Без однозначной спецификации класса ( контракта в смысле Б.Мейера) не имеет смысла обсуждение наследования - полиморфизма в принципе.
...
Рейтинг: 0 / 0
Что такое ООП (объектно-ориентированное программирование)
    #40139678
EvgenyKh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz  17.01.2025, 10:53
[игнорируется]
1)
Язык объектно - ориентированный тогда и только тогда, когда в языке есть синтаксическая конструкция наследования. Точка.
Очень сомнительное утверждение, ибо и того и другого можно достичь и в процедурных, и в прототипных языках..
...
Рейтинг: 0 / 0
Что такое ООП (объектно-ориентированное программирование)
    #40139679
EvgenyKh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz  17.01.2025, 10:53
[игнорируется]
7)
понятие объекта надо заменить понятием автомата. Это тоже самое, но это математика и имеет понятное определение.
не уверен. Возможно, объект может быть автоматом - да, а может и не быть, например объект описывающий елемент справочника, и вообще справочник, словарь ...
...
Рейтинг: 0 / 0
Что такое ООП (объектно-ориентированное программирование)
    #40139683
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если про основные принципы объектно ориентированного программирования вопрос задают на собеседовании, то надо отвечать как по учебнику.
Потому что автор лезет в технические подробности.
а на собеседовании люди не очень то понимают это, и надо проверить. знает человек или нет.
...
Рейтинг: 0 / 0
Что такое ООП (объектно-ориентированное программирование)
    #40139692
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgenyKh  17.01.2025, 11:24
[игнорируется]
tchingiz  17.01.2025, 10:53
[игнорируется]
7)
понятие объекта надо заменить понятием автомата. Это тоже самое, но это математика и имеет понятное определение.
не уверен. Возможно, объект может быть автоматом - да, а может и не быть, например объект описывающий елемент справочника, и вообще справочник, словарь ...
справочинк и словарь полностью удовлетворяет определению абстрактного автомата.
Метод получает на вход справочник и айди на выход выдает шонадо. Это функций.
Парнас. Переменная - это автомат
...
Рейтинг: 0 / 0
Что такое ООП (объектно-ориентированное программирование)
    #40139693
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgenyKh  17.01.2025, 10:21
[игнорируется]
Это и есть первый принцип ООП — он так и называется: Message Passing.
Передача сообщений (это просто отложенные вызовы функций) была в виндовсе 3.10 (Петзольд ) на чистом Си.
Она нужна, что бы параллельные процессы (два дочерних окна имеют два разных обработчика, которые работают типа одновременно)
работали вдвоем.
И не для чего больше. Вот в спойлере передача сообщений есть, а ооп - нет:
Спойлер
Код: C
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
// Файл WINDOWS.H содержит определения, макросы, и структуры
// которые используются при написании приложений под Windows.
//#define UNICODE
//#define _UNICODE
#include<iostream>

#include <stdio.h>
#include <windows.h>
//#include <mem.h>
#include "sys.h"
#include "time.h"

//#include <wchar_t.h>
FILE * out= 0;

// прототип оконной процедуры
LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
const uchar *vkName (uint id);

wchar_t szClassWindow[] = L"Каркасное приложение";  /* Имя класса окна */

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
   HWND hWnd;
   MSG lpMsg;
   WNDCLASSEX wcl;

 //  setlocale(LC_ALL,"RUS");

   out = fopen ("./.fa.txt", "w+");
  //mbstowcs   (wchar_t * wcstr, const char    * str, size_t strSz);  // строку в широкие
  //  wcstombs (char    * out,   const wchar_t * str, size_t strSz)
  // sprintf(ss, "%s", "каркасное приложение");
  if (out) {
    time_t sta=time(0);
    char  buf[40];  strcpy (buf, asctime(localtime(&sta)));
    char* pyear = strstr(buf, " 201");
    *(pyear+5)=0;
    char ss [sizeof(szClassWindow)+1];
    //wcstombs(ss, szClassWindow, wcslen(szClassWindow));
    WideCharToMultiByte(CP_ACP,0,szClassWindow, -1, ss, wcslen(szClassWindow), 0,0);
    ss [wcslen(szClassWindow)]=0;

    fprintf(out, "%s -- application '%s' started\n", buf,  ss);
    // 1. Определение класса окна
    wcl.cbSize = sizeof(wcl);  // размер структуры WNDCLASSEX
    // Перерисовать всё окно, если изменён размер по горизонтали или по вертикали
    wcl.style = CS_HREDRAW | CS_VREDRAW;  // CS (Class Style) - стиль класса окна
    wcl.lpfnWndProc = WindowProc;  // адрес оконной процедуры
    wcl.cbClsExtra = 0;    // используется Windows
    wcl.cbWndExtra  = 0;   // используется Windows
    wcl.hInstance = hInst;  // дескриптор данного приложения
    wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);  // загрузка стандартной иконки
    wcl.hCursor = LoadCursor(NULL, IDC_ARROW);  // загрузка стандартного курсора
    //wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);  // заполнение окна белым цветом
    wcl.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);  // заполнение окна белым цветом
    wcl.lpszMenuName = NULL;  // приложение не содержит меню
#ifdef UNICODE
    wcl.lpszClassName = szClassWindow;  // имя класса окна
#else
    wcl.lpszClassName = ss;//szClassWindow;  // имя класса окна
#endif
    wcl.hIconSm = NULL;  // отсутствие маленькой иконки для связи с классом окна

    // 2. Регистрация класса окна
    if (!RegisterClassEx(&wcl))
      return 0; // при неудачной регистрации - выход

    // 3. Создание окна
    // создается окно и  переменной hWnd присваивается дескриптор окна
    hWnd = CreateWindowEx(
      0,    // расширенный стиль окна
#ifdef UNICODE
      szClassWindow,  //имя класса окна
      szClassWindow, // заголовок окна
#else
      ss,//szClassWindow,  //имя класса окна
      ss,//szClassWindow, // заголовок окна
#endif

      WS_OVERLAPPEDWINDOW,        // стиль окна
      /* Заголовок, рамка, позволяющая менять размеры, системное меню, кнопки развёртывания и свёртывания окна  */
      CW_USEDEFAULT,  // х-координата левого верхнего угла окна
      CW_USEDEFAULT,  // y-координата левого верхнего угла окна
      CW_USEDEFAULT,  // ширина окна
      CW_USEDEFAULT,  // высота окна
      NULL,      // дескриптор родительского окна
      NULL,      // дескриптор меню окна
      hInst,    // идентификатор приложения, создавшего окно
      NULL);    // указатель на область данных приложения

    // 4. Отображение окна
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd); // перерисовка окна

    // 5. Запуск цикла обработки сообщений

    while(GetMessage(&lpMsg, NULL, 0, 0)) // получение очередного сообщения из очереди сообщений
    {
      TranslateMessage(&lpMsg);  // трансляция сообщения
      DispatchMessage(&lpMsg);  // диспетчеризация сообщений
    }
    fprintf(out, "application stoped (%d secs of work)\n", time(0)-sta);
    fclose(out);
    return lpMsg.wParam;
  }
  return 0;
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
  int result;
  RECT rc;
  PAINTSTRUCT       ps;            // требуется для BeginPaint
  HDC               hdc; //создаём идентификатор контекста устройства
  static TEXTMETRIC tm;             // структура с параметрами текста
  TWM_CHAR          map;

  int doSome =0;

  static ushort x = 10, y = 10;
  int  xp = 10, yp = 10;
  uchar  buf[20];  memset(buf, 20, 0);
  uchar  buf_[20]; memset(buf_, 20, 0); // для вывода бит

#ifdef UNICODE
  wchar_t  wbuf2[20]; memset(wbuf2, sizeof(wbuf2), 0);// буфер для вывода текста
#else
  uchar  buf2[20]; memset(buf2, 20, 0);// буфер для вывода текста
#endif

  static uchar  but = 0;
#ifdef UNICODE
  static wchar_t  but2 = 0;
#else
#endif
  static uint   butW = 0;

  short move = 1;
  short move2 = 0;

  ushort h = HIWORD(lParam);
  ushort l = LOWORD(lParam);
  ushort hw = HIWORD(wParam);
  ushort lw = LOWORD(wParam);
  ushort *psh = (ushort*) &map;
  const uchar *nm = 0;
  ushort  keyStt = 0;
  ushort  bit = 0;

  switch(uMessage)       //http://msdn.microsoft.com/en-us/library/ms646287%28v=VS.85%29.aspx
  {

  case WM_CREATE:
    // Получаем параметры текущего шрифта.
    hdc = GetDC(hWnd);
    GetTextMetrics(hdc, &tm);

    ReleaseDC(hWnd, hdc);
    break;

  case WM_PAINT:
    fprintf(out, "--- PAINT is here.\n");
    hdc = BeginPaint(hWnd, &ps);
    // Устанавливаем границы прямоугольника, а затем
    // рисуем в нём текст.
 //   SetRect(&rc, x, y, butW, tm.tmHeight);
    if (but) {
#ifdef UNICODE
      wsprintf(wbuf2, L"%c", but2);
      TextOut(hdc, x,y, wbuf2, 1); //Выводим текст на экран
#else
      sprintf((char*)buf2, "%c", but);
      TextOut(hdc, x,y, (char*)buf2, 1); //Выводим текст на экран
#endif

//            DrawText(hdc, (LPSTR)buf2 , 1, &rc, DT_LEFT);
    }

    EndPaint(hWnd, &ps);
    break;

  case WM_CHAR: // нажатие клавиши.

#ifdef UNICODE
    but2 = wParam;
   //
   WideCharToMultiByte(CP_ACP,0,&but2, 1, (char*)&but, 1, 0,0);
#else
    but  = wParam;
#endif

   // but         = wParam;
    fprintf(out, "--- button pressed (WM_CHAR): %d/%c The repeat count: %hd 16-31:%hd\n",
                wParam, but, l, h);
    map= getMap(h);
//                                   31  /30/ 29/28-25/24                        16-23
    fprintf(out,
         "--- bits: '%s': b15-31-now/b14-30-before/p13-29-alt/b8-24-add (%hd/%hd/%hd/%hd), scan-code:%hd/'%c'\n"
                                  ,stoa(h, buf)
                                   ,(ushort)map.p
                                     ,(ushort)map.pb
                                       ,(ushort)map.alt
                                           ,(ushort) map.add
                                             ,(ushort)   map.code
                                              , (uchar) map.code);

    if ( getbit((ushort)GetKeyState(VK_CONTROL),15)) {
       fprintf (out,"    ctrl is pressed\n" );
       but=0;
       break;
    }
    if ( getbit((ushort)GetKeyState(VK_MENU),   15))  fprintf(out, "     alt is pressed\n" );
    if ( getbit((ushort)GetKeyState(VK_SHIFT),  15))  fprintf(out, "     shift is pressed\n" );
//    wsprintf(wbuf2, L"new key: %c", but);

#ifdef UNICODE
    wsprintf(wbuf2, L"new key: %c", but2);
    SetWindowText (hWnd, wbuf2);
#else
    sprintf((char*)buf2, "new key: %c", but);
    SetWindowText (hWnd, (char*)buf2);
#endif

    break;

  case  WM_SYSCHAR : // нажатие клавиши.
    fprintf(out, "--button pressed( WM_SYSCHAR): %d/'%c' %hd %hd\n", wParam, wParam, l, h);
    map= getMap(h);
    fprintf(out,
     "--bits: '%s': b15-31-now/b14-30-before/p13-29-alt/b8-24-add (%hd/%hd/%hd/%hd), scan-code:%hd/'%c'\n"
                                  ,stoa(h, buf)
                                   ,(ushort)map.p
                                     ,(ushort)map.pb
                                       ,(ushort)map.alt
                                           ,(ushort) map.add
                                             ,(ushort)   map.code
                                              , (uchar)    map.code);

    if (getbit((ushort)GetKeyState(VK_MENU), 15)) fprintf(out, "  alt is pressed\n" );
    if (getbit((ushort)GetKeyState(VK_SHIFT),15)) fprintf(out, "  shift is pressed\n" );
    break;

  case WM_SYSKEYUP:
    nm= vkName (wParam);

    fprintf(out, "**WM_SYSKEYUP: %d/%x: '%s' \n", wParam, wParam, nm);
    if ( getbit((ushort)GetKeyState(VK_CONTROL), 15) ) fprintf (out, "  ctrl is pressed\n" );

    GetWindowRect(hWnd, &rc);
    fprintf(out, "**WM_SYSKEYUP: '%s' left/top/right/bottom %d/%d/%d/%d \n",  nm
       , rc.left      , rc.top
       , rc.right  , rc.bottom    );

    hdc = GetDC(hWnd);

    move = 0;
    move2 = 0;

    if (wParam == VK_LEFT)        {    move=-10;  doSome=1;  }
    else if (wParam == VK_RIGHT)  {    move=+10;  doSome=1;   }
    else if (wParam == VK_UP)     {    move2=-10;   doSome=1;  }
    else if (wParam == VK_DOWN)   {    move2=+10;   doSome=1;  }
    if (doSome)  {
      MoveWindow(hWnd
      , rc.left+move
      , rc.top+move2
      , rc.right-rc.left +move
      , rc.bottom-rc.top +move2
      , TRUE
      );
    }

    break;

  case WM_KEYUP:
    nm= vkName (wParam);
    fprintf(out, "**WM_KEYUP: %d/%x: '%s' \n", wParam, wParam, nm);

    map= getMap(h);
//                               31  /30/ 29/28-25/24                        16-23
    fprintf(out, "**bits: '%s': b15-31-now/b14-30-before/b8-24-add (%hd/%hd/%hd), scan-code:%hd/'%c'\n"
                                  ,stoa(h, buf)
                                   ,(ushort)map.p
                                     ,(ushort)map.pb
                                           ,(ushort) map.add
                                             ,(ushort)   map.code
                                              , (uchar)    map.code);

    if ( getbit((ushort)GetKeyState(VK_CONTROL), 15) ) {
      fprintf (out, "  ctrl is pressed\n" );
      move = 10;
    }
    else
      move = 1;

    hdc=GetDC(hWnd); //Получаем контекст рисования
    GetCharWidth32(hdc, but2, but2, (LPINT) &butW);

    SetRect(&rc, x, y, (x+butW), (y+tm.tmHeight));
//    SetRect(&rc, x, y, butW, tm.tmHeight);
    InvalidateRect(hWnd, &rc, TRUE);

    if (wParam == VK_LEFT)            x-=move;
    else if (wParam == VK_RIGHT)      x+=move;
    else if (wParam == VK_UP)         y-=move;
    else if (wParam == VK_DOWN)       y+=move;
    SetRect(&rc, x, y, (x+4*butW), (y+tm.tmHeight));
    InvalidateRect(hWnd, &rc, TRUE);

    fprintf (out, "** new x/y: %hd/%hd\n",   x, y);
    ReleaseDC(hWnd, hdc);
    break;

  case WM_LBUTTONUP:
    fprintf(out, "**WM_LBUTTONUP: %d/%x:  \n", wParam, wParam);
    fprintf(out, "**x coor/y coor: %hd/%hd ", l, h);
    fprintf(out, " h bits/ l bits: '%s'/'%s'\n", stoa(hw, buf), stoa(hw, buf_));

    hdc=GetDC(hWnd); //Получаем контекст рисования
    SetRect(&rc, x, y, (x+4*butW), (y+tm.tmHeight));
    InvalidateRect(hWnd, &rc, TRUE);
    x = l;
    y = h;
    SetRect(&rc, x, y, (x+4*butW), (y+tm.tmHeight));
    InvalidateRect(hWnd, &rc, TRUE);

    ReleaseDC(hWnd, hdc);
    break;

  case WM_CLOSE: // сообщение о завершении программы
    fprintf(out, "**WM_CLOSE: \n");
  //  MessageBeep(MB_ICONQUESTION);
#ifdef UNICODE
    if(IDOK==MessageBox(hWnd,L"точно закрываем?",L"заголовок", MB_OKCANCEL))
      DestroyWindow(hWnd);
#else
    if(IDOK==MessageBox(hWnd,"точно закрываем?","заголовок", MB_OKCANCEL))
      DestroyWindow(hWnd);
#endif

    break;
  case WM_DESTROY: // сообщение о завершении программы
      PostQuitMessage(0); // посылка сообщения WM_QUIT
    break;
  default:
      // все сообщения, которые не обрабатываются в данной оконной функции
      // направляются обратно Windows на обработку по умолчанию
    return DefWindowProc(hWnd, uMessage, wParam, lParam);
  }
  return (0);
}
...
Изменено: 17.01.2025, 17:44 - tchingiz
Рейтинг: 0 / 0
Что такое ООП (объектно-ориентированное программирование)
    #40139694
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрел старик Ромуальдыч на
Код: C
1.
HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam
и аж заколдобился[:smoking]
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Что такое ООП (объектно-ориентированное программирование)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]