Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WS_EX_LAYOUTED/UpdateLayeredWindow и WS_CHILD 
:(
    Опции темы
Strell
Дата 1.8.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.12.2006

Репутация: нет
Всего: 1



Всем доброго времени суток. Пишу на WinApi. 
Создаю окно WS_EX_LAYOUTED по маске png файла используя GDIi+ для преобразование в 32-х битный BITMAP.
Потом создаю еще одно окно, которое должно быть дочерним.
ДОчернее окно создается, но не прорисовывается. 

в MSDN написано: Creates a layered window. Note that this cannot be used for child windows 

Может кто нибудь сталкивался с подобной проблемой? Как ее можно обойти? Главная задача поместить одно окно в другое и чтобы при перемещении, изменении размера, сворачивании главного окна, подобные действия выполнялись и со всеми дочерними окнами.


PM MAIL   Вверх
Paspartu
Дата 1.8.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



Окно стиля WS_EX_LAYERED не может быть дочерним если необходимо, то его можно подвесить над основным, делать замещение оконной процедуры основного окна, обрабатывать WM_SIZE, WM_MOVE и т.д. и позиционировать соответствено слоистое окно.
PM MAIL   Вверх
Strell
Дата 3.8.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.12.2006

Репутация: нет
Всего: 1



Нет, дочерним должно быть другое окно. А окно со стилем WS_EX_LAYOUTED - родительское.
Проблема в том, чтобы прилепить обыкновенное окно к окну WS_EX_LAYOUTED
PM MAIL   Вверх
Paspartu
Дата 5.8.2008, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



Что имеено не получается?
Код в студию!
PM MAIL   Вверх
Supersedes
Дата 5.8.2008, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 29.7.2008

Репутация: нет
Всего: нет



Дочернее окно - это Control ("button", "edit", etc...) !!?
PM MAIL ICQ   Вверх
Strell
Дата 5.8.2008, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.12.2006

Репутация: нет
Всего: 1



Код

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    MSG msg = { 0 };
    WNDCLASSEX wcex = { 0 }, wcex1 = {0};
    GdiplusStartupInput gdiplusStartupInput;
    gdiplusStartupInput.GdiplusVersion = 1;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    TClistItem *it = new TClistItem();
    //Здесь было много лишнего
    wcex.cbSize            = sizeof(WNDCLASSEX); 
    wcex.lpfnWndProc    = (WNDPROC)WndTest;
    wcex.hInstance      = hInstance;
    wcex.hCursor        = LoadCursor(NULL, IDC_HAND);
    wcex.hbrBackground  = NULL;
    wcex.lpszClassName  = MAIN_WND_CLASS;
    wcex.style            = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;

    wcex1.cbSize            = sizeof(WNDCLASSEX); 
    wcex1.lpfnWndProc    = (WNDPROC)Proc1;
    wcex1.hInstance      = hInstance;
    wcex1.hCursor        = LoadCursor(NULL, IDC_HAND);
    wcex1.hbrBackground  = CreateSolidBrush(RGB(255, 0, 0));
    wcex1.lpszClassName  = _T("ChildWindow1");
    wcex1.style             = CS_HREDRAW | CS_VREDRAW |  CS_DBLCLKS | CS_PARENTDC;

    RegisterClassEx(&wcex);
    RegisterClassEx(&wcex1);
    HWND hWnd = CreateWindowEx(WS_EX_TOOLWINDOW , wcex.lpszClassName,  NULL, WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT,
        MAIN_WND_W, MAIN_WND_H, NULL, NULL, hInstance, NULL);
    hWnd1 = CreateWindowEx(
            0,
            wcex1.lpszClassName,  
            NULL,
             WS_VISIBLE | WS_CHILD, 
            95, 
            200,
            200,
            200, 
            hWnd, 
            NULL, 
            hInstance, 
            NULL);

    hLayoutedWindow = hWnd;
            
            HDC hMemDC;

            RECT lpRect;
            GetWindowRect(hWnd, &lpRect);
            ptDst.x = 0;
            ptDst.y = 0;
            HDC hDC = GetDC(0);
            UINT nImageHeight, nImageWidth;
            hMemDC = getDcFromPng("c:\\app_shape.png", &nImageWidth, &nImageHeight);


            SetWindowPos(hWnd, HWND_TOP, 0, 0, 1000, 3000, SWP_ASYNCWINDOWPOS);
            SetWindowLong(hWnd, GWL_EXSTYLE, (GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED));
            szWnd.cx = nImageWidth;
            szWnd.cy = nImageHeight;
            g_nImageHeight = nImageHeight;
            g_nImageWidth = nImageWidth;
            InvalidateRect(hWnd1, NULL, true);
            UpdateLayeredWindow(hWnd, hDC, &ptDst, &szWnd, hMemDC, &ptSrc, RGB(1, 1, 1), &pBlendFunc, ULW_ALPHA);
            SetWindowPos(hWnd, NULL, ptDst.x, ptDst.y, g_nImageWidth, g_nImageHeight, SWP_FRAMECHANGED); 
            InvalidateRect(hWnd, NULL, true);
            g_hMemDC = hMemDC;
            ReleaseDC(hWnd, hDC);
            ShowWindow(hWnd, SW_SHOWNORMAL);
            ShowWindow(hWnd1, SW_SHOW);
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    

    return (int) msg.wParam;
}



