Zeiger auf Klasse PrivateFontCollection erstellen

Hallo Muepe32,

ich habe jetzt in der Headerdatei, in der ich den Zeiger auf die Klasse "PrivateFontCollection" deklariere, die Include Anweisungen
Code:
#include <GdiPlus.h>
using namespace Gdiplus;
eingefügt.

Die Deklaration funktioniert jetzt. Zumindest erkennt die Intellisense die Klasse.
Code:
extern Gdiplus::PrivateFontCollection *pfc2;
Leider werden jetzt in anderen Methoden Konflikte gemeldet.
Code:
ColorMap ColorConfig::_colors;
error C2872:'ColorMap': Mehrdeutiges Symbol

und
Code:
class BitmapImage : public Image
{
error C2872:'Image': Mehrdeutiges Symbol


Sieht so aus als müsste ich meine Programmstruktur anpassen.

Vielen Dank für den Tipp!

Übrigens, kann ich von dem GDI+ Font auf den der Zeiger 'pfc2' zeigt einen HFONT generieren, bzw. ist eine Konvertierung von GDI+ Font in HFONT überhaupt möglich?

mfG.
fujitsufan
 
Hallo fujitsufan,

C++:
using namespace Gdiplus;

using namespace ist ein absoluter Teufel. Verwendest du das noch in einem Header ist dir die Hölle vorprogrammiert. Damit holst du dir sämtliche Objekte des Namespaces in den Sichtbarkeitsbereich. Ich plädiere schon lange dafür, dass diese Anweisung aus der Sprache entfernt wird und man gezwungen ist entweder den vollen Namen anzugeben oder lokal via using einzelne Elemente gezielt hervor zu heben.

Zu Frage 2:
Du hast die Funktion Gdiplus::Font::GetLogFont und die nicht-GDI+ Funktion CreateFontIndirect erwartet einen Zeiger auf eine LOGFONT, die du von GetLogFont erhälst.

Gruss
Muepe
 
Hallo Muepe32,

das mit dem
using namespace Gdiplus;
besorgt mir ein herbes Durcheinander.
Was soll ich stattdessen machen.

Tut mir leid, dass ich Dir diese Fragen stelle.
Das blöde ist nur, ich war bis jetzt Embedded Programmierer. Jetzt muss ich MS VS Projekte bearbeiten, und das auch gleich mit einem für mich seltsamen Thema. Schriften!

Du weißt so ziemlich alles habe ich den Eindruck.
Ich muss auch noch unter vielen auszuwählenden Schriftfonts sicherstellen, dass die Schriftgrößen, gemessen am 'H' wärend der Laufzeit korrigiert wird.

Das heißt, der Benutzer kann die Schriftgröße in "mm" auswählen.
Diese Auswahl rechne ich an Hand der Monitorauflösung in Pixel um.
Jetzt fehlt mir nur noch die reelle Größe des in der Schrift vorkommenden 'H'.
Weicht dieses 'H' von der geählten Schriftgröße ab, muss ich die FontSize für diese Schrift korrigieren.

Gut, was!?:eek:

Wenn dir das zu viel wird, sag´ es bitte.


mfG.
fujitsufan
 
Hi fujitsufan,

Du benötigst eigentlich using namespace Gdiplus in deinem Fall gar nicht, du hast nämlich den voll qualifizierten Namen angegeben:
C++:
extern Gdiplus::PrivateFontCollection *pfc2;

Mit using namespace Gdiplus könntest du auf das Gdiplus:: verzichten kriegst dann aber natürlich Probleme, wenn du selber Klassen wie Image definieren möchtest, da diese bereits im namespace Gdiplus vorhanden sind. Von daher ist es gut, wenn du den voll qualifizierten Namen immer angibst und grundsätzlich auf using namespace verzichtest.

Deine Aufgabe klingt nach viel Aufwand und nervtötenden Problemen, habe ich recht? :D

Um an die Grösse des 'H' zu kommen könntest du möglicherweise folgende Funktion verwenden:
GetCharacterPlacement und dann einen String übergeben, der lediglich aus "H" besteht.

Gruss
Muepe
 
Hallo Muepe32,

so geht´s den ganzen Tag.

ich schaff´ den Parameter 5 im Funktionsaufruf nicht.
Code:
double dRet = GetCharacterPlacement(hdc, acText, nCount, nMaxExtent, ?, GCP_CLASSIN);
In der Headerdatei:
Code:
typedef struct tagGCP_RESULTS{
  DWORD  lStructSize;
  LPTSTR lpOutString;
  UINT   *lpOrder;
  int    *lpDx;
  int    *lpCaretPos;
  LPSTR  lpClass;
  LPWSTR lpGlyphs;
  UINT   nGlyphs;
  int    nMaxFit;
} GCP_RESULTS, *LPGCP_RESULTS;
In der CPP:
Code:
//test------
	HDC hdc = GetDC(hDlg);
	char acText[MAX_PATH] = {0};
	int nCount = 10;
	int nMaxExtent = 10;
	GCP_RESULTS lpRes, *pRes;
	pRes = &lpRes;

	FillMemory((PVOID) &lpRes, sizeof(lpRes), 0x0);

	double dRet = GetCharacterPlacement(hdc, acText, nCount, nMaxExtent, ?, GCP_CLASSIN);

mfG
fujitsufan
 
Ich würde es einfach mal so versuchen:
C++:
HDC hDc = GetDC(hDlg);
GCP_RESULTS res = { 0 };
DWORD dwRet = GetCharacterPlacement(hDc, "H", 1, 0, &res, 0);
ReleaseDC(hDc);
DWORD height = HIWORD(dwRet);
 
Hallo Muepe32,

sorry, dei Fehlermeldung:
"error C2440: 'Typumwandlung': 'ZeichenWaehlenDialog::GCP_RESULTS' kann nicht in 'LPGCP_RESULTSA' konvertiert werden"
Es muss an der Strukturtypdefinition liegen.
Ich finde aber keine andere Typdefinition von "GCP_RESULTS".

mfG.
fujitsufan
 
Warum definierst du denn die Struktur nochmals? Die gibts bereits. Ausserdem scheinst offenbar nicht die Adresse deiner Variablen zu nehmen, mein Code compiliert bis auf eine kleine Erinnerungslücke bei ReleaseDC ohne Probleme.
 
Hallo Muepe32,

ganz einfach. Weil die in der WinGDI.h gefehlt hat, warum auch immer.
Wie gesagt, ich habe das Projekt so übernommen.
Jetzt habe ich die Strukturdefinition wieder eingefügt.
Code:
typedef struct tagGCP_RESULTSA
    {
    DWORD   lStructSize;
    LPSTR     lpOutString;
    UINT FAR *lpOrder;
    int FAR  *lpDx;
    int FAR  *lpCaretPos;
    LPSTR   lpClass;
    LPWSTR  lpGlyphs;
    UINT    nGlyphs;
    int     nMaxFit;
    } GCP_RESULTSA, FAR* LPGCP_RESULTSA;
Dann meckert auch der Compiler nicht mehr, logisch.

Geht trotzdem nicht.

Der Rückgabewert ist 0, auch die Parameter der "lpResults", alles 0.
Code:
HWND hwndEdit = GetDlgItem(hDlg, IDC_EDIT1);
	HDC hdcEdit = GetDC(hwndEdit);
	char acText[MAX_PATH] = {0};
	int nCount = 1;
	int nMaxExtent = 0;
	GCP_RESULTSA lpResults;

	FillMemory((PVOID) &lpResults, sizeof(lpResults), 0x0);

	double dRet = GetCharacterPlacement(hdcEdit, "H", nCount, nMaxExtent, &lpResults, GCP_CLASSIN);

IDC_EDIT ist ein ganz normales Dialogtextfeld.
hDlg ist der Handle auf den Dialog.

Sollte die Funktion "GetCharacterPlacement(,,,,,);" auf das Textfeld ein 'H' schreiben?
Tut es aber nicht.

Denke ich ganz falsch?

Wenigstens stürzt das Programm nicht gleich ab.

mfG.
fujitsufan
 
Hi,

Schau mal was in der Referenz zu GCP_CLASSIN steht:
Specifies that the lpClass array contains preset classifications for characters. The classifications may be the same as on output. If the particular classification for a character is not known, the corresponding location in the array must be set to zero. for more information about the classifications, see GCP_RESULTS. This is useful only if GetFontLanguageInfo returned the GCP_REORDER flag.

Und nein, geschrieben wird nichts, es wird ein DWORD (kein double!) zurückgegeben, wie das zusammengesetzt ist steht ebenfalls in der Referenz.

Gruss
Muepe
 
Zurück