Модераторы: 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   Вверх
xvr
Дата 17.12.2009, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

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

Блин чтото не так опять,
Но только этого ОДНОГО недостаточно. Этот кусок кода позволяет работать обычной оконной системе Windows, в частности позволяет реагировать на нажатия кнопок (и мыши). Но эти нажатия тоже надо обрабатывать, и при этом не забыть, что вы находитесь НЕ в основном цикле обработки сообщений, а внутри цикла показа DirectX, и из него сначала нужно выйти. А для этого надо понять, что пора выходить  smile 

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


Опытный
**


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

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



Цитата(xvr @ 17.12.2009,  22:20)
Цитата

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

Блин чтото не так опять,
Но только этого ОДНОГО недостаточно. Этот кусок кода позволяет работать обычной оконной системе Windows, в частности позволяет реагировать на нажатия кнопок (и мыши). Но эти нажатия тоже надо обрабатывать, и при этом не забыть, что вы находитесь НЕ в основном цикле обработки сообщений, а внутри цикла показа DirectX, и из него сначала нужно выйти. А для этого надо понять, что пора выходить  smile

АААААА сделал чето
Код

HWND hStream;
    while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
      if (!IsDialogMessage(hwndDlg, &msg))
          while(msg.message!=WM_QUIT) 
            {
                hStream=GetDlgItem(hwndDlg,ID_CDRAW);
                InitialDirect3D(hStream);
                InitialBufferVershin();
                ShowWindow(hStream, SW_SHOWDEFAULT);
                //UpdateWindow(hStream);
                if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                     TranslateMessage(&msg);
                     DispatchMessage(&msg);
                }else RenderingDirect3D();
            }
      else{ TranslateMessage(&msg);
      DispatchMessage(&msg);}
    }


Это чето ест 1гб оперативной памяти и причем её потребление растет с каждой секундой...что делать не понятно...
Хотя работает как надо smile 
PM MAIL   Вверх
TGrey
Дата 17.12.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А ему обязательно инициализировать буферы в цикле? Возможно оно и есть память? Один раз инициализировать перед циклом, а потом выводить.
PM MAIL   Вверх
toxx
Дата 17.12.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(TGrey @ 17.12.2009,  23:38)
А ему обязательно инициализировать буферы в цикле? Возможно оно и есть память? Один раз инициализировать перед циклом, а потом выводить.

Да это и есть весь этот 1 гб)
Только если это всё убирать из цикла, то ничего не работает(хотя программа в любом случае не работает).
Я уже разные комбинации перепробовал все впустую smile 
Короче я уже не знаю чего делать с этой проблемой, сижу с 5 часов в компиляторе уже,не в радость это всё ужеsmile  + за день нифига не сделалsmile 

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


Эксперт
****


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

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



Попробуй так:
Код

OOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
 static int do_exit=0;

    switch(iMsg)
    {    
        case WM_KEYDOWN:
            {
                if(wParam==VK_ESCAPE)
                {do_exit=1; 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(!do_exit)
                    {
                      while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                      {
                       if (!IsDialogMessage(hwndDlg, &msg)
                        {
                         TranslateMessage(&msg);
                         DispatchMessage(&msg);
                        }
                      }
                      RenderingDirect3D();
                    }
                    return 0;
                }
                case IDOK :
                case IDCANCEL :
                    do_exit=1;
                    EndDialog(hDlg, 0);
                return TRUE;
            }
            break;
    }
return FALSE;
}



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


Опытный
**


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

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



Цитата

Попробуй так

Щас возможности откомпилировать нет, но думаю не прокатит т.к.
в диалоге iMsg//UINT
а получается обрабатывает сообщения msg//MSG
Мб я не прав, приду сделаю=)
PM MAIL   Вверх
xvr
Дата 18.12.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(toxx @ 18.12.2009,  11:29)
Щас возможности откомпилировать нет, но думаю не прокатит т.к.
в диалоге iMsg//UINT
а получается обрабатывает сообщения msg//MSG

Прокатит - IsDialogMessage и DispatchMessage преобразую что надо куда надо

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


Опытный
**


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

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



Цитата(xvr @ 18.12.2009,  17:35)
Цитата(toxx @ 18.12.2009,  11:29)
Щас возможности откомпилировать нет, но думаю не прокатит т.к.
в диалоге iMsg//UINT
а получается обрабатывает сообщения msg//MSG

Прокатит - IsDialogMessage и DispatchMessage преобразую что надо куда надо

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

Код

MSG msg; 


Действует только в WinMain, вот в этом и все проблемы.
Спасибо еще раз, надолкнули на правильный путь.


Блин а память все так и жрёт....1гб стабильно(
Это ###
Код

BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMsg,
                           WPARAM wParam, LPARAM lParam)
{
    HWND hStream;
    MSG msg;
    static int do_exit=0;
    switch(iMsg)
    {
        case WM_DESTROY:
            {
                DeleteDirect3D();
                PostQuitMessage(0);
                return 0;
            }
         case WM_KEYDOWN:
            {
                if(wParam==VK_ESCAPE)
                {
                    do_exit=1; 
                    PostQuitMessage(0);
                    DeleteDirect3D();
                }
                return 0;
            }
        case WM_INITDIALOG :
            {
                return 0;
            }
         case WM_COMMAND :
         { 
             switch(LOWORD(wParam))
             {
                case ID_DRAW:
                {
                    hStream=GetDlgItem(hDlg,ID_CDRAW);
                    InitialDirect3D(hStream);
                    InitialBufferVershin();
                    ShowWindow(hStream, SW_SHOWDEFAULT);
                    UpdateWindow(hStream);
                    while(!do_exit)
                    {
                      while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                      {
                       if (!IsDialogMessage(hStream, &msg))
                        {
                         TranslateMessage(&msg);
                         DispatchMessage(&msg);
                        }
                      }
                      RenderingDirect3D();
                    }
                    return 0;
                }
                case IDOK :
                case IDCANCEL :
                {
                    DeleteDirect3D();
                    do_exit=1;
                    EndDialog(hDlg, 0);
                    return 0;
                }
                //return TRUE;
            }
         }
    }
return FALSE;
}


В свете этого поедания памяти проверил и пример c DX там тоже жрёт память пока работает 1гб++ и увеличивается,
что за фигня не понятно, неужели кто писал книгу совсем?)Или я где тупанул...

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


Опытный
**


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

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



На всякий случай проверил код функций, всё как в книге(
PM MAIL   Вверх
xvr
Дата 18.12.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(toxx @ 18.12.2009,  18:08)
Блин а память все так и жрёт....1гб стабильно(

Видимо проблема в RenderingDirect3D. Можно на ее код глянуть?

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


Опытный
**


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

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



Цитата(xvr @ 18.12.2009,  19:42)
Цитата(toxx @ 18.12.2009,  18:08)
Блин а память все так и жрёт....1гб стабильно(

Видимо проблема в RenderingDirect3D. Можно на ее код глянуть?

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

VOID RenderingDirect3D()
{
    if(pDirect3DDevice==NULL)
        return;
    pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
                            D3DCOLOR_XRGB(60,100,150),1.0f,0);
    pDirect3DDevice->BeginScene();
    /////
    LightMaterial();
    Matrix();
    pDirect3DDevice->SetStreamSource(0,pBufferVershin,0,
                        sizeof(CUSTOMVERTEX));
    pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    //pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,2);
    pDirect3DDevice->SetIndices(pBufferIndex);
    pDirect3DDevice->SetTexture(0,pTextura001);
    pDirect3DDevice->SetTextureStageState(0,D3DTSS_COLORARG1,
                                            D3DTA_TEXTURE);
    pDirect3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,
                                            D3DTOP_MODULATE);
    pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
                                    0,0,36,0,12);
    DrawMyText(pDirect3DDevice,hFont,"Calculator",
                       10,10,500,700,D3DCOLOR_ARGB(250,250,250,50));
    /////
    pDirect3DDevice->EndScene();
    pDirect3DDevice->Present(NULL,NULL,NULL,NULL);
}

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


Эксперт
****


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

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



Тоже ничего криминального не вижу. А как насчет функций LightMaterial, Matrix и DrawMyText?

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


Опытный
**


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

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



Цитата(xvr @ 18.12.2009,  19:57)
Тоже ничего криминального не вижу. А как насчет функций LightMaterial, Matrix и DrawMyText?

Тоже смотрю... ничего тоже пока не нашел.
Вот они
Код

VOID LightMaterial()
{
    D3DMATERIAL9 Material;
    D3DLIGHT9 Light;
    ZeroMemory(&Material,sizeof(D3DMATERIAL9));
    Material.Diffuse.r=Material.Ambient.r=1.0f;
    Material.Diffuse.g=Material.Ambient.g=1.0f;
    Material.Diffuse.b=Material.Ambient.b=1.0f;
    Material.Diffuse.a=Material.Ambient.a=1.0f;
    pDirect3DDevice->SetMaterial(&Material);
    D3DXVECTOR3 VectorDir;
    ZeroMemory(&Light,sizeof(D3DLIGHT9));
    Light.Type=D3DLIGHT_DIRECTIONAL;
    Light.Diffuse.r=1.0f;
    Light.Diffuse.g=1.0f;
    Light.Diffuse.b=1.0f;
    Light.Range=1000.0f;
    VectorDir=D3DXVECTOR3(0.0f,0.0f,1.0f);
    D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction,&VectorDir);
    pDirect3DDevice->SetLight(0,&Light);
    pDirect3DDevice->LightEnable(0,TRUE);
    pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
    pDirect3DDevice->SetRenderState(D3DRS_AMBIENT,0);
}
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,
                HFONT hFont,char* StrokaTexta,
                int x,int y,int x1,int y1,
                D3DCOLOR MyColor)
{
    hFont=CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,
        0,0,0,DEFAULT_PITCH|FF_MODERN,"Arial");
    Rec.left=x;
    Rec.top=y;
    Rec.right=x1;
    Rec.bottom=y1;
    D3DXCreateFont(pDirect3DDevice, 30,10, 1, 0, FALSE, 0,30,0,0, "Arial", &pFont);
    pFont->DrawText(0, StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor);
}
VOID Matrix()
{
    D3DXMATRIX MatrixWorld,MatrixWorldX,MatrixWorldY,MatrixWorldZ;
    D3DXMATRIX MatrixView;
    D3DXMATRIX MatrixProjection;

    UINT Time=timeGetTime()%5000;
    FLOAT Angle=Time*(2.0f*D3DX_PI)/5000.0f;
    D3DXMatrixRotationY(&MatrixWorldY,Angle);
    D3DXMatrixRotationZ(&MatrixWorldZ,Angle);
    D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldZ,&MatrixWorldY);
    pDirect3DDevice->SetTransform(D3DTS_WORLD,&MatrixWorld);
    D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.0f),
                        &D3DXVECTOR3(0.0f,0.0f,0.0f),
                        &D3DXVECTOR3(0.0f,1.0f,0.0f));
    pDirect3DDevice->SetTransform(D3DTS_VIEW,&MatrixView);

    D3DXMatrixPerspectiveFovLH(&MatrixProjection,D3DX_PI/4,
                                1.0f,1.0f,100.0f);
    pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MatrixProjection);
}

PM MAIL   Вверх
xvr
Дата 19.12.2009, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Есть подозрение (все в функции DrawMyText)
1) Зачем там строка hFont=CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,0,0,0,DEFAULT_PITCH|FF_MODERN,"Arial");? hFont более нигде не используется (и не удаляется!)
2) D3D фонт, созданный через D3DXCreateFont не удаляется (надо позвать pFont->Release() перед выходом, или использовать smart указатель для pFont).
Кстати, создавать и удалять фонт на каждом кадре мне кажется несколько расточительным - почему бы его не создать в начале и не удалить в самом конце (один раз)?

И последнее - если не поможет рекомендую задать этот вопрос тут

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


Опытный
**


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

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



Цитата(xvr @ 19.12.2009,  11:55)
Есть подозрение (все в функции DrawMyText)
1) Зачем там строка hFont=CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,0,0,0,DEFAULT_PITCH|FF_MODERN,"Arial");? hFont более нигде не используется (и не удаляется!)
2) D3D фонт, созданный через D3DXCreateFont не удаляется (надо позвать pFont->Release() перед выходом, или использовать smart указатель для pFont).
Кстати, создавать и удалять фонт на каждом кадре мне кажется несколько расточительным - почему бы его не создать в начале и не удалить в самом конце (один раз)?

И последнее - если не поможет рекомендую задать этот вопрос тут

Да я тоже сегодня методом исключения функций из цикла добился тогоже результата, что и вы посмотрев функции.
Вычислил что эта функция непомерно ест память...Только вот проблема, пример в книге был нерабочий.
D3DXCreateFont устарела(в книге где она использовалась принималось 3 параметра, а в версии DX9 SDK march 2009
она уже принимает 6 параметров, как ей пользоваться я так и не нашел в интернете...Но понял что DirectX развивается не по
дням , а по часам...))
Спасибо, что посмотрели код.Теперь я практически завершил свой калькулятор.Осталось текст добавить только в DX и будет готово.

Это сообщение отредактировал(а) toxx - 19.12.2009, 13:35
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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