CBitmapButton + AutoLoad funktioniert nicht - warum ?
-
Sers Leutz ;),
ich hab hier n sonderbares Problem mit CBitmapButton und AutoLoad obwohl ich alles nach Buch mache bekomm ich immer wieder die selben Fehler.
Ich hanb eine Dlg-Anwendung angelegt un einen Butten (IDC_BUTTON1) draufgelegt.
In den Eigenschaften des Buttons hab ich Benutzerzeichnung aktiviert.
Die Kontextabhängige Hilfe ist nur wegen der Bitmaps dabei die standardmäßig ins Ressourceverzeichnis kopiert werden.
Ich habe eine Bitmapressource eingefügt ("BUTTD").
Im Konstruktor meines Dlg hab ichprivate:CBitmapButton m_Bild;eingefügt.
In OnInitDialog habe ichVERIFY(m_Bild.AutoLoad(IDC_BUTTON1),this);eingefügt.
Obwohl ich alles genau nach Buch mache bekomm ich folgende Fehlermeldungen :
warning C4002: Zu viele uebergebene Parameter für das Makro 'VERIFY'
error C2065: 'm_Bild' : nichtdeklarierter Bezeichner
error C2228: Der linke Teil von '.AutoLoad' muss eine Klasse/Struktur/Union seinHier mal der ganze Quellcode der ...DLG.cpp:
// DLGBitmapButtonDlg.cpp : Implementierungsdatei // #include "stdafx.h" #include "DLGBitmapButton.h" #include "DLGBitmapButtonDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info" class CAboutDlg : public CDialog { //***************************************************************************************************************************** //***************************************************************************************************************************** private: CBitmapButton m_Bild; //***************************************************************************************************************************** //***************************************************************************************************************************** public: CAboutDlg(); // Dialogfelddaten //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // Vom Klassenassistenten generierte Überladungen virtueller Funktionen //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung //}}AFX_VIRTUAL // Implementierung protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // Keine Nachrichten-Handler //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDLGBitmapButtonDlg Dialogfeld CDLGBitmapButtonDlg::CDLGBitmapButtonDlg(CWnd* pParent /*=NULL*/) : CDialog(CDLGBitmapButtonDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDLGBitmapButtonDlg) // HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein //}}AFX_DATA_INIT // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CDLGBitmapButtonDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDLGBitmapButtonDlg) // HINWEIS: Der Klassenassistent fügt an dieser Stelle DDX- und DDV-Aufrufe ein //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDLGBitmapButtonDlg, CDialog) //{{AFX_MSG_MAP(CDLGBitmapButtonDlg) ON_WM_SYSCOMMAND() ON_WM_DESTROY() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDLGBitmapButtonDlg Nachrichten-Handler BOOL CDLGBitmapButtonDlg::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 // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen //***************************************************************************************************************************** //***************************************************************************************************************************** VERIFY(m_Bild.AutoLoad(IDC_BUTTON1),this); //***************************************************************************************************************************** //***************************************************************************************************************************** return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten } void CDLGBitmapButtonDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } void CDLGBitmapButtonDlg::OnDestroy() { WinHelp(0L, HELP_QUIT); CDialog::OnDestroy(); } // Wollen Sie Ihrem 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 für Sie erledigt. void CDLGBitmapButtonDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext für Zeichnen SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Symbol in Client-Rechteck 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 Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer // das zum Symbol verkleinerte Fenster mit der Maus zieht. HCURSOR CDLGBitmapButtonDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; }Vielen dank für eure Mühe

Shadoweater
-
Der Name der Bitmap Ressourcen, die verwendet werden sollen, muss als Button text vergeben werden.
Ist der Button-Text "BUTT", dann benötigst Du 4 Bitmaps:
BUTTU, BUTTD, BUTTF, BUTTX!
-
Danke für Deine Antwort Martin ;),
was muss ich tun um nur eine Bmp. verwenden zu müssen ?

ShadowEater
-
Neicht Autoload verwenden sondern eben LoadBitmaps und dann eben 4 mal die gleiche angeben. Aber wie soll der User dann sehen, dass er drauf geklickt hat?
-
Danke für Deine Antwort Martin.
Ich will die Bmp als Verzierung verwenden.regards

ShadowEater