|
Posted on 2008-09-26 17:51 沒畫完的畫 閱讀(1547) 評論(1) 編輯 收藏 引用 所屬分類: DirectX
第1集中,DirectDraw 畫出來的界面是全屏的,想把它改成窗口的
我把原先在調用 SetCooperativeLevel() 時 DDSCL_FULLSCREEN 參數改成 DDSCL_NORMAL
if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL )))
結果后面的
CreateSurface() 就調用失敗了,返回的錯誤是 DDERR_INVALIDCAPS
Google 了一下,意外地找到幾個URL
另外也找到了答案,代碼改動如下:
 /**//**
* 設置參數
*/
if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL )))
 {
MessageBox(NULL,TEXT("DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
return(0);
}

 /**//**
* 創建一個表層
*/
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;
}

全部代碼:
 /**//**
* 創建一個 DirectDraw 對象
*/
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);
}
 /**//**
* 設置執行模式
*/
if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL )))
 {
MessageBox(NULL,TEXT("DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
return(0);
}
 /**//**
* 創建一個表層
*/
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, 0, 0, "sxFrontMsg", lstrlen("szFrontMsg"));
lpDDSPrimary->ReleaseDC(hdc);
}

*-*!!!!
雖然不像之前全屏黑色,這次是“窗口模式”,DDSCL_NORMAL 或 DDSCL_FULLSCREEN 跟調用 CreateSurface() 時的參數有聯系,
但怎么 TextOut 還是在屏幕的左上角?????
聽說有一個 Clipper 的對象,就是一個“剪切區域”,通過這個對象可以防止畫圖畫出指定的范圍
修改代碼如下:
 /**//**
* 設置執行模式
*/
if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL )))
 {
MessageBox(NULL,TEXT("DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
return(0);
}
 /**//**
* 創建一個表層
*/
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, 0, 0, "sxFrontMsg", lstrlen("szFrontMsg"));
lpDDSPrimary->ReleaseDC(hdc);


*-*!!!! TextOut 出來的東西依然顯示在左上角!!!!
突然覺得好餓!!!,吃完東西再研究~~
Feedback
# re: 初探DirectDraw 第2集 回復 更多評論
2008-09-29 17:27 by
ddraw在dx9里面已經取消了吧?
|