Wie kann ich hWnd & den hDC in C#.Net ...


Kwons

Grünschnabel
#1
:(

Wie kann ich hWnd & den hDC in C#.Net abfragen bzw. festlegen ?

-----------------------------------------------------------------------------------------------------------

In Visual Basic 6 sieht es so aus:



Option Explicit

Private Sub Form_Load()

Dim MyhWnd As Long

MyhWnd = Form1.hWnd

End Sub

Private Sub Picture1_Click()

Dim MyhWndOther As Long
Dim MyhDc As Long

MyhWndOther = Picture1.hWnd
MyhDc = Picture1.hDC

End Sub

-----------------------------------------------------------------------------------------------------------

Wer kann mir damit helfen ? Für manche DLL'S benötigt man es, und für die DX 9-Programmierung auch ! ( pressi@kwons.de )
 

broetchen

Erfahrenes Mitglied
#2
hi

Ich weiß zwar net wirklich, was hDC bzw. hWnd is, aber ich denk mal, dass hWnd das Handle ist.

Code:
Form f = new Form();
IntPtr handle = f.Handle;
mfg broetchen
 

Kwons

Grünschnabel
#3
Habe es mal so probiert, funktioniert nicht wirklich :-(

Aber ich Versuche die Frage mal deutlicher zu stellen:

private: System::Void MyButton_Click(System::Object * sender, System::EventArgs * e)
{

PAINTSTRUCT ps;
HDC hDC;
HWND hWnd;

IntPtr handle = Form1::Handle;

hWnd = (HWND) handle.ToInt64();

hDC =BeginPaint (hWnd,&ps);
SetTextColor (hDC, RGB (255,0,255));

TextOut (hDC,50,50,"Hallo",5);
EndPaint (hWnd,&ps);
}


Ich benötige ein Fenster-Handler für die GDI-Aufrufe, jedoch bietet das mit dem Net erstellte Fenster KEIN Fenster-Handler (Wie z.B. VB6 bietet), und der eine Handler von der Form (Falls das so ein Handler ist) ist NICHT kompatibel mit dem Win32-Fester-Handler ! Ich möchte blos ein roter Text über die GDI auf die Form ausgeben mit "Hallo", was mache ich da falsch ? (Möchte später gern die BitBlt-Funktion verwenden für Spiele)
 

Kwons

Grünschnabel
#5
Schön, und wie sieht nun ein Funktionierender Code dazu aus ? Mit der MSDN-Hilfe von Net komme ich nicht zurecht, da Die blos dauernd wohin verweisen, aber nicht wirklich schreiben wie das geht :-(

Zum dem muß ich vermerken, das ich ein C# .Net Anfänger bin und kein Wort Englisch kann.

Ich möchte später mit C# DirectX9 Programme schreiben, und manche DLL's benötigen halt ein Fenster-Handler, z.B. für die Funktion SCARD-Server für mein Chip-Karten-Leser, weiß aber Net wie das hier geht. In Visual Basic V.6.0 kenne ich mich dagen recht gut aus, weil aber alles und jenes für C geschrieben ist, habe ich gedacht umzlernen. Ich bin aber kein Fan von Steinzeit-Programmierung ich arbeite lieber mit Form-Gesalter wie in VB6 deshalb will ich NICHT umbedingt mit Visual Studio C ++ V.6.0 arbeiten !
 

Kwons

Grünschnabel
#7
:offtopic:

Toll, jetzt bin ich so schlau wie vorher :-( Englisch war schon immer meine Schwäche, mit einem guten Buch, auf Deutsch kann ich auch vernüftg arbeiten :) Nicht nur die Leute die aus dem Gymnasium kommen, können programmieren, wenn man Dieses vernüftig auf normal deutsch, und auf normal logig erklärt :-| Wobei ich das programmieren ja ausschlieslich Hobbymähsig mache, NICHT beruflich !

Das Problem bei der Sache ist das der Handler völlig inkompatibel ist mit dem Win32-Handler, und NICHT weiß wie ich Ihn umwandeln kann. ( Un wo ist Dieser Handler von der Form bei der C#.Net bzw. C++ )

(Der compiler gibt blos fehler an, na ja, vieleicht sollte man das Thema wohl Eher nach C++ verschieben)

Jede Englische Information ist für mich ziemlich Nutzlos, da ich diese Nicht verstehen kann, mit dem bißchen Schulenglisch ! (Es gibt viel zu wenig Bücher auf deutsch dazu)
 

broetchen

Erfahrenes Mitglied
#8
moin

Nimm dir ein bisschen Zeit, schnapp dir ein Wörterbuch und geh die englische Hilfe durch. Zu Managed DirectX wirst du auf deutsch im Moment nämlich eher weniger Information finden.

Ein Buch (es ist allerdings auf englisch), das ich dir empfehlen kann, wäre:
Managed DirectX 9 Kick Start
Autor/in: Tom Miller
Verlag: Sams
Seitenzahl: 411
Erscheinungsjahr: 2003
Preis: 27,99 EUR
ISBN: 0672325969


Es ist nicht schwer geschrieben, mit ein bisschen Arbeit müsste es zu knacken sein ;-)

Was den Handler betrifft, so bin ich mir ziemlich sicher, dass das der ist, den DirectX verlangt.

Beispiel
Code:
public class Form1 : System.Windows.Forms.Form
{
	private System.ComponentModel.Container components = null;

	private Device device;

	public Form1()
	{
		InitializeComponent();

		PresentParameters presentParams = new PresentParameters();
		presentParams.Windowed = true;
		presentParams.SwapEffect = SwapEffect.Discard;

		device = new Device(0, DeviceType.Hardware, this.Handle, CreateFlags.SoftwareVertexProcessing, presentParams);

		device.RenderState.Lighting = false;
	}
}
Für dich interessant wäre hier der dritte Parameter im Device-Konstruktor, hier kann man entweder ein Control (meistens wohl das Fenster) oder ein Handle eines Controls.

Ob und wie das Handle mit Win32 kompatibel ist, weiß ich nicht, ist in diesem Fall allerdings auch irgendwie völlig belanglos.

mfg broetchen
 

Norbert Eder

Erfahrenes Mitglied
#9
Tut mir leid, wenn ich das jetzt so offen und ehrlich sage:
An deiner Stelle würd ich mich mal ein paar Stunden hinsetzen und die Grundzüge in Englisch durchnehmen. Englisch ist DIE IT-Sprache. Du wirst da nicht drumrum können. Und bestimmte Dokus/Tutorials/Info gibts nun mal NUR in dieser Sprache. Vor allem, wennst dich über Aktuelles informieren willst, gibt es dazu noch keine Übersetzunge. Für gewisse Dinge gibts auch nach Jahren noch keine.
Vielleicht nimmst mal deine Scheuklappen auf und arbeitest an deinen Grundproblemen -> Englisch. Sonst kannst DirectX gleich schnell wieder vergessen.

Es ist völlig irrelevant ob du das als Hobby betreibst oder für die Arbeit. Wenn du nicht gewillt bist, die Basis zu lernen (Englisch/Grundzüge einer Programmiersprache), dann solltest dir ein anderes Hobby suchen -> Fischen zb.

Alle die dir hier helfen bzw. es zumindest versuchen, setzen sich mit ihren eigenen Problemen und mit denen anderer auseinander. Sie sind gewillt zu lernen und sagen nicht: "Nein, das hilft mir nicht weiter, weil mit Schulenglisch fang ich mit dieser Doku nichts an". Wenn du Schulenglisch kannst, dann sollte es doch ein leichtes sein, dir ein paar Fachvokabeln anzueigenen, um technische Texte zu verstehen -> die sind übrigens bei Gott nicht schwer, da solltest mal was Wirtschaftliches auf Englisch lesen.

Ich will hier auch noch erwähnen, dass du es dir einfacher machst und etwas fürs Leben lernst. Englisch braucht man nicht nur beim Programmieren ...

Wie gesagt, es ist nicht böse gemeint, sondern sollte lediglich zum Nachdenken anregen.
 

Kwons

Grünschnabel
#10
:rolleyes: (Danke)

Würde heute in etwa so aus sehen:
---------------------------------------------

using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class Form1
{
[DllImport("user32", EntryPoint = "GetDC", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]

// Für DC
private static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("user32", EntryPoint = "ReleaseDC", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hdc);
[DllImport("gdi32", EntryPoint = "SetTextColor", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
// Für Text
private static extern int SetTextColor(IntPtr hdc, int crColor);
[DllImport("gdi32", EntryPoint = "TextOutA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int TextOut(IntPtr hdc, int x, int y, string lpString, int nCount);
[DllImport("gdi32", EntryPoint = "SetBkColor", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int SetBkColor(IntPtr hdc, int crColor);



private void MYBUTTON_Click(System.Object sender, System.EventArgs e)
{
//// Variabeln
IntPtr hDC = default(IntPtr);
//// Wichtig! Device Context hohlen
hDC = GetDC(this.Handle);
//// Farbe festlegen
SetTextColor(hDC, Information.RGB(255, 0, 0));
SetBkColor(hDC, Information.RGB(0, 0, 0));
//// Einfacher Text ausgeben
TextOut(hDC, 20, 20, "Hallo", Strings.Len("Hallo"));
//// Wichtig! Device Context wieder freigeben
ReleaseDC(this.Handle, hDC);

}
}


//// Int32 I = this.Handle.ToInt32; ' Würde scheins auch gehen, nicht ... ToInt64


Ich habe dann damals was in Visual Basic .Net gefunden, und habe nun einen Converter von heute, jetzt dazu benutzt. Mittlerweile, kahm dann damals auch auch ein Buch in Visual Basic .Net für DirecktX 9 raus. Noch ne Alternatieve das heutige XNA-Game Studio ... ( Wenn man gerne Shader schreibt )