MFC Feature Pack: Persistenz ohne Verwendung der Registry

Die neuen (Fenster-) Klassen der MFC, die zum MFC Feature Pack gehören, bieten von Haus aus die Möglichkeit, die aktuellen Zustände der Fenster einer Anwendung (Größe, Position etc.) nach dem Beenden eines Programms in die Registry zu schreiben. Wird die Anwendung zu einem späteren Zeitpunkt wieder gestartet, dann können die alten Fensterzustände mit diesen Registry-Einträgen wiederhergestellt werden. Was aber tun, wenn die Registry hierfür nicht verwendet werden soll?

In den Methoden

  BOOL LoadState(LPCTSTR lpszProfileName, int nIndex, UINT uiID);
  BOOL SaveState(LPCTSTR lpszProfileName, int nIndex, UINT uiID);

der Klasse CBasePane nimmt die Serialisierung der Zustände ihren Lauf. Dabei ist ein Objekt vom Typ CSettingsStore für das Speichern der Daten (in die Registry) verantwortlich:

  CSettingsStoreSP regSP;
  CSettingsStore& reg = regSP.Create(FALSE, FALSE);

Wie das genau funktioniert, kann man an den (virtuellen) Read- und Write-Methoden der Klasse CSettingsStore (vgl. afxsettingsstore.h) sehen. Das Framework gestattet es aber auch, über ein CRuntimeClass-Objekt eigene CSettingsStore-Objekte zu verwenden. Definiert man sich also eine von CSettingsStore abgeleitete Klasse (z.B. CMySettingsStore), dann kann man die Kontrolle über das Speichern der Daten (z.B. in Dateien) übernehmen, indem man die Read- und Write-Methoden entsprechend überschreibt. Voraussetzung ist, dass die eigene Klasse zuvor noch mit

  CSettingsStoreSP::SetRuntimeClass( RUNTIME_CLASS( CMySettingsSore ) );

angemeldet wird.

Veröffentlicht unter MFC | Hinterlasse einen Kommentar

INTERGEO 2011 in Nürnberg

Vom 27.09. bis zum 29.09.2011 findet die INTERGEO (Kongress und Fachmesse für Geodäsie, Geoinformation und Landmanagement) im Messezentrum Nürnberg statt.

Veröffentlicht unter GIS | Hinterlasse einen Kommentar

GoingNative

Im Juli ging auf Channel 9 im MSDN GoingNative online. Schwerpunkt der hier veröffentlichten Videos ist die native Softwareentwicklung mit c/c++. Die erste Ausgabe trägt den Titel GoingNative 0: Help us fly this plane, Some modern C++, Meet Ale Contenti:

Veröffentlicht unter c++ | Hinterlasse einen Kommentar

Previewing ‘Windows 8’

Link: Previewing ‘Windows 8’: Article by Julie Larson-Green, corporate vice president, Windows Experience.

Veröffentlicht unter Betriebssysteme | Hinterlasse einen Kommentar

Visual Studio: Externe Tools

Mit der Funktion „Externe Tools“ im Menü „Extras“ kann man die Entwicklungsumgebung mit externen System recht elegant verknüpfen. Setzt man beispielsweise ein webbasiertes Bug-Tracking-System (wie z.B. BugTracker.Net) ein, dann könnte die Verknüpfung folgendermaßen hergestellt werden. Zuerst öffnet man mit dem Befehl “Externe Tools” im Menü “Extras” den gleichnamigen Dialog:

Betätigt man nun die Schaltfläche “Hinzufügen”, so ist es möglich ein neues externes Tool anzulegen. In diesem konkreten Fall geben wir mal

  • Befehl: C:\Program Files\Internet Explorer\iexplore.exe.
  • Argumente: http://webtrack/edit_bug.aspx?id=$(CurText). Hierbei steht $(CurText) für den aktuell im Editor des Visual Studios markierten Text.

ein und schließen den Dialog wieder. Wenn man Änderungen und Neuerungen im Quellcode nun immer mit der entsprechenden Bug-ID kennzeichnet, dann kann man zukünftig, durch einfaches markieren der Bug-ID und anschließendem Aufruf des externen Tools direkt zur ausführlichen Beschreibung des Bugs im Bug-Tracking-System springen. Auf ähnliche Art und Weise können dann auch Dokumentationssysteme oder Wikis verknüpft werden.

Um das Ganze noch etwas komfortabler zu machen, können wir noch eine eigene Toolbar (und ein Tastenkürzel) für den Schnellzugriff auf unser neues Externes Tool einrichten. Dazu ruft man zuerst im Menü “Extras” den Befehl “Anpassen…” auf. Es öffnet sich ein Dialog, der über zwei Reiter verfügt. Unter dem reiter “Symbolleisten” richten wir eine neue Symbolleiste ein, die wir mal mit “Meine Tools” bezeichnen:

Anschließend wechseln wir auf den Reiter “Befehle” und wählen dort die soeben angelegte Symbolleiste “Meine Tools” aus. Mit der Schaltfläche “Befehl hinzufügen” fügen wir dann das Externe Tool mit der Nummer 7 hinzu, das in diesem Fall dem zuvor angelegten Aufruf des Bug-Tracking-Systems entspricht:

Wenn man nun alles richtig gemacht hat, dann erscheint im Visual Studio die neu angelegte Symbolleiste mit einer Schaltfläche.

Veröffentlicht unter Visual Studio | Hinterlasse einen Kommentar

Mohsen Agsen – C++ Today and Tomorrow

Link: Mohsen Agsen – C++ Today and Tomorrow.

Veröffentlicht unter c++ | Hinterlasse einen Kommentar

MFC Feature Pack: Über die Einträge eines Menüs iterieren

Sowohl in Kontextmenüs (CMFCPopupMenu) als auch in “normalen Menüs” (CMFCMenuBar) gibt es für jeden Menüeintrag ein Objekt vom Typ CMFCToolBarMenuButton. Handelt es sich bei einem Menüeintrag um ein Untermenü (Submenü), dann kann man über die Methode

  const CObList& CMFCToolBarMenuButton::GetCommands() const;

auf die Menüeinträge des Untermenüs zugreifen. Mit dieser Information lässt sich dann recht einfach eine rekursive Funktion implementieren, die ab einem gegebenen Menüpunkt alle untergeordneten Menüpunkte systematisch durchläuft, z.B.:

	void IterateMenu( CMFCToolBarMenuButton* pButton )
	{
		if( pButton )
		{
			// Irgendetwas mit diesem Menüeintrag anstellen:
			pButton-> ...

			// Hat der Menüpunkt ein Untermenü?
			const CObList& lCmds = pButton->GetCommands();
			for( POSITION pos = lCmds.GetHeadPosition(); pos != NULL; )
			{
				IterateMenu( (CMFCToolBarMenuButton*) lCmds.GetNext( pos ) );
			}
		}
	}

Leider besitzen die beiden genannten Menüklassen keine gemeinsame Basisklasse, die ein einheitliches Iterieren über alle Elemente der ersten Ebene ermöglichen könnte. Allerdings ist diese Funktionalität durchaus an beiden Klassen vorhanden.

Für ein CMFCPopupMenu-Kontextmenü könnte diese Funktion dann folgendermaßen eingesetzt werden:

	CMFCPopupMenu* pMenu = ...
	for( int i = 0; i < pMFCPopupMenu->GetMenuItemCount(); i++ )
	{
		IterateMenu( (CMFCToolBarMenuButton*) pMenu->GetMenuItem( i ) );
	}

Im Fall eines Menüs vom Typ CMFCMenuBar könnte das dagegen so aussehen:

	CMFCMenuBar* pMenu = ...
	for( int i = 0; i < pMenu->GetCount(); i++ )
	{
		IterateMenu( (CMFCToolBarMenuButton*) pMenu->GetButton( i ) );
	}
Veröffentlicht unter MFC | Hinterlasse einen Kommentar

GULP IT-Projektmarktindex

Der GULP IT-Projektmarktindex misst seit 1998 kontinuierlich die über den GULP Server zugestellten Projektangebote. Der daraus gewonnene Index ist ein idealer Gradmesser für die Angebots- und Nachfragesituation am IT-Projektmarkt.

Link: GULP IT-Projektmarktindex: Der Gradmesser für die Angebots- und Nachfragesituation am IT.

Veröffentlicht unter Projektmanagement | Hinterlasse einen Kommentar