ProgrammierenSoftwareToolsVS 2010VS-Tipps&TricksMartin Richter - Mi 28 Apr 2010 00:50

Microsoft ist es wirklich gelungen in zwei großen Schritten die VisualStudio Online Hilfe bzw. MSDN Integration von einem brauchbaren Tool in VC6, über VS-2003/5/8 wo es gerade auszuhalten war, in VS-2010 zu einem Ding zu verwandeln, bei dem mir fast die Worte fehlen.
Man schmeiße alle Funktionen des Hilfe-Viewers weg und behalte gerade die F1-Taste… alle Vorteile, die mir als Vorteile verkauft werden (keine separate Installation, alles im gewohnten Browser etc. siehe Video unten), sehe ich nicht als Vorteile gegenüber den Nachteilen, die in Kauf genommen wurden.
Ein vielleicht hartes Urteil, aber es geht seit Jahren in dieser Beziehung leider nur bergab.
- Just my 2 cents – :-(

Das Erste was ich sofort vermisst habe war in der folgenden Reihenfolge:

  1. Dynamic Help
  2. Table of contents (TOC)
  3. Sync to TOC
  4. Index
  5. Filter
  6. Direkte Suche in VS, oder dem entsprechenden Viewer

Ich bin dann auf im Internet auf die Suche gegangen und wurde mit 2 Tools fündig, die einem hier helfen können:

HelpViewerKeywordIndex

Aber wie angekündigt soll es auch hier Verbesserungen geben. Und das außerhalb der Wartungszyklen des VS (siehe Video unten mit Ryan Linton). Zumindest was den Index betrifft und die Suchmöglichkeit innerhalb von VS betrifft schafft ein kleines Tool von Ryan Linton (wie versprochen seit dem 20.04.) wenigstens etwas Abhilfe, der HelpViewerKeywordIndex.

Mit diesem Tool erhält man zumindest mal wieder den Index und ein Suchfenster in VS.
Auch dass das Sucherergebnis in einen VS-Fenster angezeigt werden kann ist nett. Leider betrifft diese Einstellung nicht die Funktion der F1-Taste. In diesem Fall wird immer noch der externe Browser angeworfen und nicht der interne, oder ich habe die Einstellung nicht gefunden wo man mit der F1-Taste ein Browser Fenster in VS öffnet.
Ganz verstanden habe ich auch die Option “Display TOC in page” nicht.
Das Tool ist zumindest mal ein kleiner Schimmer eines eventuellen zukünftigen Lichtblicks ;)

Aber wer weiß, vielleicht lässt Version 1.1 von  HelpViewerKeywordIndex nicht lange auf sich warten.

H3Viewer

Mit H3Viewer, von meinem MVP-Kollegen Rob Chandler, bekommt man zumindest mal wieder das, was man in VS-2008 auch hatte. Table of Contents, Sync to contents. Und der Viewer ist nicht im Browser. Mit dem Ding lässt sich leben oder zumindest ersetzt es den Viewer den wir aus VS-2005/8 kannten ziemlich gut. Und ja, es gibt auch hier wieder Bookmarks, die jetzt keine Favoriten Einträge im Browser sein müssen ;)
Besonders gefreut habe ich mich auch über die Funktion im Index die Doubletten zum gleichen Stichwort im Index in einem separaten Fenster wieder angezeigt zu bekommen, denn nicht jeder Treffer zu GetWindowtext ist der den ich suche.
Nett auch die TTS Funktion (Text to Speech)
Hier fehlen jetzt eigentlich nur noch die Filter zum vollständigen Glück.

Aber wer weiß, was Microsoft uns demnächst noch zu bieten hat. Laut der Homepage von H3Viewer hat Microsoft noch bereits einige andere Viewer in der Schublade.

Siehe auch:
http://channel9.msdn.com/posts/kmcgrath/Help-30-New-Help-System-in-Visual-Studio-2010/

Links:
http://visualstudiogallery.msdn.microsoft.com/en-us/4af86641-a302-4edf-9853-007bcc670b30
http://mshcmigrate.helpmvp.com/viewer

CommunityProgrammierenSonstigesMartin Richter - Fr 18 Sep 2009 18:36

Ich nutze gerne die MSDN-Bookmarks, allerdings hat dies scheinbar nun ein Ende:

MSDN Bookmarks werden zum 1. Oktober 2009 eingestellt. Weitere Details erfahren Sie hier.

Durch Zufall habe ich dies am Kopf der Tool Seite gelesen:
http://social.msdn.microsoft.com/de-DE/Tools/

