Nov17th

C++ のバックアップソース(No.11)

Top / C++

*まとめ [#jd0a501c]
-ウィンドウのクライアント領域イメージ取得 @Windows
#highlight(cpp){{
HWND hWnd = FindWindow(NULL, L"ウィンドウタイトル");
if(hWnd)
{
    RECT rect;
    GetClientRect(hWnd, &rect);
    int width = rect.right;
    int height = rect.bottom;

    BITMAPINFO bmpInfo;
    bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInfo.bmiHeader.biWidth = width;
    bmpInfo.bmiHeader.biHeight = height;
    bmpInfo.bmiHeader.biPlanes = 1;
    Info.bmiHeader.biBitCount = 24;
    bmpInfo.bmiHeader.biCompression = BI_RGB;

    LPDWORD lpPixel;
    HDC hDC = GetDC(hWndTenho);
    HBITMAP hBitmap = CreateDIBSection(hDC, &bmpInfo, DIB_RGB_COLORS, (void**)&lpPixel, NULL, 0);
    HDC hMemDC = CreateCompatibleDC(hDC);
    SelectObject(hMemDC, hBitmap);

    /*
    cv::Mat mat(cv::Size(width, height), CV_8UC3);
    mat.data = (uchar*)lpPixel;
    */

    BitBlt(hMemDC, 0, 0, width, height, hDC, 0, 0, SRCCOPY);

    /*
    cv::flip(mat, mat, 0);
    */
}
}}
--[[ほとんどここと一緒>http://class-exe.jpn.org/2011/01/opencv_screenshot_windows/]]
--cv::Matへの変換は、Mat::dataにuchar*にキャストしたlpPixelを入れた後にcv::flip()で反転
 
-スマートポインタ版Singleton(boost::shared_ptrの場合)
--GetInstance():自身を指すポインタでreset()を呼び、新しいインスタンスを割り当ててから返す
--privateデストラクタで解放処理

-std::vector領域確保関連
--http://dvdm.blog134.fc2.com/blog-entry-62.html
--resize()
領域確保+オブジェクト生成
--reserve()
領域確保
--size()
オブジェクトとして初期化されている個数
--capacity()
領域確保されている数
これ以上にpush_back()しようとすると領域を取りに行く(現在の2倍)ため処理時間がかかる

-ラムダ式
[変数キャプチャ](引数){処理コード}
関数オブジェクト。autoで受けられる
戻り値はreturn文の型になる

~

*メモ [#ef502d94]
-あるクラスAへの参照を持つクラスは、Aのコンストラクタ内で初期化してはいけない

-<windows.h>のFindWindow()の第二引数にウィンドウタイトルを渡すとウィンドウハンドルを取得できる

-先行宣言してるクラスのメンバへのアクセスコードはヘッダに書けない
--.cppに回せばコンパイルできる

-classのインスタンスを生成する場合、先行宣言だけでは足りない
--先行宣言はポインタ宣言のために使うぐらいしかできない

-std::mapを[]でアクセスしようとして登録してないキーを使うと、そのキーとvalue型のデフォルトコンストラクタで要素を勝手に作ってしまうっぽい
--いつの間にかmap内が要素だらけって可能性も有りうる
--find(キー)とend()の比較でそのキーを持つ要素があるかどうかの判定ができる

-std::mapのvalueにboost::shared_ptrを乗せている時、keyに無効な値を渡すとnullptrが返ってくる
--たぶん全部の型共通で0かnullになりそう

-Singletonクラスの継承は(基本的に)できない

-virtualなデストラクタを持たないクラスを継承してはいけない

-stringstreamの文字列リセットはss.str("")

-VC++ではtemplateの実装をヘッダに書かなくてはならない

-std::string::size()とstd::string::length()の動作に差はない

-スーパークラスのコンストラクタの明示的呼び出しは初期化子を使って行う

-namespaceブロックでtypedefされた型名は、その空間内扱いになる

-メンバ関数にデフォルトパラメータを与えるのは宣言時のみ

~

*未解決問題 [#vd894fb5]
-型を表す変数からnew呼び出し
--Factory系パターンで任意型の生成を行いたい

-Product名がソフトコーディングされたFactoryパターン
--Product名自体もスクリプト化したい

-Singletonの継承
-boost::shared_ptr<T>のPtr<T>への隠蔽(?) [#ze8ea4bf]
--基本
---templateのtypedefはできない
--defineの場合
---名前空間抜ける
---変数宣言時にエラー
--継承の場合
---コンストラクタによる動作が制限
---privateデストラクタが呼べない⇒Singleton時に困る


*リンク [#f3186737]
-クライアント領域のサイズからウィンドウ全体のサイズを設定する
http://d.hatena.ne.jp/yus_iri/20110911/1315730376
-スマートポインタを使ったSingletonパターン
http://d.hatena.ne.jp/wordi/20111229/p1
-template typedefができないので、その代用
http://d.hatena.ne.jp/bettamodoki/20121130/1354261873
-戻り値としてboost::shared_ptrを使う
http://d.hatena.ne.jp/faith_and_brave/20080123/1201078947
-配列からvectorへの変換
http://pokotsun.mydns.jp/?p=4163
-スタティックライブラリの作り方 for VC++
http://d.hatena.ne.jp/mitsu_chie/20090306/1236324630
-C++でオブジェクトのクラス名(型名)文字列を実行時に取得する
http://snowycode.blogspot.jp/2010/05/c_23.html
-マルチバイト文字列とワイド文字列
http://mkubara.com/index.php/マルチバイト文字列とワイド文字列
-PImplパターン
http://site.oukasei.com/?p=142
-std::cinのステートリセット
http://www.kab-studio.biz/Programing/Codian/iostream/05.html
-TinyXML-2 使い方
http://www44.atwiki.jp/bokuyo/pages/186.html
-Win32APIで階層化されたディレクトリを一度に作る
http://d.hatena.ne.jp/s-kita/20100709/1278688024
-現在時刻を取得する
http://7ujm.net/C++/time.html

#highlight(end)