Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2012, 01:11   #1
hyp1k
Новичок
Джуниор
 
Регистрация: 26.02.2012
Сообщений: 4
По умолчанию Проблемы с пропаданием дочернего окна (кнопки)

Делаю тулбар для ие. Тулбар это окошко, кнопка - дочернее окошко. Код создание первого и второго ниже. Когда навожу на крестик тулбар перерисовывается и кнопка пропадает. Но если нажать на область, где должны быть кнопка, она отрисовывается нажатой и дальше снова ведет себя нормально. В чем может быть проблема? Что делаю не так? Как понять по какому событию пропадает кнопка?

Код создания тулбара:
Код:
STDMETHODIMP CDeskBand::SetSite(IUnknown *pUnkSite)
{
 ...
    if (pUnkSite)
    {
        IOleWindow *pow;
        hr = pUnkSite->QueryInterface(IID_IOleWindow, reinterpret_cast<void **>(&pow));
        if (SUCCEEDED(hr))
        {
            hr = pow->GetWindow(&m_hwndParent);
            if (SUCCEEDED(hr))
            {
                WNDCLASSW wc = { 0 };
                wc.style         = CS_HREDRAW | CS_VREDRAW;
                wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
                wc.hInstance     = g_hInst;
                wc.lpfnWndProc   = WndProc;
                wc.lpszClassName = g_szDeskBandSampleClass;
                wc.hbrBackground = CreateSolidBrush(RGB(255, 255, 0));

                RegisterClassW(&wc);

                HWND ToolbarWindow = CreateWindowExW(WS_EX_TRANSPARENT,
                                g_szDeskBandSampleClass,
                                NULL,
                                WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                                0,
                                0,
                                0,
                                0,
                                m_hwndParent,
                                NULL,
                                g_hInst,
                                this);
				
...
}
Код создания кнопки:
Код:
LRESULT CALLBACK CDeskBand::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LRESULT lResult = 0;
    CDeskBand *pDeskBand = reinterpret_cast<CDeskBand *>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
	HWND hwndButton;
    switch (uMsg)
    {
    case WM_CREATE:
        pDeskBand = reinterpret_cast<CDeskBand *>(reinterpret_cast<CREATESTRUCT *>(lParam)->lpCreateParams);
        pDeskBand->m_hwnd = hwnd;
        SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pDeskBand));
		hwndButton = CreateWindow (TEXT("BUTTON"), TEXT("Ok"),
					WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // the styles
                    20,0,                                  // the left and top co-ordinates
                    100,20,                              // width and height
                    hwnd,       // parent window handle
                    (HMENU)123,  // the ID of your button
                    g_hInst,                              // the instance of your application
                    NULL) ;                        // extra bits you dont really need


        break;
hyp1k вне форума Ответить с цитированием
Старый 27.02.2012, 12:30   #2
hyp1k
Новичок
Джуниор
 
Регистрация: 26.02.2012
Сообщений: 4
По умолчанию

Предложения, замечания, мысли?
hyp1k вне форума Ответить с цитированием
Старый 27.02.2012, 17:46   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

А что, WS_EX_TRANSPARENT в стиле родительского окна непременное условие?
Если да, то может исключить регион кнопки из области прорисовки род. окна?

Последний раз редактировалось EUGY; 27.02.2012 в 17:49.
EUGY вне форума Ответить с цитированием
Старый 27.02.2012, 18:02   #4
hyp1k
Новичок
Джуниор
 
Регистрация: 26.02.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
А что, WS_EX_TRANSPARENT в стиле родительского окна непременное условие?
Если да, то может исключить регион кнопки из области прорисовки род. окна?
Да, видимо, вы правы! Я так понял вы имели в виду функцию SetWindowRgn? Сегодня вечером попробую.
hyp1k вне форума Ответить с цитированием
Старый 28.02.2012, 10:22   #5
hyp1k
Новичок
Джуниор
 
Регистрация: 26.02.2012
Сообщений: 4
По умолчанию

Да, верно.

1) Сменить стиль родительского окна WS_EX_TRANSPARENT на WS_EX_WINDOWEDGE
2) После создания кнопки дописать:
HRGN r = CreateRectRgn(20,3,120,23);
SetWindowRgn(hwnd,r,false);

Спасибо, EUGY!
hyp1k вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание временного и дочернего окна! DraGOU Win Api 2 24.11.2011 22:49
Создание дочернего окна ARt44 Win Api 6 01.10.2011 00:50
Получить дескриптор дочернего окна Crudelis Win Api 1 15.10.2010 21:45
WM_KYEDOWN у дочернего окна. MSga Win Api 9 02.01.2010 18:09
Изменение данных дочернего окна damned20 Win Api 1 11.08.2009 13:04