更好地控制我的客户区(WIN32)
Better control of my client area(WIN32)
我正在尝试用黑笔在 window 上制作一个 3 x 3 的网格。但是我希望它居中,例如我的网格在白色 space 内,
顶部、右侧、左侧和底部的 10%。即使我们调整 window.
的大小时,我的网格也将适合剩余的 80%
现在我可以制作网格了,但在多次尝试创建 10% 区域后,我感到很沮丧。
case WM_SIZE:
//get the 10% range.
cxInvalid = LOWORD(lParam) * 0.1;
cyInvalid = HIWORD(lParam) * 0.1;
//get the grid, DIVISIONS = 3
cxBlock = LOWORD(lParam) / DIVISIONS;
cyBlock = HIWORD(lParam) / DIVISIONS;
return 0;
Thanks in advaced :)
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for (x = 0; x < DIVISIONS; x++)
for (y = 0; y < DIVISIONS; y++)
{
Rectangle(hdc, x * cxBlock, y * cyBlock,
(x + 1) * cxBlock, (y + 1) * cyBlock);
}
EndPaint(hwnd, &ps);
return 0;
这正是 Windows 映射模式旨在用于解决的问题。目前,我假设您希望网格保持正方形,而不管 window 所在的形状如何。
一种方法是从默认的 MM_TEXT
映射模式切换到 MM_ISOTROPIC
映射模式(但如果我们希望网格随着周围的 window 改变形状,我们将使用 MM_ANISOTRCOPIC
代替)。
使用它,我们可以将 window 设置为一个虚拟网格,例如 1200 x 1200 个单元格,然后在其上绘制 3x3 网格。我选择了 1200 x 1200,所以我们关心的部分将是一个漂亮、方便的 1000 x 1000 网格。
// set up the mapping mode:
RECT rect;
GetClientRect(hWnd, &rect);
SetMapMode(hDC, MM_ISOTROPIC);
SetViewportExt(rect.x, rect.y);
// The virtual width/height for our window:
static const int width = 1200;
static const int height = 1200;
SetWindowExt(width, height);
SetWindowOrg(-100, -100); // Set the virtual 0 point ~10% of the way into the window.
// And then draw the grid. We always draw in a 1000 x 1000 grid, and Windows
// scales that to the actual window size for us.
//
static const int grid_size = 1000;
static const int step = grid_size / 3;
for (int i = step; i < grid_size-1; i += step) {
MoveTo(hDC, i, 0);
LineTo(hDC, i, grid_size);
MoveTo(hDC, 0, i);
LineTo(hDC, grid_size, i);
}
重申一下MM_ISOTROPIC
和MM_ANISOTROPIC
之间的区别,这里是网格的屏幕截图。首先是用 MM_ISOTROPIC
:
绘制的
...然后用 MM_ANISOTROPIC
:
绘制
我正在尝试用黑笔在 window 上制作一个 3 x 3 的网格。但是我希望它居中,例如我的网格在白色 space 内, 顶部、右侧、左侧和底部的 10%。即使我们调整 window.
的大小时,我的网格也将适合剩余的 80%现在我可以制作网格了,但在多次尝试创建 10% 区域后,我感到很沮丧。
case WM_SIZE:
//get the 10% range.
cxInvalid = LOWORD(lParam) * 0.1;
cyInvalid = HIWORD(lParam) * 0.1;
//get the grid, DIVISIONS = 3
cxBlock = LOWORD(lParam) / DIVISIONS;
cyBlock = HIWORD(lParam) / DIVISIONS;
return 0;
Thanks in advaced :)
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
for (x = 0; x < DIVISIONS; x++)
for (y = 0; y < DIVISIONS; y++)
{
Rectangle(hdc, x * cxBlock, y * cyBlock,
(x + 1) * cxBlock, (y + 1) * cyBlock);
}
EndPaint(hwnd, &ps);
return 0;
这正是 Windows 映射模式旨在用于解决的问题。目前,我假设您希望网格保持正方形,而不管 window 所在的形状如何。
一种方法是从默认的 MM_TEXT
映射模式切换到 MM_ISOTROPIC
映射模式(但如果我们希望网格随着周围的 window 改变形状,我们将使用 MM_ANISOTRCOPIC
代替)。
使用它,我们可以将 window 设置为一个虚拟网格,例如 1200 x 1200 个单元格,然后在其上绘制 3x3 网格。我选择了 1200 x 1200,所以我们关心的部分将是一个漂亮、方便的 1000 x 1000 网格。
// set up the mapping mode:
RECT rect;
GetClientRect(hWnd, &rect);
SetMapMode(hDC, MM_ISOTROPIC);
SetViewportExt(rect.x, rect.y);
// The virtual width/height for our window:
static const int width = 1200;
static const int height = 1200;
SetWindowExt(width, height);
SetWindowOrg(-100, -100); // Set the virtual 0 point ~10% of the way into the window.
// And then draw the grid. We always draw in a 1000 x 1000 grid, and Windows
// scales that to the actual window size for us.
//
static const int grid_size = 1000;
static const int step = grid_size / 3;
for (int i = step; i < grid_size-1; i += step) {
MoveTo(hDC, i, 0);
LineTo(hDC, i, grid_size);
MoveTo(hDC, 0, i);
LineTo(hDC, grid_size, i);
}
重申一下MM_ISOTROPIC
和MM_ANISOTROPIC
之间的区别,这里是网格的屏幕截图。首先是用 MM_ISOTROPIC
:
...然后用 MM_ANISOTROPIC
: