Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Direct3D в диалоге


Автор: toxx 16.12.2009, 23:06
Решил сделать интересное диалоговое меню "О программе" с использованием 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;
}

Автор: Alca 16.12.2009, 23:31
Код

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

Автор: smoke_man 16.12.2009, 23:37
Здесь:
Код

 while(1)
{
        RenderingDirect3D();
}

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

Автор: toxx 17.12.2009, 13:40
Цитата


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(); и при попытке нажать на завершение( на крестик) всё виснет вот скрин
http://www.valar.ru/upload/jpg/1209/1261046358_.htm
user posted image


Цитата

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


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

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

Автор: toxx 17.12.2009, 16:48
Цитата

А если в условие цикла поставить глобальную переменную.
Пока она 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 там сделаны кнопки сверху а понизу 
расположено окно где показывает( не знаю как это сделать).

Автор: Alca 17.12.2009, 16:53
Код

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


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

Автор: toxx 17.12.2009, 17:02
Цитата

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


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

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

http://www.google.com/search?client=opera&rls=ru&q=%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C&sourceid=opera&ie=utf-8&oe=utf-8
Цитата(toxx @  17.12.2009,  18:48 Найти цитируемый пост)
Другое дело может быть сделать чтобы изображение было не во всё окно,и чтобы было видно кнопку ОКТогда дело наверно вот в этой функции

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

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

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

Автор: toxx 17.12.2009, 18:14
Цитата

Добавлено через 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, 19:16
Попробовал вот так,по 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;
}

http://img.pixs.ru/storage/8/9/8/ttjpg_2904809_383898.jpg

Автор: GremlinProg 17.12.2009, 19:24
Цитата(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'ом

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

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
}

Скрин
http://pixs.ru/showimage/1234jpg_4780951_383979.jpg

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

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

Автор: toxx 17.12.2009, 22:07
Цитата(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 

Автор: xvr 17.12.2009, 22:20
Цитата

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

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

Автор: toxx 17.12.2009, 23:08
Цитата(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 

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

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

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

Автор: xvr 18.12.2009, 10:09
Попробуй так:
Код

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;
}


Автор: toxx 18.12.2009, 11:29
Цитата

Попробуй так

Щас возможности откомпилировать нет, но думаю не прокатит т.к.
в диалоге iMsg//UINT
а получается обрабатывает сообщения msg//MSG
Мб я не прав, приду сделаю=)

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

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

Автор: toxx 18.12.2009, 18:08
Цитата(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, 19:05
На всякий случай проверил код функций, всё как в книге(

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

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

Автор: toxx 18.12.2009, 19:51
Цитата(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);
}

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

Автор: toxx 18.12.2009, 20:00
Цитата(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);
}

Автор: 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).
Кстати, создавать и удалять фонт на каждом кадре мне кажется несколько расточительным - почему бы его не создать в начале и не удалить в самом конце (один раз)?

И последнее - если не поможет рекомендую задать этот вопрос http://forum.vingrad.ru/forum/c-c++multimedia-OpenGL-DirectX.html

Автор: toxx 19.12.2009, 13:21
Цитата(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).
Кстати, создавать и удалять фонт на каждом кадре мне кажется несколько расточительным - почему бы его не создать в начале и не удалить в самом конце (один раз)?

И последнее - если не поможет рекомендую задать этот вопрос http://forum.vingrad.ru/forum/c-c++multimedia-OpenGL-DirectX.html

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)