Text in Static Textfeld um x Pixel nach unternverschieben



  • Hi, wie schon im Titel erwähnt, möchte ich meinen Text um x Pixel nach unten verschieben.

    Den Text des Fensters setzte ich zur Zeit mit:

    ...
    SetWindowText(hwndStaticHead[0], sz);
    SendMessage(hwndStaticHead[0], WM_SETFONT, (WPARAM) hFontS11B, MAKELPARAM(1, 0));
    ...
    

    Das klappt auch wunderbar. Jetzt würd ich gerne nur noch, dass ich den Text nicht oben im Fenster stehen hab, sondern ein paar Pixel weiter unten.

    Das Fenster wird so erstellt:

    ...
    hwndStaticHead[0]  = CreateWindow(TEXT("static"), "", WS_CHILD | WS_VISIBLE, 0,  0, 500, 20, hwnd, 0, hInstance, NULL);
    ...
    

    Gibt es vielleicht bei WS_CHILD | WS_VISIBLE noch ein Zusatz der den Text unten im Fenster anordnet, welchen ich dann übersehen hab 😉

    Oder kennt jemand vielleicht eine andere Möglichkeit?

    Vielen Dank schonmal 🙂



  • Also Du kannst die Textposition nicht frei wählen, sondern musst Dich auf ein paar Flags beschränken: Static Control Styles (siehe dort beispielsweise SS_CENTER etc., diese werden beim Aufruf von CreateWindow(Ex) als Style-Flag mit angegeben). Wenn Dir das nicht reicht, musst Du das Control via Ownerdraw selbst zeichnen (siehe Google, Forumsuche, ...).



  • Also Du kannst die Textposition nicht frei wählen, sondern musst Dich auf ein paar Flags beschränken: Static Control Styles (siehe dort beispielsweise SS_CENTER etc., diese werden beim Aufruf von CreateWindow(Ex) als Style-Flag mit angegeben). Wenn Dir das nicht reicht, musst Du das Control via Ownerdraw selbst zeichnen (siehe Google, Forumsuche, ...).

    Sowas hatte ich mir fast schon gedacht, naja dann muss ich das wohl mal selbst versuchen zu zeichnen.
    Danke für die schnelle Antwort, hier gehts ja echt schnell *freu*.



  • ...
    case WM_PAINT:
    hdc = BeginPaint(hwnd, &ps);
    GetWindowRect(hwnd, RectWnd);
    hdcMem = CreateCompatibleDC(hdc);
    hBitmapTrans = CreateCompatibleBitmap(hdc, RectWnd->right - RectWnd->left, RectWnd->bottom - RectWnd->top);
    GetObject(hBitmapTrans, sizeof (BITMAP), &bitmap);
    cxSource = bitmap.bmWidth;
    cySource = bitmap.bmHeight;
    SelectObject(hdcMem, hBitmapTrans);
    BitBlt (hdc, 0, 1, cxSource, cySource, hdcMem, 0, 0, SRCCOPY);
    DeleteDC(hdcMem);
    EndPaint(hwnd, &ps);
    IsDraw = FALSE;
    break;
    ...
    

    hwnd ist das Fenster. Ich hätte gedacht, das ich damit den Inhalt "abfotografiere" und 1 Pixel nach untenschiebe. Aber irgendwie wird das Fenster nur schwarz. Kann mir jemand sagen, was falsch ist, bzw. wo mein Denkfehler liegt?



  • Compufreak[C++] schrieb:

    hwnd ist das Fenster. Ich hätte gedacht, das ich damit den Inhalt "abfotografiere" und 1 Pixel nach untenschiebe. Aber irgendwie wird das Fenster nur schwarz. Kann mir jemand sagen, was falsch ist, bzw. wo mein Denkfehler liegt?

    Ne. Du musst das auch auf 'das Control beziehen', d.h. Du musst sublcassen, siehe hier: http://winapi.net/index.php?inhalt=s27
    (Oder ist das schon der 'Sub-Class-Code' ? 🙄 "hwnd ist das Fenster." ist etwas ungenau, welches Fenster denn ? (Parent oder das Static-Fenster))
    Du musst ja dann updaten ( ➡ WM_PAINT), wenn es das Static-Control benötigt, nicht das Parent-Fenster.

    PS: Man soll das vorherige Objekt, was in einem HDC drin ist, wieder herein selektieren, siehe MSDN-Infos zu SelectObject, in der Remarks-Section. Das hast Du nicht gemacht.



  • Das ist alles schon Sub-Class-Code, sry war wirklich nicht klar erkenntlich. Ich werd das mal kurz testen. Danke erstmal.



  • Ich glaub die Idee kann ich auch verwerfen, denn irgendwie klappt das nicht richtig.

    Mein neuer Code

    hdc = BeginPaint(hwnd, &ps);
    GetWindowRect(hwnd, &RectWnd);
    hdcMem = CreateCompatibleDC(hdc);
    hBitmapTrans = CreateCompatibleBitmap(hdc, RectWnd.right, RectWnd.bottom);
    cxSource = RectWnd.right;
    cySource = RectWnd.bottom;
    hold = SelectObject(hdcMem, hBitmapTrans);
    BitBlt (hdcMem, 0, 0, cxSource, cySource, hdc, 0, 0, SRCCOPY);
    
    BitBlt (hdc, 0, 1, cxSource, cySource, hdcMem, 0, 0, SRCCOPY);
    
    SelectObject(hdcMem, hold);
    DeleteDC(hdcMem);
    EndPaint(hwnd, &ps);
    

    Wo ist da der Fehler/Denkfehler?


Log in to reply