Skip to content

Instantly share code, notes, and snippets.

@Tocchann
Last active August 21, 2019 09:26
Show Gist options
  • Save Tocchann/6151f68723d866b8b143ed60fa4f557b to your computer and use it in GitHub Desktop.
Save Tocchann/6151f68723d866b8b143ed60fa4f557b to your computer and use it in GitHub Desktop.
わんくま横浜 サンプルコードプロトタイプバージョン抜粋
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