Z
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