gpt4 book ai didi

c++ - 将屏幕绘图翻译到屏幕的另一部分

转载 作者:行者123 更新时间:2023-11-28 01:39:12 24 4
gpt4 key购买 nike

是否可以将“A”区域的所有绘图都转换为“B”区域?

例如绘制到区域(0,0)(100,100)并让它出现在区域(200,200)(300,300)中。

最佳答案

这个问题实际上被标记为 .这可能针对 Win32 和 GDI(不幸的是我几乎没有经验)。因此,以下内容可能被视为概念证明:

我忍不住用 QWindow 来实现这个想法/概念和 QPixmap .

概念是:

  1. 全屏打开一个窗口(即没有装饰)

  2. 制作快照并将其存储在内部(在我的例子中是 a )

  3. 在窗口中显示内部图像(用户察觉不到差异)

  4. 执行循环,定期修改和重新显示像素图(取决于或不取决于用户输入)。

这就是我在 Qt 中的做法:

  1. 我打开了一个 QWindow并使其全屏显示。 (最大尺寸也可能使窗口全屏,但它仍然会有装饰(带系统菜单的标题栏等),这是意外的。)

  2. 在绘制任何东西之前,先完成此窗口的快照。使用 QScreen::grabWindow() 在 Qt 中这真的很容易.抓取的内容返回为 QPixmap并存储为我派生的 Window 类的成员。

  3. 视觉输出只是绘制存储的成员 QPixmap .

  4. 我使用了 QTimer强制定期更改 QPixmap .为了使示例代码尽可能短,我没有费力洗牌。相反,我只是滚动像素图,复制一小部分,将其余部分向上移动,然后再次在底部插入小条纹。

示例代码qWindowRoll.cc:

#include <QtWidgets>

class Window: public QWindow {
private:
// the Qt backing store for window
QBackingStore _qBackStore;
// background pixmap
QPixmap _qPixmap;

public:
// constructor.
Window():
QWindow(),
_qBackStore(this)
{
showFullScreen();
}
// destructor.
virtual ~Window() = default;
// disabled:
Window(const Window&) = delete;
Window& operator=(const Window&) = delete;

// do something with pixmap
void changePixmap()
{
enum { n = 4 };
if (_qPixmap.height() < n) return; // not yet initialized
const QPixmap qPixmapTmp = _qPixmap.copy(0, 0, _qPixmap.width(), n);
//_qPixmap.scroll(0, -n, 0, n, _qPixmap.width(), _qPixmap.height() - n);
{ QPainter qPainter(&_qPixmap);
qPainter.drawPixmap(
QRect(0, 0, _qPixmap.width(), _qPixmap.height() - n),
_qPixmap,
QRect(0, n, _qPixmap.width(), _qPixmap.height() - n));
qPainter.drawPixmap(0, _qPixmap.height() - n, qPixmapTmp);
}
requestUpdate();
}

protected: // overloaded events

virtual bool event(QEvent *pQEvent) override
{
if (pQEvent->type() == QEvent::UpdateRequest) {
paint();
return true;
}
return QWindow::event(pQEvent);
}

virtual void resizeEvent(QResizeEvent *pQEvent)
{
_qBackStore.resize(pQEvent->size());
paint();
}

virtual void exposeEvent(QExposeEvent*) override
{
paint();
}

// shoot screen
// inspired by http://doc.qt.io/qt-5/qtwidgets-desktop-screenshot-screenshot-cpp.html
void makeScreenShot()
{
if (QScreen *pQScr = screen()) {
_qPixmap = pQScr->grabWindow(winId());
}
}

private: // internal stuff
// paint
void paint()
{
if (!isExposed()) return;
QRect qRect(0, 0, width(), height());
if (_qPixmap.width() != width() || _qPixmap.height() != height()) {
makeScreenShot();
}
_qBackStore.beginPaint(qRect);
QPaintDevice *pQPaintDevice = _qBackStore.paintDevice();
QPainter qPainter(pQPaintDevice);
qPainter.drawPixmap(0, 0, _qPixmap);
_qBackStore.endPaint();
_qBackStore.flush(qRect);
}

};

int main(int argc, char **argv)
{
QApplication app(argc, argv);
// setup GUI
Window win;
win.setVisible(true);
// setup timer
QTimer qTimer;
qTimer.setInterval(50); // 50 ms -> 20 Hz (round about)
QObject::connect(&qTimer, &QTimer::timeout,
&win, &Window::changePixmap);
qTimer.start();
// run application
return app.exec();
}

我在 Windows 10 上使用 Qt 5.9.2 进行了编译和测试。这就是它的样子:

Snapshot sequence of qWindowRoll

注意:在我的桌面上,滚动很流畅。我手动制作了 4 张快照并在 GIMP 中合成了一张 GIF——因此图像看起来有点卡顿。

关于c++ - 将屏幕绘图翻译到屏幕的另一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48073423/

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