DOBON.NET DOBON.NETプログラミング掲示板過去ログ

API関数を対応するNETFrameWorkに書き換え

環境/言語:[Windows XP VS2005(VB,C#)]
分類:[.NET]

こんにちは、また宜しくお願いします。
API関数を対応するNETFrameWorkを使用して書き換えています
MSDNのヘルプを見ながらやっていますが、以下のGetDeviceCaps(hDC, BITSPIXEL)の書き換えが
どうしてもできません。ヘルプ通りにすると
'GetDeviceCaps'は'System.Drawing.Graphics'のメンバではありません。とコンパイルエラーがでます。
このヘルプをどのように解釈したらエラーが無くなるのでしょうか?

ヘルプ内容は
Microsoft Win32 と Microsoft .NET Framework API との対応
http://www.microsoft.com/japan/msdn/net/general/win32map.aspx#win32map_devicecontextfunctions
Win32 五十音順カテゴリリスト のデバイスコンテキスト関数に収録されています。

元になるAPI関数はGetDC、GetDeviceCaps、ReleaseDCでGetDeviceCapsの書き換えができません。


API使用の元の関数呼び出しです。(これは正常に動作します。)
Public Function GetDisplayColorBit_A() As Integer 'API使用の場合
  'スクリーンデバイスコンテキストを取得
  Dim hDC As IntPtr
  hDC = GetDC(IntPtr.Zero)
  'カラービットを取得
  Dim iRes As Integer = GetDeviceCaps(hDC, BITSPIXEL)
  'スクリーンデバイスコンテキストを解放
  ReleaseDC(IntPtr.Zero, hDC)
  Return iRes
End Function 'GetDisplayColorBit

上のプロシジャーを API に対応するFrameWorkを使用して書き換えたプロシジャーです。
Public Function GetDisplayColorBit_B() As Integer 'APIに対応するFrameWorkを使用の場合
  'スクリーンデバイスコンテキストを取得
  Dim hDC As New IntPtr()
  'Dim gr As Graphics = System.Drawing.Graphics.FromHwnd(Me.Handle) '次でもOK
  Dim gr As Graphics = Me.CreateGraphics
  hDC = gr.GetHdc() '対応API hDC = GetDC(IntPtr.Zero)

  'カラービットを取得
  Dim iRes As Integer = gr.GetDeviceCaps(hDC, BITSPIXEL) '※この行がエラーになります。

  'スクリーンデバイスコンテキストを解放
  gr.ReleaseHdc(hDC) '対応API ReleaseDC(IntPtr.Zero, hDC)
  'Graphicsを解放
  gr.Dispose()
  Return iRes
End Function 'GetDisplayColorBit


エラー部分を元のAPI に置き換えると正常に動作します。
どうか宜しくお願いします。
>   'カラービットを取得
>   Dim iRes As Integer = gr.GetDeviceCaps(hDC, BITSPIXEL) '※この行がエラーになります。

対応表の見方を誤っているようです。
API関数に対する、Frameworkでの名前空間、クラス、メンバの対応表です。
名前が移行されているわけではありませんし、動作させるためにFrameworkにあわせて
処理を追加したりしなくてはなりません。
※基本的には「代替」ですが。
ですのでまったく同一の動作をするという意味の対応表ではないというスタンスで
Frameworkの使用するものについて仕様を理解しておくことが不可欠でしょう。
2006/08/05(Sat) 01:03:35 編集(投稿者)

■No16989に返信(まどかさんの記事)
まどかさん いつも有難うございます。

>
> 対応表の見方を誤っているようです。

対応表によると GetDeviceCaps API関数に相当するメソッド、プロパティが Frameworkでの名前空間
System.Drawing.Graphics プロパティ
System.Drawing.Printing.PrinterSettings
System.Management クラス
内に存在するかと思って探しましたが該当するようなメソッド、プロパティはありませんでした。

大変申し訳ありませんが、GetDeviceCaps API関数 を例として Framework に書き換えてみて頂けないでしょうか?
これができれば表の意図が解りますので、その他のAPI関数の書き換えはできる気がします。

#GetDeviceCaps API関数 で ディスプレのカラービットを取得しています。
> 対応表によると GetDeviceCaps API関数に相当するメソッド、プロパティが Frameworkでの名前空間
> System.Drawing.Graphics プロパティ
> System.Drawing.Printing.PrinterSettings
> System.Management クラス
> 内に存在するかと思って探しましたが該当するようなメソッド、プロパティはありませんでした。

えっと、先に書いたように単にメソッド名を書き換えれば動くというようなものではないんです。
ですので、上記は代わりに同等の機能を実現できる手段を持っているものの一覧で
その中の何を使えばいいのかは調べなくてはいけないのです。

上記が3つ書いてある理由はDeviceがいろいろなものをあらわす総称であるためです。
たとえばグラフィックデバイスでGetDeviceCapsを使っているならGraphicsプロパティでやりくりできます、という意味になります。

> これができれば表の意図が解りますので、その他のAPI関数の書き換えはできる気がします。

上記で表の意図を理解できましたか?
2006/08/05(Sat) 17:38:36 編集(投稿者)

■No17009に返信(まどかさんの記事)

まどかさん 有難うございます。
>
> 上記で表の意図を理解できましたか?

意図は理解できましたが実際に書き換えするとなると難しいですね。
今回 GetDC、GetDeviceCaps、ReleaseDC の3つのAPI関数の書き換えを試みて GetDC、ReleaseDC は簡単にできたのですが GetDeviceCaps の書き換えができませんでした。

表の全ての機能が書き換え可能という訳でなくできない機能もあり ’ディスプレのカラービットを取得’は書き換え不可の内容であると思います。

Screenクラス(System.Windows.Forms名前空間)での収得方法はありました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/433screenbitspixel/screenbitspixel.html

有難うございました。今後とも宜しくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板