powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
34 сообщений из 34, показаны все 2 страниц
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075290
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Срочно переписывается гора кода с (извините) Delphi, нужен класс, инкапсулирующий (невидимое) окно Windows.
В наследниках класса может переопределяться оконная процедура, добавляться обработчики сообщений окна.
В Delphi это было сделано с помощью AllocateHWnd (). Эта функция создает невидимое окно, и назначает ему оконную процедуру.
Фокус в том, что процедура - не простая ("статическая"), а метод. Который можно объявить виртуальным/абстрактным и реализовывать в наследниках.
AllocateHWnd() - осторожно, Delphi!
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  TWndMethod = procedure(var Message: TMessage) of object;
...
function AllocateHWnd(Method: TWndMethod): HWND;
var
  TempClass: TWndClass;
  ClassRegistered: Boolean;
begin
  UtilWindowClass.hInstance := HInstance;
{$IFDEF PIC}
  UtilWindowClass.lpfnWndProc := @DefWindowProc;
{$ENDIF}
  ClassRegistered := GetClassInfo(HInstance, UtilWindowClass.lpszClassName,
    TempClass);
  if not ClassRegistered or (TempClass.lpfnWndProc <> @DefWindowProc) then
  begin
    if ClassRegistered then
      Windows.UnregisterClass(UtilWindowClass.lpszClassName, HInstance);
    Windows.RegisterClass(UtilWindowClass);
  end;
  Result := CreateWindowEx(WS_EX_TOOLWINDOW, UtilWindowClass.lpszClassName,
    '', WS_POPUP {+ 0}, 0, 0, 0, 0, 0, 0, HInstance, nil);
  if Assigned(Method) then
    SetWindowLong(Result, GWL_WNDPROC, Longint(MakeObjectInstance(Method)));
end;


За фокус превращения метода класса в статическую функцию отвечает хитрая процедура MakeObjectInstance():
MakeObjectInstance () - тут всё ещё хуже.
Код: pascal
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.
function MakeObjectInstance(Method: TWndMethod): Pointer;
const
  BlockCode: array[1..2] of Byte = (
    $59,       { POP ECX }
    $E9);      { JMP StdWndProc }
  PageSize = 4096;
var
  Block: PInstanceBlock;
  Instance: PObjectInstance;
begin
  if InstFreeList = nil then
  begin
    Block := VirtualAlloc(nil, PageSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    Block^.Next := InstBlockList;
    Move(BlockCode, Block^.Code, SizeOf(BlockCode));
    Block^.WndProcPtr := Pointer(CalcJmpOffset(@Block^.Code[2], @StdWndProc));
    Instance := @Block^.Instances;
    repeat
      Instance^.Code := $E8;  { CALL NEAR PTR Offset }
      Instance^.Offset := CalcJmpOffset(Instance, @Block^.Code);
      Instance^.Next := InstFreeList;
      InstFreeList := Instance;
      Inc(Longint(Instance), SizeOf(TObjectInstance));
    until Longint(Instance) - Longint(Block) >= SizeOf(TInstanceBlock);
    InstBlockList := Block;
  end;
  Result := InstFreeList;
  Instance := InstFreeList;
  InstFreeList := Instance^.Next;
  Instance^.Method := Method;
end;

{ Free an object instance }

procedure FreeObjectInstance(ObjectInstance: Pointer);
begin
  if ObjectInstance <> nil then
  begin
    PObjectInstance(ObjectInstance)^.Next := InstFreeList;
    InstFreeList := ObjectInstance;
  end;
end;



- от интерпретации текста которой я несколько теряюсь. Надо бы позвать программиста, да где же его взять в час ночи?

Вопрос: как из нестатического метода объекта сделать статический? На C++, конечно.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075299
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
как из нестатического метода объекта сделать статический

В общем, сделал без извратов. Оставил процедуру статической.

У метода создания окна CreateWindowEx*() есть параметр LPVOID lpParam , который представляет собой ссылку на особую структуру, которую я не использую. Вместо этого я передаю ссылку на экземпляр объекта.
Далее, при создании окна эта самая оконная процедура вызывается для обработки сообщения WM_CREATE, и это значение доступно в параметре LPARAM оконной процедуры. Привожу ссылку к ссылке на экземпляр класса, и всё.

Дальше, например, вызываю виртуальный метод класса и т.д.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075301
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
У метода создания окна CreateWindowEx*() есть параметр LPVOID lpParam , который представляет собой ссылку на особую структуру, которую я не использую. Вместо этого я передаю ссылку на экземпляр объекта.
Далее, при создании окна эта самая оконная процедура вызывается для обработки сообщения WM_CREATE, и это значение доступно в параметре LPARAM оконной процедуры. Привожу ссылку к ссылке на экземпляр класса, и всё.

Не всё. :(
В следующих (не WM_CREATE) вызовах оконной процедуры значение указателя уже недоступно. Надо его где-то хранить... хранить можно в окне: сохранить - SetWindowLongPtr() с индексом, равным GWL_USERDATA. Считывать GetWindowLongPtr()... вроде всё.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075303
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

непонятно, зачем такое порно было сделано.
нет контекста, почему с разными методами вызывается

а так все просто
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SetWindowLong(Result, GWL_WNDPROC, UsualWndProc<MyWndClass>);


template class<T> LRESULT UsualWndProc(HWND a, UINT b, WPARAM c, LPARAM d)
{
  T temp;
  return temp.WndProc(a, b, c, d);
}


Если конечно, класс меняет состояния и надо их хранить между вызовами, тогда придется temp создавать в глобальной переменной (например списке), как в оригинале.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075306
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl
непонятно, зачем такое порно было сделано.

Древняя VCL.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075308
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl
Если конечно, класс меняет состояния и надо их хранить между вызовами, тогда придется temp создавать в глобальной переменной (например списке), как в оригинале.

Я ссылку в окне (GWL_USERDATA) храню, как выше написал. А оконную процедуру не подменяю, из неё вызываю обычный виртуальный метод класса (сохраненного в окне), вот и всё.

Всем спасибо.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075549
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
...
Всем спасибо.


Ещё вопрос.

Посмотрите, пожалуйста, насколько крив код с точки зрения человека, не испорченного годами Delphi-кодинга.
НапомнюНапомню, что :
ъъъъъ
...
переписывается гора кода с (извините) Delphi, нужен класс, инкапсулирующий (невидимое) окно Windows...


Интерфейс класса: конструктор/деструктор, handle хэндл невидимого окна и метод add_msg().
Метод add_msg() - для добавления обработчика конкретного сообщения windows.

Пример использования. Задача: через 3 секунды показать диалог "Привет!.
Реализация: для экземпляра объекта создаем обработчик события WM_TIMER.
Код: plaintext
1.
2.
3.
4.
5.
6.
	stealth_window sw;
	sw.add_msg(WM_TIMER, [&](UINT msg, WPARAM& w_param, LPARAM& l_param)
	{
    	    KillTimer(sw.handle, 999);
	    MessageBoxA(sw.handle, "Привет! Время пришло", "C++ отладка", MB_OK);
	});


Cоздаем таймер с интервалом 3000 мс.
Код: plaintext
1.
	SetTimer(sw.handle, 999, 3000, nullptr);



Результат:
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075550
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ,

код:
Интерфейс класса stealth_window
Файл stealth_window.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
#pragma once
#include <Windows.h>
#include <map>
#include <functional>

using msg_proc = std::function<void(UINT msg, WPARAM&, LPARAM&)>; // Обработчик события Windows

class stealth_window
{
public:

	stealth_window();
	virtual ~stealth_window();

	void add_msg(UINT msg, msg_proc proc);
	HWND handle = nullptr; // Хэндл невидимого окна

protected:
	virtual void wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
private:
	std::multimap<UINT, msg_proc> msg_procs;
	tagWNDCLASSA uwc{ 0, WndProc,0, 0, 0, 0, 0, 0, 0, "TPUtilWindow" };
	static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
};



Реализация класса stealth_window
Файл stealth_window.cpp
Код: plaintext
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.
#include "stealth_window.h"
stealth_window::stealth_window()
{
	const HMODULE hinstance = GetModuleHandleA(nullptr);
	tagWNDCLASSA tmp_class;
	this->uwc.hInstance = hinstance;
	const auto registered = GetClassInfoA(hinstance, uwc.lpszClassName, &tmp_class);

	if (!registered || (tmp_class.lpfnWndProc != DefWindowProcA)) {
		if (registered)
			UnregisterClassA(uwc.lpszClassName, hinstance);
		RegisterClassA(&uwc);
	}

	handle = CreateWindowExA(WS_EX_TOOLWINDOW, uwc.lpszClassName, "",
		WS_POPUP, 0, 0, 0, 0, 0, 0, hinstance, this);
}


stealth_window::~stealth_window()
{
	if (handle) {
		DestroyWindow(handle);
		handle = nullptr;
	}
}

void stealth_window::add_msg(UINT msg, msg_proc proc)
{
	msg_procs.insert({ msg, std::move(proc) });
}

void stealth_window::wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ // Обработка сообщений. Сообщение с одинаковым кодом может иметь несколько обработчиков. 
	auto& it = msg_procs.lower_bound(msg);
	const auto& upper_bound = msg_procs.upper_bound(msg);
	while (it != upper_bound)
		(it++)->second(msg, wParam, lParam);
}


LRESULT stealth_window::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	stealth_window* realThis;

	if (msg == WM_NCCREATE) // Первое сообщение - при создании окна. В lParam приходит this
	{
		realThis = static_cast<stealth_window*>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);

		SetLastError(0);
		if (!SetWindowLongPtr(hwnd, GWL_USERDATA, reinterpret_cast<LONG_PTR>(realThis)))
			if (GetLastError())
				return FALSE;
	}
	else
		realThis = reinterpret_cast<stealth_window*>(GetWindowLongPtr(hwnd, GWL_USERDATA));

	if (realThis)
		realThis->wnd_proc(hwnd, msg, wParam, lParam);

	return DefWindowProcA(hwnd, msg, wParam, lParam);
}


...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075552
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,
Неиспорченные в дельфи7 для сообщений делали просто TList с адресами подписчиков)
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075554
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,
Какой смысл переписывать 20 летнюю программу с одних буковок на другие не трогая архитектуру и технологии.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075579
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ,

А зачем вам невидимое окно? Для таймеров в невизуальных компонентах? Неужели такая проблема есть и в wxWidgets?
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075587
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav,

таймер - это просто пример.
Это ядро диспетчера обмена сообщениями. Например, между нитями. Или, например, можно попросить ось, чтобы она тебе слала сообщения об изменении состояния группы файлов в конкретном директории. Много чего полезного с его помощью сделано. Наверняка в wxWidgets что-то свое есть. Но, как всегда, времени разбираться нет, трясти надо.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075747
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то моё сообщение удалили без всяких комментариев. Оно культурное было и по делу.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075762
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типа wxEvtHandler
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075780
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov
типа wxEvtHandler

Можно ловить виндосовские мессаги? Нельзя.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075784
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Alex_Ustinov
типа wxEvtHandler

Можно ловить виндосовские мессаги? Нельзя.

QCoreApplication::installNativeEventFilter().
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075790
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav,

я не планирую менять хорошо знакомого уродца, который безответно пашет уже много лет, на слабоизученое (мной) чудовище с непонятными возможностями и перспективой.
И - при чем тут вообще Qt или wxW?
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075791
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
petrav,

я не планирую менять хорошо знакомого уродца, который безответно пашет уже много лет, на слабоизученое (мной) чудовище с непонятными возможностями и перспективой.
И - при чем тут вообще Qt или wxW?

Если я Вам мешаю, то скажите и я замолчу.

Просто я глубоко поражён тем, что Вы решаете проблемы, которые я решал 20-ть лет назад в институте. Вот всё сложилось… и невидимое окно, и как из нестатического метода сделать статический, и свой «унифицированный» обработчик Win сообщений, и вот это вот ::KillTimer(), регистрация своего класса окна. Я даже не сразу вспомнил всё это, но когда вспомнил — прямо пазл сложился.

И всё это на фоне wxWidgets. Ну право слово…
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075793
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav,

можно конкретнее - что именно не так?
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075796
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
petrav,

можно конкретнее - что именно не так?

Всё нормально. Продолжайте работать.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40075804
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
petrav,
я не планирую менять хорошо знакомого уродца, который безответно пашет уже много лет, на слабоизученое (мной) чудовище с непонятными возможностями и перспективой.
И - при чем тут вообще Qt или wxW?
как причем?
Форум публичный. Форум читает много народу.
Зачем им кидатся писать свой менеджер сообщений рукописный?
Только если ТС через слово повторяет - "мопед не мой, проект легаси и ничего менять не могу. Сроки".
А фреймворки и решения приводят не вам а "оглашают" читающим тему.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076007
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ, по моему, кто-то где-то перемудрил.
Невиртуальный метод экземпляра класса, это обычная функция, которая принимает неявный параметр this и зачем приседания с виртуальной памятью - совершенно не понятно. Если у тебя есть массив с регистрацией методов окон, которые надо вызывать из обработчика сообщений - нафига весь этот огород?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
typedef void (*TWndMethod) (TWndClass*, const TMessage&);
std::map<const TWndClass*, TWndMethod*> mapWndClassMethod;
...
// Регистрация
mapWndClassMethod[ inst ] = &TChildOfWndClass::method( const TMessage& );
...
void Handler( TWndClass * inst )
{
  auto it = mapWndClassMethod.find( inst );
  if ( mapWndClassMethod.cend() == it )
    throw -1;  // integrity violation

  it->second( inst );
}
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076014
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, ТС не огласил версию дельфи.
Но в 7ой было так что любая форма окно имела возможность подписки на сообщения от Оси из коробки. Одной строкой.
Имхо менеджер событий ГУИ надо опирать на самой ГУИ.
Невизуальные объекты без окон, надо опирать на свои механизмы.
Универсализм - зло.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076760
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
Кстати, ТС не огласил версию дельфи.
Но в 7ой было так что любая форма окно имела возможность подписки на сообщения от Оси из коробки. Одной строкой.
Имхо менеджер событий ГУИ надо опирать на самой ГУИ.
тут есть одна проблема: когда писалась VCL, WinAPI как-то совсем несовременный был и так эти косяки и остались для совместимости.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076780
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
Siemargl
Если конечно, класс меняет состояния и надо их хранить между вызовами, тогда придется temp создавать в глобальной переменной (например списке), как в оригинале.

Я ссылку в окне (GWL_USERDATA) храню, как выше написал. А оконную процедуру не подменяю, из неё вызываю обычный виртуальный метод класса (сохраненного в окне), вот и всё.

Всем спасибо.
Это работает с базовыми классами окон, но надо помнить, что в общем виде это неправильно.
По правильному, что бы получить смещение для SetWindowLong, нужно к GWL_USERDATA добавить cbWndExtra из структуры WNDCLASSA используемого вами класса окна. Так как cbWndExtra байт зарезервировано под функцию окна.

Так же и в обратку, если ваша функция окна (lpfnWndProc) использует сколько-то байт из структуры окна, то вы должны при создании класса окна указать в cbWndExtra сколько байт использует ваша функция, что бы никто их не подпортил.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076787
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)
По правильному,
Не буду исправлять. Ну кто мне там что-то испортит, кроме меня самого...
Но все равно - спасибо.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076789
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),
На нижнем уровне, может и косяки. А на верхнем прикладном все работало.
Не логично, но так бывает.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076805
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

архитектурные косяки не приводят к тому, что работать не будет. Футболку можно через голову одеть, а можно при определённой сноровке и через опу. Результат будет один, но второй способ сложнее.
Отсутствие дополнительного сквозного параметра в WinProc создало проблему, которую все решали как могли.

Например, мапинг хэндлов в объекты из 22332103 , это явный костыль для обхода этой архитектурой проблемы.
В Борланд сделали ещё более крутой костыль - AllocateHWnd, с динамическим созданием кода.

Потом появился SetWindowSubclass , который отчасти закрывает эту проблему, но, как говорится: "поезд уже ушёл..."
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076809
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

вот скажи, почему про SetWindowSubclass автору никто не подсказал?
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40076876
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
PetroNotC Sharp,

вот скажи, почему про SetWindowSubclass автору никто не подсказал?
мое имхо что счас пишут по другому.
Не случайно на мои топики был первый вопрос - "а зачем тебе?")))
Идем от задачи а не тупой поиск аналога дельфи3 от 1997года.
Как можно дельфи в котором ГЛАВНОЕ ЭТО ГУИ переписывать на плюсы БЕЗ ГУИ?
Мое имхо что архитектура зависит от фреймворка каркаса на 99 проц.
Когда добавим в разговор ГУИ, то и разговора о SetWindowSubclass не будет.
Невозможно переписывать дельфи без ГУИ. (с)
Имхо.
Вот не люблю такие примеры)
авторПример использования. Задача: через 3 секунды показать диалог "Привет!.
Реализация: для экземпляра объекта создаем обработчик события WM_TIMER.
stealth_window sw;
sw.add_msg(WM_TIMER, [&](UINT msg, WPARAM& w_param, LPARAM& l_param)
{
KillTimer(sw.handle, 999);
MessageBoxA(sw.handle, "Привет! Время пришло", "C++ отладка", MB_OK);
});

Cоздаем таймер с интервалом 3000 мс.
SetTimer(sw.handle, 999, 3000, nullptr);
Все имхо
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40077018
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

а моё ИМХО: все просто привыкли к костылям, которые заметили на своих платформах. Более того, считают их единственно правильными.

GUI\не GUI, в данном случае - это лирика, оконные процы и без гуи пашут

"переписать 1 в 1, а потом исправлять на особенности платформы" вполне нормально, иначе у большинства обычно получается только "добавить к текущим багам свои"
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40077027
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)
...
а моё ИМХО: все просто привыкли к костылям, которые заметили на своих платформах. Более того, считают их единственно правильными.

GUI\не GUI, в данном случае - это лирика, оконные процы и без гуи пашут

"переписать 1 в 1, а потом исправлять на особенности платформы" вполне нормально, иначе у большинства обычно получается только "добавить к текущим багам свои"

Насчет "считают единственно правильными" - да ладно. Просто когда-то получилось "именно вот так", и самому понятно, что можно лучше, да время и другие проекты поджимают. И перерабатываешь что-то, когда совсем всё колом встанет.
...
Пример. Мы когда-то обмен служебными данными над XMPP ("jabber") протоколом реализовали: просто, и не нужно тратиться на поддержку собственного сервера (вместо это использовали чужие открытые сервера). Работает, скорость устроила. Для надежности забили в список рабочих серверов аж 10 штук - если один не отвечает - связь через другой. Больше 10 лет проработало, а потом - хлоп! - и встало. Оказывается, jabber - сервера потихоньку, один за другим добавили капчу при идентификации и ssl, а мы и не знали. Последним держался какой-то сервер из Японии, но и он добавил... В общем, пришлось чинить. В итоге, менять ничего не стали, а подняли собственный jabber - сервер, который без ssl, и капчу не требует. Конечно, переделаем, но - потом, когда все остальные дела завершим... :)
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40077028
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),
Как ГУИ лирика, если код для
авторЗадача: через 3 секунды показать диалог "Привет!.
Будет совершенно разный.
В одном случае футболка будет надета через жопу))
И в шарпе и в жаве и.... пишется в ТЗ - при решении задачи использовать ххххх.
Представь, если ты взял легаси код на Си с pointer и переписываешь его в век когда есть умные указатели, шаблоны и вектор.
Говнокод и велосипед будет.
Он не сокет сервер переписывает а имхо формошлепный дельфи.
...
Рейтинг: 0 / 0
Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
    #40077030
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),
Если говорить об архитектуре, то нужна более реальная задачка о применении менеджера событий приложения в бою.
Без примера трудно).
В Qt все на сигналах.
К тому же в плюсах нет строгого деления как в жаве на бэк и фронт. Чтобы плевать на ГУИ.
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как из нестатического метода объекта сделать статический, или аналог AllocateHWnd()...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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