|
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, 0, 0, "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, 0, 0, "sxFrontMsg", lstrlen("szFrontMsg"));
lpDDSPrimary->ReleaseDC(hdc);


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