読者です 読者をやめる 読者になる 読者になる

ObjeqtNote #28 垂直方向スクロールバーの動作

垂直方向についても実装する。

PictureBox.cppのCPictureBox::OnVScrollで、

OnHScrollと同様にそれぞれの操作に対する処理を書く。

f:id:BG1:20170424180112p:plain

下に動かしても止まるので、ちゃんと上手くいっている。

・垂直方向スクロールバーの動作 · bg1bgst333/ObjeqtNote@3376781 · GitHub

ObjeqtNote #27 水平方向スクロールバーの動作

水平方向のスクロールバーを制御する処理を実装する。

Window.hでは、

OnHScroll、OnVScrollを追加。

Window.cppでは、

WM_HSCROLLでOnHScroll、WM_VSCROLLでOnVScrollを呼ぶ。

OnHScroll、OnVScrollには何も定義しない。

CustomControl.cppでは、

こちらでも、WM_HSCROLLでOnHScroll、WM_VSCROLLでOnVScrollを呼ぶ。
そして、WM_NCHITTEST、WM_NCLBUTTONDOWN、WM_NCLBUTTONUPの時、DefWindowProcを呼ぶようにしている。
こうしないと、スクロールバーが認識せず動作しない。

PictureBox.hに、

SCROLLINFO構造体変数、レンジ、位置などをメンバに追加。
OnHScroll、OnVScrollなども追加。

PictureBox.cppでは、

Loadで、幅と高さを取得。

OnPaintで、画像のサイズからスクロールバーのサイズやレンジを調整。

OnHScrollで、水平方向スクロールバーのさまざまな操作に対する処理を書く。

垂直方向はまだやらない。

f:id:BG1:20170424173832p:plain

下のスクロールバーを右に動かすと、

f:id:BG1:20170424173923p:plain

戻らなくなったので、スクロールバーの制御が上手くいっている証拠。

・水平方向スクロールバーの動作 · bg1bgst333/ObjeqtNote@bc6164f · GitHub

ObjeqtNote #26 ビットマップをピクチャーボックスのサイズにカットして表示

ビットマップが大きいと、ピクチャーボックスが拡大して表示する。
しかし、今回は、ピクチャーボックスのサイズにカットして表示する。

まず、Window.hで、

OnPaintを追加する。

Window.cppでは、

WM_PAINTでOnPaintを呼ぶ。

OnPaintの定義では、特にここでは何もしていない。

CustomControl.cppでは、

Createで位置とサイズの格納。

こちらのDynamicWindowProcでも、WM_PAINTでOnPaintを呼ぶ。

PictureBox.hでは、

ビットマップハンドル、メモリデバイスコンテキスト、サイズなどのメンバを追加し、OnPaintも追加。

PictureBox.cppでは、

OnPaintでBitBltによる再描画を実装。

MainWindow.cppで、

OnCreateのm_pPictureBox->CreateでSS_REALSIZECONTROLを指定する。
これで、コントロールのサイズで画像が表示されるので、大きくならない。
ただし、縮小するわけではなく、その大きさで入らないところはカットされる。

f:id:BG1:20170424162534p:plain

このように、コントロールの大きさ変わらず、画像はカットされて表示される。

・ビットマップをピクチャーボックスのサイズにカットして表示 · bg1bgst333/ObjeqtNote@b50ff10 · GitHub

BIO_write

今度は、BIO_writeでPUTリクエストを書き込み、ファイルをアップロードする。

bio_write(3): BIO I/O functions - Linux man page

BIO_write.cで、

bgstation0.comの下にshareフォルダを作って、そこにtest.txtをPUTする。
test.txtは、

ABCDE
XYZ

という文字列。

ただ、PUTメソッドを有効にするには、サーバ側がWebDAVに対応しないといけない。

WebDAVのモジュールはロードされている模様なので、bgstation0.comのhttpd.confに、

DavLockDB "/tmp/DavLock"
<Directory /var/www/html/share>
  DAV On
</Directory>

と書いた。

$ vi BIO_write.c 
$ gcc -o BIO_write BIO_write.c -lssl -lcrypto
$ ./BIO_write 
HTTP/1.1 201 Created
Date: Sun, 23 Apr 2017 00:49:41 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips
Location: http://bgstation0.com/share/test.txt
Content-Length: 71
Content-Type: text/html; charset=ISO-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>$

