SendMessageW返回“返回”;无效的窗口句柄“; 我试图在C++中在窗口上显示一个图像,我的sEndoMasGew返回“无效窗口句柄”。 My SendMessageW函数: void ImageWindows() { messageResult = SendMessageW(hImageWindow, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hFirstPic); //sending image to window //Error check if (messageResult == NULL) { DWORD error = GetLastError(); LPTSTR output = NULL; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&output, 0, NULL); MessageBox(NULL, output, L"Error. Reason:", MB_OK); } else { MessageBox(NULL, L"Image was assigned correctly!", L"Success", MB_OK); } //Error check }
我的hImageWindow:SendMessageW返回“返回”;无效的窗口句柄“; 我试图在C++中在窗口上显示一个图像,我的sEndoMasGew返回“无效窗口句柄”。 My SendMessageW函数: void ImageWindows() { messageResult = SendMessageW(hImageWindow, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hFirstPic); //sending image to window //Error check if (messageResult == NULL) { DWORD error = GetLastError(); LPTSTR output = NULL; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&output, 0, NULL); MessageBox(NULL, output, L"Error. Reason:", MB_OK); } else { MessageBox(NULL, L"Image was assigned correctly!", L"Success", MB_OK); } //Error check },c++,winapi,C++,Winapi,我的hImageWindow: hImageWindow = CreateWindowW(wc.lpszClassName, NULL, WS_VISIBLE | SS_BITMAP, 100, 100, 517, 450, NULL, NULL, NULL, NULL); //Creating main window 我在WM_CREATE调用ImageWindows()函数,但在此之前我设置了hFirstPic的值。在执行此操作时,我还进行了错误检查,它不会返回任何错误。我得到的是一扇空白
hImageWindow = CreateWindowW(wc.lpszClassName, NULL, WS_VISIBLE | SS_BITMAP, 100, 100, 517, 450, NULL, NULL, NULL, NULL); //Creating main window
我在WM_CREATE调用ImageWindows()函数,但在此之前我设置了hFirstPic的值。在执行此操作时,我还进行了错误检查,它不会返回任何错误。我得到的是一扇空白的白色窗户。我也没有找到任何关于这个话题的答案,只有10年前的一个,但这个修正在我的案例中不起作用
如果需要,下面是我的窗口类:
//MAIN WINDOW CLASS
WNDCLASSW wc = {}; //Creating window class
wc.hInstance = hInstance; //Instance of class
wc.lpszClassName = L"mainClass"; //Name of class
wc.lpfnWndProc = wc_callback; //Assigning callback function to class
感谢您的帮助,谢谢您的帮助 根据:
返回值
返回值是以前与关联的图像的句柄
静态控件(如有);否则,它是空的
因此messageResult
并不意味着失败。错误无效窗口句柄的原因是hImageWindow
在WM\u CREATE
时为空,因此此时不能使用SendMessageW
您需要创建一个静态控件,并在创建窗口后调用ImageWindows
函数。以下是一个示例:
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HWND hImageWindow;
void ImageWindows() {
HBITMAP hFirstPic = (HBITMAP)LoadImage(NULL, L"test.bmp", (WPARAM)IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
LRESULT messageResult = SendMessageW(hImageWindow, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hFirstPic); //sending image to window
//Error check
DWORD error = GetLastError();
if (error != 0) {
LPTSTR output = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&output, 0, NULL);
MessageBox(NULL, output, L"Error. Reason:", MB_OK);
}
else {
MessageBox(NULL, L"Image was assigned correctly!", L"Success", MB_OK);
}
//Error check
}
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR szCmdLine, _In_ int iCmdShow)
{
static TCHAR szAppName[] = TEXT("hello windows");
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
}
HWND hwnd = CreateWindow(szAppName,
TEXT("the hello program"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
hImageWindow = CreateWindow(L"STATIC", L"background", SS_BITMAP | WS_CHILD | WS_VISIBLE, 0, 0, 300, 300, hwnd, NULL, NULL, NULL);
ImageWindows();
while (GetMessageW(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
#包括
LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
HWND hImageWindow;
void ImageWindows(){
HBITMAP hFirstPic=(HBITMAP)LoadImage(NULL,L“test.bmp”,(WPARAM)IMAGE_位图,0,0,LR_LOADFROMFILE);
LRESULT messageResult=SendMessageW(hImageWindow,STM_SETIMAGE,IMAGE_BITMAP,(LPRAM)hFirstPic);//将图像发送到窗口
//错误检查
DWORD error=GetLastError();
如果(错误!=0){
LPTSTR输出=NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_insert,NULL,error,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)和输出,0,NULL);
MessageBox(NULL,输出,L“错误。原因:”,MB_OK);
}
否则{
MessageBox(空,L“图像分配正确!”,L“成功”,MB_OK);
}
//错误检查
}
int WINAPI WinMain(_In_uuhinstance HINSTANCE,_In_uopt_uuuhinstance hPrevInstance,_In_uustrszcmdline,u In_uuint iCmdShow)
{
静态TCHAR szAppName[]=文本(“你好窗口”);
味精;
WNDCLASS WNDCLASS;
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(空,IDI_应用程序);
wndclass.hCursor=LoadCursor(空,IDC_箭头);
wndclass.hbrBackground=(HBRUSH)GetStockObject(白色画笔);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,文本(“此程序需要Windows NT!”),szAppName,MB_ICONERROR);
}
HWND HWND=CreateWindow(szAppName,
文本(“hello程序”),
WS_重叠窗口,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
无效的
无效的
hInstance,
无效);
显示窗口(hwnd、iCmdShow);
更新窗口(hwnd);
hImageWindow=CreateWindow(L“静态”,L“背景”,SS|U位图| WS|U子对象| WS|U可见,0,0,300,300,hwnd,NULL,NULL);
ImageWindows();
while(GetMessageW(&msg,NULL,0,0))
{
翻译信息(&msg);
DispatchMessageW(&msg);
}
返回msg.wParam;
}
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM)
{
开关(信息)
{
案例WM_销毁:
PostQuitMessage(0);
返回0;
}
返回DefWindowProc(hwnd、message、wParam、lParam);
}
messageResult==NULL
在案例STM\u SETIMAGE
中不表示错误。这只意味着以前没有与静态控件关联的图像您是否检查过hImageWindow
是否不为空?@RolandasUlevicius是的,我检查过,它不为空。@Rolandas认为您遗漏了什么。阅读文档和RbMm的评论。