2011-06-01 64 views
1

我正在創建一個自定義組件(派生自TCustomCategoryPanelGroup)並執行一些自定義繪製操作。我想要在啓用主題並適當繪製文本時進行處理。TThemeServices :: DrawText無法解析的鏈接錯誤

下面是一些代碼,我都以平局函數的代碼段:

int theBaseDrawFlags = DT_EXPANDTABS | DT_SINGLELINE | DT_VCENTER | DT_LEFT; 
theBaseDrawFlags = DrawTextBiDiModeFlags(theBaseDrawFlags); 

if (TCustomCategoryPanelGroup::hsThemed == PanelGroup->HeaderStyle && ThemeServices()->ThemesEnabled) 
{ 
    ThemeServices()->DrawText(ACanvas->Handle, ThemeServices()->GetElementDetails(tebNormalGroupHead), m_CaptionTopLeft, m_TextRect, theBaseDrawFlags, 0); 
} 
else 
{ 
    // Draw without themes 
} 

當我嘗試建立這個我收到的錯誤:

Unresolved external __fastcall Themes::TThemeServices::DrawTextA(HDC__ *, Themes::TThemedElementDetails&, const System::WideString, Types::TRect&, unsigned int, unsigned int)' referenced from .... 

正如你可以看到它在尋找DrawTextA。我查看了Themes.hpp頭文件,並且只定義了ThemeServices::DrawText函數。

我不確定這裏發生了什麼事。我想也許我錯過了一個導入庫,但是我使用的所有其他ThemeServices函數都沒有鏈接錯誤。

任何人都知道這裏發生了什麼?

+0

忘記提及我正在使用C++ Builder XE。 – 2011-06-01 17:08:39

回答

2

我猜你有#include d一些頭(WINDOWS.H?),包含像這樣

#ifdef UNICODE 
#define DrawText DrawTextW 
#else 
#define DrawText DrawTextA 
#endif 

你或許可以在文件中把一個#undef DrawText來解決這個問題。 (另請參閱Conflict with DrawText function。)

+0

ThemeServices :: DrawText()不是我的代碼,它是Embarcadero的。爲了探索這個想法,我嘗試了不同的建議(和相關問題)。我不相信這是這樣的問題。它幾乎看起來像Themes.hpp標題(包含ThemeServices類)正在生成的問題,它與鏈接的庫有什麼不同。 – 2011-06-01 18:47:48

+0

但是你上面發佈的**代碼是**你的代碼,不是嗎?如果在上面,DrawText是#defined代表DrawTextA,那麼你的調用'ThemeServices() - > DrawText'將被預處理器轉換爲'ThemeServices() - > DrawTextA' - 這會解釋你得到的編譯器錯誤。 – 2011-06-01 19:37:02

+0

@Ulrich,錯誤表明'DrawText'在'TThemeServices'聲明之前定義爲'DrawTextA',而不是在Scott的調用之前。否則,錯誤可能是關於呼叫站點的未聲明的標識符。但是Scott看到一個鏈接器錯誤,所以在編譯器看到這個調用時,它認爲這是一個有效的函數,這意味着頭文件中的聲明也會受到影響。 Scott,在包含* windows.h *之後,但在包含* Themes.hpp *之前,請使用Ulrich的建議來取消定義'DrawText'。 – 2011-06-01 22:53:56

相關問題