發表文章

目前顯示的是有「WPF」標籤的文章

從 WPF 呼叫 NVAPI & ADL

WPF 使用 C# ,是屬於 Managed Code 而 NVAPI & ADL 是使用 C/C++ ,屬於 Unmanaged Code 所以必須透過橋樑來處理 第一步: 由 Using Unmanaged code and assembler in C# 知道 C# 可以透過 DllImport 來呼叫 DLL 中的 Function ,不過糟糕的是 NVAPI 是採用 Static Lib Link ,我們要使用的 Function 並沒有 Export 出來,因此折衷的辦法是在 NVAPI 外面再包一層 DLL ,然後將我們需要的 Function Export 出來給 C# 呼叫 ( 先試著直接呼叫,等比較熟後看是包成自訂控制項或其它方式 ) PS : 字串的處理記得在 DllImport 中設定 CharSet 的參數,否則 ANSI 與 UNICODE 未設定正確將產生錯誤 偵錯工具類型要設為 "混合",否則在 Managed Project 中無法偵錯 Unmanaged code NVAPI 採用 __cdecl、而 C# DllImport 預設是採用 __stdcall。我們的 DLL 是採用 Static Link 的方式呼叫 NVAPI,所以沒問題;但 C# 是用 Dynamic Link 方式呼叫 DLL,所以兩邊的 Calling Convention 必須一致,否則會產生堆疊錯誤。因此我們包的 DLL 要沿用 NVAPI 採用 __cdecl?還是配合 C# 採用 __stdcall 呢?暨然是 DLL,還是照慣例用 __stdcall 吧 Calling Convention cdecl 參數由右到左放入堆疊、呼叫端清除 (C/C++) MFC stdcall 由右到左、自行清除 (Win32) DLL pascal 由左到右、自行清除 (VC++2.0 & Win16) Borland Delphi fastcall 由左到右、自行清除 ( 前三個參數 EAX, EDX, ECX 剩下才放 Stack) Microsoft fastc...

WPF 新一代使用體驗開發實務 範例疑問

6.8 整合:建立可收合、停駐、調整大小的 Visual Studio 式窗格 (Page 177) 該程式在右邊有兩個按鈕,分別是 Toolbox 與 Solution Explorer,如果滑鼠移到該按鈕上方,則會暫時出現對應的視窗;如果滑鼠移開,則視窗自動隱藏 而視窗出現時,右上角會有一個按鈕提供視窗停駐的功能。 目前的問題是:Toolbox 與 Solution Explorer 的視窗位置是固定的,也就是 Toolbox 在左邊、Solution Explorer 在右邊。如果 Solution Explorer 先停駐,則滑鼠移到 Toolbox 上方時,出現的視窗在是 Solution Explorer 左邊,此時如果想將 Toolbox 視窗停駐,將因為中間隔了一個視窗而無法達成。因為滑鼠從按鈕上移開後,尚未到達 Toolbox 的停駐按鈕,視窗就消失了。 目前問題有兩種狀況: 如果先停駐 "T" 與 "S",然後再取消停駐 "T",此時就會有上述的問題 如果只停駐 "S",則 "T" 會在按鈕旁邊,可正常操作 Why? 2010/03/25 找到原因了,問題出在 UndockPane() 函式中,當要 Undock Pane1 時,除了 layer0 要移除 column1CloneForLayer0 外,還要檢查 Pane2 的狀態。如果 Pane2 是停駐的,則 layer1 也要移除 column2CloneForLayer1 (也就是跟 DockPane() 函式要對稱)。否則下次使用 Pane1 時,就變成有一個隱藏的 column2CloneForLayer1 存在,所以 Pane1 就被移到 Pane2 的左邊了 (請參考書本第 181 頁,圖 6.34)