Play / Stop Buttons in VS / Win32



  • Hallo,

    ich möchte Prozesse in meinem Programmablauf mit schönen Play / Pause / Stop Buttons steuern.

    1. Gibt es dafür in Win32 oder Visual Studio 2008 geeignete Vorlagen?

    Da ich keine finden konnten habe ich mir .ico Dateien besorgt, sie in mein Projekt eingebunden und folgendes versucht:

    HICON playico = LoadIcon(hInst, MAKEINTRESOURCE(IDI_PLAY));
    SendMessage(GetDlgItem(hDlg,IDC_BUTTON1), BM_SETIMAGE, IMAGE_ICON, (LPARAM)playico);
    
    1. Dabei wird dann das Symbol in den Button gemalt, erstens passt aber die Größe nicht (kann man sicher leicht beheben) aber zweitens möchte ich den Knopf durch das Icon ersetzen. Kann mir da jemand helfen?

    Danke!



  • Zu 1):
    Diesen Punkt überspringe ich mal
    Ich selber würde hier im Internet nach frei nutzbaren Icons suchen. Gibts in Massen zuhauf.
    Oder natürlich auch selbst entwerfen, je nach Zeit und Kreativität.

    Zu 2):
    Es gibt mehrere Möglichkeiten:
    Möglichkeit a): Die Größe des Buttons an die Größe des Icons anpassen
    Am besten in WM_INITDIALOG z.B. mit MoveWindow( GetDlgItem( hwnd_dialog, IDC_BUTTON ), ... ).

    Möglichkeit b): Die Größe des Icons an die Größe des Buttons anpassen
    Ich setze mal voraus, der Button hat den Stil SS_BITMAP.
    Dazu kombinierst Du zusätzliche Stile (per verODERung):
    SS_REALSIZECONTROL
    SS_CENTERIMAGE
    SS_REALSIZEIMAGE
    In der MSDN bzw. Online-Hilfe sind diese Stile erklärt.
    Diese 3 Möglichkeiten ergeben insgesamt 8 Kombinationsmöglichkeiten, probiere sie einfach alle nacheinander durch.

    Wenn Dir diese von Windows bereitgestellten automatischen Pixel-Stretchings nicht ganz zusagen, dann bleibt Dir noch ein von Dir maßgeschneidertes StretchBlt() zur Verfügung.
    Damit kannst Du alles abdecken was Dehnen/Stauchen des Bitmaps betrifft.

    Bitte beachte auch die User-spezifischen Einstellungen hinsichtlich der Display-Auflösung.
    Meistens ist auf PC der Defaultwert 96ppi voreingestellt. Kann aber leicht auf z.B. 120ppi oder 144ppi vergrößert werden, d.h. die Buttons werden automatisch um einige Pixel größer, aber Deine abgelegten Icon-Daten bleiben natürlich unverändert klein!

    Zu 2): Knopf durch Icon ersetzen:
    Ich vermute mal, Du möchtest den störenden 3D-Rand des Buttons entfernen?
    Dafür hast Du 2 Möglichkeiten:
    Nimm statt den Button-Control ein Static-Control mit Stil SS_BITMAP und SS_NOTIFY. Da mußt Du selbst die Mausklick-Nachrichten auswerten! (Die Tastatur-Bedienung mit Tab oder Return usw. sind gar nicht berücksichtigt!)
    Oder besser: Entferne vom Button-Control einige Fensterstile wie z.B. WS_BORDER, WS_EX_CLIENTEDGE oder WS_EX_WINDOWEDGE.

    HTH,
    Martin


  • Mod

    Oder Du baust selber einen Ownerdraw button.

    Dafür gibt es einige Implementierungen:
    http://www.codeproject.com/KB/buttons/nativewin32xpthemes.aspx
    http://www.codeproject.com/KB/buttons/odib.aspx



  • Danke für die sehr ausführliche Antwort, werde das mal versuchen umzusetzen.



  • Mmacher schrieb:

    Oder besser: Entferne vom Button-Control einige Fensterstile wie z.B. WS_BORDER, WS_EX_CLIENTEDGE oder WS_EX_WINDOWEDGE.

    Kurze Nachfrage, wie mache ich das?

    Bei mir steht:

    playButton = CreateWindow("BUTTON", NULL, WS_CHILD | BS_PUSHBUTTON | BS_ICON | WS_VISIBLE, 155, 480, 50, 50, mainwnd, (HMENU)IDC_PLAYBUTTON, hInst, NULL);
    

    Aber ich denke, das z.B. WS_BORDER in Fenstertyp "BUTTON" schon integriert ist. Wie bekomme ich das da wieder raus?


  • Mod

    Ein Button hat keine WS_BORDER! Ein Button wird immer als Ganzes gezeichnet, der Stil wird vom Windows entsprechenden Layout vorgegeben.


Anmelden zum Antworten