WIN32 API Wie komm ich an den Handle ran

elfvyn

Mitglied
Also ich hab ein Childfenster offen in dem sich neben vielen Steuerelementen ein Button befindet. In meiner Child-Nachrichtenverarbeitung komme ich aber nicht an den Handle dieses Buttons ran und global kann ich diesen nicht machen. Nun will ich aber das etwas passiert wenn ich ihn betätige
Wie komme ich an den Button ran Gibt doch bestimmt eine möglichkeit über Mouseposition oder sowas vielleicht sogar viel einfacher?
(Also die anderen Steuerelemente habe ich noch nicht bearbeitet, aber dort werde ich wohl auf das gleiche Problem stoßen)

thx schonmal im vorraus
 
Wenn du das HWND des Child-Dialoges und die ID des Buttons hast, kannst du dir über GetDlgItem das HWND des Buttons holen.

Aber mit der Funktion, wenn der Button gedrückt wird, wird es etwas schwerer. Der Button sendet das einfach zu dem Child-Dialog, und nur dahin.
Hast du denn keinen Zugriff auf die DlgProc bzw. WindowProc des Child-Dialoges? Dort musst du nur auf WM_COMMAND warten. wParam setzt sich dann aus der ID des Buttons und der Notification Nachricht (in dem Fall BN_CLICKED, welches den Wert 0 hat) zusammen. lParam enthält das auf LPARAM gecastete HWND des Buttons.

Das würde so aussehen:

Code:
switch ( uMsg )
{
  case WM_COMMAND
    if ( ( LOWORD( wParam ) == ID_MEIN_BUTTON )
    && ( HIWORD( wParam ) == BN_CLICKED ) )
    {
      // jemand hat einfach so auf meinen Button geklickt!
    }
    break;
}
 
Also ich habe meinen Button mit createWindow() in meinem Child Fenster aufgebaut genau wie die anderen Elemente auch alle Ich kann auf die Nachrichtenroutine des Childfensters zugreifen hab dort aber wie schon gesagt nicht den handle auf die elemente da ich ja nichts an die Nachrichtenroutine herkömmlich übergeben kann und global dürfen die handel nicht sein. ID's wie bei MFC habe ich bisher nicht angelegt Wie soll ich das denn machen, denn in createWindow() ist ja auch nichts von einer ID drin?
 
Ich hab schonmal sowas gemacht.... um an die elemente von einem Baum ranzukommen :
Code:
  {
        switch(((LPNMHDR)lParam)->code)
        {
          case NM_CLICK:
          {
            POINT point;
     			  TVHITTESTINFO info;
     			  HTREEITEM itemClicked=NULL;
            
     			  //Mausposition holen
     			  DWORD mousepos = GetMessagePos();
     			  //Koordinaten extrahieren (Bildschirmkoordinaten)
     			  point.x = ((int)(short)LOWORD(mousepos));
     			  point.y = ((int)(short)HIWORD(mousepos));
     			  //In Fensterkoordinaten umwandeln
     			  ScreenToClient(hWndTreeView,&point);
     			  //Item herausfinden
            info.pt.x=point.x;
            info.pt.y=point.y;
            info.flags=TVHT_ABOVE ;

     			  itemClicked = TreeView_HitTest(hWndTreeView, &info);
     			  //und jetzt kannst Du das Item verwenden
            
                 
            
          }
          break;
 
Bei CreateWindow kannst du die ID mit übergeben. Bei Child-Windows ist der HMENU-Parameter die ID. Die musst du auf HMENU casten.

// die 17 ist die ID des Fensters:
CreateWindow( "Wutz", "Schniedel", WS_CHILD | WS_VISIBLE, 10, 10, 200, 30, hwndParent, (HMENU)17, hInstance, 0 );
 
Zurück