last update: 2013/09/03

2003/11/11

いつになくプログラムを書きまくる今日この頃ですが、既に10日先までレポートをやる予定が詰まっててもうげんなりです。

プログラムを書きまくる

tasktrap revival

とりあえず、5月からアイコンメニューを実装してたのにもかかわらず一般向けに配布してなかったtasktrapを一般向けに調整してみました。

久々に配布のためにANSI版でコンパイルして実行したら電源スキーマ切り替えメニューが化けてしまい、何でだろうと調べたらEnumPwrSchemes関数のコールバック関数の文字列がAとかWの切り替えじゃなくてWinNTカーネルならUnicode、Win9xならANSIで決め打ちなので(コールバック関数なんだからそういう仕様にしないと成り立たないわけだ)、とりあえずNT系列版と9x系列版をわけました。一般向けには今までANSI版しか配布してませんでしたが、作者自身はひとりUnicode版を好んで使っていたとかいう感じですが、どちらも機能に差異はありません。

このバージョンから表記がTaskTrapからtasktrapに変わったことに気がついた人は鋭いです。が、全部置換したかどうか怪しいなぁ…

ちなみに、TaskTrapをtasktrapに手作業で変換してたら、ダイアログリソースの中に昔作ったtasktrapの詳細設定ダイアログが出てきて「うわっ、これ全部作りかけじゃん!」とかビビったのはここだけのヒミツです。いちいちリソース削るの面倒なので入ってますが、機能自体は未実装です。

WZ EDITORのマクロ

とりあえず、WZ EDITORのマクロに手を出してみました。

……引数に出てくるTX構造体って何だろう。APIヘルプにもTX-Cヘルプにも詳細が出てこないので_wz.hを見てみると、……あぁ?!

なんか、非常に巨大な構造体のようで、読むのもげんなりというか、こんなもの扱えるか! って感じなんですが、とりあえずメニューに「ステータスバーの表示」と「右端で折り返す」のトグルスイッチがないと不便なのでこれをマクロでやってみることに。

さらさらっと書いて、さくっと実行。

あー、できた。しかし、ON、OFFにかかわらずメニューにチェックが入りませんなぁ。

…ということで、組み込みのマクロ(IDM_SWITCHDISPTOOLBARとか)みたいにちゃんとメニューにチェックが入るようにしたいわけですが、……わかりません。あらかじめメニューにチェックがつく項目は決め打ちになっているか、それとも起動時に実行される何かでチェックするということを登録しているのか…。

とか考えてるうちに作業の進行上レポートを片づけはじめなきゃならない日になったので、今日はこれでおしまいです。

VisualStyleを確認する関数

最近(…でもないか)、VisualStyleをオフにしたXPだとフラットなツールバーにならないとか何とかいうWZの問題が指摘されているのを見かけたんですが、わたしゃVisualStyuleオンだし、そもそもツールバーなんて表示させてない人間なのでどうでもいいんです。

とかいいつつ、実行中のWindowsでVisualStyleがオンになっているかどうかを判別する関数をtasktrapに仕込んだ記憶があるので探してみました。

bool TaskTrapMainWnd::IsVisualStyleActive(){
   BOOL bResult=FALSE;
   
   // _t(x)はUnicodeとANSIで文字列を切り替えるマクロね
   HMODULE hUxthemeLib=LoadLibrary(_t("uxtheme.dll"));
   if(hUxthemeLib){
      typedef BOOL (WINAPI *ITA)(void);
      ITA pfIsThemeActive=GetProcAddress(hUxthemeLib, "IsThemeActive");
      if(pfIsThemeActive){
        bResult=pfIsThemeActive();
      }
      FreeLibrary(hUxthemeLib);
   }
   return bResult?true:false;
}

uxtheme.dllはWindows XP(か、それ以降のOS)にしか存在しないDLLで、VisualStyleの管理に関わるDLLです。いわゆるサードパーティ製のVisualStyleを使うためにこれにパッチを当ててる人もそれなりにいるかと思うので、その辺の人にはおなじみかもしれません。

このDLLがLoadLibraryできなければ無条件にXPではないということでVisualStyleではないことが分かりますが、XPである場合、このuxtheme.dllの中のIsThemeActive(void)を呼び出して戻り値をチェックすると、現在VisualStyleが有効であるかどうかを判別することが出来ます。

とまぁ、ただそれだけの話。オーナードローとかする方面にはわりと需要のある関数かと思うんですが、オーナードローしてまでWindows標準っぽい描画を実現しようなんて思ってるのはごく少数なようで、VisualStyleがオンだろうがオフだろうが独自のスタイルで描画するアプリケーションがほとんどみたい(Visual Studio .NETとかPSP8とか)なので、実はあまり出番がないかもしれませんが。

comments powered by Disqus