Full Screen でスクロール

Full Screen でメッセージをスクロールします。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 解像度を設定して Full Screen Mode で描画します。
    Windows Program の実行環境は、コンシューマゲームのように統一されていません。
    特にモニタの解像度(ウインドウサイズ)は重要で、これがばらばらではゲームに支障をきたします。
    そこでゲームプログラムでは、解像度(ウインドウサイズ)を強制的に設定する方法が良く使われます。
    またモニタをゲームプログラムで占有する Full Screen Mode でプレイする方法も常識です。
  2. hBackDC と hBackBitmap は BackBuffer Serface の定義です。
    HFONT hFont; はタイトルを表示するフォントを設定する領域です。
    S_POS はスクロールメッセージを制御する領域で、タイマ割り込みで「400~0」まで変化します。
    DEVMODE は設定可能なデバイスモードを列挙する領域です。
    MsgTxt[] が表示するメッセージの定義です。
        /**********************************************/
        /*★ Message Scroll のプログラム    前田 稔 ★*/
        /**********************************************/
        #define     NAME    "Full Mode"
        #include    <windows.h>
        #define     ID_TIMER    (WM_APP + 0)
        #define     WIDTH       640
        #define     HEIGHT      480
    
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        HDC         hBackDC= NULL;      //Back Buffer DC
        HBITMAP     hBackBitmap= NULL;  //Back Buffer HBitMap
        HFONT       hFont,hFontOld;
        int         S_POS= 400;
        RECT        RC= { 0, 0, WIDTH-1, HEIGHT-1 };
        DEVMODE     dev[1000];
    
        LPSTR       MsgTxt[] =
        { "宇宙暦○△□×、宇宙連合とクリンゴンは1000",
          "年間に渡り宇宙の覇権争いを続けていた。",
          "近年宇宙連合の劣勢は覆いがたく、このまま行けば",
          "クリンゴンに征服される日も近い。",
          "そこで起死回生の秘策として温存されていた宇宙船",
          "エンタープライズを出動させることにした。"
        };
        
  3. Windows Main 関数の WNDCLASS を設定した後で、SetMode() で解像度を設定します。
    if (SetMode(WIDTH,HEIGHT,32)==FALSE) return 0;
    CreateWindow() のスタイルにタイトルバーを表示しない WS_POPUP|WS_BORDER を設定して下さい。
    プログラムの終了時に ChangeDisplaySettings() で解像度を元に戻します。
    ChangeDisplaySettings(NULL,0);
        int APIENTRY  WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
        {   MSG         msg;
    
            g_hInst= hInst;
            WNDCLASS wc = { CS_CLASSDC,WndProc,0L,0L,hInst,NULL,LoadCursor(NULL,IDC_ARROW),
                            (HBRUSH)GetStockObject(BLACK_BRUSH),NULL,NAME };
            if (RegisterClass(&wc)==0)    return FALSE;
    
            if (SetMode(WIDTH,HEIGHT,32)==FALSE)    return 0;
            g_hWnd= CreateWindow(NAME,NAME,WS_POPUP|WS_BORDER,
                    0,0,WIDTH,HEIGHT,NULL,NULL,hInst,NULL);
            if (!g_hWnd)  return FALSE;
    
            ShowWindow(g_hWnd,nCmdShow);    //Window を表示
            UpdateWindow(g_hWnd);           //表示を初期化
            SetFocus(g_hWnd);               //フォーカスを設定
            while (GetMessage(&msg,NULL,0,0))
            {   TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            ChangeDisplaySettings(NULL,0);
            return S_OK;                    //return 0
        }
        
  4. CALLBACK 関数や CreateBuf() 関数や View() 関数は「ちらつき」を抑えてスクロールと同じです。
    詳細は 「ちらつき」を抑えてスクロール を参照して下さい。
  5. デバイスモードを設定する SetMode() 関数です。
    w が幅で、h が高さで、bits がビットモードです。
    設定できるデバイスモードは「ビデオカードやモニタなど」ハードに依存します。
    詳細は 設定可能な Device Mode を列挙する を参照して下さい。
    自宅では 800,600,32 を使っていますが、学校では設定できませんでした。
    学校の環境ではプロジェクタが接続されているためでしょうか?。
        int  SetMode(WORD w, WORD h, WORD bits)
        {   int     idx,i;
    
            for(idx=0; EnumDisplaySettings(NULL,idx,&dev[idx]); idx++);
            for(i=0; i<idx; i++)
                if (dev[i].dmPelsWidth==w && dev[i].dmPelsHeight==h && dev[i].dmBitsPerPel==bits)   break;
            if (i>=idx)
            {   MessageBox(NULL,"指定されたモードは設定できません","Set Display Mode",MB_OK);
                return FALSE;
            }
            if (ChangeDisplaySettings(&dev[i],0)!=DISP_CHANGE_SUCCESSFUL)
            {   ChangeDisplaySettings(NULL,0);
                MessageBox(NULL,"ChangeDisplay に失敗しました","Set Display Mode",MB_OK);
                return FALSE;
            }
            return TRUE;
        }
        

【演習】

  1. 設定可能なデバイスモードを調べて下さい。
    詳細は 設定可能な Device Mode を列挙する を参照して下さい。
  2. プログラムを完成させて Full Screen Mode で描画して下さい。
  3. デバイスモードは「ビデオカードやモニタなど」ハードに依存します。
    従って、一台のマシンでうまく描画できたからと言って、別のマシンでも同じように動くとは限りません。

【メモ】

  1. 自宅のパソコンでは「800*600」を使っていますが、学校のパソコンでは設定できませんでした。
    学校の環境ではプロジェクタが接続されているためでしょうか?。
    設定できる解像度は「ビデオカードやモニタや接続機器など」ハードに依存するので、実行環境に合わせて試して下さい。
    ちなみに学校では「640*480」で起動できました。
  2. ハードによって完全な Full Screen で表示されない現象が起こっています。
    CreateWindow() のスタイルや SetMode() 関数を呼び出すタイミングを調整すると解決する場合があります。

超初心者のプログラム入門(Win32API C++)