C++ BeginDraw()在状态栏上绘制-不考虑renderTarget的大小调整

C++ BeginDraw()在状态栏上绘制-不考虑renderTarget的大小调整,c++,winapi,direct2d,C++,Winapi,Direct2d,我有一个带窗口的Direct2D应用程序,并从常用控件向窗口添加了一个状态栏: InitCommonControls(); HWND hStatus=CreateWindowEx(0,状态类名称,NULL, WS|u CHILD | WS|u VISIBLE | SBARS|u SIZEGRIP,0,0,0, hWnd,(humenu)ID_STATUSBAR,GetModuleHandle(NULL),NULL); 状态栏显示得很好,但只要我在消息循环中激活BeginDraw()&EndDR

我有一个带窗口的Direct2D应用程序,并从常用控件向窗口添加了一个状态栏:

InitCommonControls();
HWND hStatus=CreateWindowEx(0,状态类名称,NULL,
WS|u CHILD | WS|u VISIBLE | SBARS|u SIZEGRIP,0,0,0,
hWnd,(humenu)ID_STATUSBAR,GetModuleHandle(NULL),NULL);
状态栏显示得很好,但只要我在消息循环中激活
BeginDraw()
&
EndDRaw()
函数,状态栏就会被覆盖,尽管我在初始化时定义了
renderTarget
的高度

res=D2D1CreateFactory(D2D1\u工厂类型\u单螺纹,&FACTORY);
GetClientRect(窗口句柄和矩形窗口);
GetClientRect(statusHandle和rectStatus);
rectRender.width=rectWindow.right;
rectRender.height=rectWindow.bottom-(rectStatus.bottom-rectStatus.top);
res=工厂->创建HwnRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(windowHandle、rectRender),
&渲染目标);
我还创建了一个调整大小的函数

RECT-rectWindow{0},rectStatus{0};
D2D1_SIZE_rectrend{0};
GetClientRect(窗口句柄和矩形窗口);
GetClientRect(statusHandle和rectStatus);
rectRender.width=rectWindow.right;
rectRender.height=rectWindow.bottom-(rectStatus.bottom-rectStatus.top);
渲染目标->调整大小(矩形渲染);
无效设置(windowHandle,NULL,FALSE);
并在
WM_SIZE
和WM_SIZE中调用:

case WM\u大小:
案例WM_尺寸:
hStatus=GetDlgItem(hWnd,ID\u状态栏);
gfx->调整大小(hWnd、hStatus);
SendMessage(hStatus,WM_大小,0,0);
BeginDraw()
是否尊重rendertarget的尺寸,而只考虑整个窗口?如果是这样,我应该考虑使用层还是在代码中有什么错误?

编辑:我收到了一些关于这个问题的反对票。如果我的帖子有问题,一定要告诉我,我会努力改进。我还不熟悉win32世界,但我从这个平台学到了很多东西。我很想提出一些有趣的问题和答案,但简单的-1并不能告诉我需要改进什么。我已经在MSDN和各种论坛上读了两个晚上关于这个主题的文章,但没有发现我做错了什么。我试图通过编写一个完整的示例代码来尽可能完整地说明这个问题

整个代码仅供参考

#包括
#包括
#包括
#pragma注释(lib,“comctl32.lib”)
#pragma注释(lib,“d2d1.lib”)
#定义ID\u状态栏1000
LRESULT回调WindowProc(HWND-HWND、UINT-uMsg、WPARAM-WPARAM、LPARAM-LPARAM);
类图形
{
ID2D1Factory*工厂;
ID2D1HwndRenderTarget*渲染目标;
ID2D1SOLIDCORBRUSH*电刷;
公众:
图形()
{
factory=NULL;
renderTarget=NULL;
brush=NULL;
}
~Graphics()
{
如果(工厂)工厂->发布();
if(renderTarget)renderTarget->Release();
如果(刷子)刷子->释放();
}
bool Init(HWND windowHandle、HWND statusHandle);
void BeginDraw(){renderTarget->BeginDraw();}
void EndDraw(){renderTarget->EndDraw();}
无效调整大小(HWND windowHandle、HWND statusHandle);
空抽圆(浮点数x、浮点数y、浮点数r);
};
HINSTANCE HINSTANCE;
图形*gfx;
int WINAPI wWinMain(HINSTANCE HINSTANCE、HINSTANCE、PWSTR pCmdLine、int nCmdShow)
{
InitCommonControls();
WNDCLASS wc={};
wc.lpfnWndProc=WindowProc;
wc.hInstance=hInstance;
wc.lpszClassName=文本(“主窗口”);
注册类(&wc);
HWND HWND=CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,文本(“主窗口”),
文本(“主窗口”),WS_重叠窗口,100100800600,
NULL,NULL,hInstance,NULL);
如果(!hWnd)返回-1;
HWND hStatus=CreateWindowEx(0,状态类名称,NULL,
WS|u CHILD | WS|u VISIBLE | SBARS|u SIZEGRIP,0,0,0,
hWnd,(humenu)ID_STATUSBAR,GetModuleHandle(NULL),NULL);
gfx=新图形;
如果(!gfx->Init(hWnd,hStatus))
{
删除gfx;
返回-1;
}
显示窗口(hWnd、nCmdShow);
消息{0};
bool runGame=true;
while(runGame)
{
while(peek消息(&message,NULL,0,0,PM_-REMOVE))
{
翻译消息(和消息);
DispatchMessage(&message);
如果(message.message==WM\u退出)
runGame=false;
}
gfx->BeginDraw();
gfx->DrawCircle(400.0f、100.0f、100.0f);
gfx->DrawCircle(400.0f、300.0f、100.0f);
gfx->DrawCircle(400.0f、500.0f、100.0f);
gfx->EndDraw();
}
返回0;
}
LRESULT回调WindowProc(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
HWND-hStatus;
开关(uMsg)
{
案例WM_销毁:
PostQuitMessage(0);
返回0;
案例WM_大小:
案例WM_尺寸:
hStatus=GetDlgItem(hWnd,ID\u状态栏);
gfx->调整大小(hWnd、hStatus);
SendMessage(hStatus,WM_大小,0,0);
返回0;
}
返回DefWindowProc(hWnd、uMsg、wParam、lParam);
}
bool Graphics::Init(HWND windowHandle、HWND statusHandle)
{
RECT rectWindow{0},rectStatus{0};
D2D1_SIZE_rectrend{0};
HRESULT res=D2D1CreateFactory(D2D1工厂类型单螺纹和工厂);
如果(res!=S_OK)返回false;
GetClientRect(窗口句柄和矩形窗口);
GetClientRect(statusHandle和rectStatus);
rectRender.width=rectWindow.right;
rectRender.height=rectWindow.bottom-(rectStatus.bottom-rectStatus.top);
res=工厂->创建HwnRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(windowHandle、rectRender),
&渲染目标);
如果(res!=S_OK)返回false;
res=renderTarget->CreateSolidColorBrush(D2D1::ColorF(1,0,0,0),&brush);
如果(res!=S_OK)返回false;
返回true;
}
无效图形::调整大小(HWND)
HWND hWnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, TEXT("mainwindow"),
  TEXT("MainWindow"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, 100, 100, 800, 600,
  NULL, NULL, hInstance, NULL);