メニューのオーナードローをした時、どうしても制御できないのがメニューのボーダ部分とサブメニューの▶の部分
いろいろ調べて▶の部分が制御ができるようになった。
オーナードローをしても、枠の灰色の線とSubの隣の▶の色が環境依存で、指定が出来ない。
▶については、通常黒で、選択すると反転して白になる。
左図のような黒背景だと▶が見えない。
DrawItemイベントでは描画しておらず、その後に勝手に描画されるからSetTextColorとか適用されないかな?と思ったけど無視される。
やり方は、ExcludeClipRectでメニュー項目全体をクリップすると、勝手に描画されるのを抑制できるので、あとは自分で描画するだけ。
通常状態でも白で表示出来るようになった。
2017年7月19日水曜日
2017年5月16日火曜日
VS2017のAllocConsoleでUnicode(UTF-16)出力
std::wcout.imbue(std::locale("Japanese")) ;
AllocConsole() ;
FILE * pF = _wfdopen( h, L"w" ) ;
fclose( stdout ) ;
*stdout = *pF;
setvbuf( stdout, NULL, _IONBF, 0 ) ;
AllocConsole() ;
FILE * pF = _wfdopen( h, L"w" ) ;
fclose( stdout ) ;
*stdout = *pF;
setvbuf( stdout, NULL, _IONBF, 0 ) ;
VS2010では上記のコードで、wcout、wprintfを使ってコンソール出力が出来た。
VS2017でコンパイルすると、コンパイルは通るが実行すると落ちる。
いろいろ調べてみた結果、_wfreopen(freopen)でstdoutを"CONOUT$"で開き直すとコンソールと紐付けは出来るようだ。
でも、printfすると落ちる。
wprintfすると表示されなかったり、表示されるが16進文字だったり、文字化けしていたり。
wcoutは日本語は表示されるが、"\n"、endlの部分で落ちる。
coutはやってない。
唯一、表示されるのがWriteConsole関数。
試してみたのは下記のキーワード
wcout.imbue
_wsetlocale(setlocale)
setvbuf
_setmode
wcout.rdbuf
SetConsoleOutputCP
sync_with_stdio
どうやってもまともに表示されない。
色々やっているとwcoutで落ちるのは、rdbufが準備できていない?感じで、rdbufを入れ替える方法を見つけたのでwcout以外は全部捨てて対応したコードが下記。
class Out {
private :
class Buf : public std::wstreambuf {
private :
HANDLE h ;
public :
virtual int_type overflow( int_type c = EOF ) override {
if( c == EOF ) return c ;
wchar_t sBuf[] = { c, '\0' } ;
DWORD nW ;
WriteConsole( this->h, sBuf, 1, &nW, NULL ) ;
return c ;
}
Buf( void ) {
this->h = GetStdHandle( STD_OUTPUT_HANDLE ) ;
}
} oBuf ;
std::wstreambuf * pOld ;
public:
Out( void ) { this->pOld = std::wcout.rdbuf( &oBuf ) ; }
~Out( void ) { std::wcout.rdbuf( this->pOld ) ; }
} ;
private :
class Buf : public std::wstreambuf {
private :
HANDLE h ;
public :
virtual int_type overflow( int_type c = EOF ) override {
if( c == EOF ) return c ;
wchar_t sBuf[] = { c, '\0' } ;
DWORD nW ;
WriteConsole( this->h, sBuf, 1, &nW, NULL ) ;
return c ;
}
Buf( void ) {
this->h = GetStdHandle( STD_OUTPUT_HANDLE ) ;
}
} oBuf ;
std::wstreambuf * pOld ;
public:
Out( void ) { this->pOld = std::wcout.rdbuf( &oBuf ) ; }
~Out( void ) { std::wcout.rdbuf( this->pOld ) ; }
} ;
AllocConsoleした後に、Outクラスのインスタンスを作ると、wcoutのバッファがoverflow関数に1文字ずつ渡ってくるらしい。内部では唯一まともに動くWriteConsoleを呼び出す。
2013年6月24日月曜日
Chrome Secure Shellでペーストの方法
Ctrl+VとかAlt+Vとか試してみるもペーストできない。
スクリーン上の文字列を選択すると、画面の真ん中に
Selection Copied
と表示される。
これが表示されるということはクリップボードの値を貼り付けることが出来るはず。
マニュアルを調べてみたら
Ctrl+Shift+V
だって。
スクリーン上の文字列を選択すると、画面の真ん中に
Selection Copied
と表示される。
これが表示されるということはクリップボードの値を貼り付けることが出来るはず。
マニュアルを調べてみたら
Ctrl+Shift+V
だって。
2013年6月4日火曜日
Zlib 1.2.8
zlibのバージョンを1.2.8に上げた所、プログラムが動かなくなった。
デバッグすると、初期化(deflateInit)でエラーが返ってきている。
エラーはZ_STREAM_ERROR。
ネットで検索すると、引数の圧縮レベルが間違っているという。
指定している値はZ_DEFAULT_COMPRESSION(-1)で問題ないはず。
試しに0とか6とか試してみてもダメ。
deflate.cの中までデバッグしてみると、渡している構造体(z_stream)のzallocをチェックしている所でエラーになっている。この値がNULLの場合、Z_SOLOのコンパイルスイッチが定義されていると即エラー。
何らかのアロケート関数を渡す必要があるみたい。
Z_SOLOを定義して無ければzcallocという関数が自動で設定される。
ライブラリのサイズが減ったと思ったら、このへんの関数を削る設定がデフォルトになってたみたい。
元々300KBぐらいで、削減して260KBぐらいになってた。
Windowsデスクトップアプリでは大したサイズではないので、zlibのプロジェクトからZ_SOLOを消してコンパイルし直した所、今までと同じ動作に戻った。
デバッグすると、初期化(deflateInit)でエラーが返ってきている。
エラーはZ_STREAM_ERROR。
ネットで検索すると、引数の圧縮レベルが間違っているという。
指定している値はZ_DEFAULT_COMPRESSION(-1)で問題ないはず。
試しに0とか6とか試してみてもダメ。
deflate.cの中までデバッグしてみると、渡している構造体(z_stream)のzallocをチェックしている所でエラーになっている。この値がNULLの場合、Z_SOLOのコンパイルスイッチが定義されていると即エラー。
何らかのアロケート関数を渡す必要があるみたい。
Z_SOLOを定義して無ければzcallocという関数が自動で設定される。
ライブラリのサイズが減ったと思ったら、このへんの関数を削る設定がデフォルトになってたみたい。
元々300KBぐらいで、削減して260KBぐらいになってた。
Windowsデスクトップアプリでは大したサイズではないので、zlibのプロジェクトからZ_SOLOを消してコンパイルし直した所、今までと同じ動作に戻った。
2012年4月3日火曜日
2012年1月3日火曜日
REGZA 42ZG1でPS3の3D設定
3Dテレビを買ってから、まともな3Dコンテンツを見たことがなかった。
というより、買おうとしたけど見たいものが売ってなかったので、GT5で軽く3D体験をして以来3Dの機能は使わずじまい。
3Dメガネも電池が切れてるし。(電池なしかUSB充電出来る奴がほしい)
年末から年明けにかけて、長い休みがあるから3Dのブルーレイでも買ってみようと思いアマゾンで検索してみる。
前に探した時よりかはラインナップは増えていた。
塔の上のラプンツェルを見つけ、買ってみた。
早速見てみようと、PS3で再生してみると3Dに対応したTVと再生機器で再生してくれと、失礼な表示が出る。
うちのテレビは3D対応してるし、PS3も対応してるからお前の認識を直せと。
何回か再生しなおしても結果は変わらず。
前にGT5で3Dモードには普通になっていたし、PCで3Dのコンテンツ試した時も問題なかった。
変なチェック入れずに、再生を始めてくれれば、テレビの3Dモードをこっちで切り替えすればなんとかなりそうなのに、始めてくれない。
ネットで調べてみると、どうやらPS3がテレビのことを3Dテレビと認識してくれないといけないことが判明。
早速ディスプレイ設定で認識させてみようとしたが、これも失敗。
前からこの設定はしてあるから、変わるはずも無い。
しばらく悩んだあと、ふとREGZAの裏設定を変えていることを思い出す。
PCの調子が悪いから、HDMIモードを1から3に変えていた。
その後バージョンアップを繰り返し、おそらくいつの間にか不具合は解消されていたんだろうけど特に不都合もなかったので、設定はそのままにしていた。
ところがこの設定が今回の不都合だったらしく、設定をモード3から初期の1に戻してPS3に認識させてみたら、無事おまえのTVは3D対応だと認識してもらうことができた。
もちろんブルーレイ3Dの再生もチェックを抜けて、先に進んだ。
後はPCの表示が問題なければOK。
例の再現性100%の動画で確認したけど大丈夫になっていた。
これを書いている間も問題なかったんで、解決。
でもこの嵌った時間を返して欲しい。
というより、買おうとしたけど見たいものが売ってなかったので、GT5で軽く3D体験をして以来3Dの機能は使わずじまい。
3Dメガネも電池が切れてるし。(電池なしかUSB充電出来る奴がほしい)
年末から年明けにかけて、長い休みがあるから3Dのブルーレイでも買ってみようと思いアマゾンで検索してみる。
前に探した時よりかはラインナップは増えていた。
塔の上のラプンツェルを見つけ、買ってみた。
早速見てみようと、PS3で再生してみると3Dに対応したTVと再生機器で再生してくれと、失礼な表示が出る。
うちのテレビは3D対応してるし、PS3も対応してるからお前の認識を直せと。
何回か再生しなおしても結果は変わらず。
前にGT5で3Dモードには普通になっていたし、PCで3Dのコンテンツ試した時も問題なかった。
変なチェック入れずに、再生を始めてくれれば、テレビの3Dモードをこっちで切り替えすればなんとかなりそうなのに、始めてくれない。
ネットで調べてみると、どうやらPS3がテレビのことを3Dテレビと認識してくれないといけないことが判明。
早速ディスプレイ設定で認識させてみようとしたが、これも失敗。
前からこの設定はしてあるから、変わるはずも無い。
しばらく悩んだあと、ふとREGZAの裏設定を変えていることを思い出す。
PCの調子が悪いから、HDMIモードを1から3に変えていた。
その後バージョンアップを繰り返し、おそらくいつの間にか不具合は解消されていたんだろうけど特に不都合もなかったので、設定はそのままにしていた。
ところがこの設定が今回の不都合だったらしく、設定をモード3から初期の1に戻してPS3に認識させてみたら、無事おまえのTVは3D対応だと認識してもらうことができた。
もちろんブルーレイ3Dの再生もチェックを抜けて、先に進んだ。
後はPCの表示が問題なければOK。
例の再現性100%の動画で確認したけど大丈夫になっていた。
これを書いている間も問題なかったんで、解決。
でもこの嵌った時間を返して欲しい。
2011年12月28日水曜日
VCでUTF-8 BOMなしファイル作成方法
UTF-8版のLuaで、読み込みできるファイルを作る場合
これでUTF-8のファイルができるけど、BOM(シグネチャ)ありしか
パラメータでは選択できず、BOM(シグネチャ)なしを指定できない。
VisualStudioのエディタでは指定できるのに・・・・。
どうやっても書かれてしまうのは仕方ないので、そのすぐ後でSeekする。
これで読めるようになった。
スマートな方法はないのか?
open時にccsの指定はなしか、バイナリにしてしまって、
文字列を自分でUTF-8に変換して出力すれば大丈夫そうな気もするが。。。
FILE pFP = NULL ; _wfopen_s( &pFP, L"FileName", L"w,ccs=UTF-8" ) ;
これでUTF-8のファイルができるけど、BOM(シグネチャ)ありしか
パラメータでは選択できず、BOM(シグネチャ)なしを指定できない。
VisualStudioのエディタでは指定できるのに・・・・。
どうやっても書かれてしまうのは仕方ないので、そのすぐ後でSeekする。
fseek( pFP, 0, SEEK_SET ) ;
これで読めるようになった。
スマートな方法はないのか?
open時にccsの指定はなしか、バイナリにしてしまって、
文字列を自分でUTF-8に変換して出力すれば大丈夫そうな気もするが。。。
登録:
投稿 (Atom)

