簡體   English   中英

為什么我的 StretchDiBits (windows.h) 將位圖投射到屏幕上如此緩慢且條帶狀?

[英]Why does my StretchDiBits (windows.h) projected the bitmap on screen so slow and strippy?

創建窗口.h

#pragma once
#include <Windows.h>
#include <iostream>
#include <stdint.h>
#include <cmath>
#include <vector>
#include <sstream>

using namespace std;

struct returncursorposdemcical
{
    float x, y;
};
struct CustomImage
{
    vector<vector<unsigned>> CImage;
    int long height, width;
};

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
class window
{
public:

    window();
    window(const window&) = delete;
    window& operator = (const window&) = delete;
    ~window();
    
    bool windowpro();
    void stretchbit();
    void backgroundcolor(int R, int G, int B);

private:

};

創建窗口.cpp

#include "../Header/CreateWindow.h"
WNDCLASS WindowClass = {};
HWND CreateMyWindow;
HDC mydc;
int BitmapWidth;
int BitmapHeight;
RECT ClientRect;
int ClientWidth;
int ClientHeight;
long int buffer_sizes;
void* buffer_memory;
BITMAPINFO buffer_bitmap;
HINSTANCE myhinstance; 

window::window()
{
    WindowClass.lpszClassName = "Game_Engine";
    WindowClass.lpfnWndProc = WindowProc;
    WindowClass.hInstance = myhinstance;
    WindowClass.hCursor = LoadCursor(0, IDC_CROSS);
    RegisterClass(&WindowClass);
    CreateMyWindow = CreateWindowEx(0, "Game_Engine", "Program",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        0, 0, GetModuleHandle(nullptr), 0);
    mydc = GetDC(CreateMyWindow);
    ShowWindow(CreateMyWindow, SW_SHOWMAXIMIZED);
}

window::~window()
{
    std::cout << "destroy";
    ReleaseDC(CreateMyWindow, mydc);
    UnregisterClass("Game_Engine", myhinstance);
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
    {
        PostQuitMessage(0);
        return 0;
    }
    case WM_MOUSEMOVE:
    {

    }
    case WM_MOUSELEAVE:
    {
   
    }
    case WM_SIZE:
    {
        GetClientRect(CreateMyWindow, &ClientRect);
        ClientWidth = ClientRect.right - ClientRect.left;
        ClientHeight = ClientRect.bottom - ClientRect.top;
        BitmapWidth = ClientWidth;
        BitmapHeight = ClientHeight;
        buffer_sizes = BitmapWidth * BitmapHeight * sizeof(unsigned int);
        if (buffer_memory) {
            VirtualFree(buffer_memory, 0, MEM_RELEASE);
        }
        buffer_memory = VirtualAlloc(0, buffer_sizes, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

        buffer_bitmap.bmiHeader.biSize = sizeof(buffer_bitmap.bmiHeader);
        buffer_bitmap.bmiHeader.biWidth = BitmapWidth;
        buffer_bitmap.bmiHeader.biHeight = -BitmapHeight;
        buffer_bitmap.bmiHeader.biPlanes = 1;
        buffer_bitmap.bmiHeader.biBitCount = 24;
        buffer_bitmap.bmiHeader.biCompression = BI_RGB;
    }
    return 0;
    case WM_PAINT:
    {
     
    }
    return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

bool window::windowpro()
{
    MSG msg = { };
    while (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT) {
            return false;
        }
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return true;
}
void window::backgroundcolor(int R, int G, int B)
{
    unsigned int* pixel = (unsigned int*)buffer_memory;
    for (int y = 0; y < BitmapHeight; y++) {
        for (int x = 0; x < BitmapWidth; x++)
        {
            *pixel++ = (R << 16) + (G << 8) + B;
        }
    }
}
void window::stretchbit()
{
   
     StretchDIBits(mydc, 0, 0, BitmapWidth, BitmapHeight, 0, 0, ClientWidth, ClientHeight, buffer_memory,&buffer_bitmap,DIB_RGB_COLORS,SRCCOPY);

  
}

源.cpp

#include "../WindowStartup/Header/CreateWindow.h"

int main()
{
    window mywindow;
    bool running = true;

    while (running == true)
    {
        mywindow.backgroundcolor(225, 225, 225);

        mywindow.stretchbit();

        if (!mywindow.windowpro())
        {
            running = false;
        }
    }
    return 0;
}

我嘗試對其進行雙緩沖,但沒有用,我嘗試使用 bitblit,但結果相同。 此外,當窗口調整大小時,它並沒有完全繪制。 當窗口不是全尺寸時,它看起來並不松散,所以我的猜測是我的程序正在將數據寫入位圖以減慢刷新率,或者位圖正在復制到屏幕以減慢速度。 抱歉我的英語不好,英語不是我的母語,而且我是編程新手。

我修復了,你所要做的就是將 biBitcounts 更改為 32,我不知道為什么會這樣,可能與 ARGB 有關,雖然我只使用 RGB,它是 24 位或 3 字節,如果有人能解釋這是為什么我需要將 biBitcounts 更改為 32,那會很好。 也感謝評論中所有試圖幫助我的人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM