BlitzBasic3D und Windows Event System ?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

tft

Betreff: BlitzBasic3D und Windows Event System ?

BeitragSa, Mai 07, 2016 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

nach längerer Zeit bin ich auch mal wider hier. Und habe eine Frage an die Cracks unter euch.
Ich Programmiere gerade einen Simulator für Relais Steuerungen (PureBasic). Das Kern Konzept sieht vor das
die zu Simulierenden Maschinen die Signale über das Windows Event System bekommen. So kann ich die zu Simulierenden Maschine als separate Exe behandeln und somit auch verschiedene Sprachen verwenden um Software für die Simulation zu schreiben. Ich möchte jetzt die 3D Fähigkeiten vom BB3D nutzen um Maschine nachzubauen und über das Event System zu steuern. Ich könnte die BB3D SDK verwenden, aber PB zickt da ein wenig rum, GLBasic ist mir zu ... na ich weis nicht. Hab halt viele Jahre mit BB3D gearbeitet.

Ich denke das dies über die USER oder KERNAL Dll gehen sollte. Aber ich habe keinen Plan wie. Twisted Evil
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Xaymar

ehemals "Cgamer"

BeitragSa, Mai 07, 2016 20:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht genau ob du Nachrichten senden oder empfangen willst, das war mir hier bei deiner Frage nun nicht klar. Aber beides sollte möglich sein, das empfangen dieser Events braucht halt einen Wrapper, das senden wahrscheinlich auch.

In BlitzUtiltiy hab ich z.B. folgenden Wrapper code für den WindowMessageHandler drin:
Code: [AUSKLAPPEN]
//   BlitzUtility - Expanding the normal Blitz functionality.
//   Copyright (C) 2015 Xaymar (Michael Fabian Dirks)
//
//   This program is free software: you can redistribute it and/or modify
//   it under the terms of the GNU Lesser General Public License as
//   published by the Free Software Foundation, either version 3 of the
//   License, or (at your option) any later version.
//
//   This program is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU General Public License for more details.
//
//   You should have received a copy of the GNU Lesser General Public License
//   along with this program.  If not, see <http://www.gnu.org/licenses/>.

#pragma once
#include "WindowMessageHandler.h"

std::list<WindowUserData>* WindowMessageHandler_List;

void BU_WindowMessageHandler_OnProcessAttach() {
   WindowMessageHandler_List = new std::list<WindowUserData>();
}

void BU_WindowMessageHandler_OnProcessDetach() {
   for (auto iterator = WindowMessageHandler_List->begin(), end = WindowMessageHandler_List->end(); iterator != end; iterator++) {
      BU_WindowMessageHandler_Uninstall(iterator->hwnd);
   }

   WindowMessageHandler_List->clear();
   delete WindowMessageHandler_List;
}

LRESULT CALLBACK BU_WindowMessageHandler_Procedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
   WindowUserData* UserData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA);
   if (UserData) {
      switch (uMsg) {
         case WM_SIZE:
            UserData->WindowWasResized = true;
            UserData->WindowClientWidth = lParam & 0xFFFF;
            UserData->WindowClientHeight = lParam & 0xFFFF0000 >> 16;

            return CallWindowProc(UserData->oWindowProcedure, hwnd, uMsg, wParam, lParam);
            break;
         
         case WM_CLOSE:
            UserData->DestroyCount++;
            return false;

         case WM_DESTROY:
            UserData->CloseCount++;
            return false;

         default:
            return CallWindowProc(UserData->oWindowProcedure, hwnd, uMsg, wParam, lParam);
      }
   } else {
      return DefWindowProc(hwnd, uMsg, wParam, lParam);
   }
}

DLL_FUNCTION(void) BU_WindowMessageHandler_Install(HWND hwnd)
{
   WindowUserData* UserData = new WindowUserData;
   ZeroMemory(UserData, sizeof(UserData));
   UserData->oWindowProcedure = (WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG)&BU_WindowMessageHandler_Procedure);
   UserData->oUserData = SetWindowLong(hwnd, GWL_USERDATA, (LONG)UserData);
}

DLL_FUNCTION(void) BU_WindowMessageHandler_Uninstall(HWND hwnd)
{
   WindowUserData* UserData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA);
   if (UserData) {
      SetWindowLong(hwnd, GWL_USERDATA, UserData->oUserData);
      SetWindowLong(hwnd, GWL_WNDPROC, (LONG)(UserData->oWindowProcedure));
      delete UserData;
   }
}

DLL_FUNCTION(uint32_t) BU_WindowMessageHandler_Message_Resize(HWND hwnd, LPPOINT point)
{
   WindowUserData* UserData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA);
   if (UserData) {
      int toReturn = UserData->WindowWasResized;
      point->x = UserData->WindowClientWidth;
      point->y = UserData->WindowClientHeight;
      UserData->WindowWasResized = false;
      return toReturn;
   }
   return FALSE;
}

DLL_FUNCTION(uint32_t) BU_WindowMessageHandler_Message_Destroy(HWND hwnd)
{
   WindowUserData* UserData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA);
   if (UserData) {
      int toReturn = UserData->DestroyCount;
      UserData->DestroyCount = 0;
      return toReturn;
   }
   return 0;
}

DLL_FUNCTION(uint32_t) BU_WindowMessageHandler_Message_Close(HWND hwnd)
{
   if (hwnd) {
      WindowUserData* UserData = (WindowUserData*)GetWindowLong(hwnd, GWL_USERDATA);
      if (UserData) {
         int toReturn = UserData->CloseCount;
         UserData->CloseCount = 0;
         return toReturn;
      }
   }
   return 0;
}


Technisch gesehen kann man das ganze dank BlitzPointer nun auch direkt in Blitz schreiben, aber ich trau dem Sibly-kram da nicht so ganz mit.

tft

BeitragSo, Mai 08, 2016 14:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ,

danke für die fixe Antwort. Ja das sieht schon nicht schlecht aus ........ Aber das beispiel ist in C ?

ich brauche das zum registrieren eine eigenen Massage MyMessage.l = RegisterWindowMessage_("RelaisSim")
und dann natürlich einen CallBack Funktion die darauf reagiert . Dürfte nicht ganz einfach werden. Vorallem das mit dem CallBack.

Wenn natürlich jemand da schon ne Idee hat..... ich bin ganz Ohr.

Gruss TFT
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Xaymar

ehemals "Cgamer"

BeitragSo, Mai 08, 2016 15:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Du wirst um die verwendung von C nicht drumrumkommen - gerade bei dem Callback, denn Blitz hat keine Funktionszeiger. Du kannst dir mit BlitzPointer zum Beispiel sowas schreiben:
Code: [AUSKLAPPEN]
Global WindowMessageHandler_p = 0
Global OriginalWindowProcedure = 0
Function WindowMessageHandler(hwnd, uMsg, wParam, lParam)
    If WindowMessageHandler_p = 0 Then
         WindowMessageHandler_p = BP_GetFunctionPointer()
    EndIf
   
    Select uMsg ; Nachrichten Typ hier, WM_USER bis 0x7FFF möglich. RegisterWindowMessage liefert den wert der hier abgefragt werden muss
        Default
            BP_CallFunctionVIIII(OriginalWindowProcedure, hwnd, uMsg, wParam, lParam)
    End Select
End Function:WindowMessageHandler(0,0,0,0)

OriginalWindowProcedure = SetWindowLong(SystemProperty("AppHwnd"), GWL_WNDPROC, WindowMessageHandler_p );


Das ganze steht auch in C++ in der msdn für die Befehle.

Edit: BlitzPointer findest du hier: http://github.com/Xaymar/BlitzPointer (und hier vorkompiliert herunterladen: https://github.com/Xaymar/Blit...ses/tag/r2)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group