Вы ввели cvShowImage()
для отображения окна?Потому что, кажется, ты этого не делаешь.В любом случае, вы можете вместо этого вызвать Win32 API для этого, поэтому добавьте вызов к ShowWindow(hwnd, SW_SHOW);
после SetWindowPos()
.
Если ваш текущий вызов SetWindowPos()
не сработает, отметьте этоответ: Скрыть границу окна, если я знаю дескриптор этого окна
Я рекомендую вам сначала выполнить тесты, не вызывая cvSetWindowProperty()
, просто чтобы убедиться, что вы можете найти методэто работает.
Просто обратите внимание, если вы отметите modules/highgui/src/window_w32.cpp
, вы увидите, как OpenCV создает окна в Windows.
РЕДАКТИРОВАТЬ :
следующий код реализует советы, которые я дал ранее, и обходит проблемы, о которых сообщил OP.Трюк НЕ использует cvGetWindowHandle()
для извлечения дескриптора окна и прямого использования win32 API для этого: FindWindow()
IplImage* cv_img = cvLoadImage("test.jpg", CV_LOAD_IMAGE_UNCHANGED);
if(!cv_img)
{
printf("Failed cvLoadImage\n");
return -1;
}
cvNamedWindow("main_win", CV_WINDOW_AUTOSIZE);
cvMoveWindow("main_win", 0, 0);
cvSetWindowProperty("main_win", CV_WINDOW_FULLSCREEN, CV_WINDOW_FULLSCREEN);
cvShowImage("main_win", cv_img);
//HWND cv_hwnd = (HWND)cvGetWindowHandle("main_win");
//if (!cv_hwnd)
//{
// printf("Failed cvGetWindowHandle\n");
//}
//printf("cvGetWindowHandle returned %p\n", *cv_hwnd);
HWND win_handle = FindWindow(0, L"main_win");
if (!win_handle)
{
printf("Failed FindWindow\n");
}
SetWindowLong(win_handle, GWL_STYLE, GetWindowLong(win_handle, GWL_EXSTYLE) | WS_EX_TOPMOST);
ShowWindow(win_handle, SW_SHOW);
cvWaitKey(0);
cvReleaseImage(&cv_img);
cvDestroyWindow("main_win");
Этот код сделает окно, созданное OpenCV, без полей, но вам все равно, возможно, придется настроить то или иное, чтобы сделать эту операцию совершенной .Вы поймете, почему.Одна идея состоит в том, чтобы изменить размер окна и сделать его размером изображения.
РЕДАКТИРОВАТЬ :
Ну, так как вы заявили:
написание демо может быть очень трудным
Я также решил сделать эту последнюю часть для вас, поскольку я такой хороший парень =]
Это небольшое улучшениекод выше:
HWND win_handle = FindWindow(0, L"main_win");
if (!win_handle)
{
printf("Failed FindWindow\n");
}
// Resize
unsigned int flags = (SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER);
flags &= ~SWP_NOSIZE;
unsigned int x = 0;
unsigned int y = 0;
unsigned int w = cv_img->width;
unsigned int h = cv_img->height;
SetWindowPos(win_handle, HWND_NOTOPMOST, x, y, w, h, flags);
// Borderless
SetWindowLong(win_handle, GWL_STYLE, GetWindowLong(win_handle, GWL_EXSTYLE) | WS_EX_TOPMOST);
ShowWindow(win_handle, SW_SHOW);
И в моей системе он отображает именно то, что вы задали по вопросу.