²é¿´: 525  |  »Ø¸´: 6
µ±Ç°Ö÷ÌâÒѾ­´æµµ¡£

zsglly

ľ³æ (ÖøÃûдÊÖ)

[½»Á÷] DircetDraw c/c++ ʹÓÃÖ¸µ¼

ÕâÊÇһϵÁеÄDirectDrawµÄÖ¸ÄÏ,½ÌÄãÒ»²½²½µÄÈ¥¹¹½¨Ò»¸ö¼òµ¥µÄDirectDrawÓ¦ÓÃ.Õâ¸öÖ¸ÄÏÓõ½ÁËsdk°üÌṩµÄºÜ¶àDirectDrawµÄÀý×Ó.ÕâЩÀý×ÓչʾÁËÔõÑùÉèÖÃDirectDraw,ÔõÑùÓÃDirectDraw·½·¨ÊµÏÖÒ»°ãÈÎÎñ:

×¢Òâ:ÕâЩָÄÏÖеÄÀý×ÓÊÇÓÃc++дµÄ.Èç¹ûÄãʹÓõÄÊÇc±àÒëÆ÷,Çë½øÐÐÊʵ±µÄ¸Ä±ä,ÒÔÄܽøÐгɹ¦µÄ±àÒë.ÄãÐèÒª°ÑvtableºÍthisÖ¸ÕëÌí¼Óµ½½Ó¿Ú·½·¨ÖÐ.

1.DirectDraw»ù´¡Ó÷¨

ҪʹÓÃDirectDraw,Äã±ØÐëÏÈ´´½¨Ò»¸ö´ú±í¼ÆËã»úÏÔʾ½Ó¿ÚµÄDirectDrawʵÀý.È»ºó,Äã¾Í¿ÉÒÔͨ¹ý½Ó¿ÚµÄ·½·¨À´²Ù×ÝÕâ¸ö¶ÔÏó.Äã¿ÉÄÜ»áÐèÒª´´½¨Ò»¸ö»ò¸ü¶àµÄDirectDrawÆ½Ãæ¶ÔÏó(DirectDraw surface object)µÄʵÀý
À´ÔÚͼÐÎÉ豸ÉÏÏÔʾÄãµÄÓ¦ÓóÌÐò.

ΪÁËÑÝʾÕâ¸ö,Àý×ÓDDEx1 sample((SDK root)\Samples\Multimedia\DDraw\Src\Ddex1)ÑÝʾÁËÒÔϼ¸²½:

step 1:´´½¨Ò»¸öDirectDraw¶ÔÏó
Ïë´´½¨Ò»¸öDirectDraw¶ÔÏóµÄʵÀý,ÄãµÄÓ¦ÓóÌÐò±ØÐëÔÚInitAppº¯ÊýÖÐʹÓÃDirectDrawCreateExº¯Êý,¾ÍÏñÀý³Ìddex1ÖÐÒ»Ñù.DirectDrawCreateExº¯Êý°üÀ¨4¸ö²ÎÊý.µÚÒ»¸öÊÇ:ÏÔʾÉ豸ȫ¾ÖΨһ±êʶ(GUID).GUID´ó²¿·ÖÇé¿öÏÂÊÇÉèΪNULL,Ñ¡ÔñϵͳĬÈϵÄÏÔʾÉ豸.µÚ¶þ¸ö²ÎÊýÊÇ:°üº¬µÄÊDZêʾDirectDraw¶ÔÏóÊÇ·ñ½¨Á¢µÄÖ¸ÕëµÄµØÖ·.µÚÈý¸ö²ÎÊýÊÇIDirectDraw7½Ó¿ÚµÄ²Î¿¼±êʾ.±ØÐëÉèΪIID_IDirectDraw7.µÚËĸö²ÎÊýÊÇÉèÖÃΪNULLµÄ,ÊÇΪÁ˽«À´µÄÀ©Õ¹×ö×¼±¸µÄ.
ÒÔϵÄÀý×ÓչʾÁËÔõÑù´´½¨DirectDraw¶ÔÏó,²¢Åжϴ´½¨ÊÇ·ñ³É¹¦.
hRet = DirectDrawCreateEx(NULL, (VOID**)&g_pDD, IID_IDirectDraw7, NULL);
if(hRet == DD_OK)  
{  
   // g_pDD is a valid DirectDraw object.  
}  
else  
{  
   // The DirectDraw object could not be created.  
}



step2:¾ö¶¨³ÌÐòµÄÐÐΪ
ÔÚÄã¸Ä±äÏÔʾ·½·¨Ç°,Äã±ØÐëÖÁÉÙÔÚIDirectDraw7::SetCooperativeLevelº¯ÊýÖÐÖ¸¶¨dwFlags²ÎÊý(DDSCL_EXCLUSIVE ºÍ DDSCL_FULLSCREEN).ÕâÑù,ÄãµÄÓ¦ÓóÌÐò¾ÍµÃµ½ÁËÏÔʾÉ豸µÄÈ«²¿¿ØÖÆÈ¨,ÆäËûµÄ³ÌÐò²»Äܹ²Ïí.DDSCL_FULLSCREENÈÃÄãµÄÓ¦ÓóÌÐòÔÚÈ«ÆÁĻģʽÏÂÔËÐÐ.ÄãµÄ³ÌÐò¸²¸ÇÁË×ÀÃæ,²¢ÇÒÖ»ÓÐÄãµÄ³ÌÐòÄÜÔÚÆÁÄ»ÉÏÊä³ö.µ«ÊÇ,×ÀÃæÈÔÈ»ÊÇÓÐЧµÄ.(°´ALT+TABÇл»µ½×ÀÃæ)

ÏÂÃæµÄÀý×ÓÑÝʾÁËSetCooperativeLevelº¯ÊýµÄÓ÷¨.
HRESULT       hRet;  
LPDIRECTDRAW7 g_pDD;   // already created by DirectDrawCreateEx

hRet = g_pDD->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
if (hRet != DD_OK)
{  
   // Exclusive mode was successful.  
}  
else  
{  
   // Exclusive mode was not successful.  
   // The application can still run, however.  
}

Èç¹û SetCooperativeLevel²»·µ»ØDD_OK,Äã¿ÉÒÔÖ¸¶¨ÎªDDSCL_NORMAL¼ÌÐøÔËÐÐÄãµÄ³ÌÐò.µ«ÊÇ,ÄãµÄ³ÌÐò²»ÔÙÊǶÀռģʽ,¶øÇÒ,¿ÉÄÜ»áÎÞ·¨Íê³ÉÄãµÄÒ»²¿·ÖÒªÇó.ÔÚÕâÖÖÇé¿öÏÂ,Äã×îºÃÏÔʾһ¸ö¶Ô»°¿òÈÃÓû§¾ö¶¨ÊÇ·ñÒª¼ÌÐø.
Èç¹ûÄãÉèÖõÄÊÇÈ«ÆÁÄ»¶ÀÕ¼ºÏ×÷¼¶±ð,Äã±ØÐë°Ñ³ÌÐòµÄ´°¿Ú¾ä±ú´«µÝ¸øSetCooperativeLevel,ÕâÑù¿ÉÒÔÈÃWindowsÓÐÄÜÁ¦¾ö¶¨ÄãµÄ³ÌÐòÊÇ·ñÒì³£ÖÕÖ¹.



step3 :¸Ä±äÏÔʾģʽ
½ÓÏÂÀ´,Äã¿ÉÒÔÓÃIDirectDraw7::SetDisplayModeº¯ÊýÀ´¸Ä±äÏÔʾģʽ.ÏÂÃæµÄÀý×Ó½«ÑÝʾÔõÑù°ÑÏÔʾģʽÉèÖÃΪ640 ¡Á 480 ¡Á 8 bits per pixel (bpp).
HRESULT       hRet;  
LPDIRECTDRAW7 g_pDD;   // already created by DirectDrawCreateEx  

hRet = g_pDD->SetDisplayMode(640, 480, 8, 0, 0);
if (hRet != DD_OK)
{  
   // The display mode changed successfully.  
}  
else  
{  
   // The display mode cannot be changed.  
   // The mode is either not supported or  
   // another application has exclusive mode.  
}

µ±ÄãÉèÖÃÏÔʾģʽµÄʱºò,ÄãÓ¦¸ÃÈ·¶¨Óû§µÄÓ²¼þÊÇ·ñÖ§³ÖÕâÑùµÄģʽ.Äã¿ÉÒÔÉèÖÃÒ»¸öÄܱ»´ó²¿·ÖÏÔʾÊÊÅäÆ÷Ö§³ÖµÄ±ê×¼µÄģʽ.ÀýÈç:ÄãµÄ³ÌÐò¿ÉÒÔÒÔ640 ¡Á 480 ¡Á 8×÷Ϊ±¸Ñ¡Ä£Ê½,Éè¼Æ³ÉΪ¿ÉÒÔÔÚËùÓÐϵͳÉÏÔËÐÐ.
×¢Òâ:IDirectDraw7::SetDisplayMode·µ»ØÒ»¸öDDERR INVALIDMODE´íÎóÖµ,Èç¹ûÏÔʾÊÊÅäÆ÷ÎÞ·¨Çл»µ½ÏëÒªµÄģʽʱ.Äã¿ÉÒÔÔÚÊÔͼ¸Ä±äÏÔʾģʽǰ,ÓÃIDirectDraw7::EnumDisplayModesº¯Êý¿´Ò»ÏÂÓû§ÏÔʾÊÊÅäÆ÷µÄÄÜÁ¦.


step4:´´½¨½»»»Ò³(flipping surface)
ÉèÖÃÍêÏÔʾģʽÒÔºó,ÄãÓ¦¸Ã´´½¨Ò»¸öÆ½Ãæ.Àý³ÌDEx1ÓÃIDirectDraw7::SetCooperativeLevel ÉèÖÃΪ¶Àռģʽ.ËùÒÔ,Äã¿ÉÒÔ´´½¨½»»»Ò³(flipping surfaces).Èç¹ûÄãÉèÖõÄÊÇDDSCL_NORMALģʽ,Äã¿ÉÒÔ´´½¨Ò»¸ö¿ÉÒÔ¿éÒÆ¶¯(blit)µÄÆ½Ãæ.´´½¨½»»»Ò³(flipping surfaces)ÐèÒªÒÔϲ½Öè:
(4.1)¶¨ÒåÐèÇóµÄÆ½Ãæ:
µÚÒ»²½ÊÇÒÔDDSURFACEDESC2½á¹¹¶¨ÒåÒ»¸öÐèÇóµÄÆ½Ãæ.ÏÂÃæµÄÀý×ÓÑÝʾÁ˽ṹµÄ¶¨ÒåºÍ±ê־λµÄÉ趨:
// Create the primary surface with one back buffer.  
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP |
                     DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;

ÔÚÕâ¸öÀý×ÓÖÐ,dwSize³ÉÔ±ÊÇDDSURFACEDESC2½á¹¹µÄ´óС.ÕâÊÇ·ÀÖ¹ÄãÓõ½µÄDirectDraw·½·¨·µ»ØÎÞЧ³ÉÔ±µÄ´íÎó.(dwSizeÊÇ×¼±¸¸ø½«À´µÄDDSURFACEDESC2½á¹¹µÄÀ©Õ¹ÓõÄ)
dwFlags³ÉÔ±¾ö¶¨µÄDDSURFACEDESC2½á¹¹ÖÐÄÇЩ³ÉÔ±½«±»Ìî³äÓÐЧµÄÐÅÏ¢.ÀýÈçÔÚDDEx1ÖÐ,dwFlags±»ÉèΪÄãÏëÒªÓÃDDSCAPS½á¹¹(DDSD_CAPS)ºÍÄãÏë´´½¨Ò»¸öºǫ́»º³å(back buffer)(DDSD_BACKBUFFERCOUNT)
dwCaps³ÉÔ±ÔÚÀý×ÓÖбêʾһ¸ö½«ÒªÔÚDDSCAPS½á¹¹ÖÐʹÓõıê־λ.ÔÚÕâÖÖÇé¿öÏÂ,ËûÖ¸¶¨Ò»¸öÖ÷Æ½Ãæ(primary surface DDSCAPS_PRIMARYSURFACE),Ò»¸ö½»»»Ò³(flipping surface DDSCAPS_FLIP),Ò»¸öºÏ³É±íÃæ(complex surface DDSCAPS_COMPLEX).
×îºó,Àý×ÓÖ¸¶¨ÁËÒ»¸öºǫ́»º³å.ºǫ́»º³å¾ÍÊÇʵ¼ÊµÄ»æÍ¼²Ù×÷ÏÈÔÚÄÇÀïÍê³É,È»ºó,ÔÙ¿ìËٵķ­¶¯(flip)µ½Ö÷Æ½Ãæ(primary surface)ÉÏ.ÔÚDDEx1ÖÐ,ºǫ́»º³åµÄÊýÄ¿ÊÇ1.Æäʵ,ÄãÒªÄãµÄÏÔ´æÔÊÐí,ÄãÏ뽨¼¸¸ö¾Í½¨¼¸¸ö.ÄãÏëÖªµÀ¸ü¶àµÄ¹ØÓÚ´´½¨´óÓÚ1¿é»º³åµÄÐÅÏ¢,¿ÉÒÔÈ¥¿´  "triple buffering".
´´½¨µÄ"Æ½Ãæ"Õ¼ÓõĴ洢¿Õ¼ä,¿ÉÒÔÊÇϵͳÄÚ´æÒ²¿ÉÒÔÊÇÏÔ´æ.Èç¹ûÓ¦ÓóÌÐòʹÓõĿռ䳬³öÁËÏÔ´æ,DirectDraw¾Í»áʹÓÃϵͳÄÚ´æ.(ÀýÈçÄãÖ¸¶¨¶à¿é»º´æÔÚÒ»¸ö½öÓÐ1MBÏÔ´æµÄÊÇÅäÆ÷ÉÏ).ÄãÒ²¿ÉÒÔÕâÑùÉèÖÃDDSCAPS½á¹¹µÄdwCaps³ÉÔ±,Éè³ÉDDSCAPS_VIDEOMEMEORY»òDDCAPS_SYSTEMMEMORYÒÔ´ïµ½Ö»ÓÃÏÔ´æ»òÖ»ÓÃÄÚ´æ.(ÈçÖ¸¶¨ÓÃÏÔ´æ,¶øÏÔ´æ²»¹»,IDirectDraw7::CreateSurface·µ»ØÒ»¸öDDERR_OUTOFVIDEOMEMORY´íÎó)  
(4.2)´´½¨Æ½Ãæ  
ÔÚÌî³äÍêDDSURFACEDESC2½á¹¹ºó,Äã¾Í¿ÉÒÔÓÃËûºÍg_pDDÖ¸Õë(DirectDrawCreateExº¯Êý´´½¨µÄDirectDraw¶ÔÏóµÄÖ¸Õë)µ÷ÓÃIDirectDraw7::CreateSurface·½·¨,¾ÍÏñÏÂÃæ :
hRet = g_pDD->CreateSurface(&ddsd, &g_pDDSPrimary, NULL);
if (hRet != DD_OK)
{  
   // g_pDDSPrimary points to the new surface.  
}  
else  
{  
   // The surface was not created.  
   return FALSE;  
}
g_pDDSPrimary²ÎÊý½«Ö¸ÏòÓÉCreateSurfaceº¯Êý·µ»ØµÄÖ÷Æ½Ãæ(primary surface)µÄµØÖ·,Èç¹ûµ÷Óóɹ¦µÄ»°.
Ö¸ÏòÖ÷Æ½Ãæ(primary surface)µÄÖ¸ÕëÓÐЧºó,¾Í¿ÉÒÔµ÷ÓÃIDirectDrawSurface7::GetAttachedSurface·½·¨È¥µÃµ½Ò»¸öÖ¸Ïò»º³åµÄÖ¸Õë.ÈçÏÂ:
ZeroMemory(&ddscaps, sizeof(ddscaps));
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
if (hRet != DD_OK)
{  
   // g_pDDSBack points to the back buffer.  
}  
else  
{  
   return FALSE;  
}
Èç¹ûIDirectDrawSurface7::GetAttachedSurfaceµ÷Óóɹ¦,g_pDDSBack²ÎÊý½«Ö¸Ïò»º´æÇø.



step5:ÔÚÆ½ÃæÉÏÊä³ö
ÔÚÖ÷Æ½Ãæ(primary surface)ºÍºǫ́»º³å(back buffer)´´½¨Íê³Éºó,Àý×ÓDDEx1ÓÃwindows±ê×¼GDIº¯ÊýÊä³öÁËһЩÎı¾ÔÚ»º³åÉÏ.ÈçÏÂ:
if (g_pDDSBack->GetDC(&hdc) == DD_OK)
   {
       SetBkColor(hdc, RGB(0, 0, 255));
       SetTextColor(hdc, RGB(255, 255, 0));
       if (phase)
       {
           GetClientRect(hWnd, &rc);
           GetTextExtentPoint(hdc, szMsg, lstrlen(szMsg), &size);
           TextOut(hdc, (rc.right - size.cx) / 2, (rc.bottom - size.cy) / 2,
                   szMsg, sizeof(szMsg) - 1);
           TextOut(hdc, 0, 0, szFrontMsg, lstrlen(szFrontMsg));
           phase = 0;
       }
       else
       {
           TextOut(hdc, 0, 0, szBackMsg, lstrlen(szBackMsg));
           phase = 1;
       }
       g_pDDSBack->ReleaseDC(hdc);
   }

