投稿者 snowmansnow  (社会人) 投稿日時 2021/6/6 23:37:45
こんばんは、魔界の仮面弁士様。
また、お名前を間違えてごめんなさい。
最初の頃に、るきお様に注意されたのに、気を付けます。

VBAは、Excel の VBAです。
エクセルは、2016の32bit版です。OSはWIN1Oproの64bitです。
確認環境で、エクセルは、2016の64bit版(OSはWIN1Oproの64bit)も使用する場合がございます。

>取得失敗を判定するなら
取得失敗を判定は、MSGBOXが易しいので多用しております。気をつけます。

>あるいは CreateDC で "DISPLAY" のコンテキストを得るようにします。
CreateDC で "DISPLAY" のコンテキストは、なぜかエラーになってしまい、
>代わりに「hDC = GetDC(ByVal CLngPtr(0))」を試してみてください。
hDC = GetDC(ByVal CLngPtr(0))で、試してみました。
無事、色を取得できたようですが、
なぜか、RGBが逆さな気がしました。
また、元の貼り付けた画像のPIXELと違う気がしました。
 x = ActiveWindow.PointsToScreenPixelsX(0)
 y = ActiveWindow.PointsToScreenPixelsY(0)
 の、最初のPIXELの色は、合致してる事を確認できました。

>net ではなく .NET (ドットネット) ですよ。
>また、「c#」ではなく 「C#」と書きます。
net(c#)も
.NET、C#を使うように気をつけます。

>GetWindowTextW などの Wide 系 API にすること
GetWindowTextAも文字列が影響する事をしらなかったので、注意します。

>ワークシート部分を fn で示されたファイルに変換するためのコードはどうされましたか?
画像ファイルの画素を取り出すコードは、途中経過で、
今回の質問については、後述しております。

>異常系に到達した場合の流れもきちんと作りこみましょう。
最初、エラーに気が付かなくて、修正して作ったつもりでしたので、
ENDIFの位置に気を付けます。

>> Private Type PICTDESC
>提示頂いたコードでは未使用のようですが、もしかして、
引用したコードを精査しておりませんでした。未使用の定義でした。他意はございません。

>Long と LongPtr の使い分けに統一感が無い
64bitと32bitの使い分けが、まだはっきりわかっておらず、
また、2つの環境で使う予定な事と、PTRSAFEのような明確なエラーにならないので、
整理できておりませんでした、徐々に出来るようになりたいです。(まだ呪文)

>GdipBitmapGetPixel は 32bit な色空間 (ARGB) を返す
別なWEBでPNGの透明化に言及されておられましたが、気が付きませんでした。

>' OLE_COLOR … 00BBGGRR な 24bit 色(もしくは 800000nn で管理されるシステム色) 
>' COLORREF  … 00RRGGBB な 24bit 色 
>' ARGB      … AARRGGBB な 32bit 色 
先ほどの色が逆さの謎が解けました。

>この h は何を求めるためのコードですか?
国土地理院様の高度タイルのPNGから高度を求める途中式(100倍)です。

>GdipDisposeImage で解放するのを忘れていますよ。
>後始末はきちんと行いましょう。
気をつけます。

>color 変数の宣言を忘れているのではありませんか?
はい、定義しましたら、色が出てきました。
※WEBにUPする時に、文字制限に引っかかったので、クリップボード関係の定義を削除してしまいました

>VBA7 未満での PtrSafe は余計でしたね。
これ以外なのか、私の環境ではエラーになってしまいました・・・(上記)

>書き間違い。orz
>VB の 24bit 色と同じ並び
こんがらがっちゃいました(上記)

>VBA でハンドルやポインタを扱うときは
ハンドルは、(64bitの呪文を何かで拝見しました)。
ポインタは、まだよくわかりません。

>OLE_HANDLE は 
難しいですが、注意できるようになりたいです。


今回は、国土地理院タイルの、高度タイルの標高を求めたい所からスタートしました。
LOADPICTUREで、すぐ出来ると思ったのですが、色んな回り道をして、まだ、
ワークシート画像からは、高度を求める所まで行ってません。(pixelが違う気が・・・)
(クラスライブラリや、APIで直接PNGを扱った方が、今のところ、私は間違いないです)
クラスライブラリも、コードは容易でしたが、クラスライブラリも、コンソールアプリもダメで、
フォームアプリのクラスライブラリに到達するまで時間がかかりました。

GDI+を教えてもらって、やっぱりVBAは、まだまだ凄いなぁ、と思いました。
いっぱい指摘を受けましたが、大変勉強になりました。
クラスライブラリも好きですが、VBA単体で出来る事を増やしていきたいです。
大変ありがとうございました。
また宜しくお願いします。