Ctrl einer Checkbox bekommen / Callback
-
hey cracks,
hab hier ein wirkliches probelem.
ich möchte beim erzeugen von einem object (in diesem fall eine checkbox) dessen CButton-Ctrl bekommen. Der Erzeuger dieser Checkbox ist eine externe Anwendung, die mir allerdings vor und nach dem erzeugen einen CallBack schickt. Dieser Callback enthält dann folgende Daten im lparam:UINT _nSize; // size of the structure
LPCSTR pszName; // name of the object
INT _nType; // see LL_OBJ... values
BOOL _bPreDraw; // TRUE on call before draw, FALSE on call afterwards
HDC _hRefDC; // HDC to get information from
HDC _hPaintDC; // HDC to paint on
RECT _rcPaint; // RECT in paint units (mm/10 or inch/100)
} scLlObjectA;Beim schließen des Dialgos möchte ich nun den state dieser Checkbox/bzw der Checkboxen herauslesen.... wie mach ich denn das?
Zusatz: beim click auf die checkbox bekomm ich über pretranslatemassage folgende messages übermittelt:
BM_GETCHECK
BM_SETCHECKIch bräuchte eigentlich (nur) beim Erzeugen die Einzelnene Referenzen auf die Checkboxen und beim beenden deren wert.
vielen dank für eure hilfe....
grüße
LukeX
-
CWnd's (und damit CButton) sind "nur" wrapper-Klassein für ien Win32 - Window Handle (HWND). Das kommt an irgendeiner Stelle sicherlich mit
Im prinzip würde das HWND genügen:
bool isChecked = ::SendMessage(hwnd, BM_GETCHECK, 0, 0) != 0;Wenn du ein CButton haben willst, dann nimmst du CWnd::FromHandle, und castest nach CButton. Der Zeiger ist allerdingsa nur bis zum Ende der gerade abgearbeiteten Message gültig, und darf nicht mit delete gelöscht werden.
-
Ok, das ist schon mal gut zu wissen, aber wenn ich nun das ausprobier... in der Form:
isChecked = ::SendMessage(pMsg->hwnd, BM_GETCHECK, 0, 0); if(isChecked) MessageBox("ok"); bt = (CButton*)FromHandle(pMsg->hwnd); bt->ShowWindow(FALSE);Dann verschwinden alle Checkboxen und das komplette HDC...
Vielleicht handelt es sich ja um eine COLE....
Wie kann ich den daran rumdoktorn?
danke schön
lukex
-
Nimm mal ein Trace statt der Message Box - sollte zwar nix machen, aber hilft beim Debuggen

-
bool isChecked = ::SendMessage(hwnd, BM_GETCHECK, 0, 0) != 0;Sowas ist doch scheiße. Die Rückgabewerte sind BST_CHECKED, BST_INDETERMINATE und BST_UNCHECKED.
-
Sorry, aber das hilft mir nicht gerad weiter...
Das HWND von der Message ist das HWND vom ganzen Window... Brauche hier aber nur das von diesem Checkbox-Object... Kann ich irgendwie das Ctrl beim Erzeugen bekommen.... über das HDC?
Über den Callback kann ich ja die Checkbox selber erzeugen, aber ich weiß gerad nicht wie ich das control aus dem HDC bekomm... und überhaupt weiß ich ja nicht, ob das ein CButton ist, oder was anderes .... etwa OLE, oder ...?!
eigentlich würds mir reichen, wenn ich aus allen checkboxen, statt dem häckchen ein schwarzes feld machen könnte.... hier liegt nämlich das problem.
die externe dll liefert mir hier ein control (checkbox) ... ich brauch aber statt der checkbox einen Marker .... d.h beim klick soll kein häckchen, sondern eine komplett schwarze Box angezeigt werden.... das ganze auf diesem HDC. Weil das ganz später dann gedruckt werden soll.... Stichwort Taktmarker!
Das HDC hab ich nur beim Start über den Callback zur Verfügung... (struct siehe erster Beitrag).
1. FALL:
- Checkboxen markieren
- Checkboxen-States sichern
- Window schließen
- wieder öffnen
- vorher markierte Checkboxen schwarz zeichnen (über Callback)2.FALL:
Besser:
- Beim Click, die Checkboxen gleich schwarz zeichnen...Problem:
- Für 1.Fall und 2 Fall speichern der aktivierten Checkboxen (Ref fehlt)
- beim click schwarz ausfüllen ( Ref fehlt)hab gerad schon mein bestes probiert, aber bei Callbacks, oder eben ähnlichen rumtricksen reicht mein wissen net aus...
bitte um hilfe...
merci!
LukeX
-
Wenn Du BM_?ETCHECK - notificaitons bekommst, kann man annehmen das es ein Button ist (Checkboxen, Radios, und Push Buttons sind im Windows von der gleichen WNDCLASS implementiert, und von der MFC entsprechend als eine Klasse - CButton - gespiegelt)
mit WindowFromDC kommst du an das Window-Handle eines device contexts ran, kann aber in diesem Fall auch der DC vom Parent sein (mußt wahrscheinlich ausprobieren). Da wäre es egal, ob um den Button noch ein ActiveX-Control drumrumliegt.
Ansonsten: ::GetDlgItem(HWND parent, UINT dlgCtrlID) - gibt das HWND eines Child-Fensters. Bräuchtest halt den ID des buttons (ist der, den man im Ressourcen-Editor einstellt), und geht nur, wenn der button ein direktes Kind ist.
@BEÄST:
sorry hab ich nicht dran gedacht.
Aber Krieg ist Scheiße, der Code ist fehlerhaft (und in der MFC ist es auch nicht besser gelöst). Also reiß dich bitte am Riemen.