2008年8月6日 星期三

製作純資源DLL的方法

僅含資源的 DLL 是指僅包含資源而不包含其他項目的 DLL,例如,圖示、點陣圖、字串和對話方塊。使用僅含資源的 DLL 是在多個程式間共用一組相同資源的好方法,也是為應用程式提供當地語系化為多國語言的資源的好方法。

若要建立僅含資源的 DLL,請建立新 Win32 DLL ( MFC) 專案,並且將您的資源加入專案。

  • [新增專案] 對話方塊中選取 [Win32 專案],並且在 [Win32 專案精靈] 中指定 DLL 專案類型。
  • DLL 建立包含資源 (例如字串或功能表) 的新資源指令碼,並儲存該 .rc 檔案。
  • [專案] 功能表上,按一下 [加入現有項目],並且將新的 .rc 檔案插入至專案。
  • 指定 /NOENTRY 連結器選項。/NOENTRY 可以防止連結器將 _main 參考連結至 DLL;建立僅含資源的 DLL 時需要這個選項。

  • 建置 DLL

使用僅含資源的 DLL 的應用程式時應該要呼叫 LoadLibrary 明確連結 DLL。若要存取資源,請呼叫可以使用在任何類型的資源的 FindResource LoadResource 泛用函式,或者是呼叫下列資源特定函式的其中之一:

  • FormatMessage
  • LoadAccelerators
  • LoadBitmap
  • LoadCursor
  • LoadIcon
  • LoadMenu
  • LoadString

應用程式應該在完成資源使用時呼叫 FreeLibrary

範例程式

#include "..\Mod1res\resourceppc.h"

#include "WelComeModule.h"

WelComeModule::WelComeModule()

{

m_pWelcomeBitmap = 0x0;

}

WelComeModule::~WelComeModule()

{

SetActive(false);

}

void

WelComeModule::SetActive(bool bActive)

{

if (m_bIsActive==bActive)

return;

m_bIsActive = bActive;

if (m_bIsActive)

{

if (!m_pWelcomeBitmap)

m_pWelcomeBitmap = new CBitmap;

//載入資源DLL

if (!m_hResourceDLL)

m_hResourceDLL = (HINSTANCE)LoadLibrary(_T("Mod1res.dll"));

if(m_hResourceDLL)

{

m_hOldResource = AfxGetResourceHandle();

AfxSetResourceHandle(m_hResourceDLL);

HBITMAP hBitmap =

::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_WELCOME));

_bLoad = m_pWelcomeBitmap->Attach(hBitmap);

AfxSetResourceHandle(m_hOldResource);

m_hOldResource = 0x0;

}

else

m_bIsActive = false;

}

else

{

if (m_pWelcomeBitmap)

{

BOOL check = DeleteObject(m_pWelcomeBitmap->Detach());

delete m_pWelcomeBitmap;

m_pWelcomeBitmap = 0x0;

}

//卸載資源DLL

if (m_hResourceDLL)

{

if (FreeLibrary(m_hResourceDLL)==true)

m_hResourceDLL = 0x0;

}

}

}

void

WelComeModule::Render(CDC* pDC)

{

if (!m_bIsActive)

return;

if (!m_pWelcomeBitmap)

return;

//初始化Memory DC

CDC MemoryDC;

MemoryDC.CreateCompatibleDC(pDC);

//取得圖片尺寸

BITMAP bm;

m_pWelcomeBitmap->GetObject(sizeof(bm), &bm);

MemoryDC.SelectObject(m_pWelcomeBitmap);

//將圖貼到要秀的DC

pDC->BitBlt(View_Offset, View_Offset, bm.bmWidth, bm.bmHeight,

&MemoryDC, 0, 0, SRCCOPY);

}

沒有留言: