/////////////////////////////////////////////////////////////////
// Static.cpp
#include <windows.h>
/////////////////////////////////////////////////////////////////
#define WND_CLASS L"MyWindow"
#define WND_TITLE L"Static Control"
/////////////////////////////////////////////////////////////////
// прототипы функций
//int __stdcall wWinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdLine, int cmdShow);
int __stdcall MyEntry (HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdLine, int cmdShow);
LRESULT __stdcall WndProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
/////////////////////////////////////////////////////////////////
// главная функция приложения
//int __stdcall wWinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdLine, int cmdShow);
int __stdcall MyEntry (HINSTANCE hInst, HINSTANCE hPrevInst, LPWSTR cmdLine, int cmdShow)
{
WNDCLASSEXW wc;
HWND hWndMain, hWndStatic;
MSG msg;
/////////////////////////////////////////////////////////////////
// регистрируем оконный класс и создаем главное окно
wc.cbSize = sizeof (WNDCLASSEXW);
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH) COLOR_WINDOW;
wc.hCursor = LoadCursorW (NULL, IDC_ARROW);
wc.hIcon = LoadIconW (NULL, IDI_APPLICATION);
wc.hIconSm = NULL;
wc.hInstance = hInst;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = WND_CLASS;
wc.lpszMenuName = NULL;
wc.style = CS_VREDRAW | CS_HREDRAW;
if (0 == RegisterClassExW (&wc))
{
GetLastError();
}
hWndMain = CreateWindowExW (
0,
WND_CLASS,
WND_CLASS,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
300,
250,
NULL,
NULL,
hInst,
NULL);
SetWindowTextW (hWndMain, WND_TITLE);
hWndStatic = CreateWindowExW (
WS_EX_TRANSPARENT,
L"Static",
L"Static",
WS_CHILD | WS_VISIBLE | SS_SIMPLE,
5,
5,
125,
25,
hWndMain,
NULL,
hInst,
NULL);
SetWindowTextW (hWndStatic, WND_TITLE);
ShowWindow (hWndMain, cmdShow);
UpdateWindow (hWndMain);
/////////////////////////////////////////////////////////////////
// цикл приема и обработки сообщений
while (GetMessageW (&msg, hWndMain, 0, 0) > 0)
{
TranslateMessage (&msg);
DispatchMessageW (&msg);
}
/////////////////////////////////////////////////////////////////
// завершение работы приложения
DestroyWindow (hWndMain);
UnregisterClassW (WND_CLASS, hInst);
return msg.wParam;
}
/////////////////////////////////////////////////////////////////
// оконная процедура
LRESULT __stdcall WndProc (HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_NCCREATE:
return TRUE;
case WM_CREATE:
return 0;
default:
return DefWindowProcW (hWnd, msg, wp, lp);
}
return 0;
}
Проблема - точка входа и Static control
Есть простое приложение, ничего сложного - главная функция создает главное окно, на котором расположено дочернее окно (Static), выводящее текст. Дочернее окно должно всегда оставаться прозрачным (ну или иметь цвет фона, совпадающий с главным окном).
Проблема в том, что как только я меняю название главной функции с WinMain на какое-либо другое (MyEntry), дочернее окно перестает быть прозрачным и имеет белый фоновый цвет.
Цитата:
WinMain is the conventional name for the user-provided entry point for a Windows-based application.
На сколько я понял из документации MSDN (http://msdn.microsoft.com/en-us/library/ms632595(VS.85).aspx), я вполне могу использовать вместо WinMain любое другое имя функции. В приложении я обязан использовать другое название главной функции.
Собственно, вопрос
Почему, когда я использую другие имена, видимым образом изменяется работа приложения (см. картинку внизу)? Как с этим бороться?
Помогите! Очень нужный и важный вопрос!
Исходный код
Код:
ОС и IDE
Vista Home Basic;
Visual C++ 2008, экспресс-выпуск
http://www.cyberguru.ru/programming/cpp/application-downsizing.html - думаю, прочтение этого материала (15 стр) позволит решить проблему задания другой функции в качестве точки входа вместо WinMain.
А что заставляет использовать другое название?
А что заставляет использовать другое название?
Цитата: koodeer
http://www.cyberguru.ru/programming/cpp/application-downsizing.html - думаю, прочтение этого материала (15 стр) позволит решить проблему задания другой функции в качестве точки входа вместо WinMain.
А что заставляет использовать другое название?
А что заставляет использовать другое название?
Спасибо за совет! Со статьей уже знаком. Использование другого имени главной функции тут же позволяет отсечь "хвост" в виде вызовов функций CRT - это одна из причин использования "своей" точки входа.
Кому интересно будет пишите - расскажу :-)
почему бы сразу не рассказать?
Итак, решение ситуации. Проблема с изменением фонового цвета у меня возникает на ОС Windows Vista Home Edition, среда разработки Visual C++ 2008 (экспресс-выпуск). Почему на моей системе возникает изменение фонового цвета и с чем это связано, мне выяснить так и не удалось до сих пор. Проблему эту удалось решить, пообщавшись на другом форуме и еще раз почитав MSDN.
Дело в том, что COLOR_WINDOW - это еще не сам цвет, а только его индекс. Использование его в качестве задания фонового цвета я когда-то увидел в одном из примеров по Win32 API. Как вижу теперь, это неправильное использование этой константы.
Правильным использованием цветовой константы COLOR_WINDOW оказалось следующее:
- получить значение цвета через вызов GetSysColor (COLOR_WINDOW) (ну или GetSysColor (COLOR_BTNFACE), например);
- создать "кисть" через CreateSolidBrush с указанным выше цветом и использовать ее в качестве фоновой при заполнении структуры WNDCLASSEXW.
- также, при обработке сообщения WM_CTLCOLORSTATIC необходимо устанавливать фоновый цвет через SetBkColor и возвращать эту самую созданную "кисть".
При такой последовательности действий, действительно, и главное окно и дочерние окна имеют один и тот же фоновый цвет.