API - Button



  • Moin @ all

    Ich habe ein Problem mit einem API - Programm. Ich habe hier ein Programm geschrieben das wenn es sich Startet und der Anwender mit der Maus in das Fenster Klickt einen Text an der Stelle ausgibt.

    Ich würde jetzt gerne in das Fenster in dem der Text ausgegeben wird eine Schaltfläche einrichten. Doch genau hier ist das Problem: wie mache ich das? In der MFC gibt es eine Klasse "CButton" - die kann ich hier aber nicht verwenden. bzw wenn ich sie verwende hab ich schwierigkeiten einen Zeiger auf CWnd auf das Eltern-Fenster zu bekommen - HWND kann nicht ind CWnd portiert werden, und This - funktioniert auch nicht.

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hRrevInstance,             LPSTR lpCmdLine, int nCmdShow)
    {
       WNDCLASS MyCl;
       MSG Message;
       HWND hWindow;
    
       memset(&MyCl,0,sizeof(MyCl));
    
       MyCl.style= CS_HREDRAW | CS_VREDRAW;
       MyCl.lpfnWndProc=WndProc;
       MyCl.hInstance=hInstance;
       MyCl.hbrBackground=(HBRUSH) (COLOR_WINDOW+1/20);
       MyCl.hCursor=LoadCursor(NULL, IDC_ARROW);
       MyCl.lpszClassName="Name";
    
       if(!RegisterClass(&MyCl))
          return (FALSE);
    
       hWindow=CreateWindow("Name","Titel", WS_OVERLAPPEDWINDOW,                   10,10,400,300,NULL,NULL, hInstance, NULL);
    
       ShowWindow(hWindow, nCmdShow);
       UpdateWindow(hWindow);
    
       while(GetMessage(&Message, NULL,0,0))
       {
          TranslateMessage(&Message);
          DispatchMessage(&Message);
       }
    
       return (Message.wParam);
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage,WPARAM wParam,              LPARAM lParam)
    {
    
       char Hallo[30] = "Hallo!";
       HDC dc;
    
       switch(uiMessage)
       {
       case WM_LBUTTONDOWN: dc = GetDC(hWnd);
          TextOut(dc, LOWORD(lParam), HIWORD(lParam) ,Hallo, strlen           (Hallo));
    
          ReleaseDC(hWnd,dc);
    
          return 0;
       case WM_DESTROY: PostQuitMessage(0);
          return 0;
    
       default: return DefWindowProc(hWnd, uiMessage, wParam, lParam);
       }
    }
    

    Wäre toll wenn da jemand wüsste wie ich einen Button einbaun kann und mir vieleicht den Completten-Code zurück postet...

    Vielen Dank dafür Schon mal,..

    MFG Granny



  • 1. was da CWnd->hwnd angeht CWnd::m_hWnd ist das Handle;

    und du musst glaub ein Fenster erzeugen mit CreateWindow("BUTTON",...). aber ich hab das noch nie gemacht, sry



  • Hi,
    Du brauchst n Msg-Handler für WM_CREATE, da erstellst du den Button mit CreateWindow(Ex)

    case WM_CREATE:
        hbtnOk = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("BUTTON"), TEXT("Text des Buttons"),
                                WS_CHILD | WS_VISIBLE, 100, 100, 100, 20, hWndParent, NULL,
                                ((LPCREATESTRUCT)lParam)->hInstance, NULL);
        // hbtnOk ist vom Typ HWND und sollte statisch sein!
        // Weiteres...
        break; // bzw. return (0);
    


  • @ESS_CB:

    ESS_CB schrieb:

    1. was da CWnd->hwnd angeht CWnd::m_hWnd ist das Handle;

    und du musst glaub ein Fenster erzeugen mit CreateWindow("BUTTON",...). aber ich hab das noch nie gemacht, sry

    Ich glaube aber m_hWnd ist private!

    nochmal @Grandmother:
    Du solltest dir mal ein WinAPI Tutorial anschauen 😉



  • CodeFinder schrieb:

    Ich glaube aber m_hWnd ist private!

    nö, public.

    Greetz, Swordfish



  • Vielen Dank für die Schnellen Antworten ,- die Idee der CreateWindowEx Methode bei der Beantwortung der WM-CREATE Nachricht find ich klasse.

    Eine weitere Frage:

    Angenommen ich binde mithilfe dieser Methode einen Standart-Button in mein Programm ein, wie heißt dann meine Funktion die Aufgerufen wird um die WM_LBUTTONDOWN Nachricht für diesen Button zu Beantworten?

    Im Klartext: Wie Beantworte ich bei solchen Standart-Buttons die Nachrichten? Welche Funktion muss ich aufsetzen?

    ---

    Ich habe einen eigenen Button entwickelt --- (sieht ganz schön scheiße aus) --- aber damit kann ich Nachrichten beantworten denn mit dem Aufruf von

    WNDCLASS B;
       B.lpfnWndProc=Funktion;
    

    konnte ich eine Funktion festlegen die für dieses Steuerelement aufgerufen wird. In dieser Funktion hab ich dann einfach die WM_LBUTTONDOWN Nachricht abgefangen und beantwortet.

    Wäre klasse wenn da jemand eine Lösung wüsste.

    MFG Granny



  • Ich glaube aber m_hWnd ist private!

    Nein. Ist es nicht. Aber trotzdem sollte man die GetSafeHwnd Funktion nutzen...



  • Granny schrieb:

    Angenommen ich binde mithilfe dieser Methode einen stan****-Button in mein Programm ein, wie heißt dann
    meine Funktion die Aufgerufen wird um die WM_LBUTTONDOWN Nachricht für diesen Button zu Beantworten?
    MFG Granny

    Ich weiß zwar nicht warum du das machen willst, aber Buttons sind u.a. Std-Win-Controls, die haben ihre
    eigene fertige WndProc. Wenn du unbedingt an die WndProc dran musst, um die WM_LBUTTONDOWN-Nachricht
    abzufangen, musst du Subclassen.

    Denke aber du meinst eher das Abfangen der eingehenden Befehle (sprich: jmd klickt auf den Button)...das
    geht mit WM_COMMAND in der WndProc deines Hauptfensters.
    In LOWORD von wParam steht dann die Button-ID zum identifizieren;
    BTW: Da fällt mir grade auf, die hab ich in meine Post vorhin vergessen, so isses richtig:

    // irgend wo im globalen Scope:
    #define BTN_OK 7000
    // in der WndProc deines Haupfensters:
    case WM_CREATE:
        hbtnOk = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("BUTTON"), TEXT("Text des Buttons"),
                                WS_CHILD | WS_VISIBLE, 100, 100, 100, 20, hWndParent, reinterpret_cast<HMENU>(BTN_OK),
                                ((LPCREATESTRUCT)lParam)->hInstance, NULL);
        // hbtnOk ist vom Typ HWND und sollte statisch sein!
        // Weiteres...
        break; // bzw. return (0);
    


  • (D)Evil schrieb:

    Ich glaube aber m_hWnd ist private!

    Nein. Ist es nicht. Aber trotzdem sollte man die GetSafeHwnd Funktion nutzen...

    Jaja, der MFC-Guru, ich habs nit mit MFC, aber wenn wir schon dabei sind...warum ist denn der Handle von GetSafeHwnd 'safe' ?

    PS: Das hat mir Swordfish schon gesagt :p .



  • Vielen Dank - es funktioniert,..

    MfG Granny


Anmelden zum Antworten