Õâ¸öÀý×ÓʹÓÃthe IDirectDrawSurface7::GetDC·½·¨»ñµÃÉ豸ÉÏÏÂÎĵľä±ú,²¢ÇÒ,ΪÁË×¼±¸Ð´Èë,½«»º³åÉÏËø.Èç¹ûÄã²»×¼±¸ÓÃÐèÒªÉ豸ÉÏÏÂÎľä±úµÄwindowsº¯Êý,Äã¿ÉÒÔʹÓÃIDirectDrawSurface7::Lock  IDirectDrawSurface7::Unlock·½·¨¼Ó½âËø.
½ÓÏÂÀ´,phase±äÁ¿¾ö¶¨ÁËÓ¦¸ÃÊä³öµ½Ö÷»º´æÏûÏ¢(primary buffer message)»¹ÊǺǫ́»º´æÏûÏ¢(back buffer message).Èç¹ûphase=1,Êä³ö
Ö÷»º´æÏûÏ¢,ÇÒÉèphase=0.Èç¹ûphase=0,Êä³öºǫ́»º´æÏûÏ¢,ÇÒÉèphase=1.
µ±ÏûÏ¢Êä³öµ½»º´æÇøºó,ÓÃIDirectDrawSurface7::ReleaseDC ·½·¨½«»º´æÇø½âËø.
¶Ô´´½¨Æ½ÃæµÄÄÚ´æÉÏËø,ÊDZ£Ö¤ÄãµÄ³ÌÐòºÍϵͳ²»ÄÜͬʱ¶Ô´ËÄÚ´æ½øÐдæÈ¡.Õâ·ÀÖ¹ÄãдÈë"Æ½Ãæ"ÄÚ´æÊ·¢Éú´íÎó.ÁíÍâ,²»¶Ô"Æ½Ãæ"ÄÚ´æ½âËø,ÄãµÄ³ÌÐò½«ÎÞ·¨·­×ªÆ½Ãæ.
Æ½Ãæ±»¼ÓËøÖ®ºó,Àý×ÓÖÐÓÃÁ˱ê×¼windowsGDIº¯Êý:SetBkColorÉèÖñ³¾°É«,SetTextColorÉèÖÃÔÚ±³¾°ÉÏÏÔʾµÄ×ÖµÄÑÕÉ«,ÓÃTextOutÔÚ"±íÃæ"ÉÏÊä³öÎÄ×ֺͱ³¾°É«.
µ±ÎÄ×Ö±»Êä³öµ½»º´æÖ®ºó,Àý×ÓÓ¦ÓÃIDirectDrawSurface7::ReleaseDC·½·¨½âËø"±íÃæ"²¢ÇÒÊͷžä±ú.²»ÂÛÔÚʲôʱºòÄãµÄ³ÌÐòÍê³ÉÁ˶Իº´æµÄдÈë,Ò»¶¨Òªµ÷ÓÃIDirectDrawSurface7::ReleaseDC »òIDirectDrawSurface7::UnlockÖ®Ò»,¾ßÌåÓÃÄĸö,ÓÉÄãµÄ³ÌÐò¶ø¶¨.²»½âËø,ÄãµÄ³ÌÐò½«²»ÄÜ·­×ªÆ½Ãæ.
×¢Òâ:ÓÃIDirectDrawSurface7::Unlock¶Ô"Æ½Ãæ"½âËøºó,Ö¸Ïò"Æ½Ãæ"µÄÖ¸Õ뽫»áÎÞЧ.Äã±ØÐëÔÙÓÃIDirectDrawSurface7::lockÈ¥»ñµÃÒ»¸öÓÐЧµÄÖ¸Õë.

[ Last edited by »ÃÓ°ÎÞºÛ on 2006-11-29 at 07:56 ]
»Ø¸´´ËÂ¥

» ²ÂÄãϲ»¶

×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

zsglly

ľ³æ (ÖøÃûдÊÖ)

step:6 ·­×ªÆ½Ãæ
ÔÚDDEx1ÖÐ,WM_TIMERÏûÏ¢Òý·¢´Ó»º´æµ½Ö÷Æ½ÃæµÄ·­×ª.µ±"Æ½Ãæ"ÄÚ´æ½âËøºó,Äã¾Í¿ÉÒÔÓÃIDirectDrawSurface7::Flip·½·¨ÊµÏÖ´Ó»º´æµ½Ö÷Æ½ÃæµÄ·­×ª.ÈçÏÂ:
case WM_TIMER:
       // Update and flip surfaces
       if (g_bActive && TIMER_ID == wParam)
       {
           UpdateFrame(hWnd);
           while (TRUE)
           {
               hRet = g_pDDSPrimary->Flip(NULL, 0);
               if (hRet == DD_OK)
                   break;
               if (hRet == DDERR_SURFACELOST)
               {
                   hRet = g_pDDSPrimary->Restore();
                   if (hRet != DD_OK)
                       break;
               }
               if (hRet != DDERR_WASSTILLDRAWING)
                   break;
           }
       }
       break;

ÔÚÀý×ÓÖÐ,g_pDDSPrimary²ÎÊýָʾÖ÷Æ½ÃæºÍÓëËûÁ¬½ÓµÄ»º´æ.µ±IDirectDrawSurface7::Flip±»µ÷ÓÃ,ǰºóÆ½Ãæ½«»á½»»»(Ö»Êǽ»»»Ö¸Õë,ûÓÐʵ¼ÊµÄÊý¾Ý½»»»).Èç¹û·­×ª³É¹¦,·µ»ØDD_OK,Ìø³öÑ­»·.
Èç¹û·­×ª·µ»ØµÄÊÇDDERR_SURFACELOSTÖµ,¾ÍÊÔͼÓÃIDirectDrawSurface7::Restore ·½·¨±£´æÆ½Ãæ.Èç¹û±£´æ³É¹¦,³ÌÐòÑ­»·µ½µ÷ÓÃIDirectDrawSurface7::Flip,ÔÙÊÔÒ»´Î.Èç¹û±£´æ²»³É¹¦,³ÌÐòÌø³öÑ­»·,·µ»ØÒ»¸ö´íÎó.
×¢Òâ:µ±Äãµ÷ÓÃIDirectDrawSurface7::Flip ʱ,·­×ª¶¯×÷²¢²»ÄÜÂíÉÏÍê³É.Èç¹û,ǰһ¸ö·­×ª¶¯×÷»¹Ã»ÓÐÍê³É,IDirectDrawSurface7::Flip »á·µ»ØDDERR_WASSTILLDRAWING.ÔÚÕâ¸öÀý×ÓÖÐ,IDirectDrawSurface7::Flip»áÒ»Ö±µ÷ÓÃÖ±µ½·µ»ØDD_OK.


step7:ÊÍ·ÅDirectDraw¶ÔÏó
µ±Äã°´ÏÂF12¼üʱ,Àý×ÓDDEx1½«ÔÚÍ˳ö³ÌÐòǰ´¦ÀíWM_DESTROYÏûÏ¢.Õâ¸öÏûÏ¢½«µ÷ÓÃReleaseAllObjectsº¯Êý,Õâ¸öº¯Êý°üÀ¨Á˶à¸öReleaseµ÷ÓÃ.ÏñÏÂÃæÒ»Ñù:
static void
ReleaseAllObjects(void)
{
   if (g_pDD != NULL)
   {
       if (g_pDDSPrimary != NULL)
       {
           g_pDDSPrimary->Release();
           g_pDDSPrimary = NULL;
       }
       g_pDD->Release();
       g_pDD = NULL;
   }
}
Õâ¸ö³ÌÐò¼ì²âDirectDraw¶ÔÏóµÄÖ¸Õëg_pDDºÍDirectDrawÆ½Ãæ¶ÔÏóµÄÖ¸Õëg_pDDSPrimaryÊÇ·ñΪNULL.È»ºó,µ÷ÓÃIDirectDrawSurface7::Release·½·¨ÁîDirectDrawÆ½Ãæ¶ÔÏóµÄreference count(¿ÉÒÔÈÏΪÊÇ´´½¨µÄ¶ÔÏóµÄÊýÄ¿)Êý¼õ1,ÕâʹµÃreference count¼õΪ0,DirectDrawÆ½Ãæ¶ÔÏó¾ÍÊÍ·ÅÁË.È»ºó,»¹Ð轫ËûµÄÖ¸ÕëÖµÉèΪNULL.½ÓÏÂÀ´,³ÌÐòµ÷ÓÃIDirectDraw7::Release,ͬÑùÊÇÁîDirectDrawµÄreference count¼õ1,È»ºóÈ»ºó....È«Ïú»Ù.  
tutorial2:ÔÚ»º´æÖÐÔØÈëλͼ



Õâ¸öÀý×ÓÌÖÂÛÔÚddex1µÄ»ù´¡ÉϽøÐÐÀ©Õ¹.ddex2(Àý³ÌÔÚmsdnÉϾÍÓÐ,ËÑË÷...)½²°üº¬ÔØÈëλͼÎļþµÄº¯Êý.ÐµĹ¦ÄÜ¿¿ÒÔϵIJ½ÖèʵÏÖ:
step1:´´½¨µ÷É«°å
step2:ÉèÖõ÷É«°å
step3:ÔÚ»º´æÖÐÔØÈëλͼ
step4:·­×ªÆ½Ãæ.
ÏñÔÚddex1ÖÐÒ»Ñù,ÔÚ³õʼ»¯º¯ÊýÖгõʼ»¯ÁËddex2.
²»Í¬µÄ´úÂëÈçÏÂ:
lpDDPal = DDLoadPalette(lpDD, szBackground);  

if (lpDDPal == NULL)  
   goto error;  

ddrval = lpDDSPrimary->SetPalette(lpDDPal);  

if(ddrval != DD_OK)  
   goto error;  

// Load a bitmap into the back buffer.  
ddrval = DDReLoadBitmap(lpDDSBack, szBackground);  

if(ddrval != DD_OK)  
   goto error;
×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
2Â¥2005-12-23 20:22:37
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

zsglly

ľ³æ (ÖøÃûдÊÖ)

step1:½¨Á¢µ÷É«°å
ÔÚddex2ÖÐ,Ê×ÏÈÓÃÈçÏ´úÂ뽨Á¢µ÷É«°å.
lpDDPal = DDLoadPalette(lpDD, szBackground);  

if (lpDDPal == NULL)  
   goto error;
DDLoadPaletteÕâ¸öº¯ÊýÊÇÔÚ\Dxsdk\sdk\samples\misc\ddutil.cppÖеĹ«¹²directdrawº¯Êý.ºÜ¶àdirectdrawµÄÀý×Ó(sdk°üÖеÄ)¶¼Óõ½Õâ¸öÎļþ.ÖØÒªµÄÊÇ,Ëü°üº¬ÁËÔØÈëµ÷É«°åºÍλͼµÄº¯Êý,ÎÞÂÛÊÇ´ÓÎļþ»¹ÊÇ×ÊÔ´.ΪÁ˲»Öظ´µÄд´úÂë,¾Í°ÑËû·ÅÔÚÁËÒ»¸ö¿ÉÒÔÖØ¸´Ê¹ÓõÄÎļþÖÐ.È·ÐÅÄãÔÚ±àÒëddexnÊǰüº¬ÁËÕâÎļþ.
(ÒÔÏÂÄÚÈÝÔÚddutial.cppÖÐ)ddex2ÖÐ,DDLoadPaletteº¯Êý´Óback.bmpÎļþ´´½¨ÁËDirectDrawPalette¶ÔÏó.DDLoadPaletteº¯ÊýÅжϴ´½¨µ÷É«°åµÄÎļþ»ò×ÊÔ´ÊÇ·ñ´æÔÚ.Èç¹û²»Êǵϰ,¾Í´´½¨Ò»¸öĬÈϵĵ÷É«°å.ÔÚddex2ÖÐ,Ëû´ÓλͼÎļþÌáÈ¡µ÷É«°åÐÅÏ¢²¢´¢´æÔÚÒ»¸öapeÖ¸ÏòµÄ½á¹¹ÖÐ.
DDEx2Ëæºó´´½¨ÁËDirectDrawPalette¶ÔÏó,ÈçÏÂ:
pdd->CreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL);  
return ddpal;
µ±IDirectDraw7::CreatePalette·½·¨·µ»Ø,ddpal²ÎÊýÖ¸Ïò´ÓDDLoadPaletteº¯Êý·µ»ØµÄDirectDrawPalette¶ÔÏó.
ape²ÎÊýÊÇÒ»¸öÖ¸Õë,Ö¸ÏòÒ»¸öÄܰüº¬»òÕß2»ò4»ò16»ò256¸öÏßÐÔ×éÖ¯µÄ¼Í¼µÄ½á¹¹.¼Ç¼µÄÊýÄ¿ÒÀ¿¿ÓÚCreatePalette·½·¨ÖеÄdwFlags²ÎÊý.ÔÚÉÏÃæµÄÇé¿öÏÂ,dwFlags²ÎÊýÉèΪDDPCAPS_8BIT.Õâ±íʾ½á¹¹ÖÐÓÐ256¸ö¼Ç¼.ÿһÌõ¼Ç¼°üº¬4×Ö½Ú(·Ö±ðÊǺì,ÂÌ,À¼µÄͨµÀºÍÒ»¸ö±ê־λ).








step2:ÉèÖõ÷É«°å
´´½¨Íêµ÷É«°åÒÔºó,ͨ¹ýÖ¸Õëµ÷ÓÃÖ÷Æ½ÃæµÄIDirectDrawSurface7::SetPalette·½·¨,ÈçÏÂ:
ddrval = lpDDSPrimary->SetPalette(lpDDPal);  

if(ddrval != DD_OK)  
   goto error;// SetPalette failed.
ÔÚÄãµ÷ÓÃÍêIDirectDrawSurface7::SetPalette·½·¨Ö®ºó,DirectDrawPalette¶ÔÏó¾ÍÓëDirectDrawSurface¶ÔÏóÁªÏµÆðÀ´ÁË.ʲôʱºòÄãÏë¸Ä±äµ÷É«°åÁË,¿ÉÒÔ¼òµ¥µÄ´´½¨Ò»¸öеĵ÷É«°å,È»ºóÉèÖÃһϾͿÉÒÔÁË.(ËäÈ»ÕâÆªÖ¸µ¼ÓÃÁËÕâЩ²½Öè,Æäʵ»¹ÓÐÆäËûµÄ·½·¨¸Ä±äµ÷É«°å,ÒÔºóµÄÀý×ÓÖн«»áÑÝʾ)




step3:ÔÚ»º´æÇøÔØÈëλͼ
DirectDrawPalette¶ÔÏóÓëDirectDrawSurface¶ÔÏóÁªÏµÆðÀ´Ö®ºó,DDEx2ÓÃÏÂÃæµÄ´úÂëÔÚ»º´æÖÐÔØÈëλͼback.bmp
// Load a bitmap into the back buffer.  
ddrval = DDReLoadBitmap(lpDDSBack, szBackground);  

if(ddrval != DD_OK)  
   // Load failed.
DDReLoadBitmapÊÇÁíÒ»¸öÔÚDdutil.cppÖеĺ¯Êý.ËûÔØÈëÒ»¸öλͼÎļþ»ò×ÊÔ´µ½Ò»¸öÒѾ­´æÔÚµÄDirectDrawÆ½Ãæ.(ÄãÒ²¿ÉÒÔʹÓÃDDLoadBitmapº¯Êý´´½¨Ò»¸öÆ½ÃæÈ»ºóÔØÈë.º¯ÊýÒ²ÔÚddutil.cppÖÐ.)ÔÚddex2ÖÐ,ËûÔØÈëÓÉszBackground(ID)Ö¸ÏòµÄback.bmpÎļþµ½ÓÉlpDDSBack(Ö¸Õë)Ö¸ÏòµÄºǫ́»º´æ.DDReLoadBitmapº¯Êýµ÷ÓÃDDCopyBitmapº¯Êý½«Îļþ¿½±´µ½»º´æ,²¢À­Éìµ½Êʵ±µÄ´óС.
DDCopyBitmapº¯Êý½«Î»Í¼¿½±´µ½ÄÚ´æÖÐ,ÓÃGetObjectº¯Êý»Ö¸´Î»Í¼µÄ´óС.È»ºóÊÇÓÉÏÂÃæµÄ´úÂ뽫λͼµ÷Õûµ½½«Òª·ÅλͼµÄ»º´æµÄ´óС.
// Get the size of the surface.  
ddsd.dwSize = sizeof(ddsd);  
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;  
pdds->GetSurfaceDesc(&ddsd);
ddsdÊÇÒ»¸öDDSURFACEDESC2½á¹¹µÄÖ¸Õë.Õâ¸ö½á¹¹±£´æÁËÏÖÔÚµÄDirectDrawÆ½ÃæµÄÃèÊö.ÔÚÕâÖÖÇé¿öÏÂ,DDSURFACEDESC2µÄ³ÉÔ±ÃèÊöÁËÆ½ÃæµÄ¸ßºÍ¿í,ÓÉDDSD_HEIIGHTºÍDDSD_WIDTH±êʾµÄ.IDirectDrawSurface7::GetSurfaceDesc·½·¨µÄµ÷ÓðÑÊôÐÔÖµ×°ÈëÁËÕâ¸ö½á¹¹.ÔÚDDEX2ÖÐ,Öµ½«±»ÉèΪ¸ß480,¿í640.
DDCopyBitmapº¯Êý¸øÆ½Ãæ¼ÓËøÈ»ºó°Ñλͼ¿½±´µ½»º´æÖÐ,ÓÃStretchBltº¯ÊýÀ­Éì»òѹËõ.ÈçÏÂ:
if ((hr = pdds->GetDC(&hdc)) == DD_OK)  
{  
   StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y,  
       dx, dy, SRCCOPY);  
   pdds->ReleaseDC(hdc);  
}
×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
3Â¥2005-12-23 20:22:53
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

zsglly

ľ³æ (ÖøÃûдÊÖ)

