鏑矢の憂鬱2001年1月後半
透明1ドットイメージ
 
2001/01/16 (Tue)
・今日もお便り紹介っ!
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちわ。
 いっつも勉強させてもらってます、小次郎丸といいます。
 
 お急がしいとは思ったんですが、ちょっと質問があって書かせていただきました。
 実は今SDKプログラミングをしているんですけどちょっとつまずいています。それは画面のモーダルについてです。
 
 まず、メイン画面を作成してその後あるボタンを押されるとそこからもう一つ別の画面が出てくるようにしているのですが、そのときメイン画面の操作ができてしまって困っています。
 この出てきたポップアップ画面が終わらないと元の画面にフォーカスが行かないような設定をスマートにやる方法はないでしょうか?
 
 もしご存知でしたらご教授ください。(ちなみにmfcは使ってません)
透明1ドットイメージ
透明1ドットイメージ
 
・こんにちわー。えっと、ようするにモーダルダイアログを表示したときみたいにしたいんですよね。「メイン画面」を無反応にするんだったら、 EnableWindow() で第1引数に無反応にするウィンドウのハンドル、第2引数に FALSE を渡せばOK。これで全然反応しなくなるはず。試してみてねー。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/17 (Wed)
・今日もお便り紹介〜。
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちは。質問があります。
 
 CGI にデータを POST で送信したいのですが、CHttpConnection クラスの使い方がよくわかりません。ご教授お願いします。
透明1ドットイメージ
透明1ドットイメージ
 
・うーん、あんまりネットワーク関係は詳しくないんで、ちょっと細かい部分までは分からないです。とりあえずお茶を濁す感じ(汗)で MSDN の "インターネット実用編 : WinInet" を元に、 CHttpConnection を使ってホームページのダウンロードをするコードを書いておきますです。
 
CInternetSession session;
CHttpConnection* pConnection
    = session.GetHttpConnection( "www.kab-studio.com" );
CHttpFile* pFile
    = pConnection->OpenRequest
            ( CHttpConnection::HTTP_VERB_GET
            , "index.html" );
pFile->SendRequest();

DWORD dwRet;
pFile->QueryInfoStatusCode( dwRet );
if( dwRet == HTTP_STATUS_OK )   
{
    char ch[1024];
    UINT nRead = pFile->Read( ch, 1023 );
    while( nRead > 0 )
    {
        OutputDebugString( ch );
        nRead = pFile->Read( ch, 1023 );
    }
}
delete pFile;
delete pConnection;
	
 
・なんかエラーが出てる(汗)。速攻で作ったからぼろがありそう。で、あと MSDN の Knowledge Base Article ID: Q165298 "HOWTO: Simulate a Form POST Request Using WinInet" にその POST してるっぽいサンプルコードがあるんで、これと組み合わせてなんとかなると嬉しいなー。っつーかネットワークって難しいなぁ。 RFC 訳本買うかなぁ。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/18 (Thu)
・今日もお便り紹介ですぞーっ!
 
透明1ドットイメージ
透明1ドットイメージ
 学習させて頂いています。有難う御座います。
 Appへのメモリの配分方法について、ご質問します。
 Appが、大きくなりメモリが不足してきました。
 予算の問題から64M増設しました。この64Mを全てAppに割り当てたい。この割り当て方法が、分かりません。
 宜しく御願いします。
 
追記
KABが無くなるって本当ですか?毎週楽しみにしております。是非続けてください。
透明1ドットイメージ
透明1ドットイメージ
 
・どうもですー。 KAB-studio 自体はなくならないです。ただ、ここ(かぶゆ〜)の更新をやめるかもって話。4月からお仕事だから、忙しくなって更新量減りそうなんで。さて質問の件だけど、これはウィンドウズの話だよね。だとすると、基本的にアプリ側でメモリを管理する方法はないです。
 
・メモリはウィンドウズ側が管理してて、実メモリが使えるなら実メモリを、足りなそうならスワップファイルをメモリとして割り当てる仕組みになってます。だからアプリ側で「他のアプリなんてどうでもいいから、うちに実メモリ64M使わせろい!」とかゆーことはできないんです、残念ながら。他のアプリを終了させて、余裕持たせるくらいしかないかなぁ。
 
・あ、「Appが、大きくなり」って、もしかして普通のメモリ領域の話じゃないのかな。リソース(ハンドル)だと、ウィンドウ・メニュー・アイコンなんかをまとめて、ウィンドウズ全体で65536個しか作れなかったりして、これはメモリ増やしてもどうにもならないです。あと他に……スタックサイズは【プロジェクトの設定】ダイアログの【リンク】−【アウトプット】の【スタックアロケーション】−【予約】で変更できるから、こっちの場合はここで変更してみて。このくらいかなぁ。
 
・もひとつお便り。
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちは。昨日 POST について質問した者です。
 
> 「Knowledge Base Article ID: Q165298
> "HOWTO: Simulate a Form POST Request Using WinInet」
> にその POST してるっぽいサンプルコードがあるんで、
> これと組み合わせてなんとかなると嬉しいなー。
 
 上記のサンプルコードを参考にしたら解決しました ! ありがとうございました。
 
 SendRequest のときにコンテントタイプ ( application/x-www-form-urlencoded ) をヘッダーとして送信する必要があるんですね。あ、申し忘れましたが、環境は NT4.0 SP6 + IIS4.0 です。
透明1ドットイメージ
透明1ドットイメージ
 
・おお、うまくいきましたか!  CGI にデータ送るのって、わては「エンコードして URL にくっつけて送る」のしか知らなかったんで。こういう基本的なルール知らないからなー。 RFC 日本語訳サイトを漁ってみるか、あの1万円もする分厚い本を買うか……。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/19 (Fri)
・今日はお休みだよーん。くーっ、卒論が終わらねーっ!!
透明1ドットイメージ
 
2001/01/20 (Sat)
・今日もお休みですよ。ええ。
透明1ドットイメージ
 
2001/01/21 (Sun)
・今日もお休みっ! やっと卒論が完成した〜。
透明1ドットイメージ
 
2001/01/22 (Mon)
・今日もお休み。卒論関係はひと段落したんで、お便りお待ちしてまーす。あーあと、ふと Java + XML に興味を持ったんでちょっと試してみるかも。なんかいろんなことやってるなーわて。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/23 (Tue)
・昨日の予告どおり、今日は Java を使ってみました。実は、ほとんど初めての挑戦。かなり昔、 VisualJ1.0 を買ったことがあるんだけど、あれは確か、しょっぱなから動かなかったような記憶が……。そんときの Java マニュアルが分かりやすかったのと、デザインパターンにはまったときには Java は必須だったからっていうので、ある程度は知ってるんだけど、使うのはこれが初めて。
 
・で、まずはCマガ1月号に付いてたIE5.5をインストールして、次にインプライズのホームページでユーザー登録、そのあと同じく1月号の Borland JBuilder 4 Foundation をインストール……しようとしたらいきなりアクセス違反で落ちる(汗)。再起動して常駐もの終了させてから再度インストール。
 
・んで立ち上げて @IT のサンプル試そうとしたら……重い! なんやねんこの開発環境の重さは! そして……よく落ちる(泣)。とにかくあっさりとアクセス違反になる。むぅ。この JBuilder 4 IDE そのものが Java で作られてるって話なんでなんかそこはかとない不安が……。とりあえず JBuilder 4 で行く事はあきらめる(泣)。
 
・ JBuilder 4 の中から JDK1.3 のフォルダだけ取り出してあとは削除。お次は VC を用意。そう、いつものです(爆)。【ツール】−【カスタマイズ】の【ツール】ページで javac.exe をフルパス指定、引数は Main.java 実行時のディレクトリは $(WkspDir) にして【アウトプットウィンドウを使用】をチェック。で、コンソールプロジェクトを作って Main.java 置いて、そんなかにさっき書いた VisualJ1.0 マニュアルのサンプルコードをコーディング。んでツールボタンをぽちっと。コンパイル成功〜。
 
・お次は実行。同じく【ツール】−【カスタマイズ】の【ツール】ページで java.exe をフルパス指定、引数は Main 実行時のディレクトリは $(WkspDir) にして【アウトプットウィンドウを使用】をチェック。引数で Main.class って拡張子付けちゃいけないことに気付くのにえらい時間がかかった(汗)。んでツールボタンをぽちっと。おお Hello, world! だ! これでとりあえず環境はOKかな。
 
・今日のお便り!
 
透明1ドットイメージ
透明1ドットイメージ
 Windows98(SE)に現象が起きます。
 IShellFolderから、IShellViewを作り、IContextMenu2を作ろうとしているのですが、通常のフォルダに限り、アプリが落ちてしまいます。Win2000では問題ないのですが、、、
 何か理由があるのでしょうか?
 shell32.dllに問題があるのでしょうか?
 もし、ご存知でしたら教えてください。
透明1ドットイメージ
透明1ドットイメージ
 
