Started the logic for proper positioning of the Popover on Windows.
This commit is contained in:
parent
63d59e7421
commit
f2f743824e
|
@ -153,6 +153,9 @@ HRGN makePopoverRegion(HDC dc, LONG width, LONG height)
|
||||||
return region;
|
return region;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define msgPopoverPrepareLeftRight (WM_APP+50)
|
||||||
|
#define msgPopoverPrepareTopBottom (WM_APP+51)
|
||||||
|
|
||||||
LRESULT CALLBACK popoverproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK popoverproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
|
@ -235,16 +238,49 @@ LRESULT CALLBACK popoverproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
FrameRect(dc, &r, GetStockPen(WHITE_BRUSH));
|
FrameRect(dc, &r, GetStockPen(WHITE_BRUSH));
|
||||||
EndPaint(hwnd, &ps);
|
EndPaint(hwnd, &ps);
|
||||||
return 0;
|
return 0;
|
||||||
|
case msgPopoverPrepareLeftRight:
|
||||||
|
case msgPopoverPrepareTopBottom:
|
||||||
|
// TODO screen snapping
|
||||||
|
{
|
||||||
|
RECT r;
|
||||||
|
LONG x, y;
|
||||||
|
LONG width = 200, height = 200;
|
||||||
|
|
||||||
|
if (GetWindowRect((HWND) wParam, &r) == 0)
|
||||||
|
xpanic("error getting window rect of Popover target", GetLastError());
|
||||||
|
width += 2;
|
||||||
|
height += 2;
|
||||||
|
p->arrowLeft = -1;
|
||||||
|
p->arrowRight = -1;
|
||||||
|
p->arrowTop = -1;
|
||||||
|
p->arrowBottom = -1;
|
||||||
|
if (uMsg == msgPopoverPrepareLeftRight) {
|
||||||
|
width += ARROWWIDTH;
|
||||||
|
p->arrowLeft = height / 2 - ARROWHEIGHT;
|
||||||
|
x = r.right;
|
||||||
|
y = r.top - ((height - (r.bottom - r.top)) / 2);
|
||||||
|
} else {
|
||||||
|
height += ARROWHEIGHT;
|
||||||
|
p->arrowTop = width / 2 - ARROWWIDTH;
|
||||||
|
x = r.left - ((width - (r.right - r.left)) / 2);
|
||||||
|
y = r.bottom;
|
||||||
|
}
|
||||||
|
if (MoveWindow(hwnd, x, y, width, height, TRUE) == 0)
|
||||||
|
xpanic("error repositioning Popover", GetLastError());
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HWND button;
|
||||||
|
|
||||||
LRESULT CALLBACK wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
switch (uMsg) {
|
switch (uMsg) {
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 100) {
|
if (HIWORD(wParam) == BN_CLICKED && LOWORD(wParam) == 100) {
|
||||||
MoveWindow(popover, 50, 50, 200, 200, TRUE);
|
SendMessageW(popover, msgPopoverPrepareLeftRight, (WPARAM) button, 0);
|
||||||
ShowWindow(popover, SW_SHOW);
|
ShowWindow(popover, SW_SHOW);
|
||||||
UpdateWindow(popover);
|
UpdateWindow(popover);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -260,7 +296,7 @@ LRESULT CALLBACK wndproc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
WNDCLASSW wc;
|
WNDCLASSW wc;
|
||||||
HWND mainwin, button;
|
HWND mainwin;
|
||||||
MSG msg;
|
MSG msg;
|
||||||
|
|
||||||
ZeroMemory(&wc, sizeof (WNDCLASSW));
|
ZeroMemory(&wc, sizeof (WNDCLASSW));
|
||||||
|
|
Loading…
Reference in New Issue