skalowanie okien dialogbox

0

Odpalam okno standardowo za pomocą DialogBox, ale te okna są zwykle strasznie malutkie przy dużej rozdzielczości ekranu, np. przy 1600.

Tam jest zwykle czcionka 8 pts, co było może i dobre ale w 1995r - monitory były wtedy malutkie.
Obecnie na dużym monitorze bez problemu można wrzucić czcionkę 10 pts albo i 12.

Jak to zrobić, znaczy przeskalować cały dialogbox, i razem z tymi kontrolkami, oczywiście.

Powiedzmy że tworzę wcześniej czcionkę dla okienek, i rozmiar 10 zamiast 8 pts:

h = -MulDiv(10, screem_dpi, 72);
dlgFont := CreateFont(h, 0,0,0, FW_NORMAL, 0,0,0, DEF_CHARSET, 0, 0, 0, FF_SWISS, 'Tahoma');

Może być oczywiście inna nazwa zamiast Tahoma, no ale to jest mało nieistotne.

Potem dialog trzeba odpowiednio przeskalować, np. w WM_INITDIALOG.
Mogłoby to jakoś tak wygldać

void rescaledlg(HWND dlg)
{
    SendMessage(dlg, WM_SETFONT, dlgfont,0); // nie wiem czy to jest potrzebne, ale raczej nie zaszkodzi
    rescale(dlg, 0); // powiedzmy że to tylko powiększamy - tak w dół i w prawo

    HWND hwn = GetWindow(dlg, GW_CHILD);
    while ( hwn ) {
       SendMessage(hwn, WM_SETFONT, dlgFont,0);
       rescale(hwn, dlg); // a to trzeba powiększyć i jeszcze przesunąć odpowiednio...
       hwn = GetWindow(hwn, GW_HWNDNEXT);
    }
}

void rescale(HWND child, HWND parent)
{
   Rect r, rp;
   GetWindowRect(child, &r);

  // tu coś przeliczamy - jak ?


  // ostatecznie ustawiamy przeskalowane okno:
   SetWindowPos(child, 0, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE | SWP_NOZORDER);
}

0

zrobiłem takie coś:

void rescale(HWND wnd)
{
TRect r; GetWindowRect(wnd, &r);
MapWindowPoints(HWND_DESKTOP, GetParent(wnd), &r,2);
r.left := MulDiv(r.left, hFont, hF8);
r.top := MulDiv(r.top, hFont, hF8);
r.right := MulDiv(r.right, hFont, hF8);
r.bottom := MulDiv(r.bottom, hFont, hF8);

 SetWindowPos(wnd, 0, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE | SWP_NOZORDER);

}

i działa to całkiem dobrze, poza jednym wyjątkiem niestety:
Combobox z tym rozwijanym dropdown się psuje, bo to mi zeruje kompletnie tę listę - nie rozwija się wcale!

Zatem mamy teraz inne zadanie: jak przeskalować combobox, bo coś tu nie gra;
wychodzi że:
GetWindowRect pobiera rozmiar tylko tego pola static, czyli jakby jednej linii;
natomiast:
SetWindowPos ustawia rozmiar całości, czyli nie tego static, lecz: static + ta ukryta lista.

1 użytkowników online, w tym zalogowanych: 0, gości: 1