DLL(Dynamic Link Library)


  1. 画像表示
  2. ファイル圧縮・暗号化
  3. 画像表示用スクロールバー


画像表示



32dib32.dll(C/HSP/AB)とソースのダウンロード
32dib32stdcall.dll(VB)とソースのダウンロード
CBm32.dll(C)とソースのダウンロード

DLL(ダイナミック リンク ライブラリ)を使うと、HSPActiveBasicやVisualBasicでも、Cで作った関数を動かせるようになる
Microsoft Visual Studio Express 2012 for Desktop で、DLL を作るには
  1. [ファイル]→[新しいプロジェクト]→[Win32 プロジェクト]を選択して、[名前]にファイル名(例えば、32dib32 など)を記述→[OK]→[次へ]→[DLL]を選択して、[空のプロジェクト]にチェック→[完了]
  2. エクスプローラで、[ドキュメント]フォルダ→[Visual Studio 2012]フォルダ→[Projects]フォルダの先ほど作成したプロジェクトのフォルダ内の vcxproj ファイルがあるフォルダに、必要なファイル(例えば、32dib32.h と 32dib32.cpp など)を入れ、VS に戻って、[プロジェクト]→[既存項目の追加]で、それらのファイルをプロジェクトに入れる
    (この2つのファイルは、ただのテキストファイルだから、テキストエディタで記述できる)
  3. ファイルサイズを小さくするため、[ビルド]→[構成マネージャー]で[Debug]を[Release]に変更→[閉じる]
  4. 必要に応じて、[プロジェクト]→[プロパティ]→[構成プロパティ]→[全般]→[文字セット]を[設定なし]などに変更→[OK]
    HSPやウィンドウズ95〜Meも使えるDLLにするなら、[設定なし]か、[マルチバイト文字セット](MBCS)にする必要がある
    それらを対象に加えないなら、Unicodeの方がやや高速になるらしい
    また、DLLとそれを使うソフトの文字セットが異なると使えない
  5. [ビルド]→[ソリューションのビルド]で、[Release]フォルダに 32dib32.lib と 32dib32.dll が作成される

32DIB32.DLLは、読み込んだBMPファイルを表示する関数群だ
例えば、HSPなら、以下のようなコードになる
取得したビットマップハンドルは、使用後、必ず、b32Delete() で削除する
b32Delete() の代わりに GDI 関数の DeleteObject() を使っても良い
b32Draw32()〜b32Hue()は、32bppDIBしか使えない
DLLを使うには、関数宣言が必要だが、以下のサンプルでは、32dib32.hsp でしている
HSPでは、戻り値がある関数には cfunc を、ない関数には func を使う
CBm32.dllは、32dib32.dllのクラスバージョンで、メモリ解放が不要になった
#include "32dib32.hsp"

hBmp1 = b32New(300, 100)
hBmp2 = b32Load("back.bmp")
hBmp3 = b32Load("star.bmp")
wdh = b32GetWidth(hBmp2)
hgt = b32GetHeight(hBmp2)
res = b32DrawColor(hBmp1, 128, 255, 255, 255)
res = b32DrawFont(hBmp1, "はろー", 80, 0, 0, 255, 255, 255)
res = b32Hue(hBmp2, 128, 100, 100, 200, 100)
res = b32Draw32(hBmp2, 50, 50, hBmp1, 0, 0, wdh, hgt, 255)
res = b32Draw32(hBmp2, 100, 150, hBmp3, 0, 0, 200, 200, 128)
res = b32DrawDC(hdc, 0, 0, hBmp2, 0, 0, wdh, hgt)
redraw
res = b32Delete(hBmp1)
res = b32Delete(hBmp2)
res = b32Delete(hBmp3)
    

以下は、C言語のサンプル
以下のサンプルの関数宣言は、32dib32.h でしている
Cでは、戻り値がない関数は、戻り値のデータ型を void にする
#include <windows.h>
#include <tchar.h>
#include "32dib32.h"

#pragma comment(lib, "32dib32.lib")