Когда я коментирую 
Код
SetWindowLong(hWnd, GWL_EXSTYLE, (GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED));
, то все нормально выводит(только окно не LAYERED), вот скрин: 
user posted image



Когда же пытаюсь создать окно LAYERED, то получается :

user posted image

В итоге одочернее окно создается, но не прорисовуется ((

Обработчик сообщений дочернего окна:
Код

    switch (message)
    {
    default:    
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
return 0;














PM MAIL   Вверх
Strell
Дата 6.8.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.12.2006

Репутация: нет
Всего: 1



Вместе с тем, в миранде это както реализовано (( 
user posted image
user posted image
PM MAIL   Вверх
Paspartu
Дата 6.8.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



hLayoutedWindow = hWnd; ???

 SetWindowLong(hWnd, GWL_EXSTYLE, (GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED));

замени на:

SetWindowLong(hWndl, GWL_EXSTYLE, (GetWindowLong(hWndl, GWL_EXSTYLE) | WS_EX_LAYERED));

и посмотри... помоему у тебя путаница с hWnd и hWndl
PM MAIL   Вверх
Strell
Дата 7.8.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.12.2006

Репутация: нет
Всего: 1



Цитата(Paspartu @  6.8.2008,  23:50 Найти цитируемый пост)
hLayoutedWindow = hWnd; ???


Это я для отладки ввел глобальную переменную. Ну чтобы можно было добраться до родительского окна. 

Код

    HWND hWnd = CreateWindowEx(WS_EX_TOOLWINDOW , wcex.lpszClassName,  NULL, WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT,
        MAIN_WND_W, MAIN_WND_H, NULL, NULL, hInstance, NULL);


Тут все правильно. hWnd - это родительское окно, оно и должно быть WS_EX_LAYARED,  а hWnd1 - дочернее окно.

Код

    hWnd1 = CreateWindowEx(
            0,
            wcex1.lpszClassName,  
            NULL,
             WS_VISIBLE | WS_CHILD, 
            95, 
            200,
            200,
            200, 
            hWnd, 
            NULL, 
            hInstance, 
            NULL);

PM MAIL   Вверх
Paspartu
Дата 7.8.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



Код

HWND hWnd = CreateWindowEx(WS_EX_TOOLWINDOW , wcex.lpszClassName,  NULL, WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT,
MAIN_WND_W, MAIN_WND_H, NULL, NULL, hInstance, NULL);

//пробуй
HWND hWnd = CreateWindowEx(WS_EX_LAYERED , wcex.lpszClassName,  NULL, WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT,
        MAIN_WND_W, MAIN_WND_H, NULL, NULL, hInstance, NULL);

SetLayeredWindowAttributes( ...);
UpdateLayeredWindow(...);
//и т.д.

PM MAIL   Вверх
Strell
Дата 25.8.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 7.12.2006

Репутация: нет
Всего: 1



Цитата(Paspartu @  7.8.2008,  16:18 Найти цитируемый пост)
//пробуй
HWND hWnd = CreateWindowEx(WS_EX_LAYERED , wcex.lpszClassName,  NULL, WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT,
        MAIN_WND_W, MAIN_WND_H, NULL, NULL, hInstance, NULL);


А смысл так делать??? У меня же в коде программе
Код

    HWND hWnd = CreateWindowEx(WS_EX_TOOLWINDOW , wcex.lpszClassName,  NULL, WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT,
        MAIN_WND_W, MAIN_WND_H, NULL, NULL, hInstance, NULL);

//А дальше у меня следуещее
     SetWindowLong(hWnd, GWL_EXSTYLE, (GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED));
:


Это тоже самое!!!


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.