{{notification.text}}

MirGames

renych

Москва
Зарегистрирован 12.03.07 17:28
Последний раз был в сети 18.01.15 12:25
Вызов MessageBox для окна, созданного в DLL.
20.05.14 04:48

Методом "тыка" установил, что во всём виновата директива компилятору - {$R *.res}.
Если её убрать, MessageBox работает как и должен.
В самом файле ресурсов стандартная дельфийская иконка и манифест.
Собственно проблема решена, но в целях любопытства - кто знает, как файл ресурсов влияет на вывод MessageBox?

Вызов MessageBox для окна, созданного в DLL.
19.05.14 11:01

Всем привет.
Есть библиотека DLL, в которой я создаю форму и описываю оконную процедуру.
Проблема в вызове функции MessageBox. Сам диалог не появляется, но стандартный звук windows при этом проигрывается.
Сама форма при этом не блокируется и не теряет фокус. Окна с сообщением не наблюдается ни над формой, ни под формой, ни на панели задач, нигде.

Создаю окно так:

// Пытался подсунуть и хэндл библиотеки и хэндл вызывающего приложения. В отладчике вижу, что каждый раз значение разное
h_Instance := GetModuleHandle( 'Window.dll' ); // настоящая dll
//h_Instance := GetModuleHandle( 'API.exe' );  // вызывающий exe`шник

// настраиваю класс окна. пробовал разные комбинации стилей
WindowClass.style            := CS_HREDRAW or CS_VREDRAW {or CS_OWNDC};
WindowClass.lpfnWndProc      := @WindowProc;
WindowClass.hInstance        := h_Instance;
WindowClass.hCursor          := LoadCursor( 0, IDC_ARROW );
WindowClass.lpszClassName    := PChar( DEFAULT_CLASS_NAME );  // некая строковая константа
WindowClass.cbClsExtra       := 0;
WindowClass.cbWndExtra       := 0;
WindowClass.hIcon            := LoadIcon ( 0, IDI_APPLICATION );
WindowClass.hbrBackground    := GetStockObject( WHITE_BRUSH );
WindowClass.lpszMenuName     := '';

// регистрирую класс
RegisterClass( WindowClass );

// наборы констант  для CreateWindowEx
    dwStyle   :=  WS_OVERLAPPEDWINDOW {or
                  WS_CLIPCHILDREN or
                  WS_CLIPSIBLINGS};
    dwExStyle :=  {WS_EX_APPWINDOW or}
                  WS_EX_WINDOWEDGE;

// создаю окно
Handle := CreateWindowEx(
  dwExStyle,
  PChar( DEFAULT_CLASS_NAME ),  // некая строковая константа
  PChar( DEFAULT_CLASS_NAME ) ,
  dwStyle,
  0,
  0,
  wWidth,
  wHeight,
  0,
  0,
  h_Instance,  // это всё тот же Instance, так ведь?
  nil );

Окно создаётся, ошибок нет.
Далее описываю оконную процедуру

//процедура обработки сообщений windows
function WindowProc ( WinHndl : HWND; WinMsg: UINT; WParam : WPARAM; LParam : LPARAM ) : LRESULT; stdcall;
  begin

    case WinMsg of
                         // например обрабатываю левый клик
      WM_LBUTTONDOWN: begin
                        // здесь Handle который я получил выше при создании окна
                        MessageBox( Handle, PWideChar( 'Message' ), PWideChar( 'Caption' ), 0 );  
                        // или пробовал так, "общее" окно
                        //MessageBox( 0, PWideChar( 'Message' ), PWideChar( 'Caption' ), 0 );
                      end;
    end;

    //вызываю дефолтный обработчик
    Result := DefWindowProc( WinHndl, WinMsg, WParam, LParam );

  end;

Вызывал функцию MessageBox и в основном приложении и в DLL - результат один - звук появляется, самого окна-сообщения нигде нет.
Моё окно не блокируется, даёт себя таскать и сворачивать.
Сама функция MessageBox всегда возвращает 0, GetLastError() возвращает 0. MSDN говорит, что:
[Quote]If the function fails, the return value is zero. To get extended error information, call GetLastError.[/Quote]

Или я неправильно создаю окно (неправильный h_Instance или стили), или я не обрабатываю какое-то нужное сообщение windows или что ещё может быть? Помогите! )

Матрица Проекции
16.11.10 15:59
Спасибо, так работает.
А где бы почитать, почему именно так надо делать, а мой вариант неверный?
Хотелось бы понять, а не просто скопипастить :)
Матрица Проекции
16.11.10 06:00
Подскажите, почему две функции визуально дают разный результат?

Код


type
   TMatrix = array [1..16] of Single;

procedure TForm1.Button1Click(Sender: TObject);
  begin

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective(60, 800/600, 1 , 1000);

  end;


procedure TForm1.Button2Click(Sender: TObject);
  var
    M: TMatrix;
  begin

    M := GetPerspProjMatrix(60, 800/600, 1, 1000);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glLoadMatrixf(@M);

  end;



Вот функция, которая создаёт матрицу проекции:
Пример брал отсюда

Код


function GetPerspProjMatrix(Fov, Aspect, zNear, zFar: Single): TMatrix;
  var
    F: Single;
    tmp1,
    tmp2: Single;
  begin

  
    //F := 1 / Tan(Fov * PI_OVER_360);    //FOV градусы
    F := Cotan( DegToRad (Fov / 2));      //FOV радианы


    tmp1 :=   (zFar + zNear) / (zNear - zFar);
    tmp2 := 2 * zFar * zNear / (zNear - zFar);

    
    
    Result[01] := F / Aspect;
    Result[02] := 0;
    Result[03] := 0;
    Result[04] := 0;
    
    Result[05] := 0;
    Result[06] := F;
    Result[07] := 0;
    Result[08] := 0;
    
    Result[09] := 0;
    Result[10] := 0;
    Result[11] := tmp1;
    Result[12] := tmp2;
    
    Result[13] := 0;
    Result[14] := 0;
    Result[15] := -1;
    Result[16] := 0;
    
  end;



Пошаговая Стратегия?
21.11.09 03:38
Цитата
как лучше организовать цикл?


Вот цикл, оптимизированный для пошаговых стратегий: :)

Код

assume cs:prg,ss:prg,es:prg,ds:prg
org 100h
start: jmp go
go:
mov ax, 0600h
mov bh,07
mov cx, FF77h
mov dx,184fh
mov cx, FFFFh
Zero:
mov ah,02
mov dl,30h
int 21h
loop Zero
ret
prg ends
end start

Glulookat
21.11.09 02:46
Pierre Kurochkin, а как это решает проблему? ))

Цитата
Этот Ваш Up - векторное произведение между напаравлением взгляда, и вектором left


Было бы странно, если векторные произведения векторов не давали бы перпендикуляр к первым двум :D
Glulookat
21.11.09 02:24
В описании к gluLookAt сказано:

Цитата
The UP vector must not be parallel to the line of sight from the eye point to the reference point.


Другими словами я не могу направить камеру параллельно оси Y используя
в качестве последнего параметра 0,1,0
что собственно и подтвердилось на практике.

Какое может быть решение?
Отказаться от использования этой функции, или возможно расчитать другие
параметры , которые бы дали идентичный ракурс?
Как Вычислить Поворот Зная Вектор И Угол?
17.11.09 18:30
Обнажаются существенные пробелы в знаниях. :blush:

Цитата
Euler = Vector * Angle


Беру вектор V[x,y,z] и угол a
Получаю поворот для каждой из осей:
Rx = Vx * a
Ry = Vy * a
Rz = Vz * a

Далее как я ни пробовал крутить объект по этим углам исходного положения не добился.

Пока, что бы понять сам принцип я рисую в Максе кубик. Вращаю его произвольно и получаю значение Вектор/Угол. За тем пытаюсь получить из данных Вектор/Угол углы Эйлера, чтобы повернув в соответствии с ними кубик получить его исходное положение.
Как Вычислить Поворот Зная Вектор И Угол?
17.11.09 03:53
Столкнулся с задачей выгрузки геометрии из 3DMax.
Распарсил ASE файл.
Вершины и грани нарисовал без проблем, а вот потом столкнулся с непонятками.
Хочу повернуть модель как она была в максе. Файл ASE говорит мне:

Код

*TM_ROTAXIS 0.0000    0.0000    0.0000
*TM_ROTANGLE 0.0000


Как я понимаю TM_ROTAXIS это вектор оси вокруг которой повёрнут объект, а
TM_ROTANGLE это угол поворота в радианах.

Отсюда два вопроса.

1. Какую вторую точку Max подразумевает для прямой, вокруг которой происходит поворот?
Точку в центре объекта или точку в начале системы координат?

2. Как имея эти сведения узнать насколько мне нужно повернуть свой объект
по осям X, Y, Z чтобы получить такое же положение в пространстве (поворот)?
Resident Evil
03.11.09 22:25
Спасибо, буду пробовать.

Цитата
В RE не используются какие-либо слои и т.п., всё задаётся картой цвета и глубины


Это скрины из Resident Evil Zero. Это много поздний игродел.
А я имел вииду классику. Части 1-3. Там перекрывающие объекты были реализованы именно наложением спрайтов или кусков бэкграунда.
Resident Evil
03.11.09 19:59
Да, от изврата с glDrawPixels я отказался сразу же, после того как его попробовал.

Цитата
На PC это делается простым рендером в текстуру через шейдер.


Подскажите в каком направлении копать и что почитать.
В контексте OpenGL разумеется. Спасибо :)
Resident Evil
03.11.09 04:54
Да. Всё в точности именно так. По мимо цвета используется и рендер Z-буфера.
С этим и связана основная проблема - не все карточки поддерживают расширение OpenGL BUFFER_REGION, а в особенности Radeon`ы. Оно необходимо для того, чтобы записать сохранённые данные глубины в сцену. По этому на старых радеонах игра отказывается работать. А как это делается в DirectX я вообще не понимаю.

Как это умудрялись делать CAPCOM`овцы в девяностых годах прошлого тысячелетия я ума не приложу.
Кто нибудь может подсказать, чисто гипотетически, каким образом они решили эту задачу?
Resident Evil
03.11.09 03:12
В смысле? Инструкция по запуску игры? ))
А если речь идёт о самом конструкторе, то я его ещё не выкладывал никуда ибо он сырой ещё очень.
Пока лишь я скромно демонстрирую его возможности на примере этой игры )
Resident Evil
02.11.09 20:45
А в RE насколько мне известно не было карты глубины, а перекрывающиеся объекты реализовывались спрайтами. А я храню карту глубины, для каждого бэкграунда, да, если речь идёт о тех моментах, когда например нарисованная на заднике колонна должна перекрывать стоящий "за ней" персонаж.
А если речь идёт о геометрии сцены как таковой, то я использую отдельную карту "проходимости", на которой указываю через какие клетки карты можно проходить, через какие только стрелять и т.п. Причём эта карта трёхмера.
Resident Evil
02.11.09 17:00
Ну по поводу света да. Им я ещё не занимался.
Resident Evil
02.11.09 02:38
Ну во-первых поскольку игра является точной копией Biohazard Prototype то графика и не должны быть лучше или хуже. Хотя я не понимаю, о какой графике идёт речь, если это пре-рендеры.
А во вторых графика меня сейчас мало интересует, ибо я считаю основным свои достижением создание полноценного конструктора игр GDK. Т.е. идея такова, что все арты, логика и любые аспекты игрового мира вынесены за пределы кода. Сейчас в движке нет ни единного байта, что относился бы к той игре что на нём работает. GDK предоставляет полный комплект инструментов для создания подобной игры без программирования принципиально. Другими словами можно взять на собрать на нём например какой нить Alone in the Dark, ничего не перекомпилируя и вообще не запуская IDE :) В редакторах из состава конструктора настраивается всё, начиная от меню и инвентаря и заканчивая поведением монстров и их взаимодействием с игроком.
А графика... Те кто со мной в проекте решили делать на нём именно такую игру. Я не возражаю, ибо мне нравится Resident Evil, и для меня это экспериментальная площадка для тестирования своего GDK ))
В конце концов туда можно напихать высокополигональных моделей.