・うーん、簡単に調べてみたけどちょっと原因が見つからなかったです。わてもまどかぶ使ってたときに謎のエラーが出まくったりしたからなー、 OS で IContextMenu2 の実装が微妙に違ってて、ちょっとしたことで落ちたりするのかも。他のサンプルコードと照らし合わせてテストするとかしか思い付かないです。あとは shell32.dll を最新のものにするとか、 IContextMenu3 の方を使ってみるとか……。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/24 (Wed)
・今日は XML の話。 XML ってええなー思う。プログラミング辞書とか、本文とかだけテキストで書いて、それを表示したりとかって部分を別にできるから処理が楽そう。 Perl 使って抜き出したりとかはできるんだけど、 XML なら抜き出すためのもんだから処理しやすいからね。
 
・ XML は解りにくいッ! ってよく言われてるんでわてなりの解釈を。データをファイルに保存するとき、バイナリで書き込んだり、 CSV にしたり、 Data=100 みたいにしたりするでしょ。 XML はそういうのの書き方のひとつで、テキスト形式で <Data>100</Data> っていう記述方法をするもの。
 
・そして、 XML は「このファイルには Data と Name 、それに IsNew のみっつのパラメーターがあります」みたいな定義をするためのものです。つまり「このアプリは日時と名前をファイルに保存します」「このアプリのファイルはデータっていう構造体をひとつ以上持ってて、その中には教科名と点数が入ってます」っていうフォーマットそのものを定義することができるんです、 XML は。
 
・ XML のファイルは、実際のデータと、そのデータのフォーマット定義( DTD )のふたつで構成されます。フォーマットが含まれてるから、データがどういうものなのかだいたい判断できる仕組みになってます。さらに、 XML ライブラリを使えば、そのフォーマットを元にデータを取り出すことができます。 CSV だったら「3番目が日付」ってことを知らなきゃいけないでしょ。その情報を DTD が提供してくれるから、 XML ライブラリが簡単に取り出せるわけ。
 
・ XML が使いやすい理由は、テキストファイルで作れて、ライブラリが揃ってて、スタイルシートと組み合わせれば HTML みたくきれいにブラウザで表示できて、世界標準、ってとこ。データの保存を XML でしとけばあとから融通か利きやすいわけですな。他のアプリで処理する必要が出たときとかにね。と、付け焼き刃で理解しました(爆)。 XML が難しいのは、 HTML から考えるからじゃないかなぁ。こういうふうにファイルフォーマットと絡めてみると解りやすいと思うです。
 
・で、実際にしたことは、今出てるCマガ2月号の XML 入門のを実際に試してみて、あと @ITXML フォーラムの記事を読んだくらい。Cマガのはかなり解りやすいんでお奨め。っつーか XML そのものを理解するよりも、 VC や Java からパーサーを呼び出したり、サーバーサイドのプログラムを作ったりできないと仕事で役に立たなそうなんでその辺もやってみないと。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/25 (Thu)
・今日はぷらとわを書きました。とうとうウィンドウプロシージャまわりに突入。むっつかしい MFC のメッセージ搬送システムもちょびっと見てみたり。あれは union やら enum やらメンバ関数ポインタやら使うからかなりややこしい話になってくるから、まー今回は触りだけ。それよりメッセージが送られてきて Spy++ で見てとかの部分が中心。
 
・今日はこれくらいかな。あと辞書書いたりとかくらい。 Java + XML はひと休み。本屋で見たら XML 専門誌が2冊くらいあったんだけど、結構高かったんでとりあえずパス(汗)。こういう本を読むよりも、サンプルをほむぺから漁った方がいいかなーとか思ってしまう……。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/26 (Fri)
・今日はお便り紹介!
 
透明1ドットイメージ
透明1ドットイメージ
 こんにちわ。小次郎丸です。
 
 先日はご回答いただきありがとうございました。おかげさまでいとも簡単に解決しました。いやぁ。調べ不足ですね。 m(__)m
 
 で、あつかましいのですがもう一つ質問させてもらってもいいでしょうか?
 
 CreateWindowでEditBoxを作成したのですがその中でカーソルを動かそうと矢印キーを押しても動かないのです。
 これってフックして動きを処理しないと駄目なのでしょうか?
 なにか良い方法(または間違っています等)がありましたら是非ご教授ください。
 でわ、失礼します。
透明1ドットイメージ
透明1ドットイメージ
 
・うーん、なんででしょう。そういうことにはならないと思うんだけど……とりあえずサンプルコードね。
 