Das ganze hat erst im September 2008 seinen Anfang genommen. Ich habe darüber in meinem Blog berichtet http://blog.m-ri.de/index.php/2008/09/18/bookmark-on-msdn-auch-auf-meiner-seite/ . Das Ganze hat genau ein Jahr gehalten. :-|
Eigentümlich, dass dieses Feature jetzt schon wieder abgebrochen wird.

Mehr Infos gibt es angeblich hier http://social.msdn.microsoft.com/de-DE/faq, allerdings steht da auch nicht mehr, als das es eben eine Entscheidung gibt dieses Tool einzustellen.

Ich kann also jedem nur raten, der hier wertvolle Bookmarks gespeichert hat, diese zu exportieren. Auch das geht über die Tool-Seite.

C++ProgrammierenWindows APIMartin Richter - So 01 Mrz 2009 14:02

Customdraw ist für mich erste Wahl, wenn es um das Anpassen von Ausgaben in Controls geht, zudem ein subclassing von WM_PAINT mit Erhalt der Grundfunktionen eigentlich nicht möglich ist (ich werde dazu demnächst noch mal schreiben).

Liest man die Anleitung zu NM_CUSTOMDRAW und Tooltips, bekommt man den Eindruck, dass man wie bei einem List Control an jeder Stelle eingreifen kann. Vor dem Zeichnen, nach Löschen des Hintergrundes und so weiter: CDRF_NOTIFYITEMDRAW, CDRF_NOTIFYPOSTERASE, CDRF_NOTIFYPOSTPAINT, CDRF_NOTIFYSUBITEMDRAW werden in der Doku erwähnt.

Diese Informationen sind komplett irreführend, denn nur CDRF_NOTIFYPOSTPAINT wird vom Tooltip akzeptiert und beachtet. Man kann z.B. nicht auf die Ausgabe des Textes alleine übernehmen und nur das Löschen des Hintergrundes dem Control überlassen. Es wird wirklich nur CDRF_NOTIFYPOSTPAINT berücksichtigt ( ich habe mich durch den Assembler-Code der COMCTL32.DLL durch gedebuggt).
Auch die Rückgabe von CDRF_NEWFONT kann man sich sparen. Man muss nur einen neuen Font selektieren und er wird berücksichtigt.

Was in der Dokumentation auch zu kurz kommt, ist, dass NM_CUSTOMDRAW mit CDDS_PREPAINT zweimal kurz hintereinander aufgerufen wird. Beim ersten Mal ist DT_CALCRECT in NMTTCUSTOMDRAW::uDrawFlags gesetzt ist und beim zweiten mal nicht mehr. Man hat dadurch die Möglichkeit die Größe des Controls mit NMCUSTOMDRAW::rc zu kontrollieren. Gut beschrieben ist das nicht in der MSDN sondern in einem alten Artikel des MSJ aus dem Otkober 1996, wer weiß wann der verschwinden wird.

Die Implementierung hier ist einfach halbherzig, leider. Die Möglichkeiten wären so genial, hier ein bisschen Fettgedrucktes, dort noch mal ein Icon… Schade…

CommunityInternetProgrammierenRessourcenSoftwareToolsMartin Richter - Fr 03 Okt 2008 20:56

Microsoft ist dazu übergangen Artikel, die älter als 8 Jahre sind aus dem MSDN heraus zu nehmen. Leider! Denn viele wertvolle Windows API Artikel gehen damit verloren oder sind nicht mehr verfügbar, so zum Beispiel ist auch die OLE Bibel von Kraig Brockschmidt.

Besonders peinlich finde ich es, wenn Microsoft Artikel entfernt auf die in der KB noch Bezug genommen wird, wie zum Beispiel in diesem KB Artikel INFO: Syntax of the Res: Protocol and Some Known Related Issues.
Mir ging es um den Artikel http://www.microsoft.com/mind/0199/cutting/cutting0199.asp, dessen Link leider ins Leere verläuft.

Bleibt die Frage wie man solche alte Artikel wiederfindet, die noch von anderer Seite her referenziert werden :?:

Sofern man (wie hier) die komplette alte URL noch kennt gibt es zum Glück http://web.archive.org/   :!:

Einfach im Advanced Search die URL angegeben http://www.microsoft.com/mind/0199/cutting/cutting0199.asp

Und siehe da man erhält:
http://web.archive.org/web/*/http://www.microsoft.com/mind/0199/cutting/cutting0199.asp
Wie man sieht ist der Artikel Ende 2007 zuletzt auf den MS Seiten zu sehen gewesen.

