[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    люди добрые, почему етот код не выводит на экран окно???? я нажимаю отладку а он просто моргает и всё.


    #include <windows.h>

    #define MAX_LOADSTRING 100

    TCHAR WINDOWSCLASS[MAX_LOADSTRING]; // имя класса главного окна
    TCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка

    LRESULT CALLBACK MainWindProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
    {
    switch(msg)
    {
    case WM_PAINT:
    break;
    case WM_DESTROY:
    {
    PostQuitMessage(0);
    return(0);
    }break;
    }
    return(DefWindowProc(hwnd, msg, wparam, lparam));
    }

    int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
    {
    WNDCLASSEX windowsclass;
    HWND hwnd;
    MSG msg;

    windowsclass.cbSize = sizeof(WNDCLASSEX);

    windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    windowsclass.lpfnWndProc = MainWindProc;
    windowsclass.cbClsExtra = 0;
    windowsclass.cbClsExtra = 0;
    windowsclass.hInstance = hinstance;
    windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
    windowsclass.lpszMenuName = NULL;
    windowsclass.lpszClassName = WINDOWSCLASS;
    windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&windowsclass))
    {
    return (0);
    }

    hwnd = CreateWindowEx(NULL, WINDOWSCLASS, szTitle, WS_OVERLAPPEDWINDOW, 0, 0, 500, 400, NULL, NULL, hinstance, NULL);

    if(!hwnd)
    {
    return FALSE;
    }

    ShowWindow(hwnd, SW_SHOWDEFAULT);
    UpdateWindow(hwnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    return (msg.wParam);
    }
     
  2. Tor Bel

    Tor Bel New Member

    Joined:
    13 Dec 2008
    Messages:
    12
    Likes Received:
    0
    Reputations:
    0
    windowsclass.lpszClassName = WINDOWSCLASS;
    Вместо WINDOWSCLASS должно быть имя класса. Например 'MyClass'
     
  3. revenantus

    revenantus New Member

    Joined:
    27 Sep 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    как в вижле организовать рандом в пределах какого-то значения.в борланд билдере я использовал randomize, в вижле никак не выходит.нагуглил rand, но как в него диапазон значений вбить так и не разобрался
     
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

    читаем:

     
  5. revenantus

    revenantus New Member

    Joined:
    27 Sep 2010
    Messages:
    9
    Likes Received:
    0
    Reputations:
    0
    получилось :) .только я так понял предел в 32767 значений.этого конечно хватит, но мб есть варианты с беспредельными значениями?
     
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Как вариант - использовать rand() * rand().
     
  7. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    подскажите, почему данный код компилируется, но окно как только выводится на экран, сразу само закрывается. Я только и успеваю рассмотреть серый фон. :confused:
    Причём если я убираю код инициализации directX, то всё в порядке, окно на экране и ждёт пока я его не закрою. Вот исходник.

    Code:
    #include <windows.h>
    #include <d3d9.h>
    #include <d3dx9.h>
    
    WNDCLASSEX windowsclass;
    MSG msg;
    HWND hWnd;
    LPDIRECT3D9 pDirect3D = 0;   
    LPDIRECT3DDEVICE9 pDirect3DDevice = 0;
    
    HRESULT InitialDX(HWND hWnd);    // Функция инициализации DIRECTX 
    void Render();    // Функция рендеринга(отрисовки) 
    void ReleaseDX();   // Функция освобождения устройств. 
    
    LRESULT CALLBACK WinProc(HWND hWnd,UINT msg,WPARAM wparam,LPARAM lparam)   //функция обработки сообщений 
    { 
      switch(msg) 
      { 
      case WM_DESTROY:    // закрытие(уничтожение) окна 
       { 
    	ReleaseDX();
        PostQuitMessage(0); 
        return 0; 
       }  
      } 
      return (DefWindowProc(hWnd,msg,wparam,lparam)); 
    } 
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 
    { 
    
      // инициализация класа окна 
      windowsclass.cbSize = sizeof(windowsclass);    // Размер всей структуры 
      windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);    //Цвет фона окна 
      windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW);  //Вид курсора 
      windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);    //Иконка приложения 
      windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);    // Иконка в заголовке окна 
      windowsclass.hInstance = hInstance;      //Экземпляр приложения 
      windowsclass.lpfnWndProc = WinProc;      //Наша функция обработки событий 
      windowsclass.lpszClassName = L"windowsclass";   //Имя класса окна 
      windowsclass.style = CS_DBLCLKS|CS_OWNDC|CS_HREDRAW|CS_VREDRAW;    //Задание стиля окна 
       
      RegisterClassEx(&windowsclass);  //Регистрация класа окна в операционной системе 
    
      //Создание окна 
      hWnd = CreateWindow( 
       L"windowsclass",    //Имя класса окна 
       L"DirectX",  // Заголовок окна 
       WS_OVERLAPPEDWINDOW|WS_VISIBLE,    //Стиль окна 
       100, 100,  // Координаты левого верхнего угла 
       600,   // Ширина окна 
       600,   // Высота окна 
       NULL,   // Дескриптор родительского окна 
       NULL,   // Дескриптор меню 
       hInstance,  // Экземпляр 
       NULL);  // Дополнительные параметры 
    
    if (SUCCEEDED(InitialDX(hWnd))) 
       {   
        ShowWindow(hWnd, nShowCmd);    // Вывод окна 
        UpdateWindow(hWnd);   // Обновление окна 
    
        ZeroMemory(&msg,sizeof(msg));    //Очистка сообщений 
    
        while(msg.message!=WM_QUIT)    // Цикл обработки сообщений 
        { 
         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
         { 
          TranslateMessage(&msg); 
          DispatchMessage(&msg); 
         } 
         else 
         { 
          Render();    //Наш код 
         } 
        } 
       } 
    } 
    
    HRESULT InitialDX(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;       // Рeжим отображения приложения(true - оконное, false -полноэкранное) 
       Direct3DParametr.SwapEffect=D3DSWAPEFFECT_DISCARD;  // Метод переключения буферов 
       Direct3DParametr.BackBufferFormat=Display.Format;  // Формат пикселя(колличество разрядов цвета) 
       Direct3DParametr.EnableAutoDepthStencil=TRUE;   // Управление буфером глубины 
       Direct3DParametr.AutoDepthStencilFormat=D3DFMT_D16;  // Формат буфера глубины 
       Direct3DParametr.BackBufferWidth=Display.Width;   // Ширина буфера 
       Direct3DParametr.BackBufferHeight=Display.Height;  // Высота буфера 
       //    Direct3DParametr.FullScreen_RefreshRateInHz=Display.RefreshRate;    //Частота обновления экрана(только в полноэкранном режиме) 
         
       if (FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, // используемая видеокарта 
        D3DDEVTYPE_HAL,  // тип устройства 
        hWnd,    // дескриптор родительского окна 
        D3DCREATE_HARDWARE_VERTEXPROCESSING,    //режим обработки шейдеров 
        &Direct3DParametr,    // структура с настройками 
        &pDirect3DDevice))) // указатель на устройство 
    
        return E_FAIL; 
    
       return S_OK; 
    } 
    
    void Render() 
    { 
       pDirect3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0); //Очистка вторичного буфера 
       pDirect3DDevice->BeginScene();    //Начало рендеринга 
       // Код отрисовки сцены 
       pDirect3DDevice->EndScene();    //Конец рендеринга 
       pDirect3DDevice->Present(NULL,NULL,NULL,NULL); // копирование вторичного буфера в первичный
    } 
    
    void ReleaseDX() 
    { 
       if(pDirect3DDevice!=NULL) 
        pDirect3DDevice->Release(); 
       if(pDirect3D!=NULL) 
        pDirect3D->Release(); 
    } 
    
     
    #5707 maked0n, 3 Oct 2010
    Last edited: 3 Oct 2010
  8. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    http://vxheavens.com/lib/vsl04.html
     
  9. dzhioev

    dzhioev New Member

    Joined:
    3 Oct 2010
    Messages:
    3
    Likes Received:
    2
    Reputations:
    0
    Плохой вариант, распределение совсем неравномерное получится.
    Лучше что-то вроде rand() | (rand() << log2(RAND_MAX))
     
  10. maked0n

    maked0n New Member

    Joined:
    14 Sep 2010
    Messages:
    144
    Likes Received:
    3
    Reputations:
    0
    ещё обнаружил что вот тут
    f (FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, // используемая видеокарта
    D3DDEVTYPE_HAL, // тип устройства
    hWnd, // дескриптор родительского окна
    D3DCREATE_HARDWARE_VERTEXPROCESSING, //режим обработки шейдеров
    &Direct3DParametr, // структура с настройками
    &pDirect3DDevice))) // указатель на устройство
    оно возвращает E_FAIL.
     
  11. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Текстовые функции

    Есть ли в С++ аналог функций VB: left() и right() ?
    Если нет, то возможно ли их реализовать? :confused:
     
  12. JohnnyBGoode

    JohnnyBGoode Member

    Joined:
    5 Oct 2010
    Messages:
    48
    Likes Received:
    11
    Reputations:
    5
    Используй цикл for
     
  13. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    цикл for пойдёт для left()... а как для right() сделать?
     
  14. JohnnyBGoode

    JohnnyBGoode Member

    Joined:
    5 Oct 2010
    Messages:
    48
    Likes Received:
    11
    Reputations:
    5
    Code:
    char str[80]="Строка";
    int i,n;
    cout<<"Необходимое число знаков с правой стороны строки:";
    cin>>i;
    
    for (n=strlen(str)-i;str[n];n++)
    	cout<<str[n];
    Вроде должно работать
     
  15. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Спасибо, лови +
    Кстати, как сделать чтоб в консоли русские буквы работали? А то краказябру всякую выводит...
     
  16. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Прочитать док по WinAPI-функции CharToOem и использовать ее)
    Или выводить в консоль сразу в Unicode, но это более сложно.
     
  17. Int32

    Int32 New Member

    Joined:
    24 Aug 2010
    Messages:
    19
    Likes Received:
    1
    Reputations:
    1
    Юзай CharToOem из windows.h

    вот пример

    #include <windows.h>

    void main()
    {
    char buf[10];
    char str[10]="Привет мир";
    CharToOem(str, buf);
    cout<<buf<<endl;

    }
     
  18. Jest

    Jest New Member

    Joined:
    4 Oct 2010
    Messages:
    27
    Likes Received:
    0
    Reputations:
    0
    Не могу понять в чём ошибка:
    Code:
    int main () 
    { 
    char string[1024], message[512]; 
    int cnt,i; 
    CharToOem("Введите текст: ", message);
    cout << message << endl; 
    cin >> string[1024]; 
    CharToOem("Введите число: ", message); 
    cout << message << endl;
    cin >> cnt; 
    cout <<"\n";  
     return 0; }
    Выводит:
    Программа не воспринимает последний cin >>
    Может кто подскажет что не так?
     
  19. JohnnyBGoode

    JohnnyBGoode Member

    Joined:
    5 Oct 2010
    Messages:
    48
    Likes Received:
    11
    Reputations:
    5
    Code:
    CharToOem("Введите текст: ", message);
    cout << message << endl; 
    cin >> string[1024];
    Здесь надо писать просто string
     
  20. nitx

    nitx Elder - Старейшина

    Joined:
    4 Jan 2008
    Messages:
    214
    Likes Received:
    31
    Reputations:
    10
    Подскажите пожалуйста, как эмулировать нажатия клавиш в чужом процессе? Под Windows.
    С ВинАПИ вобще незнаком, так что, желательно с рабочим примером.
     
Thread Status:
Not open for further replies.