Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема - точка входа и Static control

2.5K
16 октября 2010 года
OpenMind
10 / / 11.07.2005
Немного опишу свою проблему

Есть простое приложение, ничего сложного - главная функция создает главное окно, на котором расположено дочернее окно (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 любое другое имя функции. В приложении я обязан использовать другое название главной функции.

Собственно, вопрос

Почему, когда я использую другие имена, видимым образом изменяется работа приложения (см. картинку внизу)? Как с этим бороться?

Помогите! Очень нужный и важный вопрос!

Исходный код

Код:
/////////////////////////////////////////////////////////////////
// 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;
}


ОС и IDE
Vista Home Basic;
Visual C++ 2008, экспресс-выпуск
297
16 октября 2010 года
koodeer
1.2K / / 02.05.2009
http://www.cyberguru.ru/programming/cpp/application-downsizing.html - думаю, прочтение этого материала (15 стр) позволит решить проблему задания другой функции в качестве точки входа вместо WinMain.

А что заставляет использовать другое название?
2.5K
16 октября 2010 года
OpenMind
10 / / 11.07.2005
Цитата: koodeer
http://www.cyberguru.ru/programming/cpp/application-downsizing.html - думаю, прочтение этого материала (15 стр) позволит решить проблему задания другой функции в качестве точки входа вместо WinMain.

А что заставляет использовать другое название?



Спасибо за совет! Со статьей уже знаком. Использование другого имени главной функции тут же позволяет отсечь "хвост" в виде вызовов функций CRT - это одна из причин использования "своей" точки входа.

2.5K
16 октября 2010 года
OpenMind
10 / / 11.07.2005
Кому интересно будет пишите - расскажу :-)
1.8K
17 октября 2010 года
LM(AL/M)
332 / / 20.12.2005
почему бы сразу не рассказать?
2.5K
18 октября 2010 года
OpenMind
10 / / 11.07.2005
Да просто времени не так много сейчас, поэтому и не написал сразу :-)

Итак, решение ситуации. Проблема с изменением фонового цвета у меня возникает на ОС 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 и возвращать эту самую созданную "кисть".

При такой последовательности действий, действительно, и главное окно и дочерние окна имеют один и тот же фоновый цвет.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог