⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cursorhandler.cpp

📁 Qt4的一些例子
💻 CPP
字号:
#include <QtGui>#include "cursorhandler.h"CursorHandler::CursorHandler(){    state = BeforeHeader;    currentImageNo = 0;    numImages = 0;}bool CursorHandler::canRead() const{    if (state == BeforeHeader) {        return device()->peek(4) == QByteArray("\0\0\2\0", 4);    } else {        return state != Error;    }}bool CursorHandler::read(QImage *image){    readHeaderIfNecessary();    if (state != BeforeImage)        return false;    quint32 size;    quint32 width;    quint32 height;    quint16 numPlanes;    quint16 bitsPerPixel;    quint32 compression;    QDataStream in(device());    in.setByteOrder(QDataStream::LittleEndian);    in >> size;    if (size != 40) {        enterErrorState();        return false;    }    in >> width >> height >> numPlanes >> bitsPerPixel >> compression;    height /= 2;    if (numPlanes != 1 || bitsPerPixel != 1 || compression != 0) {        enterErrorState();        return false;    }    in.skipRawData((size - 20) + 8);    QBitArray xorBitmap = readBitmap(width, height, in);    QBitArray andBitmap = readBitmap(width, height, in);    if (in.status() != QDataStream::Ok) {        enterErrorState();        return false;    }    *image = QImage(width, height, QImage::Format_ARGB32);    for (int i = 0; i < int(height); ++i) {        for (int j = 0; j < int(width); ++j) {            QRgb color;            int bit = (i * width) + j;            if (andBitmap.testBit(bit)) {                if (xorBitmap.testBit(bit)) {                    color = 0x7F7F7F7F;                } else {                    color = 0x00FFFFFF;                }            } else {                if (xorBitmap.testBit(bit)) {                    color = 0xFFFFFFFF;                } else {                    color = 0xFF000000;                }            }            image->setPixel(j, i, color);        }    }    ++currentImageNo;    if (currentImageNo == numImages)        state = AfterLastImage;    return true;}bool CursorHandler::jumpToNextImage(){    QImage image;    return read(&image);}int CursorHandler::currentImageNumber() const{    return currentImageNo;}int CursorHandler::imageCount() const{    readHeaderIfNecessary();    return numImages;}void CursorHandler::readHeaderIfNecessary() const{    if (state != BeforeHeader)        return;    quint16 reserved;    quint16 type;    quint16 count;    QDataStream in(device());    in.setByteOrder(QDataStream::LittleEndian);    in >> reserved >> type >> count;    in.skipRawData(16 * count);    if (in.status() != QDataStream::Ok || reserved != 0            || type != 2 || count == 0) {        enterErrorState();        return;    }    state = BeforeImage;    currentImageNo = 0;    numImages = int(count);}QBitArray CursorHandler::readBitmap(int width, int height,                                    QDataStream &in) const{    QBitArray bitmap(width * height);    quint8 byte;    quint32 word;    for (int i = 0; i < height; ++i) {        for (int j = 0; j < width; ++j) {            if ((j % 32) == 0) {                word = 0;                for (int k = 0; k < 4; ++k) {                    in >> byte;                    word = (word << 8) | byte;                }            }            bitmap.setBit(((height - i - 1) * width) + j,                          word & 0x80000000);            word <<= 1;        }    }    return bitmap;}void CursorHandler::enterErrorState() const{    state = Error;    currentImageNo = 0;    numImages = 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -