Design
-
:: NoName :: schrieb:
Ja, das ist so richtig. Stimmt denn was nicht ?
Gruß
:: NoName ::Ja, es geht nicht!
Es ist keine Änderung feststellbar!PS: Such bitte nochmal bei dir, irgendwo muss die Funktion ja aufgerufen werden
-
Das ist der Ärger mit 6.0 und 2003. Nichts geht mehr so wie
man es vorher gemacht hat. Und alte Projekte in 2003 kompilieren
bringt meist auch mehr Fehlermeldungen als man sich je hätte
vorstellen können.
-
@::NoName::
Wird Sie den nirgends aufgerufen (kann ich mir irgendwie nicht vorstellen!!) ?MfG,
D.Derigs
-
Gehe mal bitte hierhin, da findest du ein kleines Beispiel:
http://www.codeguru.com/Cpp/W-D/dislog/background/article.php/c1895/
-
Die Funktion wird nicht ausgeführt weil der Eintrag
ON_WM_CTLCOLOR()
in der Messagemap fehlt.sen
-
D.Derigs schrieb:
Wird Sie den nirgends aufgerufen (kann ich mir irgendwie nicht vorstellen!!) ?
Teste das doch einfach mal mit einer MessageBox()...?
Gruß
:: NoName ::
-
Es passiet nichts, auch nicht in einer MessageBox
.cpp:/ 2645z2erDlg.cpp : Implementierungsdatei // #include "stdafx.h" #include "2645z2er.h" #include "2645z2erDlg.h" #include ".\2645z2erdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CAboutDlg-Dialogfeld für Anwendungsbefehl 'Info' class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialogfelddaten enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung // Implementierung protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) ON_WM_CTLCOLOR() END_MESSAGE_MAP() // Cz2erDlg Dialogfeld Cz2erDlg::Cz2erDlg(CWnd* pParent /*=NULL*/) : CDialog(Cz2erDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void Cz2erDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(Cz2erDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel) END_MESSAGE_MAP() // Cz2erDlg Meldungshandler BOOL Cz2erDlg::OnInitDialog() { CDialog::OnInitDialog(); // Hinzufügen des Menübefehls "Info..." zum Systemmenü. // IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden // TODO: Hier zusätzliche Initialisierung einfügen return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten } void Cz2erDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // Wenn Sie dem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das // Dokument/Ansicht-Modell verwenden, wird dies automatisch ausgeführt. void Cz2erDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext zum Zeichnen SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // Symbol in Clientrechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // Die System ruft diese Funktion auf, um den Cursor abzufragen, der angezeigt wird, während der Benutzer // das minimierte Fenster mit der Maus zieht. HCURSOR Cz2erDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } HBRUSH Cz2erDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID() == IDC_123) { pDC->SetTextColor(RGB(0,0,2550)); // Setzt die Textfarbe auf blau HBRUSH hBrush = CreateSolidBrush(RGB(255,0,0)); //Setzt die Hintergrundfarbe auf rot return (HBRUSH) hBrush; } return hbr; } void Cz2erDlg::OnBnClickedCancel() { // TODO: Add your control notification handler code here
.h:
// 2645z2erDlg.h : Headerdatei // #pragma once // Cz2erDlg Dialogfeld class Cz2erDlg : public CDialog { // Konstruktion public: Cz2erDlg(CWnd* pParent = NULL); // Standardkonstruktor // Dialogfelddaten enum { IDD = IDD_Z2ER_DIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung // Implementierung protected: HICON m_hIcon; // Generierte Funktionen für die Meldungstabellen virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP() public: afx_msg void OnBnClickedCancel(); };
-
Du hast ON_WM_CTLCOLOR() in den AboutDialog eingefügt nicht in Cz2erDlg
-
Mein, Fehler!
Aber jetzt funktionierts!!!PS: Kann man das auch generell auf alles anwenden, nicht nur auf eine bestimmte Sache (z.B. alle Statics, alle Buttons, usw.)?
Vielleicht das if weglassen? (Werde ich zu gegebener Zeit auch probieren!)MfG,
D.Derigs
-
Du kannst das pWnd mit dynamic_cast casten.
Ist das Ergebnis des cast ungleich NULL, dann war es erfolgreich.
CButton* pBtn = dynamic_cast<CButton*>pWnd; if (pBtn) { // Es ist ein Button (Radiobutton, Checkbox oder normal) }
Dafür muss aber RTTI eingeschaltet sein!