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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Direct3D в диалоге, зависание диалога 
V
    Опции темы
toxx
Дата 16.12.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Решил сделать интересное диалоговое меню "О программе" с использованием directX, всё выводит при нажатии клавиши, всё красиво, только выйти из него нельзя.Подскажите пожалуйста как можно выйти из просмотра?Окно не двигается, при попытке закрыть не закрывается, а выход из всей программы только с помощью ctrl+alt+del 

Код окна диалога
Само окно сделано через ресурс файл.
Код

OOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    switch(iMsg)
    {    
        case WM_KEYDOWN:
            {
                if(wParam==VK_ESCAPE)
                PostQuitMessage(0);
            }
        case WM_INITDIALOG :
            {
                return FALSE;
            }
        case WM_COMMAND :
            switch(LOWORD(wParam))
            {
            case ID_DRAW:
                {
                    InitialDirect3D(hDlg);
                    InitialBufferVershin();
                    ShowWindow(hDlg, SW_SHOWDEFAULT);
                    UpdateWindow(hDlg);
                    while(1)
                    {
                         RenderingDirect3D();
                    }
                    return 0;
                }
                case IDOK :
                case IDCANCEL :
                    EndDialog(hDlg, 0);
                return TRUE;
            }
            break;
    }
return FALSE;
}


Это сообщение отредактировал(а) toxx - 16.12.2009, 23:06
PM MAIL   Вверх
Alca
Дата 16.12.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Код

INT_PTR CALLBACK AboutDlgProc( 
   HWND hDlg, 
   UINT uMsg, 
   WPARAM wParam, 
   LPARAM lParam )
{
   switch( uMsg ) 
   {
      case WM_INITDIALOG:
         return TRUE;
      case WM_COMMAND:
         switch( wParam ) 
         {
            case IDOK:
               EndDialog( hDlg, TRUE );
               return TRUE;
         }
      break;
   }

   return FALSE;
}


Добавлено через 2 минуты
http://msdn.microsoft.com/en-us/library/aa383690(VS.85).aspx

Это сообщение отредактировал(а) Alca - 16.12.2009, 23:32


--------------------
PM WWW ICQ Skype Jabber   Вверх
smoke_man
Дата 16.12.2009, 23:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здесь:
Код

 while(1)
{
        RenderingDirect3D();
}

у тебя начинается бесконечный цикл. 

Это сообщение отредактировал(а) smoke_man - 16.12.2009, 23:40


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
toxx
Дата 17.12.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата


INT_PTR CALLBACK AboutDlgProc( 
   HWND hDlg, 
   UINT uMsg, 
   WPARAM wParam, 
   LPARAM lParam )
{
   switch( uMsg ) 
   {
      case WM_INITDIALOG:
         return TRUE;
      case WM_COMMAND:
         switch( wParam ) 
         {
            case IDOK:
               EndDialog( hDlg, TRUE );
               return TRUE;
         }
      break;
   }
   return FALSE;
}


Добавлено через 2 минуты
http://msdn.microsoft.com/en-us/library/aa383690(VS.85).aspx


Да я понимаю что так нужно, только у меня нет кнопки когда идёт  RenderingDirect3D(); и при попытке нажать на завершение( на крестик) всё виснет вот скрин
скрин
user posted image


Цитата

у тебя начинается бесконечный цикл. 


Да я знаю, чтобы  RenderingDirect3D(); нужно чтоб был цикл, а вот как из него выйти я никак не пойму.
Потомучто если без цикла, то попросту один раз вызовется и исчезнет directX.
А мне нужно чтобы по требованию пользователя прекратилось проигрывание сцены.Но не могу найти условие для выхода.Что и прошу я, посоветовать как выйти из этого положения

Это сообщение отредактировал(а) toxx - 17.12.2009, 13:42
PM MAIL   Вверх
mekhanikus
Дата 17.12.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

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



А если в условие цикла поставить глобальную переменную.
Пока она ture цикл крутится.
В case IDOK: делать переменную FALSE - цикл заканчивается.
PM MAIL   Вверх
toxx
Дата 17.12.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

А если в условие цикла поставить глобальную переменную.
Пока она ture цикл крутится.
В case IDOK: делать переменную FALSE - цикл заканчивается.


Нет, так не получится.Потомучто изображение занимает всё окно и кнопки ОК попросту не видно)


Другое дело может быть сделать чтобы изображение было не во всё окно,и чтобы было видно кнопку ОК
Тогда дело наверно вот в этой функции

Код

HRESULT InitialDirect3D(HWND hwnd)
{
    if(NULL==(pDirect3D=Direct3DCreate9(D3D_SDK_VERSION)))
    return E_FAIL;
    D3DDISPLAYMODE Display;
    if(FAILED(pDirect3D->
        GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&Display)))
    return E_FAIL;
    D3DPRESENT_PARAMETERS Direct3DParametr;
    ZeroMemory(&Direct3DParametr,sizeof(Direct3DParametr));
    Direct3DParametr.Windowed=TRUE;
    Direct3DParametr.SwapEffect=D3DSWAPEFFECT_DISCARD;
    Direct3DParametr.BackBufferFormat=Display.Format;
    Direct3DParametr.EnableAutoDepthStencil=TRUE;
    Direct3DParametr.AutoDepthStencilFormat=D3DFMT_D16;
    //Direct3DParametr.BackBufferWidth=1;
    //Direct3DParametr.BackBufferHeight=1;
    //Direct3DParametr.BackBufferCount=3;
    //Direct3DParametr.FullScreen_RefreshRateInHz=Display.RefreshRate;
    if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL,hwnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &Direct3DParametr,
        &pDirect3DDevice)))
    return E_FAIL;
    pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
    pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
    pDirect3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
    return S_OK;
}


Попробовал изменять настройки
Код

 //Direct3DParametr.BackBufferWidth=1;
//Direct3DParametr.BackBufferHeight=1;


Это ни к чему не привело.Подскажите пожалуйста, как правильно сделать, очень интресно исполнение это в winamp там сделаны кнопки сверху а понизу 
расположено окно где показывает( не знаю как это сделать).
PM MAIL   Вверх
Alca
Дата 17.12.2009, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Код

case WM_CLOSE:
    {
        if (VK_ESCAPE == wParam) {
            ::EndDialog(hDlg, TRUE);
        }
    }


Добавлено через 1 минуту и 22 секунды
Надо нажать на "Х"


--------------------
PM WWW ICQ Skype Jabber   Вверх
toxx
Дата 17.12.2009, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

case WM_CLOSE:
    {
        if (VK_ESCAPE == wParam) {
            ::EndDialog(hDlg, TRUE);
        }
    }


Нет, не помогает я пробовал так...Также при нажатии на Х появляется завершить задачу.

Это сообщение отредактировал(а) toxx - 17.12.2009, 17:03
PM MAIL   Вверх
GremlinProg
Дата 17.12.2009, 17:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(toxx @  17.12.2009,  15:40 Найти цитируемый пост)
Потомучто если без цикла, то попросту один раз вызовется и исчезнет directX.

http://www.google.com/search?client=opera&...-8&oe=utf-8
Цитата(toxx @  17.12.2009,  18:48 Найти цитируемый пост)
Другое дело может быть сделать чтобы изображение было не во всё окно,и чтобы было видно кнопку ОКТогда дело наверно вот в этой функции

тогда придется создать дочернее окно, ограничить его так, чтобы кнопки были видны, и уже на это окно вешать графику, т.е. в CreateDevice передавать дескриптор этого дочернего окна
Цитата(toxx @  17.12.2009,  18:48 Найти цитируемый пост)
очень интресно исполнение это в winamp там сделаны кнопки сверху а понизу расположено окно где показывает( не знаю как это сделать)

в винампе этот дочерний контрол - простой статик (STATIC)

Добавлено через 3 минуты и 38 секунд
кстати, заменить тему топика на "Direct3D в диалоге", или есть другие варианты?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
toxx
Дата 17.12.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Добавлено через 3 минуты и 38 секунд
кстати, заменить тему топика на "Direct3D в диалоге", или есть другие варианты?


Скорее это название более подходит, когда создавал тему думал, что перенесете в соответствующий раздел это.
Проблема просто в wipapi )

Цитата

в винампе этот дочерний контрол - простой статик (STATIC)

Я выбрал вот такой способ реализации(через контрол, но дела с ними еще не имел только CTEXT,ICON,DEFPUSHBUTTON)
в общих чертах прочитал вот http://dims.karelia.ru/win32/(но не нашел как это вызвать в прграмме)
Вот это не совсем подходит
Код

BOOL WINAPI SetWindowText(HWND hw, LPCSTR lpsz)
BOOL WINAPI SetDlgItemText(HWND hDlg, int idControl, LPCTSTR lpsz)

Как я понимаю вы мне предлагаете сделать вот это?

Код

AboutBox DIALOG 10, 30, 160, 80
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
{
    CONTROL "" ID_DRAW, "STATIC", SS_BLACKFRAME,  3, 3, 150, 60,WS_CHILD|WS_VISIBLE
    CTEXT "О программе" -1, 0, 12, 160, 8
    ICON "about" -1, 8, 8, 0, 0
    CTEXT "Калькулятор" -1, 0, 36, 160, 8
    DEFPUSHBUTTON "OK" IDOK, 64, 60, 32, 14, WS_GROUP
}




Но у меня тогда возникает вопрос:
Откуда взять хэндл или ID_ чтобы направить туда мой Direct3D?


Это сообщение отредактировал(а) toxx - 17.12.2009, 18:16
PM MAIL   Вверх
toxx
Дата 17.12.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

Код

BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    HWND hStream;
    switch(iMsg)
    {
        case WM_INITDIALOG :
            {
                hStream=CreateWindow("static",
                "",WS_CHILD|WS_VISIBLE,
                5, 5, 150, 60,hDlg,NULL,
                hInstance,NULL);
                return 0;
            }
        case WM_COMMAND :
            switch(LOWORD(wParam))
            {
            case ID_DRAW:
                {
                    SetFocus(hStream);
                    InitialDirect3D(hStream);
                    InitialBufferVershin();
                    ShowWindow(hStream, SW_SHOWDEFAULT);
                    UpdateWindow(hStream);
                    while(1)
                    {
                         RenderingDirect3D();
                    }
                    return 0;
                }
                case IDOK :
                case IDCANCEL :
                    EndDialog(hDlg, 0);
                return TRUE;
            }
            break;
    }
return FALSE;
}

Скрин


Это сообщение отредактировал(а) toxx - 17.12.2009, 19:18
PM MAIL   Вверх
GremlinProg
Дата 17.12.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(toxx @  17.12.2009,  20:14 Найти цитируемый пост)

Вот это не совсем подходит
Код

BOOL WINAPI SetWindowText(HWND hw, LPCSTR lpsz)
BOOL WINAPI SetDlgItemText(HWND hDlg, int idControl, LPCTSTR lpsz)


не понял, зачем это?
Цитата(toxx @  17.12.2009,  20:14 Найти цитируемый пост)
Как я понимаю вы мне предлагаете сделать вот это?
Цитата

AboutBox DIALOG 10, 30, 160, 80
STYLE WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
{
    CONTROL "" ID_DRAW, "STATIC", SS_BLACKFRAME,  3, 3, 150, 60,WS_CHILD|WS_VISIBLE
    CTEXT "О программе" -1, 0, 12, 160, 8
    ICON "about" -1, 8, 8, 0, 0
    CTEXT "Калькулятор" -1, 0, 36, 160, 8
    DEFPUSHBUTTON "OK" IDOK, 64, 60, 32, 14, WS_GROUP
}


да, это
Цитата(toxx @  17.12.2009,  20:14 Найти цитируемый пост)

Откуда взять хэндл или ID_ чтобы направить туда мой Direct3D

ID этого контрола ID_DRAW, а дескриптор можно получить, вызвав GetDlgItem с этим ID'ом


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
toxx
Дата 17.12.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всё сделал, все показывает, только опять виснет, кнопки видны,но они также виснут.
Всё вродебы правильно, только не понимаю почему всё окно виснет, когда только в статике показывает...
Код

BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    HWND hStream;
    switch(iMsg)
    {
        case WM_CLOSE:
    {
        if (VK_ESCAPE == wParam) {
            EndDialog(hDlg, TRUE);
        }
    }
        case WM_INITDIALOG :
            {
                return 0;
            }
        case WM_COMMAND :
            switch(LOWORD(wParam))
            {
            case ID_DRAW:
                {
                    //SetFocus(GetDlgItem(hDlg,IDOK));
                    hStream=GetDlgItem(hDlg,ID_CDRAW);
                    InitialDirect3D(hStream);
                    InitialBufferVershin();
                    ShowWindow(hStream, SW_SHOWDEFAULT);
                    //UpdateWindow(hStream);
                    while(1)
                    {
                         RenderingDirect3D();
                    }
                    return 0;
                }
                case IDOK :
                case IDCANCEL :
                    EndDialog(hDlg, 0);
                return TRUE;
            }
            break;
    }
return FALSE;
}

Код

AboutBox DIALOG 10, 30, 160, 90
FONT 10,"Arial"
CAPTION "О программе"
STYLE WS_OVERLAPPED|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_VISIBLE|WS_DLGFRAME
{
    CONTROL "" ID_CDRAW, "STATIC", SS_BLACKFRAME,  3, 3, 150, 50,WS_CHILD|WS_VISIBLE
    DEFPUSHBUTTON "o_O" ID_DRAW, 60,70,32,14, WS_GROUP
    DEFPUSHBUTTON "OK" IDOK, 125,70,32,14, WS_GROUP
}

Скрин
user posted image

Это сообщение отредактировал(а) toxx - 17.12.2009, 20:12
PM MAIL   Вверх
xvr
Дата 17.12.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Вам уже писали - пока крутится это
Код

while(1)
                    {
                         RenderingDirect3D();
                    }
все будет висеть (а крутится оно бесконечно, соотвественно и висеть будет так же)
Нужно добавить в цикл связку PeekMessage/IsDialogMessage/TranslateMessage/DispatchMessage. Кроме того, надо взводить флаг когда пользователь захотел закончить диалог (нажал esc, попробовал закрыть диалог или еще как), и проверять его в цикле. При взведенном флаге - завершать цикл

PM MAIL   Вверх
toxx
Дата 17.12.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(xvr @ 17.12.2009,  20:35)
Вам уже писали - пока крутится это
Код

while(1)
                    {
                         RenderingDirect3D();
                    }
все будет висеть (а крутится оно бесконечно, соотвественно и висеть будет так же)
Нужно добавить в цикл связку PeekMessage/IsDialogMessage/TranslateMessage/DispatchMessage. Кроме того, надо взводить флаг когда пользователь захотел закончить диалог (нажал esc, попробовал закрыть диалог или еще как), и проверять его в цикле. При взведенном флаге - завершать цикл

Вы имели ввиду чтото на подобии этого?
Код

    while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  {
    // Выделяем сообщения для диалоговой панели,
    // если эта панель уже создана
      if (!IsDialogMessage(hwndDlg, &msg))
          while(msg.message!=WM_QUIT) 
            {
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                    TranslateMessage(&msg);
                    DispatchMessage(&msg);
                }
            }
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }



Блин чтото не так опять, опять пол дня убил на непонятно что smile 

Это сообщение отредактировал(а) toxx - 17.12.2009, 22:14
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.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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