以前の
2003 : 5 6 7 8 9 10 11 12
2004 : 1 2 3
ZDNetJapanのLonghornでアプリケーションはどう変わるのか
従来のWin32 APIは単純な関数呼び出しの形式を取っていたが、WinFXはすべてのWindows機能、そしてLonghornからの追加機能を「クラス」として定義し直している。
PC WatchのLonghornはどんな構造になっている?
APIとしてのWinFXは、現在の.NET Frameworkの延長上にある。WinFXをオブジェクトとして見ると、.NETの「System」クラスに属するものとして実装されている。
言ってることがまるで違うのですが、、、
突っ込みどころが多すぎる気がしますが、とりあえずレイヤードウィンドウ周りだけ。
もう少し身近なところだと、グラフィックスのアルファブレンディングによる半透明表示がある。アルファブレンディングはかなり前からWindowsでサポートされ、グラフィックアクセラレータにもハードウェアで実装されている。
「かなり前」が何年前を想定しているのか知りませんが、GDIのαブレンドは所詮ウィンドウ上に描画するだけでこれをレイヤードウィンドウの代わりとして使うのは非常に難しいです、はい。
しかし、Windows 2000以降のメニュー表示エフェクトで使われている以外、実装例をあまり見ることはない(最近、Outlook 2003が着信メッセージのお知らせに利用している)。
それは前者とは違い2000以降にサポートされたレイヤードウィンドウ。9xでは使えないこともあり、互換性を考えると深い部分には使えません。ところでマウスカーソルの影とか、アイコンドラッグ中とか、いたる所に使われてますが無視の方向ですか?
もちろん、WinFXのような巨大なクラスを扱うことは、それなりに大変なことではあるが、いちいちローレベルのAPI呼び出しを繰り返しながら機能を実装するよりは、ずっと簡単で手間は少ない。Win32で画面上のコントロールを透明度を変化させ、浮き上がらせながらアニメーションさせるといった画面効果をプログラムする人はよほどの物好きだと思うが、Avalonならば忍耐強くプログラムすることなく同じことができるのだ。
MSDNのレイヤードウィンドウにあるとおり大した手間でもないかと。というか、高レベルAPIだけにしてしまうと泥臭いことが出来なくなってしまうので全体的な手続きは従来とそこまで変わらないと思います。
そんなわけで今日の更新は(も)控えめに。
以前書いたShift-JISの保存ルーチンは問題があったので訂正。
public static void SaveText( string filePass, string text ) {
System.Text.Encoding sjisEnc
= System.Text.Encoding.GetEncoding("Shift_JIS");
byte[] fileData = sjisEnc.GetBytes( text );
using( System.IO.StreamWriter stream
= new System.IO.StreamWriter( filePass, false, sjisEnc ) ) {
stream.Write( text );
}
}
日経ソフトウェアの実用ソフトに学ぶプログラミングの技 第2回は突っ込むところが見つかりませんでした。まぁアレが実用ソフトウェアなのかは疑問がありますが、それは人それぞれなのでいいでしょう。というかあの雑誌に「萌え」はまずいのでは?
どこかで見かけて突っ込もうと思ってたのですが。有効桁数というのは、その名前の通りいかなる桁の数値でもその桁*Pow(10, n)で表す表記法です。例えば有効桁数2において10000は、1.0*Pow(10, 4)となり、0.0001は0.1*Pow(10, -4)となります。よってHSPでは浮動書数点が使えないので、有効桁数を増やしましょうとかいう説明は激しく謎です。
よーやくディスプレイが戻ってきたので、ぼちぼち復帰することにします。
しました。相変わらずまともな更新してませんね。
ちょっと端折り過ぎて誤解を招く文があったので訂正。
Cはgosubの代わりに関数を用います。この関数間は独立しており関数Aから関数Bのラベルにアクセスすることは出来ません。つまり、HSPをCに変換した場合必然的に全てのコードをひとつの関数に格納する必要があります。ここで言語的にgosubを持たないCでのgosubの実装は非実現的です。また、この一つのコードをウィンドウプロシージャに置くわけにはいかないでしょうから、ここでbuttonのラベルジャンプに問題が出ます。よって、現言語仕様ではまともなコードをはくコンバータの作成は無理かと。最も私はDev-MLには入っていないのでどーなってるか知りませんが。
ASP.NET で何か作ろうかと思い無料サーバを検索してみると WebMatrixHosting というのを発見。最もVSで弄って見るもさっぱり分からなかったので全然予定ないですが。
ちょっと考えてみました(作りたかったはC#コンバータ)が、ちょっと(ごく一般的な実装では)無理な気がします。コンパイラである以上gosubがどうやっても実現できませんし、buttonでのラベルジャンプにも問題があります。というわけで、3.0ではこの辺りが改善されることを期待。
というか、ウィンドウ数が32個固定とか、コントロールが64個までしか配置できない仕様なのが謎。クラスを使えば差ほど無理なくかける可変個を実現できる気がしますけど。
何故かみら〜じゅが一次審査を通過したので雑記の背景変更。(関係ない)まぁもう寒くなってるのにいつまでも「夏」な絵はどうかなーと思いまして。服のデザインに失敗して「春」っぽい気もしますけど。まだディスプレイが返って来てないので線の修正とか色塗りはまた今度の方向で。というか微妙に傾いてる気がしなくもないのでそのまま使うか微妙です。
VC7.1のbool(C++のbool型でありWin32のBOOLではない)は1バイトを超える大きさで戻り値を取るとごみが入るためそのまま判定することができません。HSPで使用する際は次のように。
dllproc "VCFunc", ...
if dllret&0xff == 0 {
// 関数の戻り値は false
}
よーやく UpdateLayerdWindow() の使い方が分かりました。最もGDI+を用いた場合でGDI関数では依然使い方が分かってないのですけど。まぁイメージはつかめたので多分大丈夫。
ディスプレイが今日修理完了予定だったのですが、返って来ませんでした。また延期?というかこれ以上延期されると1ヶ月修理にだしてることに、、、
今日のあなたは、明日びっくりすことがあるかも
今日なのか明日なのかはっきりしてください。
立ち読みで流し読みだったので見落としていたのですが、よく見ると、拡張子を持たないファイルのみが対象になってますね。まぁどちらにせよ、あの実装は穴がありすぎです。先日のやり方でも出来ますが、この際「素直に関連付け」してください。拡張子を持たないファイルはHKEY_CLASSES_ROOT\.で関連付け出来ます。で、そうした場合単なるWindowsTipsになってしまうわけですが。
あんなわけの分からない実装しなくても、レジストリ弄ってUnknownに関連付けし渡されたコマンドラインで処理したほうが手っ取り早いと思うのは私だけでしょうか?まぁそれだと全然「プログラミングの技」じゃない気もしますけど。というかXPしか使えない上Longhornで使えるのかとか、Shell32.dllのアップデートで使えなくなるかもしれないプログラムを作る時点でどうかと思います。ちなみにレジストリの場所はHKEY_CLASSES_ROOT\Unknown、詳しくは駄文のページを。
掲示板で散々言ってますが、現在パソコンのディスプレイを修理に出しており800x600しか使えないのでやる気無しです。まぁC++のライブラリをC#に移植してたりするのですけど、そんなもの使えませんし。
そんな訳で間が持ちそうにもないのでCsScreenSaver.dllβ4を公開。Azumya.Windows.Forms.ScreenSaverクラスというのがありますが、XMLタグを打ち切れていないので、ヘルプは未公開。ということは既に書いてあるAzumaya.dll.CsScreenSaverも公開できないわけで、、、というわけでサンプルを眺めてください。無駄に力を入れてますが、かえってわからなくなったという説も。
某複合書店にボールペンを買いにいったのですが、置いてあった4本中4本ともペン詰まりで使い物にならず。後々考えると色が微妙に違ってた気がするので買わなくてよかったのかもしれませんが、なんだかな〜。
.NET TextBoxコントロールは WM_CTLCOLOREDIT を正しく処理しません。よってエディットの背景色を変える場合素直に TextBox.BackColor プロパティに適切な Color を指定しましょう。なお TextBox.ReadOnly を指定した際の WM_CTLCOLORSTATIC は正しく処理されますが、これも TextBox.BackColor で変更可能です。(VS.NETは標準色は変更しないため TextBox.ReadOnly を使用し標準のエディット背景色を持たせたい場合適切な位置で、SystemColor.Window を割り当てる必要があります。)
件のサブクラス化コード。
class SubProc : System.Windows.Forms.NativeWindow {
[System.Runtime.InteropServices.DllImport("user32.dll")]
static public extern IntPtr GetSysColorBrush( uint f );
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
protected override void WndProc( ref Message m ){
const int APPWORKSPACE = 12;
const int WM_CTLCOLOREDIT = 0x0133;
const int WM_CTLCOLORSTATIC = 0x0138;
switch( m.Msg ) {
case WM_CTLCOLOREDIT: goto case WM_CTLCOLORSTATIC;
case WM_CTLCOLORSTATIC:
// MDI の背景色にしてみる
m.Result = GetSysColorBrush( dAPPWORKSPACE );
return;
}
base.WndProc(ref m);
}
}
まぁ普通はこんなことしないですけど。
domail03.so-net.ne.jp の人ウィルス(W32/Swen@MM)に感染してますよ〜。
Copyright(C)方位記号