Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用WINAPI创建的窗口不是图形对象。什么';问题出在哪里?_C++_Winapi_Gdi+ - Fatal编程技术网

C++ 使用WINAPI创建的窗口不是图形对象。什么';问题出在哪里?

C++ 使用WINAPI创建的窗口不是图形对象。什么';问题出在哪里?,c++,winapi,gdi+,C++,Winapi,Gdi+,我有我的窗口文件(window.h): LRESULT回调MessageHandler(HWND、UINT、WPARAM、LPARAM); 类窗口 { 私人: HWND-HWND; HINSTANCE HINSTANCE; bool running=true; const char*ID=“WINAPI_JVM64”; 公众: 窗口() { init(); } 虚拟虚空绘制(Gdiplus::Graphics*)=0; void init() { hInstance=(hInstance)Get

我有我的窗口文件(
window.h
):

LRESULT回调MessageHandler(HWND、UINT、WPARAM、LPARAM);
类窗口
{
私人:
HWND-HWND;
HINSTANCE HINSTANCE;
bool running=true;
const char*ID=“WINAPI_JVM64”;
公众:
窗口()
{
init();
}
虚拟虚空绘制(Gdiplus::Graphics*)=0;
void init()
{
hInstance=(hInstance)GetModuleHandle(NULL);
WNDCLASS wc;
wc={};
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=MessageHandler;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(空,IDI_WINLOGO);
wc.hCursor=LoadCursor(空,IDC_HAND);
wc.hbrBackground=(HBRUSH)彩色窗口;
wc.lpszClassName=ID;
断言(寄存器类(&wc));
hWnd=CreateWindow(ID,“标题”,WS|u重叠窗口| WS|u可见,
200、200、400、400、NULL、NULL、hInstance、NULL);
ShowCursor(true);
setforegroundindow(hWnd);
设置焦点(hWnd);
}
无效运行()
{
味精;
PeekMessage(&msg,hWnd,0,0,PM_-REMOVE);
(跑步时)
{
如果(PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
{
如果(msg.message==WM\u退出)
运行=错误;
翻译信息(&msg);
发送消息(&msg);
}
其他的
{
//这里调用draw函数。
PAINTSTRUCT-ps;
HDC HDC=开始喷漆(hWnd和ps);
Gdiplus::Graphics*g=Gdiplus::Graphics::FromHDC(hdc);
抽签(g);
端漆(hWnd和ps);
}
}
未注册类(ID,hInstance);
}
};
和主文件(
main.cpp
):

#包括“Window.h”
LRESULT回调消息处理程序(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(uMsg)
{
案例WM_结束:
PostQuitMessage(0);
打破
违约:
返回DefWindowProc(hWnd、uMsg、wParam、lParam);
}
返回0;
}
类AppWindow:公共窗口
{
公众:
无效绘制(Gdiplus::Graphics*g)覆盖
{
Gdiplus::SolidBrush brown_brush(Gdiplus::Color(255、128、57、0));
g->FillRectangle(&brown_笔刷,0,0,200,200);
}
};
int main()
{
Gdiplus::GdiplusStartupInput GdiplusStartupInput;
ULONG_PTR gdiplusToken;
Gdiplus::GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,nullptr);
应用窗口w;
w、 run();
Gdiplus::GdiplusShutdown(gdiplusToken);
返回0;
}
我有个问题,就是画不出来

它处理每一条信息,一切都很好,但它不会吸引人。甚至发送了
WM_PAINT
类型的消息,但什么也没有发生

你能发现问题吗

我只想要一个窗口类,它有一个可重写的
draw()
函数和一个处理所有事件的
run()
函数,比如
WM\u LBUTTONDOWN
。所有这些都很好,屏幕只是保持空白

此外,我无法关闭窗口,当按下右上角的
X
按钮时,窗口将保持不变;只有在调整大小并快速按
X
后,它才会关闭


正如你所看到的,我有一些非常奇怪的行为,我不知道问题出在哪里。

你的绘图逻辑放错地方了。处理
WM_PAINT
消息时,它需要位于
MessageHandler
中<如果需要绘制窗口且没有其他消息挂起,则code>peek message()将生成
WM_PAINT
消息。不能从
WM_PAINT
处理程序的外部在窗口上绘制

此外,您在
init()
中为wc.hbrBackground指定了错误的值。如果使用像
color\u WINDOW
这样的颜色常量,则需要向其添加
1
。这在报告中也有详细说明

另外,在
run()
中,创建消息队列的第一个
PeekMessage()
将丢弃初始消息。如果一个消息处于挂起状态,则该消息不会被分派循环处理。第一次调用应该使用
PM\u NOREMOVE
标志

另外,要注意消息循环中的错误

话虽如此,请尝试以下方法:

LRESULT回调MessageHandler(HWND、UINT、WPARAM、LPARAM);
类窗口
{
私人:
HWND-HWND;
HINSTANCE HINSTANCE;
const char*ID=“WINAPI_JVM64”;
公众:
窗口()
{
init();
}
~Window()
{
清理();
}
虚拟虚空绘制(Gdiplus::Graphics*)=0;
void init()
{
hInstance=(hInstance)GetModuleHandle(NULL);
WNDCLASS wc{};
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=&MessageHandler;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(空,IDI_WINLOGO);
wc.hCursor=LoadCursor(空,IDC_HAND);
wc.hbrBackground=(HBRUSH)彩色窗口;
wc.lpszClassName=ID;
断言(寄存器类(&wc));
hWnd=CreateWindow(ID,“标题”,WS|u重叠窗口| WS|u可见,
200,200,400,400,NULL,NULL,hInstance,this);
断言(hWnd!=NULL);
ShowCursor(true);
setforegroundindow(hWnd);
设置焦点(hWnd);
}
空洞清理()
{
未注册类(ID,hInstance);
}
无效运行()
{
味精;
peek消息(&msg,NULL,0,0,PM_-NOREMOVE);
while(GetMessage(&msg,NULL,0,0))
{
翻译信息(&msg);
发送消息(&msg);
}
}
};
#包括“Window.h”
LRESULT回调消息处理程序(HWND HWND、UINT uMsg、WPARAM WPARAM、LPARAM LPARAM)
{
开关(uMsg)
{
案例WM\n创建:
{
窗口*pThis=静态转换(重新解释转换(lParam)->lpCr