HTTP/1.1 201 Createdが返ってくれば成功。

$ ls
test.txt
$

test.txtができていて、

$ vi test.txt
ABCDE
XYZ

が書き込まれている。

Sample/openssl/BIO_write/BIO_write/src/BIO_write at master · bg1bgst333/Sample · GitHub

BIO_read

コネクションの接続ができたら、BIO_writeで接続先にリクエストを書き込み、BIO_readで接続先からレスポンスを読み込む。

bio_read(3): BIO I/O functions - Linux man page

BIO_read.cで、

bgstation0.comのindex.htmlをGETするリクエスト文字列request_strを作成。
BIO_writeでrequest_strを書き込む。
あとは、BIO_readで読み込んだレスポンス文字列をresponse_bufに格納し、出力、これをなくなるまで繰り返す。

$ vi BIO_read.c
$ gcc -o BIO_read BIO_read.c -lssl -lcrypto
$ ./BIO_read
HTTP/1.1 200 OK
Date: Thu, 20 Apr 2017 12:26:03 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips
Last-Modified: Thu, 23 Feb 2017 02:40:59 GMT
ETag: "241-549298b0e24c0"
Accept-Ranges: bytes
Content-Length: 577
Connection: close
Content-Type: text/html; charset=UTF-8

<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title id="title_index">B.G-STATION</title>
  </head>
  <body id="body_index" bgcolor="#ffffff" text="#7700cc" link="0000ff" alink="ff0000" vli                                                                               nk="ff00ff">
    <div id="div_titleimage" align="center">
      <img src="http://www.geocities.co.jp/bg_sta/resource/image/title.png" width="460px"                                                                                height="140px" />
    </div>
    <div id="div_mainmenu" align="center">
      <div id="div_item_sample">
        <a href="sample/index.html">Sample</a>
      </div>
    </div>
  </body>
</html>
$

このようにレスポンスが返ってくる。

Sample/openssl/BIO_read/BIO_read/src/BIO_read at master · bg1bgst333/Sample · GitHub

ObjeqtNote #25 ピクチャーボックスを作成して画像を表示

ピクチャーボックスを作成して、ビットマップ画像を表示する。

PictureBox.hを追加して、

CCustomControlの派生クラス、CPictureBoxを定義。
メンバ変数はビットマップハンドルm_hBitmap、メンバ関数はCreate、Load、SetImageの3つ。

PictureBox.cppは、

Createで"Static"ウィンドウクラスのカスタムコントロールを作成。

Loadで指定されたファイル名のビットマップをロード。

SetImageでは、STM_SETIMAGEメッセージを投げることで、m_hBitmapを表示。

resource.hでは、

IDC_PICTUREBOX1を定義。

MainWindow.cppで、

m_pPictureBox->Createでウィンドウ作成。

MainMenuBar.cppのOnFileOpenで、pMainWindow->m_pPictureBox->Loadで画像をロード。
成功したら、pMainWindow->m_pPictureBox->SetImageで画像を表示。

f:id:BG1:20170416193002p:plain

最初はスタイルで指定しているスクロールバーが表示されている。

f:id:BG1:20170416193052p:plain

開くを選択し、

f:id:BG1:20170416193108p:plain

test1.bmpを選択すると、

f:id:BG1:20170416193155p:plain

スクロールバーは対応してないので、画像の大きさに合わせて拡大する。

・ピクチャーボックスを作成して画像を表示 · bg1bgst333/ObjeqtNote@a0e5cfb · GitHub

BIO_do_connect

接続できたかどうかは、BIO_do_connectで確認する。

Manual:BIO s connect(3) - OpenSSLWiki

BIO_do_connect.cで、

BIO_new_connectでコネクション作成したら、BIO_do_connectを呼んで、真なら成功。
(今回はポートを80に戻してる。443でもできたけど。)

$ vi BIO_do_connect.c
$ gcc -o BIO_do_connect BIO_do_connect.c -lssl -lcrypto
$ ./BIO_do_connect 
BIO_do_connect success! bio = 01929030
$

BIO_do_connectも成功している。

Sample/openssl/BIO_do_connect/BIO_do_connect/src/BIO_do_connect at master · bg1bgst333/Sample · GitHub