Skip to content

Instantly share code, notes, and snippets.

View ClassA.h
class ClassA
{
public:
static bool IsValidHandle( HANDLE handle )
{
//return handle != INVALID_HANDLE_VALUE;
return handle != INVALID_HANDLE_VALUE && handle != nullptr;
//return handle != nullptr;
}
// ハンドルの複製をどうするかは何のハンドルかに依存するのでここでは言及しない
@Tocchann
Tocchann / LoadPngFromResouce
Created Sep 27, 2021
リソースに格納したPNGをGDI+でロードする(エラーチェックなし版)
View LoadPngFromResouce
// リソースファイル上はこんな感じで格納
// #define IDB_PNG 12345
// IDB_PNG PNG "res\\png.png"
Gdiplus::Bitmap* LoadPngFromResource( HINSTANCE hInst, UINT resID )
{
HRSRC hResInfo = FindResource( hInst, MAKEINTRESOURCE(resID), _T("PNG") );
HGLOBAL hResImage = LoadResource( hModule, hResInfo );
DWORD size = SizeofResource( hModule, hResInfo );
const BYTE* srcImage = static_cast<const BYTE*>( LockResource( hResImage ) );
IStreamPtr ptrStream( SHCreateMemStream( srcImage, size ) );
View RunMessageLoop_Minimum.cpp
int RunMessageLoop()
{
MSG msg;
while( GetMessage( &msg, nullptr, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return msg.wParam;
}
View RunMessageLoop_PeekMessage.cpp
int RunMessageLoop()
{
MSG msg;
do{
if( PeekMessage( &msg, nullptr, 0, 0, PM_REMOVE ) )
{
if( msg.message != WM_QUIT && !PreTranslateMessage( &msg ) )
{
TranslateMessage( &msg );
DispatchMesage( &msg );
@Tocchann
Tocchann / RunMessageLoop_GetMessage.cpp
Last active Sep 16, 2021
GetMessage な実装例
View RunMessageLoop_GetMessage.cpp
int RunMessageLoop()
{
MSG msg = { 0 };
BOOL ret;
while( (ret=GetMessage( &msg, nullptr, 0, 0 )) != 0 )
{
if( ret == -1 )
{
// 必要に応じてエラー処理を施す。場合によっては終了する
}
View RunMessageLoop_MsgWaitForMultipleObjects.cpp
#include <map>
#include <functional>
// waitActions に登録する例は載せていない(通常は、排他制御して追加処理するのが良い)
std::map<HANDLE, std::function<bool(bool,bool&)>> waitActions;
DWORD APIENTRY SetupWaitHandles( HANDLE* waitHandles, DWORD capacityCount )
{
DWORD waitCount = 0;
if( capacityCount > 0 )
{
@Tocchann
Tocchann / IUnknown.idl
Created Aug 27, 2020
IUnknown の IDL上の定義(cpp_quote除外版)
View IUnknown.idl
[
local,
object,
uuid(00000000-0000-0000-C000-000000000046),
pointer_default(unique)
]
interface IUnknown
{
typedef [unique] IUnknown *LPUNKNOWN;
@Tocchann
Tocchann / Compatibilty.manifest
Created Apr 6, 2020
Windows10 にきっちり対応したいアプリ用追加マニフェスト
View Compatibilty.manifest
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />
@Tocchann
Tocchann / prototype.cpp
Last active Aug 21, 2019
わんくま横浜 サンプルコードプロトタイプバージョン抜粋
View prototype.cpp
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 されるとマウスカーソルが戻るためメッセージポンプが動く場合はセットしない
@Tocchann
Tocchann / AsyncIndicator.cpp
Created Aug 16, 2019
タスクを使った非同期処理
View AsyncIndicator.cpp
void CSampleDlg::OnOK()
{
// いろいろ前処理
CProgressDlg dlg; // 非同期処理で対応できるように修正したプログレス表示クラス
auto task = concurrency::create_task( [&]()
{
return CountCharInFile( dlg, m_targetPath, m_numbers );
} ).then( [&]( bool result )
{
dlg.PostMessage( WM_CLOSE );