Настроить оконное приложение для корректного переключения из полноэкранного в оконное
15.07.2010, 14:41. Показов 2916. Ответов 0
На этом форуме нашел пример как переключать оконное приложение в полноэкранное и обратно. https://www.cyberforum.ru/win-... 86774.html
Я немного его доработал (мне нужно было чтобы пользователь не мог изменять размер окна).
Все работает, но только если начинать переключать из оконного в полноэкранное.
bool FullScreen = false; //false - оконный режим
если изменить глобальную переменную
bool FullScreen = true;
Программа работает не совсем корректно (до первого переключения на полный экран).
Потом все работает верно.
И второй вопрос, почему если я создаю класс
WNDCLASSEX wc; в функции WinMain.
Программа выдает ошибку в регистрации класса.
| C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
| #include <windows.h>
WNDCLASSEX wc;
bool FullScreen = false; //false - оконный режим
WINDOWPLACEMENT wpc;
//желаемые размеры рабочей области окна
int ScreenWidth = 800;
int ScreenHeight = 400;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN:
if(wParam == VK_ESCAPE)
{
PostMessage(hwnd,WM_CLOSE,0,0);
};
if(wParam == VK_SPACE)
{
if(!FullScreen)//Из оконного во весь экран
{
GetWindowPlacement(hwnd,&wpc);//Сохраняем параметры оконного режима
SetWindowLong(hwnd,GWL_STYLE,WS_POPUP);//Устанавливаем новые стили
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_TOPMOST);
ShowWindow(hwnd,SW_SHOWMAXIMIZED);//Окно во весь экран
FullScreen = true;
}
else//Из всего эранна в оконное
{
SetWindowLong(hwnd,GWL_STYLE,WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION |WS_MINIMIZEBOX |WS_VISIBLE);//Устанавливаем стили окнного режима
//SetWindowLong(hwnd,GWL_EXSTYLE,0L);
SetWindowPlacement(hwnd,&wpc);//Загружаем парметры предыдущего оконного режима
ShowWindow(hwnd,SW_SHOWNORMAL);//Показываем обычное окно
FullScreen = false;
}
}
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,msg,wParam, lParam);
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
DWORD dwStyle, dwExStyle;
wc.cbSize=sizeof(WNDCLASSEX);
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "QWAN";
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Cant register window!", "Error!", MB_OK);
return 0;
}
if(!FullScreen){
dwStyle = WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION |WS_MINIMIZEBOX | WS_VISIBLE;
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
}
else{
dwStyle = WS_POPUP;
dwExStyle = WS_EX_TOPMOST;
}
//задаем желаемые размеры рабочей области окна
RECT windowRect;
windowRect.left = 0;
windowRect.right = ScreenWidth;
windowRect.top = 0;
windowRect.bottom = ScreenHeight;
//Функция AdjustWindowRectEx вычисляет требуемый размер прямоугольника окна расширенного стиля,
//основанного на желаемом размере рабочей области окна.
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);
hwnd = CreateWindowEx(dwExStyle,
"QWAN",
"Sample",
dwStyle,
(GetSystemMetrics(SM_CXSCREEN) - windowRect.right)/2, //центровка по горизонтали
(GetSystemMetrics(SM_CYSCREEN) - windowRect.bottom)/2, //центровка по вертикали
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top,
NULL,
NULL,
hInst,
NULL);
if(!hwnd)
{
MessageBox(NULL, "Cant create window!", "Error!", MB_OK);
return 0;
}
ShowWindow(hwnd, SW_SHOWDEFAULT);
UpdateWindow(hwnd);
ZeroMemory(&msg, sizeof(msg));
while(msg.message!=WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnregisterClass( "QWAN", wc.hInstance );
return 0;
} |
|
Добавлено через 1 час 33 минуты
Вот новый код программы, в принципе он меня устраивает, но если есть какие то замечания или рекомендации по нему, хотелось бы знать. Второй вопрос остался в силе.
| C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
| #include <windows.h>
WNDCLASSEX wc;
bool FullScreen = true; //false - оконный режим, true - весь экран
WINDOWPLACEMENT wpc;
//желаемые размеры рабочей области окна
int ScreenWidth = 800;
int ScreenHeight = 400;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN:
if(wParam == VK_ESCAPE){
PostMessage(hwnd,WM_CLOSE,0,0);
};
if(wParam == VK_SPACE)
{
if(!FullScreen){//Из оконного во весь экран
GetWindowPlacement(hwnd,&wpc);//Сохраняем параметры оконного режима
SetWindowLong(hwnd,GWL_STYLE,WS_POPUP);//Устанавливаем новые стили
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_TOPMOST);
ShowWindow(hwnd,SW_SHOWMAXIMIZED);//Окно во весь экран
FullScreen = true;
}
else {//Из всего эранна в оконное
SetWindowLong(hwnd,GWL_STYLE,WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION |WS_MINIMIZEBOX |WS_VISIBLE);//Устанавливаем стили окнного режима
//SetWindowLong(hwnd,GWL_EXSTYLE,0L);
SetWindowPlacement(hwnd,&wpc);//Загружаем парметры предыдущего оконного режима
ShowWindow(hwnd,SW_SHOWNORMAL);//Показываем обычное окно
FullScreen = false;
}
}
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,msg,wParam, lParam);
}
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
DWORD dwStyle, dwExStyle;
wc.cbSize=sizeof(WNDCLASSEX);
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = "QWAN";
if(!RegisterClassEx(&wc)){
MessageBox(NULL, "Cant register window!", "Error!", MB_OK);
return 0;
}
if(!FullScreen){
dwStyle = WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION |WS_MINIMIZEBOX | WS_VISIBLE;
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
}
else{
dwStyle = WS_POPUP;
dwExStyle = WS_EX_TOPMOST;
}
//задаем желаемые размеры рабочей области окна
RECT windowRect;
windowRect.left = 0;
windowRect.right = ScreenWidth;
windowRect.top = 0;
windowRect.bottom = ScreenHeight;
//Функция AdjustWindowRectEx вычисляет требуемый размер прямоугольника окна расширенного стиля,
//основанного на желаемом размере рабочей области окна.
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);
hwnd = CreateWindowEx(dwExStyle,
"QWAN",
"Sample",
dwStyle,
(GetSystemMetrics(SM_CXSCREEN) - windowRect.right)/2, //центровка по горизонтали
(GetSystemMetrics(SM_CYSCREEN) - windowRect.bottom)/2, //центровка по вертикали
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top,
NULL,
NULL,
hInst,
NULL);
if(!hwnd){
MessageBox(NULL, "Cant create window!", "Error!", MB_OK);
return 0;
}
if(FullScreen){//во весь экран
GetWindowPlacement(hwnd,&wpc);//Сохраняем параметры оконного режима
SetWindowLong(hwnd,GWL_STYLE,WS_POPUP);//Устанавливаем новые стили
SetWindowLong(hwnd,GWL_EXSTYLE,WS_EX_TOPMOST);
ShowWindow(hwnd,SW_SHOWMAXIMIZED);//Окно во весь экран
FullScreen = true;
}
else{
ShowWindow(hwnd, SW_SHOWDEFAULT);
}
UpdateWindow(hwnd);
ZeroMemory(&msg, sizeof(msg));
while(msg.message!=WM_QUIT){
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UnregisterClass( "QWAN", wc.hInstance );
return 0;
} |
|
Добавлено через 16 минут
Забыл сказать, что этот код уже работает как нужно. Переключение клавишей пробел.
0
|