Design



  • Hmm, bei Visual Studio 2003 kenn ich mich leider nicht aus. Aber irgendwo muss
    der ClassWizard vorhanden sein, such mal danach in allen Menüpunkten.

    Gruß
    :: NoName ::



  • Es gibt nur 'Add Class...' aber keinen 'ClassWizard', hab in allen Menüpunkten und fast allen Kontextmenüs gesucht...



  • Hmm, dann musst du die WM_CTLCOLOR wohl manuell hinzufügen:

    1. Füge in deiner CTestDlg.h folgenden Eintrag unter allen afx_msg's über der Message Map ein
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    
    1. Füge diesen Code in deiner CTestDlg.cpp ein
    HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	// TODO: Change any attributes of the DC here
    
    	// TODO: Return a different brush if the default is not desired
    	return hbr;
    }
    

    Dann noch alles kompilieren und weiterproggen 🤡

    Gruß
    :: NoName ::



  • Und was kann man da jetzt reinschreiben und was hat das für eine Wirkung?
    (Nur der Komplettierung halber!!)

    MfG,
    D.Derigs



  • Ist es so in der Headderdatei richtig?
    [cpp]
    // X-CryptDlg.h : Headerdatei
    //

    #pragma once
    #include "afxwin.h"
    #include "afxcmn.h"

    class CXCryptDlgAutoProxy;

    // CXCryptDlg Dialogfeld
    class CXCryptDlg : public CDialog
    {
    DECLARE_DYNAMIC(CXCryptDlg);
    friend class CXCryptDlgAutoProxy;

    // Konstruktion
    public:
    CXCryptDlg(CWnd* pParent = NULL); // Standardkonstruktor
    virtual ~CXCryptDlg();

    // Dialogfelddaten
    enum { IDD = IDD_XCRYPT_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung

    // Implementierung
    protected:
    CXCryptDlgAutoProxy* m_pAutoProxy;
    HICON m_hIcon;

    BOOL CanExit();

    // Generierte Funktionen für die Meldungstabellen
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HBRUSH OnCtlColor(CDC pDC, CWnd pWnd, UINT nCtlColor);**
    afx_msg HCURSOR OnQueryDragIcon();
    afx_msg void OnClose();
    virtual void OnOK();
    virtual void OnCancel();
    DECLARE_MESSAGE_MAP()
    public:
    afx_msg void OnBnClickedButton1();
    afx_msg void OnBnClickedButton2();
    afx_msg void OnEnChangeEdit3();
    CEdit mkey;
    afx_msg void OnBnClickedButton3();
    afx_msg void OnBnClickedButton4();
    afx_msg void OnBnClickedButton8();
    afx_msg void OnNMCustomdrawStatus(NMHDR *pNMHDR, LRESULT *pResult);
    CProgressCtrl mstatus;
    CStatic micon;
    CButton mbutton;
    afx_msg void OnStnClickedKeycr();
    CStatic m_static;
    };
    [/cpp]



  • Naja, wie du geschrieben hast, kannst du jetzt folgenden Code einfügen

    if (pWnd->GetDlgCtrlID() == ID_DEINES_STATICS) 
        { 
            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; 
        }
    

    Damit kannst du zwar keinen ganzen Dialog fürben, aber immerhin Statics, Edits etc.

    Gruß
    :: NoName ::



  • Ja, das ist so richtig. Stimmt denn was nicht ?

    Gruß
    :: NoName ::



  • :: 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! ⚠


Anmelden zum Antworten