ウィンドウがあり、他のウィンドウと同様に、境界線のサイズを変更するように境界線を実装したいと考えています。コメントと回答からの提案を取り入れて、コードを書き直しました。WM_GETMINMAXINFO の場合:
MINMAXINFO *min_max = reinterpret_cast<MINMAXINFO *>(lparam);
min_max->ptMinTrackSize.x = MINX;
min_max->ptMinTrackSize.y = MINY;
MINX と MINY は、ウィンドウの最小サイズです。WM_NCHITTEST の場合:
RECT wnd_rect;
int x, y;
GetWindowRect (window, &wnd_rect);
x = GET_X_LPARAM (lparam) - wnd_rect.left;
y = GET_Y_LPARAM (lparam) - wnd_rect.top;
if (x >= BORDERWIDTH && x <= wnd_rect.right - wnd_rect.left - >BORDERWIDTH && y >= BORDERWIDTH && y <= TITLEBARWIDTH)
return HTCAPTION;
else if (x < BORDERWIDTH && y < BORDERWIDTH)
return HTTOPLEFT;
else if (x > wnd_rect.right - wnd_rect.left - BORDERWIDTH && y < BORDERWIDTH)
return HTTOPRIGHT;
else if (x > wnd_rect.right - wnd_rect.left - BORDERWIDTH && y > wnd_rect.bottom - wnd_rect.top - BORDERWIDTH)
return HTBOTTOMRIGHT;
else if (x < BORDERWIDTH && y > wnd_rect.bottom - wnd_rect.top - BORDERWIDTH)
return HTBOTTOMLEFT;
else if (x < BORDERWIDTH)
return HTLEFT;
else if (y < BORDERWIDTH)
return HTTOP;
else if (x > wnd_rect.right - wnd_rect.left - BORDERWIDTH)
return HTRIGHT;
else if (y > wnd_rect.bottom - wnd_rect.top - BORDERWIDTH)
return HTBOTTOM;
return HTCLIENT;
変数は一目瞭然です。このコードは、ドラッグしてウィンドウのサイズを変更できる境界線を提供します。右下、下、右の境界線をドラッグするとうまくいきます。他の境界線をドラッグしようとすると、ウィンドウの右下隅がまだ前後に動いているように見えます。これは、Google Chrome または Visual Studio 2012 で同じ境界線のセットで表示されるものと似ていますが、Windows エクスプローラーでは表示されません。
Windows エクスプローラーのように、上または左の境界線のサイズを変更しているときに、右下隅が前後に「くねくね」しないようにする方法はありますか?