Bleibt nur noch die Frage, wie man an die alten Links kommt :?:

Es gibt einen schnellen zweiten Weg, wenn der Artikel vor 2001 bereits veröffentlicht war. Google war so nett und hat uns Google 2001 bereitgestellt :!:

Die Suche ergab hier schnell das folgende Ergebnis:
http://www.google.com/search2001/search?hl=en&q=%22Pluggable+Protocols%22+res

Und siehe da, wir erhalten zusätzlich wieder einen Link auf das bereits erwähnte http://web.archive.org :
http://web.archive.org/web/2001/http://msdn.microsoft.com/library/periodic/period99/cutting0199.htm

Google 2001 kann hier also auch ein richtig gutes Helferlein sein um verschollene Informationen und Artikel wieder aufzufinden.

CommunityProgrammierenSonstigesMartin Richter - Do 18 Sep 2008 22:21

Social Bookmarking V1 wurde ja gerade veröffentlicht, wie Kay Giza berichtete.

In meinem Blog auf der rechten Seite unter dem Blog-Info habe ich mal gleich mal das neue MSDN Bookmark Widget eingebaut. Ich bin mal gespannt wer es benutzen wird.

Der Einbau ist einfach. Man fügt nur den nachfolgenden Skript Code auf seiner HTML Seiten ein.

<script src="http://Services.social.microsoft.com/widgets/bookmark.jss?
type=1&brand=Msdn&locale=1031" type="text/javascript"></script>

So ist das ganze auch auf dieser Tools Seite beschrieben.
Was leider nicht dokumentiert ist und ich nur durch herumprobieren hinbekommen habe ist die Bedeutung des Type Parameters. Der Type Parameter hat folgenden Einfluss auf die Darstellung des Links.

  • Mit Type=0 erhält man nur ein Icon
  • Mit Type=1 erhält man das Link Icon inkl. dem Text Bookmark on MSDN

Wie man sieht habe ich mich für Type=1 entschieden.

C++MFCProgrammierenWindows APIMartin Richter - Mi 10 Sep 2008 21:50

Die MSDN ist eines der größten und besten Nachschlagewerke, die ich kenne, allerdings gehen mir auch seine Unzulänglichkeiten ab und zu auf die Nerven (und hier meine ich nicht die funktionellen Defizite, sondern die inhaltlichen)!

Das sind dann ganz besonders die kleinen Sachen, die einem das Leben leicht machen könnten, die dann nicht “vollständig” dokumentiert sind.

Beispiel:
Die MFC List-Container (z.B. CObList). Wir lesen in der Doku zu InsertAfter:

position
A POSITION value returned by a previous GetNext, GetPrev, or Find member function call.

Gut! Aber da steht nichts zu NULL. :???:
Aber wenn ich genauer darüber nachdenken, kann GetNext und Find auch NULL zurückgeben…
Was passiert also wenn ich NULL als Argument für position?
Mein Verstand sagt mir: “Es wird ein Element am Ende eingeführt!” und ein Blick in den Code bestätigt den Verdacht.

Warum steht in der Doku nicht gleich, dass InsertAfter mit NULL als position ein AddTail ausführt?
Wer weiß wieviele Entwicler solchen “unnützen” Code aufgrund der mangelnden Doku geschrieben haben:

CStringList lst;
FillMyList(lst);
POSITION pos = lst.Find(_T("Anything"));
if (pos==NULL)
    lst.AddTail(_T("Something to insert"));
else
    lst.InsertAfter(pos,_T("Something to insert"));

Es würde ja genügen wie folgt zu schreiben:

CStringList lst;
FillMyList(lst);
POSITION pos = lst.Find(_T("Anything"));
lst.InsertAfter(pos,_T("Something to insert"));

Korrespondierend ist die Doku von CObjList::InsertBefore genauso unvollständig.
Wird NULL als Position verwendet wird hier ein AddHead ausgeführt.

PS: Mich ärgert auch jedesmal wenn einer meiner Kollegen solchen Code schreibt:

CSomeObject *p = NULL;
...
// Conditional create
if (SomeThing())
     p = new CSomeObject();
...
// Cleanup
if (p)		// Category meaningless
    delete p;
  1. Warum der Test auf !=NULL?
  2. Warum wird kein Autopointer verwendet, der das auch Exception-Save gemacht hätte?
C++ProgrammierenRessourcenSonstigesWindows APIMartin Richter - So 08 Jun 2008 19:40

Immer wieder taucht die Frage auf, wie die Funktionen zum Laden von Ressourcen (LoadImage, LoadCursor, LoadMenu etc.) eigentlich arbeiten und entscheiden aus welcher LANGID-Sektion die Ressource geladen wird.

Die Dokumentation von FindResource – auf der alle diese Funktionen basieren – gibt leider keine Auskunft.

Wenn man jedoch etwas sucht wird man in der Dokumentation von Developing International Software fündig. Dort findet sich der folgende Abschnitt mit dem Titel Multiple Language Resources, in dem auch beschrieben wird wie FindResource arbeitet und wie eine Ressource gesucht wird:

If the FindResource and FindResourceEx functions do not find any resources that match the language ID’s primary language, they search for resources tagged as “language-neutral.” This language ID is useful for resource elements such as icons or cursors that are identical for all languages. If a bitmap or an icon will differ for some languages, you can define one language-neutral bitmap as the default and specify language IDs for as many other customized bitmaps as required. For example, bidirectional applications might require bitmaps with right-to-left directionality. Because the FindResource and FindResourceEx functions always search for specific language IDs first, they will always find a bitmap tagged with that language ID before they find one tagged as language-neutral. The search algorithm they follow is summarized in the following list:

1. Primary language/sublanguage
2. Primary language
3. Language-neutral
4. English (skipped if primary language is English)
5. Any

ProgrammierenVS 2008Martin Richter - Mo 19 Nov 2007 11:19

Es ist wirklich “very soon” geworden!

MSDN Subscriber Downloads 
Visual Studio Team System 2008 Team Suite (x86 and x64 WoW) – DVD (English)  
        
Date/Time Posted 
2007-11-19 06:46:35 (UTC) 

 Na dann mal los mit dem ausprobieren…

AllgemeinMartin Richter - Do 30 Aug 2007 14:12

Tools

  1. Platform SDK
    Das letzte Platform SDK, dass mit VC-6 funktioniert ist die Windows Server 2003 Version vom Februar 2003:
    http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm
  2. Der Dependancy Walker
    Hier der Link auf die aktuelle Version des unverzichtbaren Tools:
    http://www.dependencywalker.com/

Nette Helfer im Netz

  1. Das Internet Archive WaybackMachine
    http://www.archive.org/web/web.php
    Der unabdingbare Helfer zum aufspüren alter Artikel (bseonders in der MSDN).

Gute lesenswerte Artikel mit viel Gehalt

  1. Tiptoe Through the ToolTips With Our All-Encompassing ToolTip Programmer’s Guide
    http://www.microsoft.com/msj/0497/tooltip/tooltip.aspx
    Ein Artikel, der fast nichts auslässt was Tooltips betrifft
  2. Use of Two-Dimensional Vectors with Windows NT
    http://msdn.microsoft.com/en-us/library/ms969932.aspx
    Win32: Hit Testing Lines and Curves
    Eine prima Einführung wenn man es mal mit komplexeren Darstellungen und dem aufspüren von Punkten auf Linien und Bezierkurven zu tun hat. Ist zwar C Code, aber dennoch nützlich und leicht zu portieren.

Gute Ansätze in Codeproject

  1. Ein guter Ansatz für das Drucken ohne Doc/View
    http://www.codeproject.com/KB/printing/printingmadeeasy.aspx
    Man sollte zwar einiges anpassen, aber die Idee für das Drucken gerade von Tabellen ist simpel und gut. Mit etwas Einsatz bekommt man einfache Wrapper die universell zum Beispiel auch List Controls zum drucken bringen.
  2. Wie man MFC und CRT DLLs als private Assemblies nutzt
    http://www.codeproject.com/KB/cpp/PrivateAssemblyProjects.aspx
    Manch einer ist auf MFC und CRT in der DLL Version angewiesen, aber möchte keine Runtime instalieren. Dieser Artikel von mir beschreibt wie man zu einer Xcopy Instalation kommt.
  3. Guter Ansatz wenn man Resizable Dialoge nutzen will
    Einmal von Paolo Messina
    http://www.codeproject.com/KB/dialog/resizablelib.aspx
    und einmal von Paul DiLascia
    http://www.dilascia.com/PixieDoc.htm#CSizeableDlg
    http://web.archive.org/web/20030814094414/msdn.microsoft.com/msdnmag/issues/01/07/winmgr/default.aspx

Immer wieder gefragt

  1. Creating a Child Process with Redirected Input and Output (Windows)
    http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx