Windows Steuerelemente

Liebes Forum!

Ich möchte in den nächsten Tagen einige alte Anwendungen, die ich in VB6 und in VB.NET geschrieben habe, in C++ neuschreiben. Der Hauptgrund dafür ist, den Installationsaufwand zu verringern, da für fast sämtliche Programme das .NET Framework von nöten ist. Ein anderer Grund ist, dass meine VB6 Anwendungen öftmals sehr eigenartig arbeiten. Damit meine ich, dass sie manchmal nicht das tun, was sie tun sollten, stürzen aber weder mit fehler ab noch hängen sich auf etc. Mit C++ glaube ich einfach meinem PC noch besser mitteilen zu können, was er genau tun soll.

So, lange Rede, kurzer Sinn.
Weil viele dieser Programme auf Steuerelemente zurückgreifen, möchte ich nicht auf diese Verzichten. Meine Frage ist jetzt, wie ich diese in C++ einbinde. Ich möchte dabei auf Frameworks, externe Bibliotheken und die MFC verzichten, da ich soweit ich weiß, das ganze auch mit der Windows API möglich ist.

Ich habe dabei zwei Wege. Entweder über eine Dialogressource oder rein über API. Die Dialogressourcen sind nicht so ein Problem, habe schon etwas dazu gefunden, aber soweit ich gelesen habe, werden diese nicht oft verwendet. (aus welchem Grund auch immer) Also möchte ich gerne mal sehen, wie das mit der API funktioniert.

Ich bräuchte dazu Informationen(Funktionsnamen, Tutorials, etc.), wie man die Windowssteuerelemente (Button, Labels, Textbox, Progressbar, Combobox, etc.) auf ein Formular bringt und wie ich mit diesen arbeiten kann. (Messages empfangen mit der LRESULT CALLBACK WindowProcedure, oder Werte aus Textboxen auslesen, oder setzten.)

Wäre euch für jeden Link dankbar!
Hab selber schon gegooglt, aber nichts brauchbares gefunden.

Ich programmiere mit der Freeware IDE Code::Blocks und kompiliere mit dem gcc (MinGW) auf Windows XP SP3.

mfg dixxi

Windows Steuerelemente - Messages
Ok jetzt hab ich schon was gefunden:

http://msdn.microsoft.com/en-us/library/bb773169(VS…

In der MSDN ist eine Liste aller Windows Controls. Damit hab ich es mit der Funktion CreateWindow() geschafft einen Button auf meine Form zu bringen. Ich nehme an für die anderen Controls wird das ganz ähnlich funktionieren. Jetzt weiß ich aber nicht wie das mit den Messages funktioniert bzw. hab das nicht verstanden.

Meine WindowProcedur sieht so aus:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message) /\* handle the messages \*/
 {
 case WM\_DESTROY:
 PostQuitMessage (0); /\* send a WM\_QUIT to the message queue \*/
 break;
 case WM\_COMMAND:
 MessageBox(NULL, "lol", "lol", MB\_OK);
 break;
 default: /\* for messages that we don't deal with \*/
 return DefWindowProc (hwnd, message, wParam, lParam);
 }

 return 0;
}

Laut MSDN schickt der Button eine BN_CLICKED Message. Wenn ich aber statt WM_COMMAND BN_CLICKED hinschreibe, kommt keine Messagebox wenn ich auf den Button klicke. Ist die Messagebox bei WM_COMMAND kommt sie wenn ich auf den Button klicke.

Eine andere Frage ist, wie ich jetzt mit wparam und lparam umgehe?

MSDN:
wParam
The low-order word contains the button’s control identifier. The high-order word specifies the notification message.
lParam
A handle to the button

Wie komme ich denn an ein low-order word oder an ein high-order word aus einem Parameter? Gehört habe ich schon einmal etwas davon, aber benutzt noch nie. Steckt hier vielleicht das BN_CLICKED drinnen?

Noch eine Frage: Wie organisiere ich jetzt 2 oder mehr Buttons? Ich muss ja irgendwo unterscheiden (switch) welchen Button der User geklickt hat?

Ich freue mich über jede Antwort!
mfg dixxi


Weil viele dieser Programme auf Steuerelemente zurückgreifen,
möchte ich nicht auf diese Verzichten. Meine Frage ist jetzt,
wie ich diese in C++ einbinde. Ich möchte dabei auf
Frameworks, externe Bibliotheken und die MFC verzichten, da
ich soweit ich weiß, das ganze auch mit der Windows API
möglich ist.

Hallo,

ich fürchte, niemand programmiert mehr so, mit eigener Messageloop und CreateWindow usw., ich habe vor schätzungsweise 15 Jahren damit aufgehört. Ich programmiere z.B. viel in Delphi (bitte dazu keine Kommentare!), da bekomme ich die Message Loop(s) nie zu sehen, denn wenn ich einen Button aufs Formular ziehe, wird seine Resource gespeichert, sein CreateWindow eingefügt und seine Messages in Events übersetzt, alles ohne weitere Arbeit - gottseidank, ich bin froh, diese Routineaufgaben los zu sein.

Am besten besorgst du dir alte Programmierbücher, brutal gesagt aus dem letzten Jahrhundert, wie Petzold Programming Windows oder was entsprechendes von Norton. Da wird noch „Windows-Programmierung von Hand“ beschrieben, soweit ich mich erinnern kann - ich müsste die noch haben, aber weil ich 20 Jahre nicht mehr reingeschaut habe, finde ich sie im Moment nicht.

Gruss Reinhard

Hallo dixxi,

Jetzt weiß ich aber nicht wie das mit den Messages funktioniert bzw. hab das
nicht verstanden.

Es gibt jede Menge Hilfe im Web. Suche nach „WM_COMMAND“ (im Web oder auch MSDN), oder was Dich halt interessiert. Du brauchst einen Einsteiger-Kurs in Sachen WIN-API, siehe die Links weiter unten.

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
 switch (message)
 {
 case WM\_DESTROY:
 PostQuitMessage (0);
 break;
 case WM\_COMMAND:
 // koennen verschiedene sein, schauen wir mal:
 switch (wParam) // ich glaube, wParam
 {
 case BN\_CLICKED:
 MessageBox(NULL, "lol", "lol", MB\_OK);
 break;
 case any:
 // sonstwas machen
 break;
 }

 break;
 default:
 break;
 return DefWindowProc (hwnd, message, wParam, lParam);
 }

 return 0;
}

Eine andere Frage ist, wie ich jetzt mit wparam und lparam
umgehe?

MSDN:
wParam
The low-order word contains the button’s control identifier.
The high-order word specifies the notification message.
lParam
A handle to the button

Da bist Du schon auf dem richtigen Weg.

Wie komme ich denn an ein low-order word oder an ein
high-order word aus einem Parameter?

Da gibt es Makros:

UINT low = LOWORD(wParam);
UINT high = HIWORD(wParam);

aber wenn dir die bitweisen Operatoren von C ein Begriff sind, kannst du das auch selbst machen.

Noch eine Frage: Wie organisiere ich jetzt 2 oder mehr
Buttons? Ich muss ja irgendwo unterscheiden (switch) welchen
Button der User geklickt hat?

Sicher, aber das wird meist mit Konstanten gemacht, die in Ressourcen gespeichert sind, eine sehr haessliche Methode. Ich ziehe es vor, das selbst zu zeichnen, mit GDI-Funktionen. Den Klick kann ich dann feststellen mit PtInRect().

Hier sind ein paar Links ueber WIN-API:

// de
http://winapi.net (auch Forum)
http://www.henkessoft.de/C++/WinAPI/WinAPI%20Kapitel…
http://win-api.de
http://www.willemer.de/informatik/windows/index.htm

// en
http://www.winprog.org/tutorial/
http://www.inigraphics.net/ini-sc/mswin/awfcsem/inha…
http://functionx.com/win32/index.htm

Das Buch von Charles Petzold „Windows-Programmierung“ ist auch ein Tipp.
Noch so Eines gibt es von Ron Nanko. Die gibt es wohl beide in der örtlichen Bücherei auch leihweise.

Die Kollegen hier, die das „veraltet“ finden, übersehen dabei geflissentlich, dass die ganzen Libs, die man im Web findet, intern genau das machen, nur eben gekapselt in C++ Klassen. Die prozedurale Schreibweise ist allerdings veraltet, das tippst Du Dir die Finger wund. OOP ist besser.

Aber glaube mir, Du hast Dir da einiges vorgenommen. Alternativ kannst du natürlich ein Lib runterladen - für Leute, die C++ können.

lg
Martin B

Vielen Dank für die ausführliche Hilfe, Martin !

Ich werde mir deine Links gleich in den nächsten Tagen ansehen.

mfg dixxi