BlitzBasic3D und Windows Event System ?
Übersicht

![]() |
tftBetreff: BlitzBasic3D und Windows Event System ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 !!!!!! |
![]() |
Xaymarehemals "Cgamer" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group