gpt4 book ai didi

c - 绘制网格作为背景的更好方法

转载 作者:太空宇宙 更新时间:2023-11-04 04:53:28 25 4
gpt4 key购买 nike

我想绘制如下图所示的网格。 enter image description here

我知道通过绘制 6 条垂直线和水平线而不是 6 x 6 小矩形来绘制它的技巧。

但是如果我想要更小的缩放(缩放以查看图片),那么线条会很多。例如,假设我的 View 窗口大小为 800 x 600,正在查看大小为 400 x 300 的图片(因此放大倍数为 2)。将有 400 x 300 大小为 2 x 2 的矩形(每个矩形代表一个像素)。

如果我绘制每个单元格(在一个循环中,比如说 400 x 300 次),它会非常慢(当我移动窗口时...)。使用技巧可以解决问题。

我仍然很好奇在 winapi,GDI(+) 中是否有更好的方法来完成这项任务。例如,像 DrawGrid(HDC hdc, int x, int y, int numOfCellsH, int numOfCellsV) 这样的函数?

另一个问题是:如果我不调整大小、移动窗口或不更改放大,网格将不会更改。所以即使我不断更新图片(截屏),也没有必要重新绘制网格。但是我使用 StretchBltBitBlt 来捕获屏幕(到内存 DC,然后是窗口的 hdc),如果我没有在内存 DC 中重绘网格,那么网格会消失。有没有办法让网格固定在那里并更新屏幕捕获的位图?

ps:这不是真正的问题。因为我想在缩放不小于 10 时绘制网格(因此每个单元格的大小为 10 x 10 或更大)。在这种情况下,将最多绘制 100 + 100 = 200 行并且速度很快。我只是好奇是否有更快的方法。

最佳答案

您是否考虑过使用 CreateDIBSection这将为您提供一个指针,以便您可以快速操作 R、G、B 值,例如以下创建一个 256x256x24 位图并以 64 像素间隔绘制一个绿色方 block :

BITMAPINFO BI = {0};
BITMAPINFOHEADER &BIH = BI.bmiHeader;
BIH.biSize = sizeof(BITMAPINFOHEADER);
BIH.biBitCount = 24;
BIH.biWidth = 256;
BIH.biHeight = 256;
BIH.biPlanes = 1;
LPBYTE pBits = NULL;
HBITMAP hBitmap = CreateDIBSection(NULL, &BI, DIB_RGB_COLORS, (void**) &pBits, NULL, 0);
LPBYTE pDst = pBits;
for (int y = 0; y < 256; y++)
{
for (int x = 0; x < 256; x++)
{
BYTE R = 0;
BYTE G = 0;
BYTE B = 0;
if (x % 64 == 0) G = 255;
if (y % 64 == 0) G = 255;
*pDst++ = B;
*pDst++ = G;
*pDst++ = R;
}
}
HDC hMemDC = CreateCompatibleDC(NULL);
HGDIOBJ hOld = SelectObject(hMemDC, hBitmap);
BitBlt(hdc, 0, 0, 256, 256, hMemDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hOld);
DeleteDC(hMemDC);
DeleteObject(hBitmap);

关于c - 绘制网格作为背景的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12315724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com