CtrlCore: Fixed minor problem with custom bar geometry in Win32

This commit is contained in:
Mirek Fidler 2026-01-16 15:05:54 +01:00
parent d4b318922b
commit c237e6baab
4 changed files with 40 additions and 18 deletions

View file

@ -45,6 +45,9 @@ protected:
void Create(HWND parent, DWORD style, DWORD exstyle, bool savebits, int show, bool dropshadow);
Image DoMouse(int e, Point p, int zd = 0);
Rect AdjustWindowRect(const Rect& client, dword style, dword exstyle);
Rect AdjustWindowRect(const Rect& client);
void PaintWinBarBackground(SystemDraw& w, const Rect& clip);
void PaintWinBar(SystemDraw& w, const Rect& clip);
int GetActiveTitleBarButton();

View file

@ -896,16 +896,8 @@ LRESULT Ctrl::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {
MINMAXINFO *mmi = (MINMAXINFO *)lParam;
Rect frmrc = Size(200, 200);
::AdjustWindowRect(frmrc, WS_OVERLAPPEDWINDOW, FALSE);
// Size msz = Ctrl::GetWorkArea().Deflated(-frmrc.left, -frmrc.top,
// frmrc.right - 200, frmrc.bottom - 200).GetSize();
// Rect minr(Point(50, 50), min(msz, GetMinSize()));
// Rect maxr(Point(50, 50), min(msz, GetMaxSize())); // Removed cxl&nixnixnix 2012-6-12
Rect minr(Point(50, 50), GetMinSize());
Rect maxr(Point(50, 50), GetMaxSize());
dword style = ::GetWindowLong(hwnd, GWL_STYLE);
dword exstyle = ::GetWindowLong(hwnd, GWL_EXSTYLE);
AdjustWindowRectEx(minr, style, FALSE, exstyle);
AdjustWindowRectEx(maxr, style, FALSE, exstyle);
Rect minr = AdjustWindowRect(Rect(Point(50, 50), GetMinSize()));
Rect maxr = AdjustWindowRect(Rect(Point(50, 50), GetMaxSize()));
mmi->ptMinTrackSize = Point(minr.Size());
mmi->ptMaxTrackSize = Point(maxr.Size());
LLOG("WM_GETMINMAXINFO: MinTrackSize = " << Point(mmi->ptMinTrackSize) << ", MaxTrackSize = " << Point(mmi->ptMaxTrackSize));

View file

@ -472,14 +472,40 @@ void Ctrl::UseImmersiveDarkModeForWindowBorder()
}
}
Rect Ctrl::AdjustWindowRect(const Rect& client, dword style, dword exstyle)
{
Rect r = client;
TopWindow *tw = dynamic_cast<TopWindow *>(this);
if(tw && tw->custom_bar_frame) {
Rect mr(100, 100, 200, 200);
AdjustWindowRectEx(mr, style, FALSE, exstyle);
r.left -= (100 - mr.left);
r.right += (mr.right - 200);
r.bottom += (mr.bottom - 200);
r.top -= tw->GetCustomTitleBarMetrics().height;
}
else
AdjustWindowRectEx(r, style, FALSE, exstyle);
return r;
}
Rect Ctrl::AdjustWindowRect(const Rect& client)
{
HWND hwnd = GetHWND();
return hwnd ? AdjustWindowRect(client, ::GetWindowLong(hwnd, GWL_STYLE), ::GetWindowLong(hwnd, GWL_EXSTYLE))
: client;
}
void Ctrl::Create(HWND parent, DWORD style, DWORD exstyle, bool savebits, int show, bool dropshadow)
{
GuiLock __;
ASSERT_(IsMainThread(), "Window creation can only happen in the main thread");
LLOG("Ctrl::Create(parent = " << (void *)parent << ") in " <<UPP::Name(this) << LOG_BEGIN);
ASSERT(!IsChild() && !IsOpen());
Rect r = GetRect();
AdjustWindowRectEx(r, style, FALSE, exstyle);
Rect r = AdjustWindowRect(GetRect(), style, exstyle);
isopen = true;
Top *top = new Top;
SetTop(top);
@ -1100,9 +1126,7 @@ void Ctrl::WndSetPos(const Rect& rect)
LLOG("WndSetPos " << UPP::Name(this) << " " << rect);
HWND hwnd = GetHWND();
if(hwnd) {
Rect r = rect;
AdjustWindowRectEx(r, ::GetWindowLong(hwnd, GWL_STYLE), FALSE,
::GetWindowLong(hwnd, GWL_EXSTYLE));
Rect r = AdjustWindowRect(rect);
SetWindowPos(hwnd, NULL, r.left, r.top, r.Width(), r.Height(),
SWP_NOACTIVATE|SWP_NOZORDER);
if(HasFocusDeep()) {

View file

@ -57,9 +57,9 @@ struct App : public TopWindow
struct App2 : App {
Label title;
App2() {
App2(int h = GetStdFontCy() + DPI(4)) {
SetRect(700, 200, 500, 500);
Ctrl *tb = CustomTitleBar(SYellow(), GetStdFontCy() + DPI(4));
Ctrl *tb = CustomTitleBar(SYellow(), h);
if(tb)
*tb << title.SizePos();
@ -71,7 +71,7 @@ struct App2 : App {
GUI_APP_MAIN
{
App app, app_csd;
App2 app2;
App2 app2, app3(DPI(128));
app.Title("SSD");
app.OpenMain();
@ -85,5 +85,8 @@ GUI_APP_MAIN
app2.OpenMain();
app3.SetRect(1900, 200, 500, 500);
app3.OpenMain();
app.Run();
}