更好地控制我的客户区(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_ISOTROPICMM_ANISOTROPIC之间的区别,这里是网格的屏幕截图。首先是用 MM_ISOTROPIC:

绘制的

...然后用 MM_ANISOTROPIC:

绘制