• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            沒畫完的畫

            喂馬 劈柴 BBQ~
            posts - 37, comments - 55, trackbacks - 0, articles - 0
              C++博客 ::  :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            初探DirectDraw 第2集

            Posted on 2008-09-26 17:51 沒畫完的畫 閱讀(1550) 評(píng)論(1)  編輯 收藏 引用 所屬分類: DirectX
            第1集中,DirectDraw 畫出來的界面是全屏的,想把它改成窗口的
            我把原先在調(diào)用 SetCooperativeLevel() 時(shí) DDSCL_FULLSCREEN 參數(shù)改成 DDSCL_NORMAL 
             if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL  )))
             
            結(jié)果后面的
            CreateSurface() 就調(diào)用失敗了,返回的錯(cuò)誤是 DDERR_INVALIDCAPS
             
            Google 了一下,意外地找到幾個(gè)URL
             
            另外也找到了答案,代碼改動(dòng)如下:
            /**
              * 設(shè)置參數(shù)
              
            */

             
            if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL  )))
             
            {
              MessageBox(NULL,TEXT(
            "DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
              
            return(0);
             }


             
            /**
              * 創(chuàng)建一個(gè)表層
              
            */

             DDSURFACEDESC ddsd;
             LPDIRECTDRAWSURFACE lpDDSPrimary;
             ddsd.dwSize 
            = sizeof(ddsd); 
             ddsd.dwFlags 
            = DDSD_CAPS ; 
             ddsd.ddsCaps.dwCaps 
            = DDSCAPS_PRIMARYSURFACE; 
             ddsd.dwBackBufferCount 
            = 1
             ddrval 
            = lpDDraw->CreateSurface(&ddsd, &lpDDSPrimary, NULL); 
                
            if (FAILED(ddrval))
             
            {
               MessageBox(NULL, 
            "Failed to CreateSurface", NULL, MB_OK);
              
            return FALSE;
             }


            全部代碼:
             /**
              * 創(chuàng)建一個(gè) DirectDraw 對(duì)象
              
            */

             LPDIRECTDRAW _lpDD 
            = NULL; 
             HRESULT ddrval 
            = DirectDrawCreate(NULL, &_lpDD, NULL);
                
            if (FAILED(ddrval))
             
            {
                 MessageBox(NULL, 
            "Failed to DirectDrawCreate", NULL, MB_OK);
              
            return FALSE;
             }

             LPDIRECTDRAW lpDDraw 
            = NULL;
             
            if(FAILED(_lpDD->QueryInterface(IID_IDirectDraw, (LPVOID *)&lpDDraw)))
             
            {
              MessageBox(NULL,TEXT(
            "DirectDraw QueryInterface error!"), TEXT("Wrong!"), MB_OK);
              
            return(0);
             }

             
            /**
              * 設(shè)置執(zhí)行模式
              
            */

             
            if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL  )))
             
            {
              MessageBox(NULL,TEXT(
            "DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
              
            return(0);
             }

             
            /**
              * 創(chuàng)建一個(gè)表層
              
            */

             DDSURFACEDESC ddsd;
             LPDIRECTDRAWSURFACE lpDDSPrimary;
             ddsd.dwSize 
            = sizeof(ddsd); 
             ddsd.dwFlags 
            = DDSD_CAPS ; 
             ddsd.ddsCaps.dwCaps 
            = DDSCAPS_PRIMARYSURFACE; 
             ddsd.dwBackBufferCount 
            = 1
             ddrval 
            = lpDDraw->CreateSurface(&ddsd, &lpDDSPrimary, NULL); 
                
            if (FAILED(ddrval))
             
            {
               MessageBox(NULL, 
            "Failed to CreateSurface", NULL, MB_OK);
              
            return FALSE;
             }

             HDC hdc;
             
            if(lpDDSPrimary->GetDC(&hdc) == DD_OK) 
             

              SetBkColor(hdc, RGB(
            0,0,255)); 
              SetTextColor( hdc,RGB(
            255,255,0 ) ); 
              TextOut( hdc, 
            00"sxFrontMsg", lstrlen("szFrontMsg")); 
              lpDDSPrimary
            ->ReleaseDC(hdc); 
             }
             

            *-*!!!! 
            雖然不像之前全屏黑色,這次是“窗口模式”,DDSCL_NORMAL 或 DDSCL_FULLSCREEN 跟調(diào)用 CreateSurface() 時(shí)的參數(shù)有聯(lián)系,
             
            但怎么 TextOut  還是在屏幕的左上角?????
             
            聽說有一個(gè) Clipper 的對(duì)象,就是一個(gè)“剪切區(qū)域”,通過這個(gè)對(duì)象可以防止畫圖畫出指定的范圍
             
            修改代碼如下:
            /**
              * 設(shè)置執(zhí)行模式
              
            */

             
            if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL  )))
             
            {
              MessageBox(NULL,TEXT(
            "DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
              
            return(0);
             }

             
            /**
              * 創(chuàng)建一個(gè)表層
              
            */

             DDSURFACEDESC ddsd;
             LPDIRECTDRAWSURFACE lpDDSPrimary;
             ddsd.dwSize 
            = sizeof(ddsd); 
             ddsd.dwFlags 
            = DDSD_CAPS ; 
             ddsd.ddsCaps.dwCaps 
            = DDSCAPS_PRIMARYSURFACE; 
             ddsd.dwBackBufferCount 
            = 1
             ddrval 
            = lpDDraw->CreateSurface(&ddsd, &lpDDSPrimary, NULL); 
                
            if (FAILED(ddrval))
             
            {
              MessageBox(NULL, 
            "Failed to CreateSurface", NULL, MB_OK);
              
            return FALSE;
             }

             LPDIRECTDRAWCLIPPER clipper;
             
            if(lpDDraw->CreateClipper(0&clipper, NULL) != DD_OK)
             

              MessageBox(NULL, 
            "Failed to GreateClipper", NULL, MB_OK);
              
            return FALSE;
             }

             
            if( lpDDSPrimary->SetClipper(clipper) != DD_OK )
             

              MessageBox(NULL, 
            "Failed to SetClipper", NULL, MB_OK);
              
            return FALSE;
             }

             clipper
            ->SetHWnd(0, g_hwnd);
             HDC hdc;
             
            if(lpDDSPrimary->GetDC(&hdc) != DD_OK) 
             

              MessageBox(NULL, 
            "Failed to GetDC", NULL, MB_OK);
              
            return FALSE;
             }


             SetBkColor(hdc, RGB(
            0,0,255)); 
             SetTextColor( hdc,RGB(
            255,255,0 ) ); 
             TextOut( hdc, 
            00"sxFrontMsg", lstrlen("szFrontMsg")); 
             lpDDSPrimary
            ->ReleaseDC(hdc); 


            *-*!!!!  TextOut 出來的東西依然顯示在左上角!!!!
             
            突然覺得好餓!!!,吃完東西再研究~~

            Feedback

            # re: 初探DirectDraw 第2集  回復(fù)  更多評(píng)論   

            2008-09-29 17:27 by 矩陣操作
            ddraw在dx9里面已經(jīng)取消了吧?
            久久综合九色综合久99| 精品久久久久久无码国产| 欧美va久久久噜噜噜久久| 婷婷五月深深久久精品| 91精品国产高清久久久久久国产嫩草| 久久久WWW免费人成精品| 久久精品国产精品亚洲精品 | 久久棈精品久久久久久噜噜| 久久r热这里有精品视频| 色欲综合久久躁天天躁| 99久久99久久| 日本WV一本一道久久香蕉| 狠狠狠色丁香婷婷综合久久五月| 中文字幕久久精品| 97久久精品人人澡人人爽| 久久精品国产亚洲AV蜜臀色欲 | 久久精品极品盛宴观看| 天天久久狠狠色综合| 97久久国产露脸精品国产| 久久e热在这里只有国产中文精品99| 国产精品久久久久久久app | 精品多毛少妇人妻AV免费久久| 精品亚洲综合久久中文字幕| 日韩人妻无码精品久久免费一 | 国产成人精品久久| 久久er99热精品一区二区| 狠狠色噜噜色狠狠狠综合久久| 久久精品国产亚洲一区二区| 色综合久久久久综合体桃花网 | 伊人久久大香线蕉亚洲| 久久久久久久久久久免费精品 | 久久亚洲熟女cc98cm| 午夜精品久久久久久久无码| 国产精品成人99久久久久 | 久久91精品国产91久久麻豆| 久久综合九色综合网站| 欧美激情一区二区久久久| 久久综合色老色| 色天使久久综合网天天| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国内精品九九久久精品|