看不到EDIT控件但可以使用它如果我使用ID2D1DeviceContext来清除窗口?

问题描述 投票:0回答:1

我可以在 winapi 中创建编辑,如果我想画一些东西,编辑将被覆盖?

如果我删除

swapChain->Present1(1, 0, &parameters);
就可以了。 (如果我只是使用 ID2D1HwndRenderTarget 来做同样的事情,那就没问题了。)。

这是代码:

#pragma once

#include "resource.h"
#include<d2d1.h>
#include<d2d1_1.h>
#include<D2DErr.h>
#include<d3d11.h>
#include<dxgi1_2.h>
#include<Windows.h>

#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"d2d1.lib")


ID3D11Device* device = NULL;
ID3D11DeviceContext* ctx = NULL;

IDXGIDevice* dxgiDevice = NULL;
IDXGIDevice1* dxgiDevice_1 = NULL;
IDXGIFactory2* dxgiFactory = NULL;


ID2D1Factory* factory = NULL;
ID2D1Device* d2dDevice = NULL;
ID2D1DeviceContext* context = NULL;

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 };
IDXGISwapChain1* swapChain = NULL;

HWND hwnd = 0;

DXGI_PRESENT_PARAMETERS parameters{};




WNDPROC editProc = NULL;
LRESULT APIENTRY EditSubClassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    if (uMsg == WM_CHAR) {
        WCHAR ch = (WCHAR)wParam;
    }
    return CallWindowProc(editProc, hwnd, uMsg, wParam, lParam);
}

void init_x(HWND h) {
    hwnd = h;
    UINT flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT | D3D11_CREATE_DEVICE_DEBUG;
    D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_1,D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_10_1,D3D_FEATURE_LEVEL_10_0 };
    D3D_FEATURE_LEVEL featureLevel;

    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    hr = CoInitialize(NULL);
    hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &device, &featureLevel, &ctx);
    IDXGIDevice1* dxgiDevice = NULL;
    hr = device->QueryInterface(__uuidof(IDXGIDevice1), (void**)&dxgiDevice);
    hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &factory);
    hr = device->QueryInterface(__uuidof(IDXGIDevice), (void**)&dxgiDevice);
    hr = D2D1CreateDevice(dxgiDevice, nullptr, &d2dDevice);
    hr = d2dDevice->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &context);
    swapChainDesc.Width = 0;
    swapChainDesc.Height = 0;
    swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    swapChainDesc.Stereo = false;
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
    swapChainDesc.BufferCount = 2;
    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapChainDesc.Scaling = DXGI_SCALING_NONE;
    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
    swapChainDesc.Flags = 0;

    IDXGIAdapter* dxgiAdapter = NULL;
    hr = dxgiDevice->GetAdapter(&dxgiAdapter);
    hr = dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), (void**)&dxgiFactory);
    hr = dxgiFactory->CreateSwapChainForHwnd(device, hwnd, &swapChainDesc, nullptr, nullptr, &swapChain);
    hr = dxgiDevice->QueryInterface(__uuidof(IDXGIDevice1), (void**)&dxgiDevice_1);
    hr = dxgiDevice_1->SetMaximumFrameLatency(1);
    ID3D11Texture2D* backBuffer = NULL;
    hr = swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&backBuffer);
    D2D1_BITMAP_PROPERTIES1 properties1 = D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,
        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE),
        96.0f, 96.0f);
    IDXGISurface* dxgiBackBuffer = NULL;
    hr = swapChain->GetBuffer(0, __uuidof(IDXGISurface), (void**)&dxgiBackBuffer);
    ID2D1Bitmap1* renderTargetBitmap;
    hr = context->CreateBitmapFromDxgiSurface(dxgiBackBuffer, &properties1, &renderTargetBitmap);

    context->SetTarget(renderTargetBitmap);


    context->BeginDraw();
    context->Clear(D2D1::ColorF(1, 1, 0, 1));
    context->EndDraw();

    swapChain->Present1(1, 0, &parameters);

    HWND hTextBox = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_BORDER, static_cast<int>(15), static_cast<int>(15), static_cast<int>(130), static_cast<int>(30), hwnd, (HMENU)50, (HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), NULL);
    NONCLIENTMETRICS ncm{};
    ncm.cbSize = sizeof(ncm);
    SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);
    editProc = (WNDPROC)SetWindowLongPtr(hTextBox, GWLP_WNDPROC, (LONG_PTR)EditSubClassProc);

}

这是完整的示例https://github.com/ljzj2/testedit

c++ winapi direct3d
1个回答
0
投票

简单总结一下在 Windows 8 上使用 Direct2D 进行渲染

在 Windows 7 及更早版本中,您可以使用 ID2D1HwndRenderTarget 或其他渲染目标接口来渲染到窗口或表面。从 Windows 8 开始,我们不建议使用依赖 ID2D1HwndRenderTarget 等接口的方法进行渲染,因为它们不适用于 Windows 应用商店应用程序。如果您想制作桌面应用程序并仍然利用设备上下文的附加功能,则可以使用设备上下文呈现到 Hwnd。但是,需要设备上下文才能使用 Direct2D 渲染 Windows 应用商店应用程序中的内容。

© www.soinside.com 2019 - 2024. All rights reserved.