Win Api

Тема в разделе "MS Visual C++", создана пользователем LovePower, 7 мар 2010.

Статус темы:
Закрыта.
  1. LovePower

    LovePower Гость

    Здравствуйте, уважаемые программисты)). Я в программировании на с++ сравнительно недавно.. Ну основы программирования уже знаю на мой взгляд хорошо)). Код бью на зарошем паутиной продукте Microsoft Visual C++ 6.0.. Вот начал изучать DirectX SDK, в своем первом приложении Windows 32 Applications хочу инициализировать DirectX в окне, это даст представление о том, как можно сделать обычную программу внедрив в нее средства DirectX, мне кажется ее можно будет сделать намного красивее и динамичнее, минус только один у конечного пользователя должен быть установленный DirectX 9.0, но думаю в наше время уже все распологают этим программным продуктом.
    И так собственно к делу, создаю я окно, а оно тупо не появляется, вроде все правильно забил, и функции ShowWindow, UpdateWindow вбил, а оно все равно не появляется, и самое главное, компилятор даже не ругается ни на что((. говорит 0 ошибок, 0 предостережений. Нувот собственно мой горе код))), на инициализацию DirectX можно забить, главное помогите пожалуйста с выведение окна на экран, спасибо большое заренее).
    Код (C++):
    #include "windows.h"
    #include "d3d9.h"
    LPARAM _stdcall MyWindProc (HWND,UINT,WPARAM,LPARAM);
    int _stdcall WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
    WNDCLASS MyWindow;
    MyWindow.cbClsExtra = 0;
    MyWindow.cbWndExtra = 0;
    MyWindow.hbrBackground = (HBRUSH) (6);
    MyWindow.hCursor = LoadCursor (NULL,IDC_ARROW);
    MyWindow.hIcon = LoadIcon (NULL,IDI_APPLICATION);
    MyWindow.hInstance = hInstance;
    MyWindow.lpfnWndProc = MyWindProc;
    MyWindow.lpszClassName = TEXT("class");
    MyWindow.lpszMenuName = NULL;
    MyWindow.style = CS_OWNDC;
    RegisterClass (&MyWindow);
    HWND hWnd = CreateWindow (TEXT("class"),TEXT("Moe okno!!"),WS_OVERLAPPEDWINDOW,
    200,100,500,500,NULL,NULL,hInstance,NULL);
    ShowWindow (hWnd,nShowCmd);
    UpdateWindow(hWnd);
    IDirect3D9 *d3d=NULL;
    IDirect3DDevice9 *dev=NULL;
    d3d = Direct3DCreate9(D3D_SDK_VERSION);
    D3DPRESENT_PARAMETERS pp;
    ZeroMemory(&pp,sizeof(pp));
    pp.BackBufferWidth = 500;
    pp.BackBufferHeight = 500;
    pp.BackBufferFormat = D3DFMT_X8R8G8B8;
    pp.BackBufferCount = 1;
    pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    pp.hDeviceWindow = hWnd;
    pp.Windowed = true;
    d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING, &pp, &dev);
    MSG msg;
    while (1)
    {
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
    if (msg.message == WM_QUIT)
    break;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    dev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(255,255,255),
    1.0f,0);
    dev->BeginScene();
    dev->EndScene();
    dev->Present(NULL,NULL,NULL,NULL);
    }
    if (d3d != NULL)
    d3d->Release();
    if (dev != NULL)
    dev->Release();
    return 0;

    }

    LPARAM _stdcall MyWindProc (HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    switch (msg)
    {
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    }
    return MyWindProc (hWnd,msg,wParam,lParam);
    }
    Добавлено: помогите плиз, пока я себе весь фейс об тэйбол не разбил)))) еще, если кто этим уже занимался, может подскажете хорошие доки по DirectX 9? было бы вообще прекрасно если бы книга была ориентированна под Visual c++ 6.0)
     
  2. borpavlenko

    borpavlenko New Member

    Регистрация:
    10 июл 2008
    Сообщения:
    2
    Симпатии:
    0
    Не считаю себя в этом Докой, но имхо в LPARAM _stdcall MyWindProc (HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) не может быть рекурсий.
    попробуй так:
    Код (Text):
    LPARAM _stdcall MyWindProc (HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    switch (msg)
    {
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;// кстати, тут может быть и просто break;
    }
    return 0;
    }
     
  3. LovePower

    LovePower Гость

    ;) возвратил в функцию значение 0, программа критует, компилятор по прежнему говорит что все норм)). возвратил значение 1 появилось подобие окна, размеров таких как указано, но оно не перересовывается, у него нет заголовка, и вообще ужас короче, нашел пример в инете по созданию окна, тупо скопировал в новую прогу, все норм работает, тупо пишу своими руками код, ничего не получается, хотя код сравниваю, вроде все так как написано в примере)))) короче видимо дело именно в моих кривых пальцах(((.. просто я хочу знать как это все происходит, как вручную можно создать окно, ну почти в ручную, хотяб используя уже написанную микрософтом функцию, а то создаешь апп визардом новую прогу, связываешь кнопочками события с обьектами, потом вписываешь в эту процедуру код, и такое не хорошее чувство ламера(((.. короче мне нужна литра по программированию, по с++ нашел много а именно по программированию для виндовс - типо работа с диалоговыми окнами, изображениями ничего не нашел (((.. приму любую помощь, начиная от кусков интересного кода и заканчивая названиями хороших книг по этому делу ).

    СОВА спасибо большое за потраченное время на написание твоего сообщения, но чет не прокатило (..
     
  4. borpavlenko

    borpavlenko New Member

    Регистрация:
    10 июл 2008
    Сообщения:
    2
    Симпатии:
    0
    Думаю, что в таком случае надо сначала в тонкостях освоить программирование на чистом API, что бы понимать какие (хотя бы основные) события надо обрабатывать и как.
    Вот пример функции окна, которую создает по умолчанию MSVC2008
    Код (Text):
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
    case WM_COMMAND:
    wmId    = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    // Parse the menu selections:
    switch (wmId)
    {
    case IDM_ABOUT:
    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
    break;
    case IDM_EXIT:
    DestroyWindow(hWnd);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    // TODO: Add any drawing code here...
    EndPaint(hWnd, &ps);
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hWnd, message, wParam, lParam); // посмотри ка! обрабатываются ВСЕ события, а не только те, что ты хочешь описать вручную! МБ поэтому у тебя не рисуется?
    }
    return 0;
    }
    Накручивать сразу же DX на отсутствие навыков программирования на голом API...
    Тут 2 варианта для тебя,
    ::::: либо использование готовых сред вроде MFC, CLR или же VCL (от Borland) - что отнюдь не означает, что все будет 100% получаться и будет получаться легче. Напротив, в этом случае придется вникать в некоторые моменты которые не описываются в литературе посвященной чистому API+DX (OpenGL) и придется опять таки активно шевелить волосами и лопатить форумы/книги, что бы скомпоновать и применить;
    ::::: либо же заняться снчала изучением API, что бы достаточно точно представлять себе работу приложений в Win, ибо они несколько отличаются от тех консольных, на которых мы все учились.

    Что касается меня... то я когда-то давно так же осваивал OpenGL, и я пошел по 1му пути, я адаптировал OpenGL+API к Borland Builder 5... времена, когда интернет был маленьким, мозги были юношеские, а мечты прекрасными. Удалось достигнуть определенных успехов в этом, сравнивая примеры из книжки (которые никак не хотели у меня собираться в рабочее приложение) и примеры из комплекта BCB, которые собирались не совсем в то, что мне было нужно.

    Позже, конечно, я занялся таки изучением API, и теперь понимаю, что начинать надо было именно с него.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей