Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Überprüfen ob Button auf Oberfl. vorhanden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.05.2003, 19:22 Uhr
~Thomas
Gast


Hi,
wie kann ich programmiertechnisch überprüfen, bevor ich mit Button.Create(..) einen Button erzeuge, ob ein Button bereits existiert bzw. ob er auf der Oberfläche ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.05.2003, 19:52 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,

C++:
if (GetDlgItem(0x3E8))
  MessageBox("Existiert");


Die Steuerelmente-ID, welche auf allen Rechnern gleich ist, kannst Du z.B. mit Spy++ ermitteln.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.05.2003, 09:07 Uhr
~Thomas
Gast


Hallo Uwe,
das Problem bei deinem Vorschlag ist, daß die Steuerelement-ID wenn man den Button einmal erzeugt hat in der Resource.h immer vorhanden ist, egal ob der Button nun auf der Oberfläche vorhanden ist oder nicht.
Bei mir gibt es die Problematik:
Der Hauptdialog wird aufgerufen ließt die Datenbank aus und setzt dann dementsprechend die Buttons auf den Dialog.

Nun kann ich mit der Re-Maustaste einen neuen Buttondialog öffnen, mit dem ich nun die Button aus oder einblenden kann. (Checkboxen)
Mit übernehmen schließe ich den Dialog (ONOK()).

Nun muss der Hauptdialog mit dieser neuen Situation umgehen;d.h.
wenn bereits z.B. Button1 auf der Oberfläche vorhanden ist und logischerweise im Buttondialog die Checkbox auf True gesetzt ist, jetzt aber
nochmal versucht wird den Button1 mit Create(...) zu erzeugen (da ja die Checkbox auf TRUE ist) stürzt mir das Programm natürlich ab.

Deshalb muss ich vorher überprüfen ob der Button schon auf der Oberfläche existiert.

Vielleicht fällt Dir oder einem Forumsteilnehmer eine Lösung dazu ein !

Gruß, Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.05.2003, 12:05 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,

Zitat:
~Thomas postete
das Problem bei deinem Vorschlag ist, ..................

Das stand aber nicht bei DEINER Frage mit beschrieben.
Dann schreib Dir z.B. eine Callback:

C++:
void CTestDlg::OnOK()
{
    //const char* ButtonName = "Button2";
    hWnd = AfxGetMainWnd()->m_hWnd;
    if (hWnd){
        if (::EnumChildWindows(hWnd,lpEnumWin,lParam)){
            myButton.Create("Button2",WS_CHILD|WS_VISIBLE|SS_CENTER|BS_PUSHBUTTON,
                CRect(10,20,100,70),this,IDC_B1);
        }
    }
    
    //CDialog::OnOK();
}

BOOL CALLBACK lpEnumWin(HWND hWnd, LPARAM lParam)
{
    char strBuffer[100];
    ::GetWindowText(hWnd,strBuffer,100);
    if(strcmp(strBuffer,ButtonName) == 0)
        return FALSE;
    return TRUE;
}


Das Handel mußt Du Dir natürlich vom aktuellen Fenster holen (bei mir hier ein Dialog).
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.05.2003, 13:13 Uhr
~Thomas
Gast


Danke für Deine Mühen.

Ich bin jetzt noch nicht so fix in C++ und bekomme bei der Impementierung dieses Codes von Dir:

HWND hWnd;
hWnd = AfxGetMainWnd()->m_hWnd;

if (hWnd)
{
if (::EnumChildWindows(hWnd,lpEnumWin,lParam))
{
Button1->Create ("Button2",WS_CHILD|WS_VISIBLE|SS_CENTER|BS_PUSHBUTTON,CRect(460,140,540,160),this,IDC_BUTTON2);
}
}

den Fehler:

c...\??.cpp(286): error C2664: 'EnumChildWindows' : Konvertierung des Parameters 2 von 'BOOL (HWND,LPARAM)' in 'WNDENUMPROC' nicht möglich

Kann damit nicht soviel anfangen.
Was mache ich falsch.

Gruß,Thomas
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.05.2003, 17:17 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Die Funktion BOOL CALLBACK lpEnumWin(HWND hWnd, LPARAM lParam)
muß global bereitgestellt werden, der LPARAM von EnumChildWindows(hWnd,lpEnumWin,lParam)) muß auch noch definiert werden, dann sollte die Sache funktionieren.
Wie bereits geschrieben mußt Du Dir ein gültiges Fensterhandle von Deinem Dialog besorgen, wo die Überprüfung stattfindet.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 24.05.2003 um 17:20 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: