Nachricht, wenn Dialog Fokus bekommt/verliert?
-
Hallo,
ich brauche für meinen MFC-Dialog die Nachrichtenbehandlungen, wenn der Dialog den Fokus
a) verliert (z.B. an den Desktop, andere Anwendungen etc...)
b) erhältIch habe es bis jetzt mit WM_KILLFOCUS und WM_PAINT probiert, aber KILLFOCUS
funzt bei mir nicht, die Methode wird also nicht aufgerufen.
WM_PAINT ist mir zu allgemein, da die Methode ja jedesmal aufgerufen wird, wenn der
Dialog neu gezeichnet werden soll, also auch, wenn er bereits den Fokus hat.Der Dialog soll nämlich semitransparent werden, wenn er den Fokus verliert
(ich nutze dazu AlphaBlend) und wieder solid, wenn er den Fokus erhält.Wenn jemandem dazu was schlaues einfällt, wär ich sehr dankbar...
-
Öhm, das kann fast nicht sein, dass du keine WM_KILLFOCUS bekommst ... wie hast du es denn versucht?
-
WM_ACTIVATE schonmal ausprobiert?
-
in die HauptDlg-Class mit Klassenassistent WM_KILLFOCUS->Funktion hinzufügen, wie immer. Da drin steht folgendes:
void CAlphaNotesDlg::OnKillFocus(CWnd* pNewWnd) { CDialog::OnKillFocus(this); // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen MessageBox("Fokus verloren!"); BLENDFUNCTION m_bf; m_bf.SourceConstantAlpha=255; CClientDC dc(this); CWnd* pDesk=GetDesktopWindow(); CClientDC dcDesk(pDesk); AlphaBlend(dc,0,0,m_Width,m_Height,dcDesk,0,0,m_Width,m_Height,m_bf); }
Die MessageBox zu Testzwecken. Kommt aber nicht.
WM_ACTIVATE ist bei mir in den Defaults nicht vorhanden.
-
Hab momentan keine IDE installiert, aber guck dir zu WM_ACTIVATE doch mal den Eintrag in der MSDN an, das sieht doch genau danach aus, was du haben willst ...
-
hmm, ja, das klingt ganz vernünftig. Aber wie baue ich denn dafür ne Methode ein? Einfach in die Dlg-Klasse eine Funktion "OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized );" hinzufügen, funzt doch bestimmt nicht, oder?
Zumal OnActivate ja eine Methode von CWnd ist.
Nur wo baue ich die ein?
Thx, für den Hint!
-
Einfach überschreiben, würde ich mal sagen ...
-
Hab ich probiert:
Dlg-Klasse->Funktion hinzufügen:
Typ: afx_msg void
Name: OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized)Die Implementierung schaut so aus:
switch(nState) { case WA_INACTIVE: MessageBox("Inactive"); break; case WA_ACTIVE: MessageBox("Active"); break; default: break; }
Funzt net
Hast du noch ne andere Idee ?
-
Hm, hast du dir die Eigenschaften deines Dialoges mal angeschaut, ob da alles ok ist?
-
Was heisst denn "alles OK"?
-
ka, kann grad net schauen ...
Mir gehen halt langsam auch die Ideen aus
-
muss man nicht noch in die message map eine verbindung von nachricht zur member-funktion erstellen?
-
ich meine das:
-
Wenn man's eh nicht als Nachricht bekommt, wie er sagt, nciht.
Aber eine Möglichkeit ist mir noch eingefallen.
Du arbeitest mit dem 6er-Studio nehm ich an. Wenn man dort im Klassenassistenten ist, ist der erste Reiter ja der Teil, wo man seine Nachrichten auswählen kann, der zweite für die Membervariablen. Dann gibt es weiter hinten einen Reiter, bei dem kann man einstellen, welchen Typ deine Dialogklasse hat und dementsprechend bekommst du auch mehr Nachrichten angezeigt. Versuch dort mal die "höchste" Einstellung sozusagen.
-
mfc nichtskenner schrieb:
ich meine das:
Jepp, du hast schon recht. Sein Problem ist momentan eben nur, dass er es nciht als Nachricht bekommt *g* Das sollte sich aber mit meinerm Lösungsansatz eigentlich beheben lassen.
-
Sein Problem ist momentan eben nur, dass er es nciht als Nachricht bekommt *g*
Wo hat er das denn geschrieben?
Dann müsste er ja schon ein Programm wie Spy++ ausprobiert haben, um zu sehen das er die Nachricht nicht bekommen.
-
Hab ich gemacht:
// Generierte Message-Map-Funktionen //{{AFX_MSG(CAlphaNotesDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnKillFocus(CWnd* pNewWnd); afx_msg void OnActivate(UINT nState, CWnd *pWndOther, BOOL bMinimized);//! //}}AFX_MSG DECLARE_MESSAGE_MAP()
Geht aber leider auch nicht...
-
ON_WM_ACTIVATE() macht doch was ganz anderes.
#define ON_WM_ACTIVATE() \ { WM_ACTIVATE, 0, 0, 0, AfxSig_vwWb, \ (AFX_PMSG)(AFX_PMSGW) \ (static_cast< void (AFX_MSG_CALL CWnd::*)(UINT, CWnd*, BOOL) > (OnActivate)) },
-
hmm, ich habe mal die Klasse auf "Fenster" gesetzt (eins höher als Dialog), dann gibt es auch die WM_ACTIVATE.
Mit folgendem Code in dieser Methode kommt jedoch nur eine Dialogbox "Inactive" beim Starten der Anwendung und darauf bricht das Programm ab...switch(nState) { case WA_INACTIVE: MessageBox("Inactive"); break; case WA_ACTIVE: MessageBox("Active"); break; default: break; }
-
mfc nichtskenner schrieb:
Sein Problem ist momentan eben nur, dass er es nciht als Nachricht bekommt *g*
Wo hat er das denn geschrieben?
Dann müsste er ja schon ein Programm wie Spy++ ausprobiert haben, um zu sehen das er die Nachricht nicht bekommen.
Er hat geschrieben, er bekommt sie nicht angezeigt. Ist ja auch egal