FC2ブログ


VS2017-はじめの1/10歩(8):ダイアログの背景に画像を使う

   プログラミング [2019/03/09]
タイトルには含まれませんが、目指しているのは
「タブレット的な、向きな、らしいアプリを作ってみる」です。
では、らしいアプリ」ってなんだよ・・・んー・・・分かんないね。

今回は、比較的にありがちな、「ダイアログの背景に画像を貼る」です。
お前に言われなくてもな話。

早速ですが、
外部変数を3つほど。
//---------------------------------------------
HBITMAP g_hBgBmp = NULL; //背景画像のBitmapハンドル
HBITMAP g_hPrvBmp = NULL; //元の背景画像のBitmapハンドル
HDC g_hDcBase = NULL; //画像描画用コピー元hDC
//---------------------------------------------


ダイアログのウィンドウプロジシャのWM_INITDIALOGとかで
//---------------------------------------------
//背景ビットマップ描画準備(全ダイアログ共通)
g_hBgBmp = (HBITMAP) LoadImage(g_hInst, "背景.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (g_hBgBmp) {
g_hDcBase = CreateCompatibleDC(hdc);
g_hPrvBmp = (HBITMAP) SelectObject(g_hDcBase, g_hBgBmp);
}
//---------------------------------------------

カレントディレクトリ上に「背景.bmp」という名前のWindowsビットマップ形式のファイルがあるものとしてます。

先に後始末のためにWM_DESTROYとかで
//---------------------------------------------
if (g_hPrvBmp != NULL) SelectObject(g_hDcBase, g_hPrvBmp);
if (g_hBgBmp != NULL) DeleteObject(g_hBgBmp);
//---------------------------------------------

まあ、プログラムを終わらせるだけならいらないかもしれないけど、「躾」として入れます。

で、ダイアログではあまりしないWM_PAINTの処理を入れます。
//---------------------------------------------
//******* 描画処理
case WM_PAINT:
DrawBackGround(hDlg, NULL);
break;
//---------------------------------------------

関数化してあるのは、ダイアログを複数使うようなプログラムで、共通の背景画像を使うことを想定してます。

関数の中身は、・・・





//---------------------------------------------
//name :DrawBackGround
//function :背景画像描画-表示領域幅に合わせて拡大し、縦にタイル貼りする。
// 全画面描画にするとスクロール時に子コントロールがパタパタするため。
//parameter :hDlg -ダイアログウィンドウハンドル
// pSc -スクロール情報(内容全体の高さ)
//return :なし

VOID DrawBackGround(
HWND hDlg,
PMYSCROLLINF pSc)
{
PAINTSTRUCT ps; //PS
HDC hdc; //デバイスコンテキストハンドル
RECT rect; //矩形
BITMAP bm; //ビットマップオブジェクト
float flexp; //拡大倍率
INT dw; //描画時の画像の幅(表示幅)
INT dh; //描画時の画像の高さ
INT fullh; //実際の内容の高さ
INT y; //描画先y座標

hdc = BeginPaint(hDlg, &ps);
GetWindowRect(hDlg, &rect);
GetObject(g_hBgBmp, sizeof(BITMAP) , &bm);
dw = rect.right - rect.left;
flexp = (float) dw / bm.bmWidth;
dh = (INT) ((float) bm.bmHeight * flexp);
fullh = rect.bottom - rect.top;
y = 0;
if (pSc != NULL) {
if (pSc->fullh > fullh) fullh = pSc->fullh;
y = -pSc->pos;
}

//先頭ブロックの描画
StretchBlt(hdc, 0, y, dw, dh,
g_hDcBase, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
//2ブロック目以降の描画
y += dh;
while (fullh > y) {
StretchBlt(hdc, 0, y, dw, dh,
g_hDcBase, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);
y += dh;
}
EndPaint(hDlg, &ps);

return;
}
//---------------------------------------------


説明してなかった、「PMYSCROLLINF pSc」ってパラメタがありますが、
後々出てくるスワイプ・・・スクロールの話で必要になります。
こんな中身です。
//---------------------------------------------
//スクロール関係
typedef struct _myscroll_inf {
INT fullh; //本来の表示の高さ
INT disph; //見えている部分の高さ
INT range; //表示されていない部分の高さ
INT pos; //現在の表示縦位置
INT dy; //移動量の単位
INT boxh; //スライダーのサイズ
} MYSCROLLINF, *PMYSCROLLINF;
//---------------------------------------------


ダイアログであまりスクロールさせることってないかなって思うでしょ。
でもタブレットだと、例えばポトレート(縦)向きを想定してダイアログ内の配置を考えて作ってたのに、
ある日突然、ランドスケープ(横)向きに使われるという、理不尽なことが起こります。

なので、いつか必要になる日がきっと来ます。

それと、画像をタイル貼りにしているのも、スクロール(スワイプ)対策でヤムナクです。
これも後で分かります。

背景を貼っただけなので、上に乗っけたコントロール類はその上に配置されます。
次回は、楽なところで、ラベル(スタティックコントロール)の透かし方になるかと思います。

では、今回はこの辺で。
m(__)m
スポンサーサイト





コメントの投稿

非公開コメント

カレンダー
09 | 2019/10 | 11
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
プロフィール

さるもすなる

Author:さるもすなる
さるです。別HPサイト「さるもすなる」から侵食してきました。 山菜/きのこ、それとタイトルにしたPPバンド籠のことをメインに徒然に・・・・暇を持て余したさるの手仕事:男手芸のブログってことで。

最新記事
最新コメント
月別アーカイブ
カテゴリ
天気予報

-天気予報コム- -FC2-








本家のHPのトップ
山菜や茸の話です
PPバンドの籠作品と作り方です
投稿をお待ちしております



ブログランキング・にほんブログ村へ にほんブログ村 ハンドメイドブログへ



マニュアルのお申し込み



検索フォーム
リンク
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QR