FAQ Eintrag?! Button übermalen



  • Hi,
    nachdem ich mich ewig damit rumgequält habe wie man einen XP Style Button mit einem eigenen Icon belegen kann, dachte ich mir das wär doch mal was für die FAQ.

    Erst einmal für alle VC++2008 Express nutzer die das XP-Style nutzen wollen aber net wissen wie:
    blub.exe.manifest

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly
      xmlns="urn:schemas-microsoft-com:asm.v1"
      manifestVersion="1.0">
    <assemblyIdentity
        name="VC.Apps.BLUB"
        processorArchitecture="x86"
        version="1.0.0.0"
        type="win32"/>
    <description>BLUB</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="x86"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    

    diese manifestdatei unter Projekt->Eigenschaften->Eingabe als zusätzliche manifestdatei angeben.

    Im Projekt->Linker->Eingabe die library comctl32.lib einbinden. Weiter in der "stdafx.h" (oder falls ihr ohne Vorkompilierten header arbeitet in eurer main.cpp) den header mit

    #include <commctrl.h>
    

    einbinden.

    Das ganze ein der main loop mit:

    InitCommonControls()
    

    initialisieren.

    Jetzt den XP-Button erstellen (in der entsprechenden WNDPROC) und subclassen:

    hPipette=CreateWindowA("button","HAllo",BS_PUSHBUTTON|WS_CHILD,10,10,40,40,hWnd,NULL,hGlobalInstance,NULL);
    ShowWindow(hPipette,SW_SHOWNORMAL);
    
    OLDBUTTONPROC=(WNDPROC)SetWindowLongPtr(hPipette,GWL_WNDPROC,(LONG_PTR)newButtonProc);
    SendMessage(hPipette,WM_CREATE,(WPARAM)NULL,(LPARAM)NULL);
    

    Jetzt kommt die neue Callback fkt:

    LRESULT CALLBACK newButtonProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static HICON hPipette;
    
    switch(message){
    case WM_CREATE:
    
    /*Diese WM_CREATE msg wird von mir ^^ manuell aufgerufen, es hätte genausogut eine eigen definierte msg sein können*/
    
    //ein bissl transparenz schadet der optik net
    hPipette=(HICON)LoadImage(hGlobalInstance,MAKEINTRESOURCE(IDI_CURSOR_PIPETTE) ,IMAGE_ICON,18,22,LR_LOADTRANSPARENT);
    
    return 0;
    	}
    case WM_PAINT:
    {
    //erst einmal den button von der original fkt zeichnen lassen
    int ret=CallWindowProc(OLDBUTTONPROC,hWnd,message,wParam,lParam);
    
    /*um nun über den button zu zeichnen müssen wir windoof mitteilen wo welcher 
    rect wohl nicht mehr gültig ist, in diesem Fall der ganze button, denn der icon
     ist nur in der mitte nicht transparent */
    RECT rect;
    rect.left=0;
    rect.top=0;
    rect.bottom=40;
    rect.right=40;
    //bloß nicht den background löschen, aber das invalide rect mitteilen
    InvalidateRect(hWnd,&rect,FALSE);
    
    PAINTSTRUCT ps;
    
    //jetzt können wir malen nach zahlen
    HDC hdc=BeginPaint(hWnd,&ps);
    
    DrawIcon(hdc,5,5,hPipette);
    
    EndPaint(hWnd,&ps);
    
    return 0;
    }
    //sonstiges 
    default: return CallWindowProc(OLDBUTTONPROC,hWnd,message,wParam,lParam);
    }
    return 0;
    }
    

    So, fertig und text wird auch angezeigt.

    Seid gegrüßt


Anmelden zum Antworten