我可以在 winapi 中创建编辑,如果我想画一些东西,编辑将被覆盖?
如果我删除
swapChain->Present1(1, 0, ¶meters);
就可以了。
(如果我只是使用 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, ¶meters);
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);
}
简单总结一下在 Windows 8 上使用 Direct2D 进行渲染
在 Windows 7 及更早版本中,您可以使用 ID2D1HwndRenderTarget 或其他渲染目标接口来渲染到窗口或表面。从 Windows 8 开始,我们不建议使用依赖 ID2D1HwndRenderTarget 等接口的方法进行渲染,因为它们不适用于 Windows 应用商店应用程序。如果您想制作桌面应用程序并仍然利用设备上下文的附加功能,则可以使用设备上下文呈现到 Hwnd。但是,需要设备上下文才能使用 Direct2D 渲染 Windows 应用商店应用程序中的内容。