step4:·­×ªÒ³Ãæ
ddex2Öз­×ªÒ³ÃæµÄ²¿·ÖÓëddex1ÖеÄÊ®·ÖµÄÏàÏñ.Ëù²»Í¬µÄÊÇ:µ±Æ½Ã涪ʧʱ(DDERR_SURFACELOST),ÔÚÆ½Ãæ´¢´æºó,±ØÐëÓÃDDReLoadBitmapº¯Êý½«Î»Í¼ÖØÐÂÔØÈ뻺´æ.

tutorial2:ÔÚ»º´æÖÐÔØÈëλͼ

Õâ¸öÀý×ÓÌÖÂÛÔÚddex1µÄ»ù´¡ÉϽøÐÐÀ©Õ¹.ddex2(Àý³ÌÔÚmsdnÉϾÍÓÐ,ËÑË÷...)½²°üº¬ÔØÈëλͼÎļþµÄº¯Êý.ÐµĹ¦ÄÜ¿¿ÒÔϵIJ½ÖèʵÏÖ:
step1:´´½¨µ÷É«°å
step2:ÉèÖõ÷É«°å
step3:ÔÚ»º´æÖÐÔØÈëλͼ
step4:·­×ªÆ½Ãæ.
ÏñÔÚddex1ÖÐÒ»Ñù,ÔÚ³õʼ»¯º¯ÊýÖгõʼ»¯ÁËddex2.
²»Í¬µÄ´úÂëÈçÏÂ:
lpDDPal = DDLoadPalette(lpDD, szBackground);  

if (lpDDPal == NULL)  
   goto error;  

ddrval = lpDDSPrimary->SetPalette(lpDDPal);  

if(ddrval != DD_OK)  
   goto error;  

// Load a bitmap into the back buffer.  
ddrval = DDReLoadBitmap(lpDDSBack, szBackground);  

if(ddrval != DD_OK)  
   goto error;








step1:½¨Á¢µ÷É«°å
ÔÚddex2ÖÐ,Ê×ÏÈÓÃÈçÏ´úÂ뽨Á¢µ÷É«°å.
lpDDPal = DDLoadPalette(lpDD, szBackground);  

if (lpDDPal == NULL)  
   goto error;
DDLoadPaletteÕâ¸öº¯ÊýÊÇÔÚ\Dxsdk\sdk\samples\misc\ddutil.cppÖеĹ«¹²directdrawº¯Êý.ºÜ¶àdirectdrawµÄÀý×Ó(sdk°üÖеÄ)¶¼Óõ½Õâ¸öÎļþ.ÖØÒªµÄÊÇ,Ëü°üº¬ÁËÔØÈëµ÷É«°åºÍλͼµÄº¯Êý,ÎÞÂÛÊÇ´ÓÎļþ»¹ÊÇ×ÊÔ´.ΪÁ˲»Öظ´µÄд´úÂë,¾Í°ÑËû·ÅÔÚÁËÒ»¸ö¿ÉÒÔÖØ¸´Ê¹ÓõÄÎļþÖÐ.È·ÐÅÄãÔÚ±àÒëddexnÊǰüº¬ÁËÕâÎļþ.
(ÒÔÏÂÄÚÈÝÔÚddutial.cppÖÐ)ddex2ÖÐ,DDLoadPaletteº¯Êý´Óback.bmpÎļþ´´½¨ÁËDirectDrawPalette¶ÔÏó.DDLoadPaletteº¯ÊýÅжϴ´½¨µ÷É«°åµÄÎļþ»ò×ÊÔ´ÊÇ·ñ´æÔÚ.Èç¹û²»Êǵϰ,¾Í´´½¨Ò»¸öĬÈϵĵ÷É«°å.ÔÚddex2ÖÐ,Ëû´ÓλͼÎļþÌáÈ¡µ÷É«°åÐÅÏ¢²¢´¢´æÔÚÒ»¸öapeÖ¸ÏòµÄ½á¹¹ÖÐ.
DDEx2Ëæºó´´½¨ÁËDirectDrawPalette¶ÔÏó,ÈçÏÂ:
pdd->CreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL);  
return ddpal;
µ±IDirectDraw7::CreatePalette·½·¨·µ»Ø,ddpal²ÎÊýÖ¸Ïò´ÓDDLoadPaletteº¯Êý·µ»ØµÄDirectDrawPalette¶ÔÏó.
ape²ÎÊýÊÇÒ»¸öÖ¸Õë,Ö¸ÏòÒ»¸öÄܰüº¬»òÕß2»ò4»ò16»ò256¸öÏßÐÔ×éÖ¯µÄ¼Í¼µÄ½á¹¹.¼Ç¼µÄÊýÄ¿ÒÀ¿¿ÓÚCreatePalette·½·¨ÖеÄdwFlags²ÎÊý.ÔÚÉÏÃæµÄÇé¿öÏÂ,dwFlags²ÎÊýÉèΪDDPCAPS_8BIT.Õâ±íʾ½á¹¹ÖÐÓÐ256¸ö¼Ç¼.ÿһÌõ¼Ç¼°üº¬4×Ö½Ú(·Ö±ðÊǺì,ÂÌ,À¼µÄͨµÀºÍÒ»¸ö±ê־λ).
×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
4Â¥2005-12-23 20:23:18
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

zsglly

ľ³æ (ÖøÃûдÊÖ)

step2:ÉèÖõ÷É«°å
´´½¨Íêµ÷É«°åÒÔºó,ͨ¹ýÖ¸Õëµ÷ÓÃÖ÷Æ½ÃæµÄIDirectDrawSurface7::SetPalette·½·¨,ÈçÏÂ:
ddrval = lpDDSPrimary->SetPalette(lpDDPal);  

if(ddrval != DD_OK)  
   goto error;// SetPalette failed.
ÔÚÄãµ÷ÓÃÍêIDirectDrawSurface7::SetPalette·½·¨Ö®ºó,DirectDrawPalette¶ÔÏó¾ÍÓëDirectDrawSurface¶ÔÏóÁªÏµÆðÀ´ÁË.ʲôʱºòÄãÏë¸Ä±äµ÷É«°åÁË,¿ÉÒÔ¼òµ¥µÄ´´½¨Ò»¸öеĵ÷É«°å,È»ºóÉèÖÃһϾͿÉÒÔÁË.(ËäÈ»ÕâÆªÖ¸µ¼ÓÃÁËÕâЩ²½Öè,Æäʵ»¹ÓÐÆäËûµÄ·½·¨¸Ä±äµ÷É«°å,ÒÔºóµÄÀý×ÓÖн«»áÑÝʾ)




step3:ÔÚ»º´æÇøÔØÈëλͼ
DirectDrawPalette¶ÔÏóÓëDirectDrawSurface¶ÔÏóÁªÏµÆðÀ´Ö®ºó,DDEx2ÓÃÏÂÃæµÄ´úÂëÔÚ»º´æÖÐÔØÈëλͼback.bmp
// Load a bitmap into the back buffer.  
ddrval = DDReLoadBitmap(lpDDSBack, szBackground);  

if(ddrval != DD_OK)  
   // Load failed.
DDReLoadBitmapÊÇÁíÒ»¸öÔÚDdutil.cppÖеĺ¯Êý.ËûÔØÈëÒ»¸öλͼÎļþ»ò×ÊÔ´µ½Ò»¸öÒѾ­´æÔÚµÄDirectDrawÆ½Ãæ.(ÄãÒ²¿ÉÒÔʹÓÃDDLoadBitmapº¯Êý´´½¨Ò»¸öÆ½ÃæÈ»ºóÔØÈë.º¯ÊýÒ²ÔÚddutil.cppÖÐ.)ÔÚddex2ÖÐ,ËûÔØÈëÓÉszBackground(ID)Ö¸ÏòµÄback.bmpÎļþµ½ÓÉlpDDSBack(Ö¸Õë)Ö¸ÏòµÄºǫ́»º´æ.DDReLoadBitmapº¯Êýµ÷ÓÃDDCopyBitmapº¯Êý½«Îļþ¿½±´µ½»º´æ,²¢À­Éìµ½Êʵ±µÄ´óС.
DDCopyBitmapº¯Êý½«Î»Í¼¿½±´µ½ÄÚ´æÖÐ,ÓÃGetObjectº¯Êý»Ö¸´Î»Í¼µÄ´óС.È»ºóÊÇÓÉÏÂÃæµÄ´úÂ뽫λͼµ÷Õûµ½½«Òª·ÅλͼµÄ»º´æµÄ´óС.
// Get the size of the surface.  
ddsd.dwSize = sizeof(ddsd);  
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;  
pdds->GetSurfaceDesc(&ddsd);
ddsdÊÇÒ»¸öDDSURFACEDESC2½á¹¹µÄÖ¸Õë.Õâ¸ö½á¹¹±£´æÁËÏÖÔÚµÄDirectDrawÆ½ÃæµÄÃèÊö.ÔÚÕâÖÖÇé¿öÏÂ,DDSURFACEDESC2µÄ³ÉÔ±ÃèÊöÁËÆ½ÃæµÄ¸ßºÍ¿í,ÓÉDDSD_HEIIGHTºÍDDSD_WIDTH±êʾµÄ.IDirectDrawSurface7::GetSurfaceDesc·½·¨µÄµ÷ÓðÑÊôÐÔÖµ×°ÈëÁËÕâ¸ö½á¹¹.ÔÚDDEX2ÖÐ,Öµ½«±»ÉèΪ¸ß480,¿í640.
DDCopyBitmapº¯Êý¸øÆ½Ãæ¼ÓËøÈ»ºó°Ñλͼ¿½±´µ½»º´æÖÐ,ÓÃStretchBltº¯ÊýÀ­Éì»òѹËõ.ÈçÏÂ:
if ((hr = pdds->GetDC(&hdc)) == DD_OK)  
{  
   StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y,  
       dx, dy, SRCCOPY);  
   pdds->ReleaseDC(hdc);  
}

