[本]プログラミングのセオリー
- プログラミングのセオリー/矢沢 久雄
- ¥2,499
- Amazon.co.jp
買ってすごく損した。
まだ途中までしかよんでないけど、それでも内容は陳腐。
大それた装丁と題名からは予想もつかないほどに。
最近発刊のくせしてセオリーというには涙がでる。2500円も取られたと。
そもそもオブジェクト指向の勉強をしている最中に構造化プログラミング
(それも陳腐な内容)に目を向けているのがそもそもの間違いか。
一応最後まで読んでは見るけど、印象が変わらなければ即ブックオフ行きにします。
もったいない。。
まぁ、ホントの出だしのプログラマは読んでもよいとは思う。
読まないほうがよい。
<1/18追記>
一応最後まで苦しいながらも(流し)読みした。
やっぱり駄目だった。
関数ラッピングはまぁ言いたいことはわかるけど、その代替案として
グローバル変数を使うだの、何故か途中はポインタとかリスト構造の
解説だったりして、脈絡もない。
C言語を使っていたかと思ったらいきなりC++やJAVAに移ったり、
一言で言うなら
「駄目だコイツ・・・早く何とかしないと」
で片がつく。
[MFC]CPaintDCとCClientDC
ダイアログベースアプリで以下を試してみた。
※ 1/15訂正
■CPaintDC
void CSampleDlg::OnPaint()
{
if (IsIconic())
{
・・・中略
}
else
{
// CDialog::OnPaint();
// ↑を削除すればOK
CPaintDC dc(this);
// 太さ2の赤色実線
CPen pen(PS_SOLID, 2, RGB(255,0,0));
CPen *old = dc.SelectObject(&pen);
dc.MoveTo(10,10);
dc.LineTo(100,100);
dc.SelectObject(old);
pen.DeleteObject();
}
}
■CClientDC
void CSampleDlg::OnPaint()
{
if (IsIconic())
{
・・・中略
}
else
{
CDialog::OnPaint();
CClientDC dc(this);
// 太さ2の赤色実線
CPen pen(PS_SOLID, 2, RGB(255,0,0));
CPen *old = dc.SelectObject(&pen);
dc.MoveTo(10,10);
dc.LineTo(100,100);
dc.SelectObject(old);
pen.DeleteObject();
}
}
結果、CPaintDCは描画されず、CClientDCは描画された。
CPaintDCはWM_PAINTメッセージをハンドルする関数のはずだけどわけがわからん。
ダイアログだから?SDIとかでOnPaint内に書けばいける?未確認。
<1/15追記>
ダイアログの基底クラスのOnPaintを呼んでいるらしく、削除したら
CPaintDCもいけた。
そもそもBeginPaintとEndPaintはきらい。
たとえコンストラクタとデストラクタでカプセル化しようとも。
CDCクラスを使うのが個人的に一番美しいと思う。
[BMP]ビットマップのフォーマット
<09/01/17編集>
まず、ビットマップにはDIBとDDBというものがある。
違いは、デバイスに依存するかしないかという点。
DIB(Device Independent Bitmap)
→ デバイスに依存しないビットマップ
DDB(Device Dependent Bitmap)
→ デバイスに依存するビットマップ
ここで言うデバイスとは、ディスプレイなど、実際に表示したりするためのもので
あったりするが、この辺はデバイスコンテキスト とかとあわせて調べるべし。
個人的に理解しやすいイメージとしては、
DIBはファイルに保存されているバイナリ形式のもの。
つまり、バイナリデータを編集することで、色やサイズを直接編集できる。
DDBはDIBを元に、ディスプレイなどに表示されているビットマップ。
または、表示のためだけに作成されたビットマップ。
(この辺の解釈はあくまでイメージなので、実際の定義とは違うと思います。)
DIBはカラーテーブルをもち、次のような構造をもつ。
BITMAPFILEHEADER
BITMAPINFOHEADER
カラーテーブル
カラーテーブルは24bit未満のビットマップに対して設定される。
BITMAPINFOHEADERとカラーテーブルをもった構造体をBITMAPINFO構造体と
言うが、自分が扱うのは24bit以上のビットマップのため、カラーテーブルは特に
考慮していない。
24bit以上の場合、色データは直接バイト列として扱われるため、
次のような感じ。
24bitビットマップ
→24bit(3byte)で1ピクセルを表現する。各バイトにはRGBカラーをそれぞれもつ。
ダンプしたときはBGRの順で並んでいる。
参照:RGBTRIPLE構造体
32bitビットマップ
→32bit(4byte)で1ピクセルを表現する。上記24bitと同様だが、ひとつは
予約領域として使われていない。
参照:RGBQUAD構造体
BITMAPFILEHEADER構造体
次の構成を持つ構造体。
typedef struct tagBITMAPFILEHEADER {
WORD bfTyep; // ファイルタイプ(BM(0x424D)でなければならない)
DWORD bfSize; // ファイルのサイズ
WORD bfReserved1; // 予約領域(0)
WORD bfReserved2; // 予約領域(0)
DWORD bfOffbits; // ファイル先頭から、ビットマップデータまでのバイト数
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
BITMAPINFOHEADER構造体
次の構成を持つ構造体。
typedef struct tagBITMAPINFOHEADER {
DWORD biSize; // 構造体のバイト数
LONG biWidth; // ビットマップのピクセル幅
LONG biHeight; // ビットマップのピクセル高さ
WORD biPlanes; // 対象デバイスに対するプレーン数(1)用途よくわからん
WORD biBitCount; // 1ピクセル当たりのビット数
DWORD biCompression; // 圧縮タイプ
DWORD biSizeImage; // イメージ部分のサイズ
LONG biXPelsPerMeter; // よくわからん(ビットマップに対する対象デバイスの水平解像度)
LONG biYPersPerMeter; // よくわからん(ビットマップに対する対象デバイスのつい直解像度)
DWORD biClrUsed; // 使用される色の数
DWORD biClrImportant; // 重要な色
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
RGBTRIPLE構造体
typedef struct tagRGBTRIPLE {
BYTE rgbBlue; // 青
BYTE rgbGreen; // 緑
BYTE rgbRed; // 赤
}
RGBQUAD構造体
typedef struct tagRGBQUAD {
BYTE rgbBlue; // 青
BYTE rgbGreen; // 緑
BYTE rgbRed; // 赤
BYTE rgbReserved; // 予約領域
}
面倒なのが、24bitタイプのビットマップである。
ラスタ列(ビットマップの横ライン)は4byteアライメントされていないといけない。
例えばピクセル幅101のビットマップは、バイトに直すと
101 * 3 = 303
となり、303 % 4 = 3 のため、4バイト境界調整を行わなければならない。
この場合は3バイト足りない(当然データを減らすことはないので、*バイト多いということはない)
なので、3バイト分追加し、102ピクセル幅として扱う必要が出てくる。
これらを考慮したビットマップの作成、表示をやってみようと思う。
MFCではなく、WIN32APIを使用して行うタイプ。
MFC使用版はもっと簡単だけど、WIN32API版はより高速らしい(そりゃそうだ)
- 詳解 画像処理プログラミング C言語で実装する画像処理アルゴリズムのすべて/昌達 慶仁
- ¥3,990
- Amazon.co.jp
[MFC]スピンコントロール
スピンコントロールの設定
スピンコントロールは上図のように、値を指定単位で増減させるためのコントロールボタン。
エディットボックスと連動して使用することで一番力を発揮すると思う。
で、リソースエディタでエディットボックスとスピンコントロールを配置しても
上図のようにくっついていない。
コレは特定の設定をすることにより、実行時にくっついて表示される。
①エディットボックスとスピンコントロールボタンを配置する
②タブオーダーを連番になるように並び替える。
③スピンコントロール側でプロパティから次の設定をする
・「Auto Buddy」 : TRUE
・「Set Buddy Integer」 : TRUE
→ エディットボックスとスピンコントロールが連動するようになる。
・「Alignment」 : Right Align
→ エディットボックスの右側にくっついて表示される。
④スピンコントロールのコントロール変数を追加する。
→ CSpinButtonCtrl m_spin
[メンバ関数でよく使用すると思われるもの]
・GetPos32
スピン ボタン コントロールの位置 (32 ビット) を取得します。
・SetRange
スピン ボタン コントロールの上限と下限 (範囲) を設定します。