LRESULT CALLBACK ProcWnd(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static HBITMAP hBmp1,hBmp2,hBmp3;
    
    switch (uMsg)
    {
    case WM_CREATE:
        hBmp1 = b32New(300, 100);
        hBmp2 = b32Load(TEXT("back.bmp"));
        hBmp3 = b32Load(TEXT("star.bmp"));
        return 0;
    case WM_PAINT:
        {
            HDC         hDC;
            PAINTSTRUCT ps;
            hDC = BeginPaint(hWnd,&ps);
            int wdh = b32GetWidth(hBmp2);
            int hgt = b32GetHeight(hBmp2);
            b32DrawColor(hBmp1, 128, 255, 255, 255);
            b32DrawFont(hBmp1, TEXT("はろー"), 80, 0, 0, 255, 255, 255);
            b32Hue(hBmp2, 128, 100, 100, 200, 100);
            b32Draw32(hBmp2, 50, 50, hBmp1, 0, 0, wdh, hgt, 255);
            b32Draw32(hBmp2, 100, 150, hBmp3, 0, 0, 200, 200, 128);
            b32DrawDC(hDC, 0, 0, hBmp2, 0, 0, wdh, hgt);
            EndPaint(hWnd,&ps);
        }
        return 0;
    case WM_CLOSE:
        b32Delete(hBmp1);
        b32Delete(hBmp2);
        b32Delete(hBmp3);
        DestroyWindow(hWnd);
        PostQuitMessage(0);
        return 0;
    default:
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
    

以下は、VB(ABも、おおよそ同じ)のサンプル
VBは、HSPやCのように関数宣言を外部ファイルにできないから、直接、記述しなくてはならない
ABは、C同様、#include が使える
どちらも、戻り値がある関数には、Declare Function を使い、ない関数には、Declare Sub を使う
Public Class Form1
    Private Declare Auto Function b32Delete Lib "32dib32stdcall.dll" _
        (ByVal hBmp As IntPtr) As Boolean
    ・・・
    Private Sub Draw1() Handles Me.Paint
        Dim hWnd = Me.Handle
        Dim g = Graphics.FromHwnd(hWnd)
        Dim hDC = g.GetHdc()
        Dim hBmp1 = b32New(300, 100)
        Dim hBmp2 = b32Load("back.bmp", 0, 0, 0, 0)
        Dim hBmp3 = b32Load("star.bmp", 0, 0, 0, 0)
        Dim wdh = b32GetWidth(hBmp2)
        Dim hgt = b32GetHeight(hBmp2)
        b32DrawColor(hBmp1, 128, 255, 255, 255, 0, 0, 0, 0)
        b32DrawFont(hBmp1, "はろー", 80, 0, 0, 255, 255, 255)
        b32Hue(hBmp2, 128, 100, 100, 200, 100)
        b32Draw32(hBmp2, 50, 50, hBmp1, 0, 0, wdh, hgt, 255)
        b32Draw32(hBmp2, 100, 150, hBmp3, 0, 0, 200, 200, 128)
        b32DrawDC(hDC, 0, 0, hBmp2, 0, 0, 0, 0)
        b32Delete(hBmp1)
        b32Delete(hBmp2)
        b32Delete(hBmp3)
    End Sub
End Class
    

以下は、C言語(クラスバージョン)のサンプル
#include <windows.h>
#include <tchar.h>
#include "CBm32.h"

#pragma comment(lib, "CBm32.lib")

LRESULT CALLBACK ProcWnd(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static CBm32   bm1,bm2,bm3;
    static CFont32 font;
    
    switch (uMsg)
    {
    case WM_CREATE:
        font.Set(TEXT("MS P明朝"), FW_MEDIUM, SHIFTJIS_CHARSET,
                 DEFAULT_PITCH | FF_DONTCARE, PROOF_QUALITY);
        bm1.Create(300, 100);
        bm2.Create(TEXT("back.bmp"));
        bm3.Create(TEXT("star.bmp"));
        return 0;
    case WM_PAINT:
        {
            HDC         hDC;
            PAINTSTRUCT ps;
            hDC = BeginPaint(hWnd,&ps);
            int wdh = bm2.GetWidth();
            int hgt = bm2.GetHeight();
            bm1.DrawColor(128, 255, 255, 255);
            bm1.DrawFont(TEXT("はろー"), 80, 0, 0, 255, 255, 255);
            bm2.Hue(128, 100, 100, 200, 100);
            bm1.Draw32(bm2, 50, 50, 0, 0, wdh, hgt, 255);
            bm3.Draw32(bm2, 100, 150, 0, 0, 200, 200, 128);
            bm2.DrawDC(hDC, 0, 0, 0, 0, wdh, hgt);
            EndPaint(hWnd,&ps);
        }
        return 0;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        PostQuitMessage(0);
        return 0;
    default:
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
    

32DIB32.DLLの関数
予め、定数が設定されている引数は、右から順に省略できる(VB以外)
画像の幅と高さは、0を設定すると、画像全体になる
ビットマップハンドルの解放
BOOL b32Delete(HBITMAP hBmp)
hBmp   : [IN] ビットマップハンドル
戻り値 :      1:成功、0:失敗

DIB の画像幅を取得
int b32GetWidth(HBITMAP hBmp)
hBmp   : [IN] ビットマップハンドル
戻り値 :      画像幅

DIB の画像高を取得
int b32GetHeight(HBITMAP hBmp)
hBmp   : [IN] ビットマップハンドル
戻り値 :      画像の高さ

DIB の画像の色深度を取得
int b32GetBPP(HBITMAP hBmp)
hBmp   : [IN] ビットマップハンドル
戻り値 :      画像の色深度

DIB のピクセル値を取得
PBYTE b32GetBits(HBITMAP hBmp)
hBmp   : [IN] ビットマップハンドル
戻り値 :      画像のピクセル値

32bppDIB の新規作成
HBITMAP b32New(int width, int height)
width  : [IN] 画像の幅
height : [IN] 画像の高さ
戻り値 :      ビットマップハンドル

画像を 32bppDIB に読み込む
HBITMAP b32Load(char *filename, int x = 0, int y = 0, int width = 0, int height = 0)
filename : [IN] ビットマップ ファイル名
x, y     : [IN] 読み込み矩形の左上座標
width    : [IN] 読み込み矩形の幅(0 の場合は画像の幅)
height   : [IN] 読み込み矩形の高さ(0 の場合は画像の高さ)
戻り値   :      ビットマップハンドル

画像の再読み込み
BOOL b32Reload(HBITMAP hBmp, char *filename, int x = 0, int y = 0, int width = 0,
               int height = 0)
hBmp     : [IN] ビットマップハンドル
filename : [IN] ビットマップ ファイル名
x, y     : [IN] 読み込み矩形の左上座標
width    : [IN] 読み込み矩形の幅(0 の場合は画像の幅)
height   : [IN] 読み込み矩形の高さ(0 の場合は画像の高さ)
戻り値   :      1:成功、0:失敗

32bppDIB を取得(入力したDIBは削除されない)
HBITMAP b32Get32bppDIB(HBITMAP hBmp, int x = 0, int y = 0, int width = 0, int height = 0)
hBmp   : [IN] 元になるビットマップハンドル
x, y   : [IN] 読み込み矩形の左上座標
width  : [IN] 読み込み矩形の幅(0 の場合は画像の幅)
height : [IN] 読み込み矩形の高さ(0 の場合は画像の高さ)
戻り値 :      ビットマップハンドル

DIB の描画
BOOL b32Draw(HBITMAP hBmpDst, int xDst, int yDst, HBITMAP hBmpSrc, int xSrc = 0,
             int ySrc = 0, int width = 0, int height = 0)
hBmpDst      : [IN][OUT] コピー先ビットマップハンドル
xDst, yDst   : [IN]      コピー先座標
hBmpSrc      : [IN]      コピー元ビットマップハンドル
xSrc, ySrc   : [IN]      コピー元座標
width, height: [IN]      コピー矩形の幅と高さ
戻り値       :           1:成功、0:失敗

DIB の描画(デバイスコンテキスト)
BOOL b32DrawDC(HDC hDC, int xDst, int yDst, HBITMAP hBmpSrc, int xSrc = 0,
               int ySrc = 0, int width = 0, int height = 0)
hDC          : [IN][OUT] コピー先デバイスコンテキスト
xDst, yDst   : [IN]      コピー先座標
hBmpSrc      : [IN]      コピー元ビットマップハンドル
xSrc, ySrc   : [IN]      コピー元座標
width, height: [IN]      コピー矩形の幅と高さ
戻り値       :           1:成功、0:失敗

DIB の描画(拡大・縮小)
BOOL b32DrawEx(HBITMAP hBmpDst, int xDst, int yDst, int widthDst, int heightDst,
               HBITMAP hBmpSrc, int xSrc = 0, int ySrc = 0, int widthSrc = 0, int heightSrc = 0)
hBmpDst             : [IN][OUT] コピー先ビットマップハンドル
xDst, yDst          : [IN]      コピー先座標
widthDst, heightDst : [IN]      コピー先矩形の幅と高さ
hBmpSrc             : [IN]      コピー元ビットマップハンドル
xSrc, ySrc          : [IN]      コピー元座標
widthSrc, heightSrc : [IN]      コピー元矩形の幅と高さ
戻り値              :           1:成功、0:失敗

DIB の抜き色描画
BOOL b32DrawKey(HBITMAP hBmpDst, int xDst, int yDst, HBITMAP hBmpSrc, int xSrc, int ySrc,
                int width, int height, BYTE red, BYTE green, BYTE blue)
hBmpDst      : [IN][OUT] コピー先ビットマップハンドル
xDst, yDst   : [IN]      コピー先座標
hBmpSrc      : [IN]      コピー元ビットマップハンドル
xSrc, ySrc   : [IN]      コピー元座標
width, height: [IN]      コピー矩形の幅と高さ
red          : [IN]      抜き色の赤色成分
green        : [IN]      抜き色の緑色成分
blue         : [IN]      抜き色の青色成分
戻り値       :           1:成功、0:失敗

DIB の抜き色描画(デバイスコンテキスト)
BOOL b32DrawKeyDC(HDC hDC, int xDst, int yDst, HBITMAP hBmpSrc, int xSrc, int ySrc,
                  int width, int height, BYTE red, BYTE green, BYTE blue)
hDC          : [IN][OUT] コピー先デバイスコンテキスト
xDst, yDst   : [IN]      コピー先座標
hBmpSrc      : [IN]      コピー元ビットマップハンドル
xSrc, ySrc   : [IN]      コピー元座標
width, height: [IN]      コピー矩形の幅と高さ
red          : [IN]      赤色
green        : [IN]      緑色
blue         : [IN]      青色
戻り値       :           1:成功、0:失敗

DIB の抜き色描画(拡大・縮小)
BOOL b32DrawKeyEx(HBITMAP hBmpDst, int xDst, int yDst, int widthDst, int heightDst,
                  HBITMAP hBmpSrc, int xSrc, int ySrc, int widthSrc, int heightSrc,
                  BYTE red, BYTE green, BYTE blue)
hBmpDst             : [IN][OUT] コピー先ビットマップハンドル
xDst, yDst          : [IN]      コピー先座標
widthDst, heightDst : [IN]      コピー矩形の幅と高さ
hBmpSrc             : [IN]      コピー元ビットマップハンドル
xSrc, ySrc          : [IN]      コピー元座標
widthSrc, heightSrc : [IN]      コピー矩形の幅と高さ
red                 : [IN]      抜き色の赤色成分
green               : [IN]      抜き色の緑色成分
blue                : [IN]      抜き色の青色成分
戻り値              :           1:成功、0:失敗

DIB の半透明描画
BOOL b32DrawAlpha(HBITMAP hBmpDst, int xDst, int yDst, HBITMAP hBmpSrc, int xSrc, int ySrc,
                  int width, int height, BYTE alpha)
hBmpDst      : [IN][OUT] コピー先ビットマップハンドル
xDst, yDst   : [IN]      コピー先座標
hBmpSrc      : [IN]      コピー元ビットマップハンドル
xSrc, ySrc   : [IN]      コピー元座標
width, height: [IN]      コピー矩形の幅と高さ
alpha        : [IN]      全体の透明度(0 - 255)
戻り値       :           1:成功、0:失敗

DIB の半透明描画(デバイスコンテキスト)
BOOL b32DrawAlphaDC(HDC hDC, int xDst, int yDst, HBITMAP hBmpSrc, int xSrc, int ySrc,
                    int width, int height, BYTE alpha)
hDC          : [IN][OUT] コピー先デバイスコンテキスト
xDst, yDst   : [IN]      コピー先座標
hBmpSrc      : [IN]      コピー元ビットマップハンドル
xSrc, ySrc   : [IN]      コピー元座標
width, height: [IN]      コピー矩形の幅と高さ
alpha        : [IN]      全体の透明度(0 - 255)
戻り値       :           1:成功、0:失敗

DIB の半透明描画(拡大・縮小)
BOOL b32DrawAlphaEx(HBITMAP hBmpDst, int xDst, int yDst, int widthDst, int heightDst,
                    HBITMAP hBmpSrc, int xSrc, int ySrc, int widthSrc, int heightSrc, BYTE alpha)
hBmpDst             : [IN][OUT] コピー先ビットマップハンドル
xDst, yDst          : [IN]      コピー先座標
widthDst, heightDst : [IN]      コピー矩形の幅と高さ
hBmpSrc             : [IN]      コピー元ビットマップハンドル
xSrc, ySrc          : [IN]      コピー元座標
widthSrc, heightSrc : [IN]      コピー矩形の幅と高さ
alpha               : [IN]      全体の透明度(0 - 255)
戻り値              :           1:成功、0:失敗

32bppDIB の透明度あり描画
BOOL b32Draw32(HBITMAP hBmpDst, int xDst, int yDst, HBITMAP hBmpSrc, int xSrc = 0,
               int ySrc = 0, int width = 0, int height = 0, BYTE alpha = 255)
hBmpDst      : [IN][OUT] コピー先ビットマップハンドル
xDst, yDst   : [IN]      コピー先座標
hBmpSrc      : [IN]      コピー元ビットマップハンドル
xSrc, ySrc   : [IN]      コピー元座標
width, height: [IN]      コピー矩形の幅と高さ
alpha        : [IN]      全体の透明度(0 - 255)
戻り値       :           1:成功、0:失敗

32bppDIB の加算半透明描画
BOOL b32DrawAddAlpha(HBITMAP hBmpDst, int xDst, int yDst,
                     HBITMAP hBmpSrc, int xSrc, int ySrc, int width, int height, BYTE alpha)
hBmpDst      : [IN][OUT] コピー先ビットマップハンドル
xDst, yDst   : [IN]      コピー先座標
hBmpSrc      : [IN]      コピー元ビットマップハンドル
xSrc, ySrc   : [IN]      コピー元座標
width, height: [IN]      コピー矩形の幅と高さ
alpha        : [IN]      全体の透明度(0 - 255)
戻り値       :           1:成功、0:失敗

32bppDIB の単色塗りつぶし
BOOL b32DrawColor(HBITMAP hBmp, BYTE alpha, BYTE red, BYTE green, BYTE blue,
                  int x = 0, int y = 0, int width = 0, int height = 0)
hBmp         : [IN][OUT] ビットマップハンドル
alpha        : [IN]      透明度
red          : [IN]      赤色
green        : [IN]      緑色
blue         : [IN]      青色
x, y         : [IN]      矩形の座標
width, height: [IN]      矩形の幅と高さ
戻り値       :           1:成功、0:失敗

32bppDIB のモノクロ化
BOOL b32Monotone(HBITMAP hBmp, int x = 0, int y = 0, int width = 0, int height = 0)
hBmp         : [IN][OUT] ビットマップハンドル
x, y         : [IN]      矩形の座標
width, height: [IN]      矩形の幅と高さ
戻り値       :           1:成功、0:失敗

32bppDIB の色相変換(HBITMAP)
BOOL b32Hue(HBITMAP hBmp, int hue, int x = 0, int y = 0, int width = 0, int height = 0)
hBmp         : [IN][OUT] ビットマップハンドル
hue          : [IN]      色相レート 0 - 192(32:緑, 96:青, 144:紫)
x, y         : [IN]      矩形の座標
width, height: [IN]      矩形の幅と高さ
戻り値       :           1:成功、0:失敗

フォント設定
void b32SetFont(TCHAR *strFontName, int iWeight, int iCharSet, int iPitchAndFamily, int iQuality)
strFontName     : [IN] フォント名
iWeight         : [IN] 太さ(0〜900)
iCharSet        : [IN] 文字セット
iPitchAndFamily : [IN] 固定幅フォントとフォントファミリー
iQuality        : [IN] 品質
戻り値          :      なし

文字列の描画(HBITMAP)
BOOL b32DrawFont(HBITMAP hBmp, char *str, int size, int x, int y, BYTE red, BYTE green, BYTE blue)
hBmp   : [IN][OUT] ビットマップハンドル
str    : [IN]      文字列
size   : [IN]      文字サイズ
x,y    : [IN]      文字表示位置
red    : [IN]      赤色
green  : [IN]      緑色
blue   : [IN]      青色
戻り値 :           1:成功、0:失敗

文字列の描画(デバイスコンテキスト)
BOOL b32DrawFontDC(HDC hDC, char *str, int size, int x, int y, BYTE red, BYTE green, BYTE blue)
hDC    : [IN][OUT] デバイスコンテキスト
str    : [IN]      文字列
size   : [IN]      文字サイズ
x,y    : [IN]      文字表示位置
red    : [IN]      赤色
green  : [IN]      緑色
blue   : [IN]      青色
戻り値 :           1:成功、0:失敗


b32SetFont の引数
LOGFONT 構造体の各メンバの取り得る数値については、wingdi.h を参照

【strFaceName の取り得る文字列】
指定フォントが、そのパソコンに無い場合は、
それに近いフォントが選ばれる

"MS ゴシック"
"MS Pゴシック"
"MS 明朝"
"MS P明朝"
"Arial"
"Times Roman"
など

【iWeight の取り得る数値】

FW_DONTCARE   0
FW_THIN       100
FW_EXTRALIGHT 200
FW_LIGHT      300
FW_NORMAL     400
FW_MEDIUM     500
FW_SEMIBOLD   600
FW_BOLD       700
FW_EXTRABOLD  800
FW_HEAVY      900

【iCharSet の取り得る数値】
通常、128 にする

ANSI_CHARSET        0
DEFAULT_CHARSET     1
SYMBOL_CHARSET      2
SHIFTJIS_CHARSET    128
HANGEUL_CHARSET     129
HANGUL_CHARSET      129
GB2312_CHARSET      134
CHINESEBIG5_CHARSET 136
OEM_CHARSET         255
JOHAB_CHARSET       130
HEBREW_CHARSET      177
ARABIC_CHARSET      178
GREEK_CHARSET       161
TURKISH_CHARSET     162
VIETNAMESE_CHARSET  163
THAI_CHARSET        222
EASTEUROPE_CHARSET  238
RUSSIAN_CHARSET     204
MAC_CHARSET         77
BALTIC_CHARSET      186

【iPitchAndFamily の取り得る数値】
PITCH と FF の論理和の組み合わせで、例えば 1 | 48
とすると、固定幅フォントになる。
全角文字の場合は、FF は関係ないから、PITCH だけ。

DEFAULT_PITCH   0 // デフォルト
FIXED_PITCH     1 // 固定幅フォント
VARIABLE_PITCH  2 // 可変幅フォント
MONO_FONT       8 // Mono フォント

FF_DONTCARE     0  // 何でも良い
FF_ROMAN        16 // 可変幅のセリフ体フォント(Times Roman など)
FF_SWISS        32 // 可変幅のサンセリフ体フォント(Swiss など)
FF_MODERN       48 // 固定幅フォント(Pica, Elite, Courier など)
FF_SCRIPT       64 // Cursive など
FF_DECORATIVE   80 // Old English など

【iQuality の取り得る数値】

DEFAULT_QUALITY         0 // デフォルト
DRAFT_QUALITY           1 // 下書き程度の品質
PROOF_QUALITY           2 // 校正程度の品質
NONANTIALIASED_QUALITY  3 // アンチエリアスなし
ANTIALIASED_QUALITY     4 // アンチエリアスあり

【bItalic の取り得る数値】

TRUE   1 // イタリック体
FALSE  0 // 通常体

【bUnderline の取り得る数値】

TRUE   1 // 下線あり
FALSE  0 // 下線なし

【bStrikeOut の取り得る数値】

TRUE   1 // 打ち消し線あり
FALSE  0 // 打ち消し線なし
    


ファイル圧縮・暗号化


cmpcode.dll(C/HSP/AB)とソースのダウンロード
cmpcodestdcall.dll(VB)とソースのダウンロード

CMPCODE.DLLは、ファイルを圧縮・暗号化する関数群だ
例えば、HSPなら、以下のようなコードになる
テキストファイルは、プログラムがUnicodeの場合は、Unicodeで、Shift−JIS(ANSI)の場合は、Shift−JISで保存する
メモ帳でテキストファイルを開き、[ファイル]→[名前をつけて保存]→[Unicode]を選択し、保存する
圧縮・暗号化したファイル名は、sample.datになる
#uselib "cmpcode"
#cfunc ccEncodeFile  "ccEncodeFile"  int, int, int, int, str, str
#cfunc ccDecodeFile  "ccDecodeFile"  int, int, int, int, var, int, str
#cfunc ccGetFileSize "ccGetFileSize" int, str

filenameLoad = "sample.txt" ; 読み込みファイル名
filenameSave = "sample.dat" ; 保存ファイル名
typeEncode   = 2            ; 暗号化フラグ(0:暗号化のみ、1:圧縮のみ、2:暗号化と圧縮)
key          = 123          ; 暗号化・復号キー
multiplicand = 654321       ; key の被乗数
add          = 1234         ; key の加数

res  = ccEncodeFile(typeEncode, key, multiplicand, add, filenameSave, filenameLoad)
size = ccGetFileSize(typeEncode, filenameSave) + 1 ; + 1 は、ヌル文字の分
sdim data, size
res  = ccDecodeFile(typeEncode, key, multiplicand, add, data, size, filenameSave)
mes data
    

以下は、C言語のサンプル
#include <windows.h>
#include <tchar.h>
#include "cmpcode.h"

#pragma comment(lib, "cmpcode.lib")

int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hInstPrev,LPTSTR lpCmdLine,int nCmdShow)
{
    TCHAR *filenameLoad = TEXT("sample.txt");
    TCHAR *filenameSave = TEXT("sample.dat");
    UINT  typeEncode    = 2;
    UINT  key           = 123;
    int   multiplicand  = 654321;
    int   add           = 1234;
    
    // 圧縮保存
    BOOL res = ccEncodeFile(typeEncode, key, multiplicand, add, filenameSave, filenameLoad);
    
    // 展開表示
    if(res){
        int size = ccGetFileSize(typeEncode, filenameSave) + 1;
        if(size > 1){
            BYTE *pData = (BYTE*) malloc(size);
            if(pData){
                ZeroMemory(pData, size);
                ccDecodeFile(typeEncode, key, multiplicand, add, (BYTE*) pData,
                             size, filenameSave);
                MessageBox(0, (TCHAR*) pData, filenameSave, MB_OK);
                free(pData);
                pData = NULL;
            }
        }
    }
    
    return 0;
}
    

以下は、VBのサンプル
Public Class Form1
    Private Declare Auto Function ccEncodeFile Lib "cmpcodestdcall.dll"
            (ByVal typeEncode As Integer, ByVal key As Integer, ByVal multiplicand As Integer,
            ByVal add As Integer, ByVal filenameSave As String, ByVal filenameLoad As String) 
            As Boolean
    ・・・
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim filenameLoad = "sample.txt"
        Dim filenameSave = "sample.dat"
        Dim typeEncode   = 2
        Dim key          = 123
        Dim multiplicand = 654321
        Dim add          = 1234
        Dim size As Integer
        ccEncodeFile(typeEncode, key, multiplicand, add, filenameSave, filenameLoad)

        size = ccGetFileSize(typeEncode, filenameSave) + 1
        Dim pData(size) As Byte
        ccDecodeFile(typeEncode, key, multiplicand, add, pData(0), size, filenameSave)
        Dim str As String
        str = System.Text.Encoding.Unicode.GetString(pData)
        MsgBox(str)
    End Sub
End Class
    

以下は、ABのサンプル
Declare Function ccEncodeFile Lib "cmpcode.dll" (ByVal typeEncode As Long, ByVal key As Long,
        ByVal multiplicand As Long, ByVal add As Long, ByVal filenameSave As *SByte,
        ByVal filenameLoad As *SByte) As Boolean
・・・
Sub MainWnd_CommandButton1_Click()
    Dim filenameLoad = "sample.txt"
    Dim filenameSave = "sample.dat"
    Dim typeEncode   = 2
    Dim key          = 123
    Dim multiplicand = 654321
    Dim add          = 1234
    Dim size As Long
    ccEncodeFile(typeEncode, key, multiplicand, add, filenameSave, filenameLoad)
    size = ccGetFileSize(typeEncode, filenameSave) + 1
    Dim pData As *SByte
    pData = malloc(SizeOf(SByte) * size)
    ccDecodeFile(typeEncode, key, multiplicand, add, pData, size, filenameSave)
    MessageBox(0, pData, filenameSave, MB_OK)
    free(pData)
End Sub
    

CMPCODE.DLLの関数
ファイルを読み込んで、暗号化して別名保存する
BOOL ccEncodeFile(UINT typeEncode, UINT key, int multiplicand, int add,
                  TCHAR *filenameSave, TCHAR *filenameLoad)
typeEncode   : [IN] 暗号化フラグ(0:暗号化のみ、1:圧縮のみ、2:暗号化と圧縮)
key          : [IN] 暗号化・復号キー
multiplicand : [IN] key の被乗数
add          : [IN] key の加数
filenameSave : [IN] 保存ファイル名
filenameLoad : [IN] 読み込みファイル名
戻り値       : 処理成否フラグ(FALSE:失敗, TRUE:成功)

暗号化ファイルを読み込んで、復号データを取得する
BOOL ccDecodeFile(UINT typeEncode, UINT key, int multiplicand, int add,
                  BYTE *pData, int size, TCHAR *filenameLoad)
typeEncode   : [IN]  暗号化フラグ(0:暗号化のみ、1:圧縮のみ、2:暗号化と圧縮)
key          : [IN]  暗号化・復号キー
multiplicand : [IN]  key の被乗数
add          : [IN]  key の加数
pData        : [OUT] 受け取るデータ
size         : [IN]  受け取るデータのサイズ
filenameLoad : [IN]  読み込みファイル名
戻り値       : 処理成否フラグ(FALSE:失敗, TRUE:成功)

ファイルサイズを取得
int ccGetFileSize(UINT typeEncode, TCHAR *filename)
typeEncode   : [IN]  暗号化フラグ(0:暗号化のみ、1:圧縮のみ、2:暗号化と圧縮)
filenameLoad : [IN]  ファイル名

ファイルが圧縮されているか?
BOOL ccIsCompress(TCHAR *filename)
戻り値 :(FALSE:非圧縮、TRUE:圧縮)
    


画像表示用スクロールバー




scrollbar_img.dll(C/HSP/AB)とソースのダウンロード
scrollbarimgstdcall.dll(VB)とソースのダウンロード

SCROLLBAR_IMG.DLLは、画像表示用スクロールバーだ
HSPやVBでは、ウィンドウメッセージ(WM)の番号を知る必要がある
それは、winapi.h を参照

以下は、HSPのサンプル
#uselib "scrollbar_img"
    #cfunc siGetScrollPosH "siGetScrollPosH" int
    #cfunc siGetScrollPosV "siGetScrollPosV" int
    #func  siSetScrollBar  "siSetScrollBar"  int
    #func  siSetScrollMax  "siSetScrollMax"  int, int, int
    #func  siSetScrollPage "siSetScrollPage" int
    #func  siDelScroll     "siDelScroll"     int
    #func  siMoveScrollH   "siMoveScrollH"   int, int
    #func  siMoveScrollV   "siMoveScrollV"   int, int
    #func  siSetScrollPosH "siSetScrollPosH" int, int
    #func  siSetScrollPosV "siSetScrollPosV" int, int
    
    #define WM_HSCROLL $0114
    #define WM_VSCROLL $0115
    #define WM_PAINT   $000F
    
    oncmd gosub *OnHScroll, WM_HSCROLL
    oncmd gosub *OnVScroll, WM_VSCROLL
    oncmd gosub *OnPaint,   WM_PAINT
    
    screen 0, 200, 200
    siSetScrollBar hwnd
    siSetScrollMax hwnd, 400, 400
    siSetScrollPage hwnd
    celload "back.bmp"
    id = stat
    stop

*OnHScroll
    siMoveScrollH hwnd, wparam
    return
    
*OnVScroll
    siMoveScrollV hwnd, wparam
    return
    
*OnPaint
    h = siGetScrollPosH(hwnd)
    v = siGetScrollPosV(hwnd)
    gcopy id, h, v, 400, 400
    return
    

以下は、Cのサンプル
#include <windows.h>
#include <tchar.h>
#include <gdiplus.h>
#include "scrollbar_img.h"

#pragma comment(lib, "gdiplus.lib")
#pragma comment(lib, "scrollbar_img.lib")

using namespace     Gdiplus;
GdiplusStartupInput gdiSI;
ULONG_PTR           gdiToken;

LRESULT CALLBACK ProcWnd(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CREATE:
        siSetScrollBar(hWnd);
        GdiplusStartup(&gdiToken,&gdiSI,NULL);
        return 0;
    case WM_SIZE:
        siSetScrollPage(hWnd);
        return 0;
    case WM_HSCROLL:
        siMoveScrollH(hWnd, wParam);
        return 0;
    case WM_VSCROLL:
        siMoveScrollV(hWnd, wParam);
        return 0;
    case WM_PAINT:
        {
            HDC         hDC;
            PAINTSTRUCT ps;
            hDC = BeginPaint(hWnd,&ps);
            Bitmap      bmp(L"butterfly.jpg");
            Graphics    g(hDC);
            siSetScrollMax(hWnd, bmp.GetWidth(), bmp.GetHeight());
            g.DrawImage(&bmp, -siGetScrollPosH(hWnd), -siGetScrollPosV(hWnd),
                        bmp.GetWidth(), bmp.GetHeight());
            EndPaint(hWnd,&ps);
        }
        return 0;
    case WM_CLOSE:
        DestroyWindow(hWnd);
        GdiplusShutdown(gdiToken);
        PostQuitMessage(0);
        return 0;
    default:
        break;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
    

以下は、VBのサンプル
Public Class Form1
    Private Declare Auto Function siGetScrollPosH Lib "scrollbarimgstdcall.dll" _
                                  (ByVal hWnd As IntPtr) As Integer
    ・・・

    Const WM_HSCROLL As Integer = &H114
    Const WM_VSCROLL As Integer = &H115
    Dim hWnd = Me.Handle
    Dim img As Image

    Protected Overrides Sub WndProc(ByRef m As Message)
        Select Case m.Msg
            Case WM_HSCROLL
                siMoveScrollH(hWnd, m.WParam)
            Case WM_VSCROLL
                siMoveScrollV(hWnd, m.WParam)
        End Select
        MyBase.WndProc(m)
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        siSetScrollBar(hWnd)
        img = Image.FromFile("butterfly.jpg")
        siSetScrollMax(hWnd, img.Width, img.Height)
    End Sub

    Private Sub Form1_Size(sender As Object, e As EventArgs) Handles MyBase.Resize
        siSetScrollPage(hWnd)
    End Sub

    Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
        Dim g = Graphics.FromHwnd(hWnd)
        Dim h = siGetScrollPosH(hWnd)
        Dim v = siGetScrollPosV(hWnd)
        g.DrawImage(img, -h, -v, img.Width, img.Height)
        g.Dispose()
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
        img.Dispose()
    End Sub
End Class
    

以下は、ABのサンプル
#include "dib32.ab"
#include "scrollbar.ab"

Dim hBmp As HBITMAP

Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As LRESULT
    Select Case dwMsg
        Case WM_HSCROLL
            siMoveScrollH(hWnd, wParam)
            Exit Function
        Case WM_VSCROLL
            siMoveScrollV(hWnd, wParam)
            Exit Function
    End Select
    MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function

Sub MainWnd_Destroy()
    b32Delete(hBmp)
    scrollbarimgTest_DestroyObjects()
    PostQuitMessage(0)
End Sub

Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
    hBmp = b32Load("back.bmp", 0, 0, 0, 0)
    siSetScrollBar(hMainWnd)
    siSetScrollMax(hMainWnd, b32GetWidth(hBmp), b32GetHeight(hBmp))
End Sub

Sub MainWnd_Paint(hDC As HDC)
    b32DrawDC(hDC, - siGetScrollPosH(hMainWnd), - siGetScrollPosV(hMainWnd), hBmp, 0, 0, 0, 0)
End Sub

Sub MainWnd_Resize(SizeType As Long, cx As Integer, cy As Integer)
    siSetScrollPage(hMainWnd)
End Sub
    

SCROLLBAR_IMG.DLLの関数
横スクロールボックス位置取得
任意の場所に置く
int siGetScrollPosH(HWND hWnd)

縦スクロールボックス位置取得
任意の場所に置く
int siGetScrollPosV(HWND hWnd)

スクロールバーの初期設定
WM_CREATE に置く
void siSetScrollBar(HWND hWnd)

画像サイズをスクロールバーに設定
ビットマップ読み込み時
void siSetScrollMax(HWND hWnd, int width, int height)
width  : [IN] 画像の幅
height : [IN] 画像の高さ

クライアント領域の大きさをスクロールバーに設定
WM_SIZE に置く
void siSetScrollPage(HWND hWnd)

スクロールバー消去
任意の場所に置く
void siDelScroll(HWND hWnd)

横スクロールバーが動いたとき
WM_HSCROLL に置く
void siMoveScrollH(HWND hWnd, WPARAM wParam)

縦スクロールバーが動いたとき
WM_VSCROLL に置く
void siMoveScrollV(HWND hWnd, WPARAM wParam)

横スクロールボックス位置設定
任意の場所に置く
void siSetScrollPosH(HWND hWnd, int pos)

縦スクロールボックス位置設定
任意の場所に置く
void siSetScrollPosV(HWND hWnd, int pos)