Kontrollkästchen in MS VC++

Bahly

Grünschnabel
Hi,
als Anfänger in C++ Programmierung (Visual C++ 6.0) habe ich folgendes Problem:
Ich habe in meinem Projekt drei Kontrollkästchen (Checkboxes)
eingebaut. Jedes hat einen Buchstaben: A, B, und C.
Es sollte beim Aktivieren des einen Kontrollkästchen dessen Buchstabe
in einem Eingabefeld angezeigt werden, ohne daß, ein bereits angezeigter Buchstabe verschwindet.
Also wenn ich A aktiviere erscheint der Buchstabe A in einem Eingabefeld, aktiviere ich weiter B dann wird B zustäzlich in dieses
Eingabefeld hinzugefügt und so weiter.
Ich wäre dankbar einen Lösungsvorschlag zu bekommen.
Wünsche euch einen schönen Tag.
Bahly
 
  • Bei Klick auf ein Kontrollkästchen überprüfen, ob es Markiert ist oder nicht.
  • Wenn Ja, das Editfeld auslesen, den neuen Buchstaben einfügen und den Text in das Editfeld wieder einlesen.

und man hätte es so lösen können:
Code:
#include <windows.h>
#include "resource.h"

void Check(HWND hwnd, WPARAM wParam)
{
	char temp[99] = {""};
	HWND check;

	if(wParam == IDC_A) //auf A geklickt?
	{
		check = GetDlgItem(hwnd, IDC_A);
		if(SendMessage(check, BM_GETCHECK, 0, 0) == BST_CHECKED) // markiert?
		{
			GetDlgItemText(hwnd, IDC_EDITFELD, temp, sizeof(temp));
			temp[strlen(temp)] = 65; // A hinzufügen
			SetDlgItemText(hwnd, IDC_EDITFELD, temp);
		}
	}

	if(wParam == IDC_B) //auf B geklickt?
	{
		check = GetDlgItem(hwnd, IDC_B);
		if(SendMessage(check, BM_GETCHECK, 0, 0) == BST_CHECKED) // markiert?
		{
			GetDlgItemText(hwnd, IDC_EDITFELD, temp, sizeof(temp));
			temp[strlen(temp)] = 66; // B hinzufügen
			SetDlgItemText(hwnd, IDC_EDITFELD, temp);
		}
	}

	if(wParam == IDC_C) //auf C geklickt?
	{
		check = GetDlgItem(hwnd, IDC_C);
		if(SendMessage(check, BM_GETCHECK, 0, 0) == BST_CHECKED) // markiert?
		{
			GetDlgItemText(hwnd, IDC_EDITFELD, temp, sizeof(temp));
			temp[strlen(temp)] = 67; // C hinzufügen
			SetDlgItemText(hwnd, IDC_EDITFELD, temp);
		}
	}
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
		case WM_COMMAND:
			Check(hwnd, wParam);
			break;

		case WM_CLOSE:
			PostQuitMessage(0);
			break;
	}
	return false;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)		
{ 
	DialogBox (hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, (DLGPROC) WndProc);
	return 0;
}
 
Hi rook,
herzlichen Dank für Deine Mühe und den Code.
Nun, nach Einbetten des Codes in mein Projekt
bekam ich beim Kompilieren 4 Fehler und zwar:
1. Fehler:
error C2664: 'void __thiscall CWnd::GetDlgItem(int,struct HWND__ ** ) const' : Konvertierung des Parameters 1 von 'struct HWND__ *' in 'int' nicht moeglich

2. Fehler:
error C2660: 'SendMessageA' : Funktion akzeptiert keine 4 Parameter

3. Fehler:
error C2661: 'GetDlgItemTextA' : Keine ueberladene Funktion akzeptiert 4 Parameter

4. Fehler:
error C2660: 'SetDlgItemTextA' : Funktion akzeptiert keine 3 Parameter
also ich habe die Funktion
void Check(HWND hwnd, WPARAM wParam)
umbenannt und zwar zu
void MyClassView::OnChenblA(HWND hwnd, WPARAM wParam)

OnChenbleA sollte das kontrollkästchen A beim anklicken aktivieren
wie es der Vorschlag des Klassenassistenten war.

Eine andere Sache, wo solle ich den letzten Teil des Codes hinzufügen? Also den
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
Check(hwnd, wParam);
break;

case WM_CLOSE:
PostQuitMessage(0);
break;
}
return false;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
DialogBox (hInstance, MAKEINTRESOURCE(IDD_MAIN), 0, (DLGPROC) WndProc);
return 0;
}
 
Also Du programmierst wohl mit der MFC und willst C++-Code einbauen! Dies muss ja schief gehen!

Wenn Du WinAPI Funktionen in MFC verwenden willst, dann musst Du vor die API-Funktionen :: davor schreiben.

Portiere den Code lieber nach MFC. Es zeigt Dir hier ja das Prinzip - umsetzen solltest Du es selber - willst ja was lernen!
:)
 
Hi geola,
leider bin ich mit Deiner Antwort nicht schlauer geworden.
ich nehme an :: soll ich in MFC vor der Funktion schreiben im zusammenhang mit der verwendten Klasse oder meinst Du es anders?
das habe aber schon gemacht.
 
Poste doch mal den Quellcode Deiner Umsetzung (also nur den Teil mit den Checkboxen)! Dann werde ich schlauer, was Du gemacht bzw. probiert hast! :)
 
Original geschrieben von Bahly
Eine andere Sache, wo solle ich den letzten Teil des Codes hinzufügen?

schlecht, mit MFC unterstützung, da es in MFC (soweit ich weiss) keine main funktion gibt... ich mag ehrlich gesagt kein MFC :)
 
Selbstverständlich gibt es in der MFC eine WinMain. Du must nur danach suchen - ist nähmlich in der Klasse CWinApp implementiert! Source anschauen, da findest Du die WinMain!

Und die WndProc brauchst Du bei der MFC nicht (ist ebenfalls im Hintergrund bereits implementiert), da man dort mit den Makros MESSAGEMAPS arbeitet für Nachrichtenweitergabe!

Die MFC nimmt Dir den ganzen Kleinkram der WinAPI Programmierung ab!
 
Zurück