Last active
August 21, 2019 09:26
-
-
Save Tocchann/6151f68723d866b8b143ed60fa4f557b to your computer and use it in GitHub Desktop.
わんくま横浜 サンプルコードプロトタイプバージョン抜粋
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static void APIENTRY CountColors( CWnd* pParent, CListCtrl& lc, LPCTSTR imagePath, std::map<COLORREF, size_t>& numColors ) | |
{ | |
// InsertItem するときに使う情報(コールバックでテキスト表示するのでデータはLPARAMだけ) | |
LVITEM item{}; | |
item.mask = LVIF_PARAM|LVIF_TEXT; | |
// テキストデータはその都度生成する(メモリイメージ省略のため) | |
item.cchTextMax = 0; | |
item.pszText = LPSTR_TEXTCALLBACK; | |
// メッセージポンプが動かない版 WM_SETCURSOR されるとマウスカーソルが戻るためメッセージポンプが動く場合はセットしない | |
CWaitCursor wait; | |
{ | |
// 初期化処理 | |
lc.DeleteAllItems(); | |
numColors.clear(); | |
// ファイルから読み込む | |
Gdiplus::Bitmap bmp( imagePath ); | |
Gdiplus::BitmapData bmpData; | |
if( bmp.LockBits( nullptr, Gdiplus::ImageLockModeRead, PixelFormat32bppARGB, &bmpData ) == Gdiplus::Ok ) | |
{ | |
//const COLORREF* imageTop = static_cast<const COLORREF*>( bmpData.Scan0 ); | |
const BYTE* imageTop = static_cast<const BYTE*>(bmpData.Scan0); | |
// 色データを個別計算するのは面倒なのでフルカラー画像で取り込むことにする | |
for( UINT yLine = 0 ; yLine < bmpData.Height ; yLine++ ) | |
{ | |
const COLORREF* lineTop = reinterpret_cast<const COLORREF*>(imageTop + bmpData.Stride * yLine); | |
for( UINT xPos = 0 ; xPos < bmpData.Width ; xPos++ ) | |
{ | |
auto itr = numColors.find( lineTop[xPos] ); | |
if( itr != numColors.end() ) | |
{ | |
itr->second += 1; | |
} | |
else | |
{ | |
numColors[lineTop[xPos]] = 1; | |
} | |
} | |
} | |
bmp.UnlockBits( &bmpData ); | |
} | |
} | |
lc.SetItemCount( static_cast<int>(numColors.size()) ); | |
lc.SetRedraw( FALSE ); | |
for( const auto& numCol : numColors ) | |
{ | |
item.lParam = numCol.first; | |
item.iItem = lc.InsertItem( &item ); | |
if( item.iItem >= 0 ) | |
{ | |
item.iItem++; | |
} | |
else | |
{ | |
break; // 色が追加できなくなった時点であきらめる | |
} | |
} | |
lc.SetRedraw( TRUE ); | |
lc.SetColumnWidth( 0, LVSCW_AUTOSIZE_USEHEADER ); | |
lc.SetColumnWidth( 1, LVSCW_AUTOSIZE_USEHEADER ); | |
lc.Invalidate( TRUE ); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment