Einen String irgendwohin (z.B. Desktop) zeichnen

roxX0r

Mitglied
Hallo!
Habe eine simple Frage, wie kann ich mit C++ einen String irgendwohin "zeichen"?
Also ich gebe die absoluten Koordinaten an und es soll an diese Stelle ein String (am besten noch Einstellbar Farbe und Font) gezeichnet werden. Z.B. auch den Windows Desktop oder in andere Fenster (Firefox) z.B.

Welche funktion kann sowas?
Danke für die Hilfe!
 
was mir noch einfällt: Das windowHandle, in welches Fenster es geschrieben wird, hätte ich :)

Jemand einen Tipp für mich ?
 
Also ich habe jetzt ewig rumgefummelt und dabei ist folgendes entstanden (was bei mir noch nicht funktioniert):

Code:
#include <jni.h>
#include "NewJFrame.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment(lib,"gdi32") 

JNIEXPORT jintArray JNICALL Java_NewJFrame_go(JNIEnv *env, jobject obj) 
{   
 
POINT pos;
HWND h;
GetCursorPos(&pos);
h = WindowFromPoint(pos);	  
PAINTSTRUCT ps;
HDC hdc = BeginPaint(h, &ps);
TextOut(h,10,10,"Hello World",11);
EndPaint(h, &ps);

return arr;

}

Beim compilieren sagt er mir folgendes:

mylib.c: In function `Java_NewJFrame_go':
mylib.c:46: warning: passing arg 1 of `TextOutA' from incompatible pointer type
/cygdrive/c/Users/Alex/AppData/Local/Temp/ccdN4FKd.o:mylib.c:(.text+0xf6): undefined reference to `_TextOutA@20'
collect2: ld returned 1 exit status


Ich nutze Cygwin und das ist mein Kommandoaufruf:
gcc -mno-cygwin -IC:\Java\jdk1.6.0_01\include -IC:\Java\jdk1.6.0_01\include\win32 -shared mylib.c -Wl,--add-stdcall-alias -o mylib.dll

Kann es sein dass er die gdi32.lib nicht findet? Wie linke ich die denn "richtig" ?
Ich benutze als Entwicklungsumgebung Notepad... :)

Und stimmt der Code sonst? Ich möchte in einem fremden Fenster, dessen handle ich über ein Mausklick bekomme, einen String schreiben. Dieses Fenster kann (bzw ist) ein Fenster eines anderen Programmes, z.b. firefox oder sonstwas...
Danke vielmals für die hilfe
 
Hallo,

die Funktion "TextOut" erwartet einen Devicekontext (HDC) als ersten Parameter und nicht das Fensterhandle.
Mit "BeginPaint" kannst du hier nicht arbeiten; das benötigt einen speziellen Kontext. Nimm stattdessen "GetDC":
C++:
POINT pos;
HWND h;
GetCursorPos(&pos);
h = WindowFromPoint(pos);     

HDC hdc = GetDC(h);
TextOut(hdc,10,10,"Hello World",11);
ReleaseDC(h, hdc);
Gruß
MCoder
 
danke für die antwort, aber beim compilieren sagt er mir immernoch:

/cygdrive/c/Users/Alex/AppData/Local/Temp/ccF3oIeI.o:mylib.c:(.text+0xe6): undefined reference to `_TextOutA@20'
collect2: ld returned 1 exit status

oben hab ich aber drinstehen:
#pragma comment(lib,"gdi32.lib")

wo muss denn diese Datei drin sein? ich hab mal gesucht, auf meinem Rechner gibts wohl garkeine Datei diesen Namens...
 
wo muss denn diese Datei drin sein? ich hab mal gesucht, auf meinem Rechner gibts wohl garkeine Datei diesen Namens...
Die Datei ist ist normalerweise Bestandteil des Windows Platform SDK. Daher sieht mir das nach einen cygwin-Problem aus. Allerdings kenne ich mich damit überhaupt nicht aus.

Gruß
MCoder
 
Zuletzt bearbeitet:
also das mit dem linken klappt jetzt prima, ich musste -lgdi32 hintendranhängen!
also gcc <blablabla> -lgdi32
So er compiliert und er schreibt auch "HelloWorld" in andere Fenster rein!
Soweit so gut, nur würde ich gern

1. andere Schriftarten / Farben usw verwenden
2. das "Hello World" auch wieder wegbekommen auf Wunsch. Weil immoment bleibt es einfach da stehen :) Selbst wenn ich das Programm beende. Ich habe leider wirklich kaum erfahrung mit c++ und Windows API (GDI) Programmierung. Ich erahne, dass ich irgendwas mit WM_PAINT (Callback Funktion? Aber welche?) schreiben muss und in meine DLL reinstecken muss. Mensch in Java ist das alles viel einfacher :)

Für einen normalen C++ Programmierer ist das wohl alles Hello World Niveau, aber ich finde das alles ehr verwirrend, deshalb bin ich für jede Hilfe dankbar :)
 
Für einen normalen C++ Programmierer ist das wohl alles Hello World Niveau
GDI-Programmierung als solches und und dazu noch in fremden Fenstern ist so trivial nun auch wieder nicht :-)


1. Für die GDI-Objekte, wie etwa Font, Brush, Pen usw., gibt es Create-Funktionen (z.B. CreateFont). Einmal erzeugt müssen sie mit SelectObject ausgewählt werden und stehen dann für die nächste Zeichenoperation zur Verfügung.
Die Textfarbe wird mit SetTextColor festgelegt.

2. Am besten du rufst InvalidateRect mit dem entsprechenden Fenster-Handle auf. Das veranlasst ein Neuzeichnen des Fensters.
Das Problem ist aber eigentlich eher die Kontrolle dieses Prozesses. Aktionen wie Verschieben, Größenänderungen oder Überdeckungen führen ebenfalls zum Neuzeichen und löschen damit (evt. unerwünscht) deine Malereien wieder.
"WM_PAINT" ist hier schon das richtige Stichwort, nur wenn's nicht das eigene Fenster ist, kommt man da sehr viel schwerer ran. Dazu bräuchte man dann einen sog. Message Hook, was die Angelegenheit recht komplex macht.

Gruß
MCoder
 
Zurück