step4:·­×ªÒ³Ãæ
ddex2Öз­×ªÒ³ÃæµÄ²¿·ÖÓëddex1ÖеÄÊ®·ÖµÄÏàÏñ.Ëù²»Í¬µÄÊÇ:µ±Æ½Ã涪ʧʱ(DDERR_SURFACELOST),ÔÚÆ½Ãæ´¢´æºó,±ØÐëÓÃDDReLoadBitmapº¯Êý½«Î»Í¼ÖØÐÂÔØÈ뻺´æ.


tutorial2:ÔÚ»º´æÖÐÔØÈëλͼ

Õâ¸öÀý×ÓÌÖÂÛÔÚddex1µÄ»ù´¡ÉϽøÐÐÀ©Õ¹.ddex2(Àý³ÌÔÚmsdnÉϾÍÓÐ,ËÑË÷...)½²°üº¬ÔØÈëλͼÎļþµÄº¯Êý.ÐµĹ¦ÄÜ¿¿ÒÔϵIJ½ÖèʵÏÖ:
step1:´´½¨µ÷É«°å
step2:ÉèÖõ÷É«°å
step3:ÔÚ»º´æÖÐÔØÈëλͼ
step4:·­×ªÆ½Ãæ.
ÏñÔÚddex1ÖÐÒ»Ñù,ÔÚ³õʼ»¯º¯ÊýÖгõʼ»¯ÁËddex2.
²»Í¬µÄ´úÂëÈçÏÂ:
lpDDPal = DDLoadPalette(lpDD, szBackground);  

if (lpDDPal == NULL)  
   goto error;  

ddrval = lpDDSPrimary->SetPalette(lpDDPal);  

if(ddrval != DD_OK)  
   goto error;  

// Load a bitmap into the back buffer.  
ddrval = DDReLoadBitmap(lpDDSBack, szBackground);  

if(ddrval != DD_OK)  
   goto error;
×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
5Â¥2005-12-23 20:23:37
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

zsglly

ľ³æ (ÖøÃûдÊÖ)

step1:½¨Á¢µ÷É«°å
ÔÚddex2ÖÐ,Ê×ÏÈÓÃÈçÏ´úÂ뽨Á¢µ÷É«°å.
lpDDPal = DDLoadPalette(lpDD, szBackground);  

if (lpDDPal == NULL)  
   goto error;
DDLoadPaletteÕâ¸öº¯ÊýÊÇÔÚ\Dxsdk\sdk\samples\misc\ddutil.cppÖеĹ«¹²directdrawº¯Êý.ºÜ¶àdirectdrawµÄÀý×Ó(sdk°üÖеÄ)¶¼Óõ½Õâ¸öÎļþ.ÖØÒªµÄÊÇ,Ëü°üº¬ÁËÔØÈëµ÷É«°åºÍλͼµÄº¯Êý,ÎÞÂÛÊÇ´ÓÎļþ»¹ÊÇ×ÊÔ´.ΪÁ˲»Öظ´µÄд´úÂë,¾Í°ÑËû·ÅÔÚÁËÒ»¸ö¿ÉÒÔÖØ¸´Ê¹ÓõÄÎļþÖÐ.È·ÐÅÄãÔÚ±àÒëddexnÊǰüº¬ÁËÕâÎļþ.
(ÒÔÏÂÄÚÈÝÔÚddutial.cppÖÐ)ddex2ÖÐ,DDLoadPaletteº¯Êý´Óback.bmpÎļþ´´½¨ÁËDirectDrawPalette¶ÔÏó.DDLoadPaletteº¯ÊýÅжϴ´½¨µ÷É«°åµÄÎļþ»ò×ÊÔ´ÊÇ·ñ´æÔÚ.Èç¹û²»Êǵϰ,¾Í´´½¨Ò»¸öĬÈϵĵ÷É«°å.ÔÚddex2ÖÐ,Ëû´ÓλͼÎļþÌáÈ¡µ÷É«°åÐÅÏ¢²¢´¢´æÔÚÒ»¸öapeÖ¸ÏòµÄ½á¹¹ÖÐ.
DDEx2Ëæºó´´½¨ÁËDirectDrawPalette¶ÔÏó,ÈçÏÂ:
pdd->CreatePalette(DDPCAPS_8BIT, ape, &ddpal, NULL);  
return ddpal;
µ±IDirectDraw7::CreatePalette·½·¨·µ»Ø,ddpal²ÎÊýÖ¸Ïò´ÓDDLoadPaletteº¯Êý·µ»ØµÄDirectDrawPalette¶ÔÏó.
ape²ÎÊýÊÇÒ»¸öÖ¸Õë,Ö¸ÏòÒ»¸öÄܰüº¬»òÕß2»ò4»ò16»ò256¸öÏßÐÔ×éÖ¯µÄ¼Í¼µÄ½á¹¹.¼Ç¼µÄÊýÄ¿ÒÀ¿¿ÓÚCreatePalette·½·¨ÖеÄdwFlags²ÎÊý.ÔÚÉÏÃæµÄÇé¿öÏÂ,dwFlags²ÎÊýÉèΪDDPCAPS_8BIT.Õâ±íʾ½á¹¹ÖÐÓÐ256¸ö¼Ç¼.ÿһÌõ¼Ç¼°üº¬4×Ö½Ú(·Ö±ðÊǺì,ÂÌ,À¼µÄͨµÀºÍÒ»¸ö±ê־λ).








step2:ÉèÖõ÷É«°å
´´½¨Íêµ÷É«°åÒÔºó,ͨ¹ýÖ¸Õëµ÷ÓÃÖ÷Æ½ÃæµÄIDirectDrawSurface7::SetPalette·½·¨,ÈçÏÂ:
ddrval = lpDDSPrimary->SetPalette(lpDDPal);  

if(ddrval != DD_OK)  
   goto error;// SetPalette failed.
ÔÚÄãµ÷ÓÃÍêIDirectDrawSurface7::SetPalette·½·¨Ö®ºó,DirectDrawPalette¶ÔÏó¾ÍÓëDirectDrawSurface¶ÔÏóÁªÏµÆðÀ´ÁË.ʲôʱºòÄãÏë¸Ä±äµ÷É«°åÁË,¿ÉÒÔ¼òµ¥µÄ´´½¨Ò»¸öеĵ÷É«°å,È»ºóÉèÖÃһϾͿÉÒÔÁË.(ËäÈ»ÕâÆªÖ¸µ¼ÓÃÁËÕâЩ²½Öè,Æäʵ»¹ÓÐÆäËûµÄ·½·¨¸Ä±äµ÷É«°å,ÒÔºóµÄÀý×ÓÖн«»áÑÝʾ)




step3:ÔÚ»º´æÇøÔØÈëλͼ
DirectDrawPalette¶ÔÏóÓëDirectDrawSurface¶ÔÏóÁªÏµÆðÀ´Ö®ºó,DDEx2ÓÃÏÂÃæµÄ´úÂëÔÚ»º´æÖÐÔØÈëλͼback.bmp
// Load a bitmap into the back buffer.  
ddrval = DDReLoadBitmap(lpDDSBack, szBackground);  

if(ddrval != DD_OK)  
   // Load failed.
DDReLoadBitmapÊÇÁíÒ»¸öÔÚDdutil.cppÖеĺ¯Êý.ËûÔØÈëÒ»¸öλͼÎļþ»ò×ÊÔ´µ½Ò»¸öÒѾ­´æÔÚµÄDirectDrawÆ½Ãæ.(ÄãÒ²¿ÉÒÔʹÓÃDDLoadBitmapº¯Êý´´½¨Ò»¸öÆ½ÃæÈ»ºóÔØÈë.º¯ÊýÒ²ÔÚddutil.cppÖÐ.)ÔÚddex2ÖÐ,ËûÔØÈëÓÉszBackground(ID)Ö¸ÏòµÄback.bmpÎļþµ½ÓÉlpDDSBack(Ö¸Õë)Ö¸ÏòµÄºǫ́»º´æ.DDReLoadBitmapº¯Êýµ÷ÓÃDDCopyBitmapº¯Êý½«Îļþ¿½±´µ½»º´æ,²¢À­Éìµ½Êʵ±µÄ´óС.  
DDCopyBitmapº¯Êý½«Î»Í¼¿½±´µ½ÄÚ´æÖÐ,ÓÃGetObjectº¯Êý»Ö¸´Î»Í¼µÄ´óС.È»ºóÊÇÓÉÏÂÃæµÄ´úÂ뽫λͼµ÷Õûµ½½«Òª·ÅλͼµÄ»º´æµÄ´óС.
// Get the size of the surface.  
ddsd.dwSize = sizeof(ddsd);  
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;  
pdds->GetSurfaceDesc(&ddsd);
ddsdÊÇÒ»¸öDDSURFACEDESC2½á¹¹µÄÖ¸Õë.Õâ¸ö½á¹¹±£´æÁËÏÖÔÚµÄDirectDrawÆ½ÃæµÄÃèÊö.ÔÚÕâÖÖÇé¿öÏÂ,DDSURFACEDESC2µÄ³ÉÔ±ÃèÊöÁËÆ½ÃæµÄ¸ßºÍ¿í,ÓÉDDSD_HEIIGHTºÍDDSD_WIDTH±êʾµÄ.IDirectDrawSurface7::GetSurfaceDesc·½·¨µÄµ÷ÓðÑÊôÐÔÖµ×°ÈëÁËÕâ¸ö½á¹¹.ÔÚDDEX2ÖÐ,Öµ½«±»ÉèΪ¸ß480,¿í640.
DDCopyBitmapº¯Êý¸øÆ½Ãæ¼ÓËøÈ»ºó°Ñλͼ¿½±´µ½»º´æÖÐ,ÓÃStretchBltº¯ÊýÀ­Éì»òѹËõ.ÈçÏÂ:
if ((hr = pdds->GetDC(&hdc)) == DD_OK)  
{  
   StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y,  
       dx, dy, SRCCOPY);  
   pdds->ReleaseDC(hdc);  
}
×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
6Â¥2005-12-23 20:23:55
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

zsglly

ľ³æ (ÖøÃûдÊÖ)

step4:·­×ªÒ³Ãæ
ddex2Öз­×ªÒ³ÃæµÄ²¿·ÖÓëddex1ÖеÄÊ®·ÖµÄÏàÏñ.Ëù²»Í¬µÄÊÇ:µ±Æ½Ã涪ʧʱ(DDERR_SURFACELOST),ÔÚÆ½Ãæ´¢´æºó,±ØÐëÓÃDDReLoadBitmapº¯Êý½«Î»Í¼ÖØÐÂÔØÈ뻺´æ.

tutorial3:´ÓÒ»¸öÀëÆÁ±íÃæ(off-screen surface)µÄ¿éÒÆ¶¯(blt)

ÔÚddex2ÖÐ,°ÑÒ»ÕÅλͼ·Åµ½Á˺ǫ́»º´æÖÐ,È»ºóÔÚ»º´æÓëÖ÷Æ½Ãæ¼ä·­°¡·­...ÆäʵÕâ²»ÊÇÏÔʾλͼµÄÒ»°ãÐÐΪ.ÔÚÕâһƪÖÐ(Àý×ÓÊÇddex3)½«ÒªÍ¨¹ý°üº¬Á½¸öÀëÆÁ±íÃæÀ´À©Õ¹ddex2µÄÄÜÁ¦.Á½¸öλͼ-Ò»¸öÊǵÚżÊý´ÎÏÔʾµÄ,Ò»¸öÊÇÆæÊý´ÎÏÔʾ-´æ·ÅÔÚÕâÁ½¸öÀëÆÁ±íÃæ.Àý×ÓÖÐ,ÓÃIDirectDrawSurface7::BltFast·½·¨°ÑÀëÆÁ±íÃæµÄÄÚÈÝ¿½±´µ½ºǫ́»º´æÖÐÈ¥,È»ºó·­×ª,È»ºóÔÙ°ÑÏÂÒ»¸öÀëÆÁ±íÃæ¿½µ½»º´æ...
(ÒëÕß×¢:ÕâһƪֻÊÇÑÝʾÀëÆÁ±íÃæºÍblitµÄ·½·¨,ʵ¼ÊÉÏ,ÀëÆÁ±íÃæÊ¹ÓõÄʱºò´ó²¿·ÖÊÇÓÃÀ´´æ·Å¾«Áé,ʵÏÖ¶¯»­µÄ.´æ·ÅµÄ¶¼ÊÇСµÄͼƬ,ÊÇÒ»¸öÌØÊâµÄÆ½Ãæ)
ddex3еĺ¯ÊýÒÔÏÂÃæ3¸ö²½ÖèÑÝʾ:
step1:½¨Á¢ÀëÆÁ±íÃæ
step2:ÔØÈëλͼµ½ÀëÆÁ±íÃæ
step3:¿éÒÆ¶¯(blit)ÀëÆÁ±íÃæµ½ºǫ́»º³å


step1:½¨Á¢ÀëÆÁ±íÃæ
ÏÂÃæµÄ´úÂëÊǼÓÈëµ½doInitº¯ÊýÖд´½¨Á½¸öÀëÆÁ±íÃæ.
// Create an off-screen bitmap.  
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;  
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;  
ddsd.dwHeight = 480;  
ddsd.dwWidth = 640;  
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSOne, NULL);  
if(ddrval != DD_OK)  
{  
   return initFail(hwnd);  
}  

// Create another off-screen bitmap.  
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSTwo, NULL);  
if(ddrval != DD_OK)  
{  
   return initFail(hwnd);  
}
dwFlags³ÉÔ±¶¨ÒåÁ˳ÌÐò½«Ê¹ÓÃDDSCAPS½á¹¹,²¢ÇÒ½«ÒªÉèÖÃÀëÆÁ±íÃæµÄ¸ßºÍ¿í.Õâ¸ö±íÃæÒòΪ±êʾÁËDDSCAPS_OFFSCREENÔÚDDSCAPS½á¹¹ÖÐ,ËùÒÔ½«»áÊÇÒ»¸öÍêÈ«µÄÀëÆÁµÄ»º´æ.¸ßºÍ¿í·Ö±ðÉèΪ480 ºÍ640.Ëæºó,±íÃæ¾­¹ýIDirectDraw7::CreateSurface·½·¨´´½¨.
ÒòΪÁ½¸öÀëÆÁ±íÃæ´óСÏàͬ,¾ÍÓÖ²»Í¬µÄÖ¸Õëµ÷ÓÃÁËIDirectDraw7::CreateSurfaceÓÖÒ»´Î,´´½¨ÁËÁíÒ»¸ö.
Äã¿ÉÒÔͨ¹ýÔÚDDSCAPS½á¹¹Öж¨ÒåDDSCAPS_SYSTEMMEMORY»òDDSCAPS_VIDEOMEMORYÀ´¾ö¶¨½«ÀëÆÁ±íÃæ·ÅÔÚϵͳÄڴ滹ÊÇÏÔ´æÖÐ.·ÅÔÚÏÔ´æÖÐ,Äã¿ÉÒÔ¼Ó¿ìÀëÆÁ±íÃæµ½ºǫ́»º´æµÄÒÆ¶¯ËÙ¶È.½«Óõ½Î»Í¼µÄ¶¯»­µÄʱºò,Õ⽫ʮ·ÖµÄÖØÒª.µ«ÊÇ,Èç¹ûÄãʹÓÃDDSCAPS_VIDEOMEMORY²¢ÇÒûÓÐ×ã¹»µÄÏÔ´æÇø´æ·ÅÄǸöλͼÁË,µ±ÄãÊÔͼ´´½¨Õâ¸ö±íÃæµÄʱºò,½«»á·µ»ØÒ»¸öDDERR_OUTOFVIDEOMEMORY´íÎó.



step2:ÔØÈëλͼµ½ÀëÆÁ±íÃæ
µ±Á½¸öÀëÆÁ±íÃæ´´½¨ºÃºó,DDEx3ÓÃInitSurfaceº¯Êý½«frntback.bmpÎļþµÄλͼװÈëµ½±íÃæÖÐ.InitSurfaceº¯ÊýÓõ½ÁËddutil.cppÎļþÖеÄDDCopyBitmapº¯ÊýÈ¥×°ÔØÎ»Í¼.ÈçÏÂ:
// Load the bitmap resource.  
hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), szBitmap,  
   IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);  

if (hbm == NULL)  
   return FALSE;  

DDCopyBitmap(lpDDSOne, hbm, 0, 0,   640, 480);  
DDCopyBitmap(lpDDSTwo, hbm, 0, 480, 640, 480);  
DeleteObject(hbm);  

return TRUE;
Èç¹ûÄãÓÿ´Í¼»ò»­Í¼µÄÈí¼þ¿´¹ýfrntback.bmpÎļþÁË,Äã¾ÍÖªµÀ,Õâ¸öÎļþ°üÀ¨Á½¸öͼ,Ò»¸öÔÚÁíÒ»¸öµÄÉÏÃæ.DDCopyBitmapº¯Êý°ÑÕâ¸öλͼ´Ó·Ö½çµÄµØ·½·Ö³ÉÁ½²¿·Ö.Ò»¸ö×°Èëµ½µÚÒ»¸öÀëÆÁ±íÃæ(lpDDSOne),ÁíÒ»¸öÔÚµÚ¶þ¸öÀëÆÁ±íÃæ(lpDDSTwo).