void CreateEdit
    ( HWND p_hParentWnd   // 親ウィンドウ
    , HINSTANCE p_hInst ) // インスタンスハンドル
{
    HWND hWnd
        = ::CreateWindow
            ( "EDIT"
            , ""
            , WS_CHILD 
            , 10, 30, 100, 60
            , p_hParentWnd
            , (HMENU)1050
            , p_hInst
            , NULL );
    ::ShowWindow( hWnd, SW_SHOW );
}
	
 
・たぶんこうすれば普通に入力できるしカーソルも移動できるはず。動かなくなる原因としては、なんか変なスタイルを付けちゃったとか、変な処理をしちゃったとか、かなぁ。でもカーソルキーだけ効かないっていうのはちょっと思い付かないです。うーむ。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/27 (Sat)
・今日はプログラミング言語書いてました。今さらになって「演算子」を追加するってゆーのがなんかすごい(爆)。こういうのも、送られてこないと追加しないからなー。あと、もしかしたら多次元配列を全然理解してないかもしんない、わて。っつーか使ったことないし。調べ直さねば。今日はこれだけ(汗)。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/28 (Sun)
・今日はお休みしまーす。
透明1ドットイメージ
 
2001/01/29 (Mon)
・今日もお休み。今週はお休み多いかも……。
透明1ドットイメージ
 
2001/01/30 (Tue)
・今日はお便り紹介!
 
透明1ドットイメージ
透明1ドットイメージ
 三好です。
 
 アプリのクライアント領域に出力したいのですが、頻繁に描画し直さなければならないので、先にBMP の形で画像全体を用意してから出力しようとしています。
 CreateCompatibleDC() あたりを使うようなんですが、やり方がよく分からないので、教えてください。
 それと、もしもっと高速化できるやり方があれば、教えてください。ちなみに、エディタを作ろうとしています。
 よろしくおねがいします。
P.S. Visual C++ で書かれたソースコードを公開しているエディタをご存知ないですか?もしあれば参考にしたいですので。
透明1ドットイメージ
透明1ドットイメージ
 
・エディタのソースコードかー、ちょっと知らないです。実際、エディタを実現するのってかなり大変そうなんで、わても見てみたいです。 UNIX 系から移植したのとかだとコードありそうだけど。
 
・ CreateCompatibleDC() のは「メモリデバイスコンテキスト」っていうのです。2000年12月19日のにメモリ DC の例があるんで見てみて。 CMy20001219View::On1() の中のがほとんどそう。最後から2行前の BitBlt() してるところを cMemDC から pDC に転送するように書き換えればOK。
 
・簡単に解説すると、まず画面に出てる DC を元に CreateCompatibleDC() を呼び出します。すると画面に表示されないメモリだけの DC が作られます。これがメモリデバイスコンテキスト。で、忘れちゃいけないのがビットマップの作成。ビットマップは「キャンバス」。作りたてのメモリ DC にはそのキャンバスになるビットマップがないから、作って持たせてあげなきゃいけない。
 
・そこで同じく画面に出てる DC から CreateCompatibleBitmap() でビットマップを作成して SelectObject() でメモリ DC に貼り付けます。そうすればメモリ DC への描画がこのビットマップに反映されるようになります。で、描画した後 BitBlt() でメモリ DC から画面に出てる DC にコピーすればOK。
 
・描画は、画面の DC にするよりメモリ DC にした方が早いんでこれで高速化できるはず。あと、 WM_PAINT では BitBlt() だけするようにして、メモリ DC への描画は必要なときだけするとか。エディタで DirectX 使うとかはありなのかなぁ。ちょっと不明。
 
・でわまたっ!
透明1ドットイメージ
 
2001/01/31 (Wed)
・今日もお便り紹介!
 
透明1ドットイメージ
透明1ドットイメージ
 三好です。
 
 1/30 の続きです。
 なるほど。完全に分かりました。やはり分かっている人に説明してもらうと違いますね。MSDN にはなぜかサンプルコードがない上、その説明は、分かっている人には分かる、という感じの説明でしたので、困っていました。
 どうもありがとうございました。
 エディタはなかなかソースを公開しないみたいですね。といっても最近はほとんどのソフトがそのようですが。私のエディタは完成するかどうか分かりませんが、出来たらソースを公開してみます。
 それでは。
透明1ドットイメージ
透明1ドットイメージ
 
・そうしてくれると嬉しいですー。今はメーラーとかチャットとか、通信系クライアントで特にエディタ必須状態で、仕方なくリッチエディット使うような感じなんで。 VC のエディタを公開してくれるくらいのサービスが欲しい(爆)。
 
・メモリデバイスコンテキスト、特に「ビットマップを作って付ける」っていうのは結構知らない人多いみたいですね。「キャンバス」は結構分かりやすいみたいで前にもそんなこと言ってくれた方が。わてはなんで知ったのかな、記憶にない(爆)。こういうノウハウは Win95 が出始めた頃には蓄積されてたみたいなんだけど、最近はそういうのは薄まって来てるのかもしんない……。
 
・でわまたっ!
 
 
(C)KAB-studio 2001 ALL RIGHTS RESERVED.