|
・今日はお休みしまーす。
|
・今日もお休み〜。
|
・今日もお休み。っつーか今週2回しか書いてないぞ(汗)。今はお便りがないと書いてないから、それでお客さんが減ってさらにお便りが減るっつー悪循環状態。むー。でも(何度言ったか分かんないけど)4月までにうちかぶとか WTL に移行したいなーとか思ってるんで。
・でわまたっ! |
・今日もお休み(泣)。まー卒論はかなり終わってるんで<どっちの意味?
・でわまたっ! |
・今日はお便りがみっつ。ではひとつめのお便り。
|
|
・ベンチャーキャピタル( Venture Capital )っていうのは「起業家向け投資家」のこと。ちょっとアイディア浮かんだから、それに誰か投資しませんかーって呼びかけて、それに応えて資金提供してくれるのがベンチャーキャピタル。ベンチャーキャピタルは「投資」なんで、起業した会社が株式を公開した時の利ざやを利益にしようとたくらんでます。
・でもベンチャーキャピタルってちょっと前までアメリカと日本とじゃかなり違ったからなー。アメリカはお金だけじゃなくて経営とかに思いっきり関わってきて、情報公開をしっかりしないと信用してくれないっていう結構厳しいのなんだけど、今の日本の現状はちょっと分からないです。ベンチャーキャピタルそのものの知名度とかは上がってるんだろうけど、不況だから数は減ってそうな気がする……。 ・うちのガッコにも SVBL っていうのがあって、アイディアコンテストみたいなのやってます。前行ったときは高専から編入してきた人がかなりすごいのを持ってきてて「こりゃかなわんわ」とか思った(爆)。個人的には、特許取ってくれる部署作った方がいいんじゃないかなーとか思うんだけどねぇ。 ・もひとつお便り。 |
|
・あ、そういえばこのドメインのことってちゃんと書いてなかったですね。うちのはジャストネットのMYドメインパックっていうのです。初期費用1万円、月々3900円。ほむぺ容量25Mにメールアドレスが5個、 Perl の CGI が使えて、そしてダイヤルアップが使い放題なんで、家で普通にインターネットしてホームページ持ってて、それでドメイン取りたいって人にはかなりお勧め。
・元々わてはジャストネットの会員で、1年前くらいにこのサービスが始まった時に即入会(爆)。ずっとドメイン取ろう思ってたし、そのときは初期費用がキャンペーンでタダだったし、なによりジャストネット会員はものすごく簡単な手続きでできたんですよ。だから乗り換えだとちょっと手間はかかるかな。でも安いのは安いと思うし、今のところわてはまったく不満がないです。あ、入会時のこととかはチョー普通な日記2000年1月24日とか2月9日とかにも書いてあるんでそちらも参考に。 ・もひとつお便り。 |
|
・ただ有効化させるだけなら、ハンドラ関数を作るだけでOK。 ClassWizard ダイアログの【メッセージ マップ】のページで、【オブジェクト ID 】をそのツールバーの項目の ID にして、【メッセージ】から COMMAND をダブルクリック。そうすると、その項目を押したときに呼ばれるメンバ関数(=ハンドラ関数)が作られます。で、これだけで有効になると思います。手動でするならこんな感じ。
BOOL CMainFrame::OnCmdMsg (UINT nID, int nCode, void* pExtra , AFX_CMDHANDLERINFO* pHandlerInfo) { if ( pHandlerInfo == NULL && nID == ID_B && nCode == CN_UPDATE_COMMAND_UI ) { CCmdUI* pCmdUI = (CCmdUI*)pExtra; pCmdUI->Enable( TRUE ); return TRUE; } return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); } ・参考ページは Codian のメニューを動的に追加する(後編)。っつーか仕組み忘れてた(爆)。この「無効化システム」は、メニューやツールバー問わず、コマンド ID に対して行うんで基本的にはメニューと同じなんですね。この辺は、 MFC 複雑やなーと思うところ。むぅ。 ・でわまたっ! |
・今日もお便り紹介。
|
|
・フォルダを見に行くってことは、 FindFirstFile() とか CFileFind とかでファイルを列挙するとこまではできたのかな。ってことはファイルを開いて置換すればいいんですよね。置換か〜、最近は Perl ですること多いからちょっと苦手かも。あ、でも MFC 使っていいならこんな簡単にできます。
void ReplaceWithMfc() { CStdioFile cStdFile( "A.txt", CFile::modeReadWrite ); CString cStr; char chTemp[256]; while( cStdFile.ReadString( chTemp, 255 ) ) { cStr += chTemp; } cStr.Replace( "あいう", "えお" ); cStdFile.SeekToBegin(); cStdFile.WriteString( cStr ); } ・ CStdioFile っていうクラスでファイルを開いて、ファイルの中身を cStr に詰め込みます。あとは CString::Replace() で一発置換。んで書き込めば完了。っつーかこれは CString が便利なんだな。 std::string にも replace() があるんだけど、これはちょっと便利でないし。 ・ライブラリ使わないでって場合だと……そうだなー、C言語による最新アルゴリズム事典の strmatch.c が「文字列からの検索」をするのだから、これにファイルの読み書きと置換機能を加えれば大丈夫かな。ファイル入出力は#pramga twiceの 074.mmag とかを参考にしてみてください。書き換え自体は結構一般的だから、アルゴリズム関係の本やサイトの方が詳しいかもしんない。 ・でわまたっ! |
|
・どうもですー。基本的に HDN_ITEMDBLCLICK がオーナーウィンドウ(つまりダイアログ)に送られることはないみたいです。いわゆる「そーゆー仕様」ってヤツ。これは直接の親ウィンドウ、つまりリストコントロールに送られてきちゃうんです。だからダイアログじゃ受け取れないとゆー。しゃーないんでサブクラス化するしかないですな。
・つっても MFC はコントロールのサブクラス化が簡単にできます。まず ClassWizard の【クラスの追加】−【新規】で【基本クラス】を CListCtrl にしてクラス名は適当に、ここではとりあえず CNewLstCtrl にして、このクラスを追加。 C(プロジェクト名).cpp とC(プロジェクト名)Dlg.cpp で NewLstCtrl.h をインクルードしてから m_FileList の型を CNewLstCtrl に変更。 ・こうすることで自動的にリストコントロールを乗っ取って、 CNewLstCtrl のウィンドウプロシージャでメッセージを処理できるようになります。というわけでこのクラスで OnItemdblclick() を作れば……とはいかなくて、 ClassWizard で WindowProc() をオーバーライド。その中でこんなふうにしてください。 LRESULT CNewLstCtrl::WindowProc (UINT message, WPARAM wParam, LPARAM lParam) { if( message == WM_NOTIFY && ((LPNMHDR)lParam)->code == HDN_ITEMDBLCLICKW ) { // こんなかで処理。 } return CListCtrl::WindowProc(message, wParam, lParam); } ・なんで HDN_ITEMDBLCLICKW じゃないといけないんだろう(汗)。プロジェクトは Unicode 指定してないのに。どっかで設定できるのかなー。ま、そういうわけでこうやってリストコントロールの中で HDN_ITEMDBLCLICKW を拾えばダブルクリックを関知することができますです。うーん、ウィンドウズって複雑やねぇ。 ・でわまたっ! |
・今日はお便りがふたつ。ではひとつめのお便り。
|
|
・そうなんですよねー、普通に売ってある本のソースコードが置いてあるっていうのは結構ビックリかも。確かCodianオフライン版を置くとしたらどこかなーって調査してるときに見つけたんだと思う。あ、そういえばオフライン版更新しないと。
・もひとつお便り。 |
|
・あ、 CNewLstCtrl::PreCreateWindow() って呼ばれないですね。たぶんこれは、 CNewLstCtrl がリストコントロールを作るんじゃなくて、元からあるリストコントロールにサブクラス化するから呼ばれないんだと思うです。 CWnd::PreSubclassWindow() は呼ばれるけど、これじゃあんまり役立たないかな……。あと HDN_ITEMDBLCLICK じゃなくて HDN_ITEMDBLCLICKW みたいです。
・あと、それ以外の原因っていう可能性も。2の後にしとかなきゃいけないことがあるんです。2の2「ダイアログに張り付いているリストビューにメンバ変数を作成しました」のメンバ変数は、 (プロジェクト名)Dlg.h の中でこんなふうに宣言されてるでしょ。 class C(プロジェクト名)Dlg : public CDialog { // 略 // ダイアログ データ //{{AFX_DATA(CMy20010207Dlg) enum { IDD = IDD_MY20010207_DIALOG }; CListCtrl m_FileList; // ここ!! //}}AFX_DATA // 略 }; ・この CListCtrl を、 ClassWizard で作ったクラス CListCtrlEx に書き換えちゃうんです。昨日「m_FileList の型を CNewLstCtrl に変更」って言ったことね。これを忘れててもうまくいかないから注意してくださいです。 ・でわまたっ! |
・今日はぷらとわとかなゆ〜を書いてました。なんか結構ショックなんだけど、今は TRACE() にまんま CString を渡せるみたいですね(汗)。 VC6 からそうなってるらしいんだけど、全然知らなかった……。
・今日のお便り! |
|
・ホントですね、 E_NOTIMPL が返ってきてるってことは実装されてないってことで、これじゃ「場合によっては成功する」ってことはないのかも。っつーか検索しても実際に使ってる例ないし(爆)。結局は Reset の代わりに IEnumIDList を作り直すとか Clone() するとかしかないかも。
・でわまたっ! |
・今日もお便り紹介!
|
|
・…… COM ってソースコードが公開されてたなんて知らなかった!!(爆) そっか、 IShellFolder なら CShellFolder で検索すればいいんだ、これならかなり楽に使えるなー。あ、でも CShellFolder::SetNameOf() みたいに実装されてないのもあるなー、バージョンアップで実装されてるってこともあるだろうし、参考程度にしといた方がいいかも。それにしてもこれを知っとけば、前に書いたときかなり助かっただろうなぁ……。
・でわまたっ! |
・今日はお休み〜。
|
・今日はお便り紹介〜。
|
|
・メッセージ送るのはOK。こういうのは結構しますね。「PostMessage(の引数」ってつまりこの場合どういう引数渡せばいいのかってことですよね。こういう通知メッセージは WM_COMMAND として送ってその LPARAM の上位2バイトに通知メッセージを入れて送ります。こんな感じに。
void Test( CDialog *p_pcDlg ) { p_pcDlg->PostMessage ( WM_COMMAND , MAKEWPARAM( IDC_BUTTON6, BN_CLICKED ) , (LPARAM)GetDlgItem ( p_pcDlg->GetSafeHwnd() , IDC_BUTTON6 ) ); } ・メッセージは WM_COMMAND 。 WPARAM の下位2バイトにボタンの ID 、上位2バイトに通知メッセージの BN_CLICKED を入れます。 LPARAM はそのボタンのウィンドウハンドル。普通システムから送られてくるんでこんだけいたれりつくせりだけど、自分で送ると面倒だな〜。あ、あと通知メッセージとしてじゃなく、 WM_LBUTTONDOWN と WM_LBUTTONUP でもOK。 void Test( CDialog *p_pcDlg ) { p_pcDlg ->GetDlgItem( IDC_BUTTON6 ) ->PostMessage( WM_LBUTTONDOWN ); p_pcDlg ->GetDlgItem( IDC_BUTTON6 ) ->PostMessage( WM_LBUTTONUP ); } ・左ボタンを押して離すってゆーのをさせるわけです。 WPARAM と LPARAM を省略すると 0 が渡されるんだけど、別にボタンのウィンドウのどこを押してもちゃんと押されるんでこれで大丈夫でしょう。通知メッセージ使うよりもこっちの方が自然でいいかもしんない。 ・でわまたっ! |
・今日もお便り紹介〜。
|
|
・うわホントだ、こんな制限があったとは……。見た感じ、これを変更できる設定とかはなさそうです。たぶん中でハードコーディングされてるんじゃないかなぁ。コントロールの個数を unsigned char に入れてるとか。
・面倒で遠回りな解決策はあります。ひとつはリソースを直接書き換えちゃうこと。(プロジェクト名).rc をテキストモードで開いて直接コントロールを書き加えて、増えた分だけ resource.h にも ID を加えておけばOK。もうひとつの方法は動的生成。 Create() すれば普通にできるんで。前者は Perl とかで、後者は for ループとかで自動処理しちゃえばある意味楽かもしんない。 ・でわまたっ! |
・今日はぷらとわを書いてました。今回はコンボボックスの話。書くネタに困らないのは、ウィンドウズの仕様が複雑だからかも(爆)。アプリを使う側からしてみれば、開発者ってのはある程度知ってなきゃってゆーのあるわけで、でもだからって研修で Platform SDK 熟読したりはしないんだろうなぁとか思ったり。もしそういう試験制度があったら司法試験並みに難しいかも(爆)。
・はっ、今日はこれだけ(爆)。お便り募集中だよん。 ・でわまたっ! |
・今日はちょっとだけ MSXML Parser を使ってみました。前にダウンロードしたのね。今はそのとき一緒にダウンロードしたサンプルの解析が中心。「サンプルがクラスってやだなー」とか思ってたんだけど、オーバーライド使ったイベントハンドラとして実装しなきゃいけない仕組みになってるんでクラスとして作らないといけなかったとゆー(汗)。
・サンプル解析してみて分かったこと。 ISAXContentHandler がイベントハンドラとして呼び出される仕組みになってます。開始タグに出遭うと startElement() が呼ばれて、閉じタグに出遭うと endElement() が呼ばれるとゆー。ってことはたぶんその中身で呼ばれるメソッドがあるんだなきっと。仕組み的には分かりやすいかも。 ・分かりにくいこと…… Unicode (泣)。文字列がすべて wchar_t で実装されてるんでかなりめんどい話になってます。うちは Win98 だから OutputDebugStringW() 実装されてないし。 char に変換して出力する TRACE() もどきを作るかなー、それより WTL プロジェクトを立ち上げてそれでテストしていった方がいいかも。 ・でわまたっ! |
(C)KAB-studio 2001 ALL RIGHTS RESERVED. |