Icon "vergrößern"...



  • Hat keiner mehr ne Idee?

    Das dürfte doch nicht allzu kompliziert sein...
    Hab schon auf allen einschlägigen Seiten gesucht, aber nichts gefunden...:\
    Ich will halt einfach nur ein HICON in ein CBitmap "laden", um StrechBlt darauf anwenden zu können...



  • JohnQ schrieb:

    Hat keiner mehr ne Idee? Das dürfte doch nicht allzu kompliziert sein...

    Ich dachte ich habe Dir die antwort schon gegeben!? Oder was geht nicht...
    Zitat: Entweder direkt laden oder: ...



  • Naja, das geht ja komischerweise auch nicht...
    Hier mal mein Code:

    BITMAP bm;

    CBitmap Bild1;
    	HBITMAP hBitmap; 
    	ICONINFO iconinfo; 
    	GetIconInfo(m_hBkIcon, &iconinfo); 
    	hBitmap = iconinfo.hbmColor; 
    	Bild1.FromHandle(hBitmap);
    
    	Bild1.GetObject( sizeof( bm ), &bm ); 
    	pDCMem->CreateCompatibleDC( &dc ); 
    	pDCMem->SelectObject( &Bild1 ); 
    	CRect Rect; 
    	GetClientRect( &Rect ); 
    	dc.SetStretchBltMode( HALFTONE ); 
    	dc.StretchBlt( 0, 0, Rect.right, Rect.bottom, pDCMem, 
    		0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY );
    

    Bild1.LoadBitmap(MAKEINTRESOURCE(m_hBkIcon));
    geht ja auch nicht...



  • WAS geht denn nicht? Was liefert GetIconInfo zurück? Was sagt dann GetLastError?



  • Es wird halt einfach nichts "gezeichnet"...
    GetLastError() ist, wenn ich es korrekt ausgegeben habe NULL!
    Hier mal die gesamte Funktion:

    void CMainWnd::OnPaint()
    {	
    	CPaintDC dc(this); // device context for painting
    
    	CDC* pDCMem = new CDC;
    	BITMAP bm;
    	CBitmap Bild1;
    
    	HBITMAP hBitmap; 
    	ICONINFO iconinfo; 
    	GetIconInfo(m_hBkIcon, &iconinfo); 
    	hBitmap = iconinfo.hbmColor; 
    	Bild1.FromHandle(hBitmap);
    
    	Bild1.GetObject( sizeof( bm ), &bm ); 
    	pDCMem->CreateCompatibleDC( &dc ); 
    	pDCMem->SelectObject( &Bild1 ); 
    	CRect Rect; 
    	GetClientRect( &Rect ); 
    	dc.SetStretchBltMode( HALFTONE ); 
    	dc.StretchBlt( 0, 0, Rect.right, Rect.bottom, pDCMem, 
    		0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY );
    }
    


  • Ok..ich habe nun 2 Möglichkeiten gefunden das Icon darzustellen...
    Dabei verzichte ich auf ein umwandeln in ein Bitmap...

    CRect Rect; 
    GetClientRect( &Rect ); 
    
    //1.Möglichkeit
    ::DrawIconEx (dc.GetSafeHdc(), Rect.right-Rect.bottom, 5, m_hBkIcon, Rect.bottom-10, Rect.bottom-10, 0, NULL, DI_NORMAL | DI_COMPAT);
    
    //2.Möglichkeit mit bestimmtem Effekt...
    dc.DrawState(CPoint(Rect.right-Rect.bottom, 5), CSize(999,999), m_hBkIcon, DST_ICON | DSS_UNION, &CBrush(RGB(128,128,128)));
    

    Während die 1.Möglichkeit problemlos funktioniert,
    wird bei Möglichkeit 2 das Icon immer in der Ausgangsgröße 32x32
    gezeichnet..egal was ich bei CSize(x,y) eingebe...
    Wo liegt hier der Fehler?
    Denn ein Vergrößern des Icons ist für meinen Zweck unumgänglich...

    Und die 2.Möglichkeit mit dem DrawStae wäre halt besser,
    weil ich dann z.B den DSS_UNION Effekt darauf anwenden kann...

    Ich möchte nämlich, dass das Icon wie eine Art Wasserzeichen dargestellt wird...Wenn das auch anderst geht, bin ich offen für Vorschläge...;)

    Also, wer kann mir helfen?



  • Kommt schon... 🙄

    ich komme einfach nicht weiter...
    Warum funktioniert denn das nicht!?



  • Jochen Kalmbach schrieb:

    Ich würde mal sagen Du musst das Icon mit LoadImage laden und dann mittels StretchBlt zeichnen...

    Also hier hast du doch schon die Antwort. Du machst dir zu viel Arbeit. Schau dir die zwei Funktionen mal genau an und du wirst feststellen das es so geht. 😮



  • Ok danke...

    Das habe ich schon probiert...
    Nur klappt folgendes nicht (es wird schlicht nichts gezeichnet):

    Bild1.GetObject( sizeof( bm ), &bm ); 
    hTemp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(m_hBkIcon), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR);
    Bild1.FromHandle(hTemp);
    pDCMem->SelectObject(Bild1);
    CRect Rect; 
    GetClientRect( &Rect ); 
    dc.SetStretchBltMode( HALFTONE ); 
    dc.StretchBlt( 0, 0, Rect.right, Rect.bottom, pDCMem, 
    	0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY );
    

    Jedoch wäre die DrawState Methode, wie bereits beschrieben,
    die beste Methode für mich, weil man damit einen
    gewissen Effekt auf das Icon anwenden kann (z.b grau melliert oder disabled)
    Ich vestehe nur nicht, weshalb ich bei DrawState die Größe des zu zeichnenden
    Icons nicht verändern kann...wie z.B CSize(99,99)

    Wenn mir da einer weiterhelfen könnte, oder eine andere Möglichkeit für
    den Effekt kennt wäre das wunderbar... 🕶



  • Wenn "m_hBkIcon" ein HICON ist dann ist es klar das es nicht klappt...
    Und bei dem alternativansatz hast Du mir immer noch nicht gesagt, was für ein eFehler wo genau kommt... somit bleibst Du mit Deinem Problem allein, wenn Du Dir nicht helfen lassen willst...



  • JohnQ schrieb:

    Während die 1.Möglichkeit problemlos funktioniert,
    wird bei Möglichkeit 2 das Icon immer in der Ausgangsgröße 32x32
    gezeichnet..egal was ich bei CSize(x,y) eingebe...
    Wo liegt hier der Fehler?

    Kann dir sagen woran das liegt. Du kannst mit der DrawState Methode einfach nicht Strechen. Dafür ist sie nicht vorgesehen. Dafür gibt es ja die Strechte Methode um genau das zu machen.

    JohnQ schrieb:

    Nur klappt folgendes nicht (es wird schlicht nichts gezeichnet):

    Was heißt es wird nichts gezeichnet? Was siehst du denn. Schwarz, Weiß, oder garnichts. 😕

    Jochen Kalmbach schrieb:

    Wenn "m_hBkIcon" ein HICON ist dann ist es klar das es nicht klappt...

    Genau das dachte ich mir auch gerade 😃



  • Kann dir sagen woran das liegt. Du kannst mit der DrawState Methode einfach nicht Strechen. Dafür ist sie nicht vorgesehen. Dafür gibt es ja die Strechte Methode um genau das zu machen.

    Hm...gibt es denn eine Möglichkeit DrawState und StretchBlt zu kombinieren?
    So das quasi erst nur ein vergrößertes Abbild des Icons in den Speicher kopiert wird..und dann irgendwie DrawState darauf angewendet wird?

    Wenn "m_hBkIcon" ein HICON ist dann ist es klar das es nicht klappt...

    Ich vermute mal, dass das ganze nicht klappt aufgrund der Kombination von HBITMAP und ::LoadImage(...IMAGE_ICON...)...
    Aber das war ja auch meine Frage, wie ich ein Icon in ein Bitmap umwandle... 😕



  • Also ich bin nochmal..
    Vielleicht hab ich mich ein bischen schlecht ausgedrückt... 🙄
    Ich würde gerne folgendes machen wollen:

    - Ich habe ein HICON als "Ausgangspunkt"
    - Nun möchteich dieses 32x32 Icon nicht einfach "normal" hinzeichnen, sondern verändert:

    - Es soll vergrößert sein (z.B 100x100)
    - Alle nicht weißen Stellen des Icons sollen mit einem bestimmten Brush/einer bestimmten Farbe gezeichnet werden...>>> wie beim DSS_UNION von dc.DrawState(...)
    Beispiele: http://img432.imageshack.us/img432/4018/icons2uz.jpg

    > Hier habe ich DrawState verwendet, jedoch kann man damit ja nicht "vergrößern"...

    Hat jemand ne Lösung für mein Problem..!?
    Ist sowas überhaupt möglich?

    mfg


Anmelden zum Antworten