String in einem fremden Fenster zeichnen
-
Hallo!
Ich würde gerne wissen, wie ich einen String (am besten noch Font und Farbe wählbar) in einem fremden Fenster reinzeichenn kann? Das Fensterhandle habe ich ...
funktioniert das mit GDI wenn ja muss ich da was includen? Bin recht unerfahren, wäre für jede hilfe Dankbar!
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Also ich habe jetzt ewig rumgefummelt und dabei ist folgendes entstanden (was bei mir noch nicht funktioniert):
#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 ofTextOutA' 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 statusIch 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.dllKann 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
-
#pragma comment(lib,"gdi32.lib")
-
hmm er sagt immernoch:
/cygdrive/c/Users/Alex/AppData/Local/Temp/ccF3oIeI.o:mylib.c.text+0xe6): undefined reference to `_TextOutA@20'
collect2: ld returned 1 exit statusliegt es vielleicht daran, dass ich Vista 64 nutze?
-
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 gern1. 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

-
Sorry aber Dein Vorhaben ist -grob gesagt- nonsense. Schließlich kümmert sich jedes Fenster selbst um seinen Inhalt und aktualisiert sich als Reaktion auf WM_PAINT selbstständig. Davon bekommst Du nix mit. Es ist also Glückssache, ob Dein Text sichtbar ist, oder nicht... .
Trotz alle dem:
lumpeh schrieb:
1. andere Schriftarten / Farben usw verwenden
CreateFont(Ex), SelectObject, DeleteObject für Schriften
SetTextColor für die Textfarbe, SetBkColor bzw. SetBkMode für den Hintergrund.lumpeh schrieb:
2. das "Hello World" auch wieder wegbekommen auf Wunsch. Weil immoment bleibt es einfach da stehen
Selbst wenn ich das Programm beende.InvalidateRect, ggf. UpdateWindow
lumpeh schrieb:
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

Siehe oben. Du könntest das evtl. hooken (Siehe 'Hook' in der MSDN), aber das lohnt...und erst der Overhead...oha
.