Text aus Textfile auf OwnerDraw-Button



  • rectBtn = GetClientRect()
    rectTxt = DrawText(...,DT_CALCRECT)

    y = rectBtn.top+(rectBtn.bottom-rectBtn.top)/2 - (rectTxt.bottom-rectTxt.top)/2



  • Vielleicht bin ich zu blööd dafür... Versteh gerade nur Bahnhof und Kofferklauen... 😞



  • Du hast zwei Rechtecke, gegeben durch jeweils zwei Punkte, von denen das eine im anderen vertikal zentriert werden soll ... mal es dir halt mal auf ein Blatt Papier auf.



  • Das mit der Berechnung an sich ist mir klar...

    Warum brauche ich GetClientRect()? Da brauche ich ein Fensterhandle,wobei ich verschiedene Button-Grössen habe... Kann ja sein, dass ich in der Gesamt-Struktur da schon Mist gebaut habe, aber jeder Button hat ein eigenes Fensterhandle.

    Die Grösse des Buttons hab ich doch schon über bm.bmWidth und bm.bmHeight.

    Was ich nicht verstehe, wie ich das Ergebnis aus y dann übergebe.... und da hänge ich am Fliegenfänger...



  • im welchem Teil deines cods Zeichnest du den den Text? Und warum hast den dann kein Handle? - das ergibt keinen Sinn.



  • Die Buttons an sich werden im OnCreate()gesetzt:

    /***********Reihe 1***************/
    	if (_wfopen(buttons[0].link , L"r") != 0){		// prüft ob die auszuführende Exe vorhanden ist. Falls nicht, wird der Button nicht angezeigt.
    		hWndBtn0 = CreateWindow( L"BUTTON", L"Button 1", WS_VISIBLE | BS_OWNERDRAW, 0, 33, 239, 62, hwnd, (HMENU)(IDM_BTN1+0), hInst, NULL); 	
    		hBM[0] = SHLoadDIBitmap(buttons[0].pic);
    	}
    	if (_wfopen(buttons[1].link , L"r") != 0){
    		hWndBtn1 = CreateWindow( L"BUTTON", L"Button 2", WS_VISIBLE | BS_OWNERDRAW, 241, 33, 239, 62, hwnd, (HMENU)(IDM_BTN1+1), hInst, NULL); 
    		hBM[1] = SHLoadDIBitmap(buttons[1].pic);
    	}
    

    In dieser Testversion wird die Buttongrösse noch fix gesetzt, allerdings soll die demnächst aus der Steuerdatei kommen...

    Die Bitmaps und der Text werden dann im OnDrawItem() gezeichnet:

    void OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT * lpDrawItem)
    {
    	RECT rc;
    	HDC hdc;
    	HDC hdcMem;
    	HBITMAP hBM0;
    	BITMAP bm;
    	int nIdx;
    
    	if (lpDrawItem->CtlID < IDM_BTN1 || lpDrawItem->CtlID > (IDM_BTN1+BUTTONMAX))
    		return;
    
    	nIdx = lpDrawItem->CtlID-IDM_BTN1;
    	rc = lpDrawItem->rcItem;
    	hdc = lpDrawItem->hDC;
    	hBM0 = hBM[nIdx];
    	hdcMem = CreateCompatibleDC(hdc);
    	SelectObject(hdcMem, hBM0);
    	GetObject(hBM0, sizeof(bm), &bm);
    	if (lpDrawItem->itemState & ODS_SELECTED) {									//  wenn geklickt wurde.
    		BitBlt(hdc, -2, -2, bm.bmWidth-0, bm.bmHeight-0, hdcMem, -2, -2, SRCCOPY);	// zeichnet den Button
    		DrawEdge(lpDrawItem->hDC, &rc, EDGE_SUNKEN, BF_TOPLEFT);			// 3-D-Anzeige, wenn geklickt
    	}
    	else {
    		BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);			// ungeklickter Button
    	}
    	SetBkColor (hdc, TRANSPARENT); 
    	SetBkMode(hdc, TRANSPARENT); 
    	SetTextColor(hdc, RGB(255,255,255));
    	SetRect(&rc, 50, 0, bm.bmWidth, bm.bmHeight);
    
    	/* draw the text on the button */
    
    	DrawText(lpDrawItem->hDC, buttons[nIdx].text, lstrlen(buttons[nIdx].text), &rc, DT_WORDBREAK | DT_CALCRECT); // DT_WORDBREAK
    	DrawText(lpDrawItem->hDC, buttons[nIdx].text, lstrlen(buttons[nIdx].text), &rc, DT_WORDBREAK | DT_LEFT); //DT_VCENTER );
    
    	DeleteDC(hdcMem);
    }
    

    so sieht das bei mir jetzt aus...



  • arbeite dich doch bitte erstmals durch ein WinAPI-Tutorial durch! - so ist das nur ein Rumpfuscherei.
    und im Übrigen zum Thema button-Handle:

    void OnDrawItem(HWND hwnd, const DRAWITEMSTRUCT * lpDrawItem)



  • Dann erst mal Danke für den Hilfeversuch. 👍

    Mal sehen, wie ich das hin bekomme...



  • Nur mal als Rückmeldung:

    Ich brauche kein GetClientRect() Das hat mich die ganze Zeit verwirrt...

    RECT rc, rcT;
    
    /* hier zwischen werden die Bitmaps auf die Buttons gezeichnet */
    
    	SetRect(&rc, 50, 0, bm.bmWidth, bm.bmHeight);
    
    	if (lstrlen(buttons[nIdx].text) > 3){      // Zeichnet Text nur, wenn mehr als 3 Zeichen
    	 	rcT.bottom = DrawText(lpDrawItem->hDC, buttons[nIdx].text, lstrlen(buttons[nIdx].text), &rc, DT_WORDBREAK | DT_CALCRECT | DT_LEFT | DT_EXPANDTABS | DT_NOPREFIX);
    
    		int textHeight = (bm.bmHeight/2 - rc.bottom/2);
    		SetRect(&rcT, 50, textHeight, bm.bmWidth, bm.bmHeight);
    		DrawText(lpDrawItem->hDC, buttons[nIdx].text, lstrlen(buttons[nIdx].text), &rcT, DT_WORDBREAK | DT_LEFT);
    	}
    

  • Mod

    Pitter (c) schrieb:

    Nur mal als Rückmeldung:

    Ich brauche kein GetClientRect() Das hat mich die ganze Zeit verwirrt...

    Du hast eigentlich noch gar nichtsverstanden!
    Dein ClientRect ist das sichtbare Areal von Deinem Cntrol.
    Wenn Du einen vernünftigen WM_PAINT Handler baust benötigst Du es immer!

    Was machst Du denn, wenn Dein Control von außen neu gezeichnet wird?
    Dein Weg auf irgendwelchen Font oder Bitmap Größen Annahmen zu machen ist falsch!

    Lies ein Tutorial...


Anmelden zum Antworten