ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2012年08月01日

URLエンコードされた文字列をTRACEで表示したい

WindowsのVisual C++。

デバッグ文字列は TRACEマクロで出すけど、こいつに "%"が含まれる文字列を表示させたい。

一例としてはURLエンコードされた文字列。

これをそのまんまTRACEに出すと、%に対応するべき引数がないとかでエラーになる。
たまたま%dとかそういうのがあるのだろう。

回避方法としては、TRACEマクロが呼んでいる本当の関数の方を直接呼び出す。

具体的にはOutputDebugString
posted by みこあいさ at 19:01| Windows開発

2012年06月25日

IWebBrowser2 スクロールバーを消す & 3D境界線を消す

Windowsなんてもう触りたくないんだけど。
仕方ないのよ仕事だから。

WindowsのIEブラウザコンポーネント。
いまどきはもうVC++から操作する人なんてほとんどいないんだろうな。
VBとかC#とかならちょろっと出来るのだろうか。
まぁよくしんないけど、自分とこではVC++から操作する必要が出た。
はじめModifyStyleとModifyStyleExでWS_BORDERとかWS_EX_CLIENTEDGEとかをいじってみたがうんともすんともいわない。

で、調べてみると、
IDocHostUIHandlerを実装しろとか。それでGetHostInfoの中で
DOCHOSTUIFLAG_NO3DBORDER
を指定しろとか。
だけど、これをVC++で実装するのがまたものすごく面倒くさい。やりたい内容から考えるとあり得ないレベル。

たったこれだけのことのためになんでこんなに…これだからWindowsは…とうんざりしながらぐぐっていると。

HTMLのほうのスタイルであっさり消せることが判明。

<BODY style="border-width:0;">

これで境界線が消える。

<BODY scroll="no" ">

スクロールバーを消すのはこっち。両方書いてもOK。

HTMLのほうが自分で自由にならない場合はこの方法は使えないが。

なんかFRAMEとかIFRAMEとか使ったりとかJavaScriptのInnerHTMLとかでごまかせるんじゃないかと。

HTML絡みは極力コード側で解決しないほうがいいような気がした。
posted by みこあいさ at 19:02| Windows開発

2012年06月01日

Windows CProgressCtrl Marqueeが動かない

今更Windowsとかないよ〜とか思いつつもこれもお仕事なので。

XPから プログレスコントロールに所要時間不明のときの流れるアニメが実装されたんだけど、これがちょっと癖がある。

普通にModal Dialogで使ってる分にはいい。Modeless Dialogとかのときに困る。
リソースエディタとかでくっつけたCProgessCtrlにマーキー属性をつけたり、ONにしてやらなくてはならないのだけど、それをどこでやるかという問題。
VC2010ではリソースエディタレベルでマーキーをONに出来たりするみたいなんでVC2010なら問題でないのかもしれない。
でももう自分はWindowsネイティブアプリはメンテ関係だけにしてVC2005で終わりにしようと思ってる。今更Visual Studioのメジャーアップデートなんてとっくにもうどうでもいいし。

具体的にはこういう処理だけど。
CProgressCtrl* pc = ( CProgressCtrl* )GetDlgItem( IDC_PROGRESS );

pc->ModifyStyle( 0,PBS_MARQUEE );

pc->SendMessage( PBM_SETMARQUEE,1,5 );

Modal Dialogなら InitDialog中でOK。簡単。

だけどModelessのときは InitDialogに来ない。じゃぁOnCreateで、というとこれが動かない。
ぐぐると苦しんで相談している人が他にもいたが、そのスレでは解決できなかったようだった。

仕方ないので自分で考える。
マーキーを動かすスレッドを内部で作ってるとかいう情報も見たような気がするので、やるタイミングというかスレッドを変えてみる。

OnCreateで

bInitedMarquee = false;
SetTimer( 0,50,NULL );

とかやって。

void CDlgXXXXX::OnTimer(UINT_PTR nIDEvent)
{
if( !bInitedMarquee ){
CProgressCtrl* pc = ( CProgressCtrl* )GetDlgItem( IDC_PROGRESS );

pc->ModifyStyle( 0,PBS_MARQUEE );

pc->SendMessage( PBM_SETMARQUEE,1,5 );

bInitedMarquee = true;
}

CDialog::OnTimer(nIDEvent);
}

これで動いた。

やり方が汚いが別に動きさえすればいいっていう投げやりな感じで。
posted by みこあいさ at 19:46| Windows開発