step3:¿éÒÆ¶¯(blit)ÀëÆÁ±íÃæµ½ºǫ́»º³å
WM_TIMERÏûÏ¢´¥·¢µÄ´úÂë°üÀ¨Ð´Èë±íÃæºÍ·­×ª±íÃæ.ÔÚDDEx3ÖÐ,Ëû°üº¬ÁËÏÂÃæµÄ´úÂëȥѡÔñÊʵ±µÄÀëÆÁ±íÃæ,È»ºó°ÑËû¿éÒÆ¶¯(blit)µ½ºǫ́»º´æ.
rcRect.left = 0;  
rcRect.top = 0;  
rcRect.right = 640;  
rcRect.bottom = 480;  
if(phase)  
{  
   pdds = lpDDSTwo;  
   phase = 0;  
}  
else  
{  
   pdds = lpDDSOne;  
   phase = 1;  
}  
while(1)  
{  
   ddrval = lpDDSBack->BltFast(0, 0, pdds, &rcRect, FALSE);  
   if(ddrval == DD_OK)  
   {  
       break;  
   }  
}
phase±äÁ¿¾ö¶¨Á˵½µ×ÊÇÄÄÒ»¸öÀëÆÁ±íÃæ½«±»Òƶ¯µ½ºǫ́»º´æ.IDirectDrawSurface7::BltFast·½·¨µÄµ÷ÓÃÊÇÓÃÀ´°ÑËùÑ¡µÄÀëÆÁ±íÃæ¿éÒÆ¶¯µ½ºǫ́»º´æµÄ.ÔÚ(0,0)´¦¿ªÊ¼,×óÉϽÇ.reRect²ÎÊýÖ¸ÏòÒ»¸öRECT½á¹¹,Ëû¶¨ÒåÁËÒÆ¶¯³öÀ´µÄÀëÆÁ±íÃæµÄ×óÉϺÍÓÒϽÇ.×îºóµÄÒ»¸ö²ÎÊýÉèΪFALSE(0),±êʾûÓÐʹÓÃÌØÊâµÄ´«Êä±êʾ·û.
¸ù¾ÝÄãµÄ³ÌÐòµÄÐèÒª,Äã¿ÉÒÔʹÓÃIDirectDrawSurface7::Blt »òÕßIDirectDrawSurface7::BltFast ·½·¨ÊµÏÖ¿éÒÆ¶¯.Èç¹ûÄãµÄÀëÆÁ±íÃæÔÚÏÔ´æÖÐ,Äã×îºÃʹÓÃIDirectDrawSurface7::BltFast ·½·¨.ÕâÑù×ö,Èç¹ûÄãʹÓõÄÊÇÓ²¼þ¿éÒÆ¶¯Ö§³ÖµÄϵͳ,Äã²»»á»ñµÃ¸ü¿ìµÄËÙ¶È,µ«ÊÇ,Èç¹ûʹÓõÄÓ²¼þÄ£·ÂµÄ¿éÒÆ¶¯,Ä㽫»áÉÙÓÃ10%µÄʱ¼ä.ËùÒÔ,ÄãÓ¦¸ÃʹÓÃIDirectDrawSurface7::BltFast·½·¨È¥×öËùÓеÄÔÚÏÔ´æÖеĿéÒÆ¶¯.Èç¹ûÄã´ÓϵͳÄÚ´æÖÐÒÆ¶¯,»òÕßÐèÒªÌØ±ðµÄÓ²¼þ±êÖ¾,ÄǾÍÖ»ºÃʹÓÃIDirectDrawSurface7::BltÁË.
µ±Íê³ÉµÄ´ÓÀëÆÁ±íÃæµ½ºǫ́»º´æµÄ¿éÒÆ¶¯,ºǫ́»º´æ¾ÍºÍÖ÷Æ½ÃæÖ®¼äÏñÇ°Ãæ¼¸ÆªÒ»Ñù²»Í£µÄ·­°¡·­
×öÈËÒªºñµÀ°¡£¡ºñµÀ°¡£¡
7Â¥2005-12-23 20:24:28
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
Ïà¹Ø°æ¿éÌø×ª ÎÒÒª¶©ÔÄÂ¥Ö÷ zsglly µÄÖ÷Ìâ¸üÐÂ
×î¾ßÈËÆøÈÈÌûÍÆ¼ö [²é¿´È«²¿] ×÷Õß »Ø/¿´ ×îºó·¢±í
[¿¼ÑÐ] һ־Ըɽ¶«´óѧ²ÄÁÏÓ뻯¹¤325Çóµ÷¼Á +4 °ë½ØµÄÊ«0927 2026-03-02 4/200 2026-03-02 18:21 by shmilysuda
[¿¼ÑÐ] 284Çóµ÷¼Á +3 ÌìÏÂŸß 2026-03-02 3/150 2026-03-02 18:15 by lature00
[¿¼ÑÐ] »¶Ó­²É¿ó¡¢µØÖÊ¡¢ÑÒÍÁ¡¢¼ÆËã»ú¡¢È˹¤ÖÇÄܵÈרҵµÄͬѧ±¨¿¼ +6 pin8023 2026-02-28 8/400 2026-03-02 17:13 by 0854¶×µ÷¼Á
[¿¼ÑÐ] ²ÄÁÏ»¯¹¤µ÷¼Á +12 ½ñÏIJ»ÏÄ 2026-03-01 14/700 2026-03-02 16:09 by ½ñÏIJ»ÏÄ
[¿¼ÑÐ] 0856»¯¹¤×¨Ë¶Çóµ÷¼Á +15 ¶­boxing 2026-03-01 15/750 2026-03-02 15:06 by »Î»Î²»Ðí»Î
[¿¼ÑÐ] ½­ËÕʡũ¿ÆÔºÕе÷¼Á1Ãû +4 Qwertyuop 2026-03-01 4/200 2026-03-02 14:27 by Éý¸ñ°¢´ï
[¿¼ÑÐ] 0856µ÷¼Á +7 ÁõÃÎ΢ 2026-02-28 7/350 2026-03-02 14:11 by liyongv
[¿¼ÑÐ] 291 Çóµ÷¼Á +3 »¯¹¤2026½ì±ÏÒµÉ 2026-03-02 3/150 2026-03-02 12:55 by houyaoxu
[¿¼ÑÐ] 0805×Ü·Ö292£¬Çóµ÷¼Á +8 »ÃÏëÖ®éä 2026-03-01 8/400 2026-03-02 12:51 by Î޼ʵIJÝÔ­
[¿¼ÑÐ] 265·ÖÇóµ÷¼Á²»µ÷רҵºÍѧУÓÐÐÐѧÉÏ¾Í +6 ÀñÌö¡Õæ258 2026-02-28 9/450 2026-03-02 12:04 by 52hz~~
[¿¼ÑÐ] ²ÄÁϹ¤³Ìר˶283Çóµ÷¼Á 5+4 £¬£¡£¿ 2026-03-02 6/300 2026-03-02 11:07 by ºÚ£¡ÔÚ¸ÉÂï
[¿¼ÑÐ] 264Çóµ÷¼Á +4 °ÍÀ­°ÍÀ­¸ù556 2026-02-28 4/200 2026-03-02 10:48 by yuchj
[¿¼ÑÐ] µ÷¼Á +3 13853210211 2026-03-02 4/200 2026-03-02 10:16 by 13853210211
[¿¼ÑÐ] ²ÄÁÏѧµ÷¼Á +10 ÌáÉñ¶¹É³°ü 2026-02-28 12/600 2026-03-02 09:26 by ÀîÀÏʦ£¡
[¿¼ÑÐ] 0857µ÷¼Á +4 Ò»ll°ë 2026-02-28 5/250 2026-03-02 02:33 by 908055542
[¿¼ÑÐ] 313Çóµ÷¼Á +3 Ë®Á÷Äêlc 2026-02-28 3/150 2026-03-01 16:01 by ÐÂÄÜÔ´´ïÈË
[¿¼ÑÐ] 311Çóµ÷¼Á +6 ͤͤͤ01 2026-03-01 6/300 2026-03-01 15:41 by 324616
[¿¼ÑÐ] 298Çóµ÷¼Á +9 È˼äΨÄãÊÇÇå»¶ 2026-02-28 12/600 2026-03-01 14:23 by Ducount.Y
[¿¼ÑÐ] 317Ò»Ö¾Ô¸»ªÄÏÀí¹¤µçÆø¹¤³ÌÇóµ÷¼Á +6 Soliloquy_Q 2026-02-28 11/550 2026-03-01 11:14 by ¸èliekkas
[¿¼ÑÐ] 304Çóµ÷¼Á +3 52hz~~ 2026-02-28 5/250 2026-03-01 00:00 by 52hz~~
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û