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