HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0306
hspAPIでビットマップを表示する方法7解決


hsp

リンク

2021/3/6(Sat) 07:51:58|NO.92418

LoadImageを使ってみたいのですが#funcの引数をAPIのリファレンス通りに指定すればいいのかどうか
わかりません。ポインタの指定法もよくわかりません。
宜しければご教示お願いします。



この記事に返信する


ウサギガニゲテル

リンク

2021/3/6(Sat) 12:51:44|NO.92421




こいる

リンク

2021/3/6(Sat) 14:07:05|NO.92422

リンク先のスクリプトを、分かりやすいようにモジュール化してみました。(ついでに画像ロードモードも付けてみました)

このモジュールは、参考にするなり、使用するなり自由にして大丈夫です。

#module picload_by_win32api #uselib "user32.dll" #func LoadImage "LoadImageA" sptr,sptr,sptr,sptr,sptr,sptr #uselib "gdi32.dll" #func CreateCompatibleDC "CreateCompatibleDC" sptr #func SelectObject "SelectObject" sptr,sptr #func GetObject "GetObjectA" sptr,sptr,sptr #func BitBlt "BitBlt" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr #func DeleteDC "DeleteDC" sptr #func DeleteObject "DeleteObject" sptr #define LR_LOADFROMFILE 0x10 #define IMAGE_BITMAP 0 #define SRCCOPY 0xCC0020 #deffunc PicLoadByWin32Api str filename, int loadmode hImage = LoadImage(hinstance, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE) // bmpを読み込み memoryDc = CreateCompatibleDC(hdc) // メモリDC作成 SelectObject memoryDc, hImage // メモリDCにbmp転送 // bmpのサイズ取得 bufferSize = GetObject(hImage,0,0) dim BITMAP, bufferSize/4 GetObject hImage, bufferSize, varptr(BITMAP) // メモリDCからコピー if loadmode == 0 { // ウィンドウを初期化してロード screen ginfo_sel, BITMAP(1), BITMAP(2) BitBlt hdc, 0, 0, BITMAP(1), BITMAP(2), memoryDc, 0, 0, SRCCOPY }else{ // 現在の画面の上にロード BitBlt hdc, ginfo_cx, ginfo_cy, BITMAP(1), BITMAP(2), memoryDc, 0, 0, SRCCOPY } DeleteDC memoryDc // メモリDC破棄 DeleteObject hImage // bmpハンドル破棄 redraw 1 // 画面更新 return #global // 以下サンプル dialog "bmp",16,"ビットマップ" if stat==0 : end PicLoadByWin32Api refstr



hsp

リンク

2021/3/6(Sat) 20:43:28|NO.92428

こいるさん面倒なコード書いてもらってすいません。
私はただビットマップを表示してみたいだけなんですがLoadImageの引数のLPCTSTRにファイルパス
のポインタを指定となってますがHSPではどうすればいいんでしょう?
とりあえず書いてみましたがエラーになる。

#uselib "user32.dll"
#func loadimage "LoadImage" HINSTANCE,LPCTSTR,UINT,int,int,UINT



こいる

リンク

2021/3/7(Sun) 14:02:51|NO.92430

>私はただビットマップを表示してみたいだけなんですが
あのモジュールは、LoadImageを使い、HSP標準命令のpicloadのようにビットマップを表示するものなので、本当にただ表示したいだけならば、あれを使うだけで解決します。

>LoadImageの引数のLPCTSTRにファイルパスのポインタを指定となってますがHSPではどうすればいいんでしょう?
#funcでは、引数の「型」を指定するのですが、基本的には全て「sptr」(ポインタ整数値または文字列のポインタ)でいいです。
↓こんな感じで、すべての引数をsptrに

#uselib "user32.dll" #func LoadImage "LoadImageA" sptr,sptr,sptr,sptr,sptr,sptr


呼び出すときは、直接文字列を指定したり、文字列型の変数を指定します。
型をsptrにしているので、指定した文字列のポインタを自動で渡してくれます。

LoadImage hinstance, "test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE LoadImage hinstance, filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE



hsp

リンク

2021/3/7(Sun) 15:13:18|NO.92431

ご返答ありがとうございます。
LoadImageAというのはメモリに読み込むだけで画面には出ないのですか?
BitBltとか必要なら不毛な質問だったかな…



こいる

リンク

2021/3/7(Sun) 18:47:11|NO.92434

はい、読み込むだけで描画は一切しません。
(メモリデバイスコンテキストを作成し、読み込んだビットマップを転送、BitBltで画面にコピーする必要があります)

なので、ただ表示したいだけなら、NO.92422のモジュールを使ってください。
引数は標準命令のpiclaodとほぼ同じなので、簡単に使えるかと思います。



hsp

リンク

2021/3/8(Mon) 16:22:48|NO.92439

APIの手順はなんとか理解できました。
こいるさんありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.