■ VisualC++(MFC限定)相談室 MFC10.dll■
スレタイ壊れているけど前スレ ↑ これ消し忘れた。スマソ
ではスレ最初の質問を。開発環境はVC6.0。 CRichEditCtrlでキー操作による変更をEN_CHANGEで処理し、 SetSelectionCharFormat()で文字色など書式属性を変更している。 削除するだけなら問題ないが、日本語入力で文字列を追加すると 書式属性の変更が画面上に反映されない。 別のコントロールにフォーカスが移った頃になってやっと表れる。 EN_IMECHANGEを試してみたけど、ENM_IMECHANGEをマスクしても来なかった。 (どこかのサイトにRichEdit1.0でないと来ないとか書いてあった) 以上よろしくです。
6 :
デフォルトの名無しさん :04/01/17 15:47
>>5 変更後に
m_RichEdit.InvalidateRect(NULL);
としてみたらどう?
>>6 それやってるんだ。あとInvalidate()も。
すでに正常に表示されている属性はそのままで、
追加した文字列だけが、1つ前の文字の属性になってしまう。
例…「あ」が赤で「えお」は青、新規追加の「いう」は緑にしたい
「あえお」 → 「あいうえお」
こうすると「あいう」までが赤で「えお」が青になる。
でも削除、たとえば「え」を消すと「あ」赤、「いう」緑、「お」青に変わる。
EN_CHANGEじゃなくて、WM_IME_〜を捕まえないといけないのかな。
ダイアログが表示されているときに、エンターキーやESCキーを押すと終了してしまいます。 これらの動作を禁止するにはどうすればいいでしょうか?
>>8 OnOK()
{
//CDialog::OnOK(); こいつわEndDialogしやがる
return;
}
( ´∀`) <OnCancelモナー
モナーさん感謝します しっかり出来ました(^o^)/
いろいろ書いてありますね しかもクラス別に書いてあって見やすい^-^ 今度MFCで困ったとき覗いてみます(^-^;)
リソースのテキストボックスのプロパティにてnumberをtrueにして数値以外入力できないようにしたのですけど コピペすると文字も入力できてしまいます。 数値だけしか入らないようにしたいのですがいい方法はありますか?
>>13 テキストボックスって「エディット・ボックス」のことか?
コントロールにメンバ変数をintやUINTで割り当ててやれば範囲指定も含めて
勝手にやってくれるが。
Masked Editを使うわけにゃいかんかね?
>>14 普通にキー入力だとちゃんと無視してくれるんですが、
それだとコピペで入力できてしまうんです
>>15 ActiveXコントロール作ってるのでなるべくActiveXコンテナにはなりたくないと思ってます。
メニューの「貼り付け」って項目を メニューがプルダウンしたときに クリップボード中にテキスト形式のデータがあるかを判定して あれば有効に、なければ淡色表示にしたくて UPDATE_COMMAND_UIを使って実現できたんですが これを使うと便利な事に同じIDのツールバーも同じ処理をしてくれるんですが メニューの場合は、プルダウンしたときだけに呼ばれるのですが、 ツールバーの場合は、マウスが1ドット動いただけで呼ばれてしまいます メニューの有効無効の判定する処理が重くなるとかなりの負荷になります UPDATE_COMMAND_UI以外にプルダウンメニューだけに 適応できる方法ってないでしょうか? メニューのIDとツールバーのID変えれば済むのですが、 管理上わかりにくくなるので困ってます
ツールバーのUPDATE_COMMAND_UIはOnIdle()の時に呼ばれるようになっていたきがする。
自己解決しました OnUpdate〜(CCmdUI* pCmdUI) のpCmdUI->m_pMenu が NULL なら メニューのプルダウン時じゃないので 無視してツールバーが更新してしまう事を防げました これで重い判定でもプルダウンした時のみに適用できます
20 :
デフォルトの名無しさん :04/01/20 23:49
CListView で SortItemsの比較関数の実装を行っています。 static int CALLBACK CExtListView::CompareFunc (LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); このコールバック関数なんですが、CListViewの中で GetListCtrl().SortItems(CompareFunc, (DWORD) pSortStruct); という形でCompareFuncを呼び出すと、第1、第2引数が いずれもNULLの形で呼び出されます。 これは何が問題なのでしょうか? 両者には有効なLVITEMへのポインタが渡されると思っていたのですが。
渡されるのはLVITEMのlParamへのポインタじゃないか。
>>21 ども。
調べてみたら LVITEM の lParam を設定しないと駄目みたいですね。
設定してデバッグで確認したらCompareFuncに渡されるのは
ポインタではなく、
0 1 / 2 3 / 4 5
といった数字の組み合わせみたいです。おそらくアイテムの
番号なんでしょう。
もう少し研究してみます。
あぁごめん、ポインタではなくlParamね。 で、普通はそのlParamにアイテムのポインタなんかを入れておいて、 CItem pItem = new CItem; pItem->text = _T("ABC"); LVITEM.lParam = (LPARAM)pItem; ・・・ ・・・ CompareFunc(・・・){ CItem pItem1 = (CItem*)lParam1; CItem pItem2 = (CItem*)lParam2; // pItem1->textとpItem2->textを比較してソート } ってやり方が常道かと。
どもども。どうにか実装できました。 ソートアルゴリズムにはあまり明るくないんですが、 同じソート関数で昇順と降順を交互に変更できる んですかね。 最初、昇順のときと降順のときでソート関数の符号が +-逆になるように比較関数を書いてみたんですが、 どうも動作がおかしいので、符号を逆にすることを やめたら、正しくソートされるようになりました。 (以前は2回ソートするとソート順が変わるようになっていた)
引き続きリストビューのソートの研究をやっておりますた。
↓こちらのスレを参考にしてやってました。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_TVdrag.html >>24 の段階では、まだ正しく動作していなくて、
Swap関数を作って、要素を入れ替えながらソートしたら
うまくいかないことが分かったんですが、ソート関数自体は
大筋で正しいアルゴリズムだったようです。
それで↑のURLを見ると、LVITEMのソート直前にlParam に
0から順番に数値を割り振っていますが、やはりこれを
やらないとうまくソートされない。初期の挿入時に1回やれば
OKなのではなく、ソートのたびに再度割り振り直さないと
いけないようです。これはすべて同じ数字の割り振りでは
駄目で、MaxItemCount から0まで減算しながら割り振る方法
でも正しくソートされないようです。(逆順にもならなかった)
それで以上のような結果を踏まえると、
>>23 さんのおっしゃる
ように lParam にポインタをいれておくことはできないのではな
いかと思うのですが、どうでしょう? 実際にポインタを入れて
使っている人いますか?
できるって。以下文字列アイテムのソート int nResult = ::lstrcmpi(pItem1->GetName(), pItem2->GetName()); return nReault; 逆順ソートしたい場合は int nResult = ::lstrcmpi(pItem2->GetName(), pItem1->GetName()); return nReault;
>>25 >うまくいかないことが分かったんですが、ソート関数自体は
>大筋で正しいアルゴリズムだったようです。
ソート関数ではなくコンペア関数ね。
ああ、そっかそっか。 わかりますた。 CompareFunctionで lParam1 と lParam2 を アイテムの順番と一致することを前提に関数を 書いてますた。 たしかにできるかも知れないですね。 引き続き研究してみます。
LPARAMにポインタを使ってできますた!
この場合は
>>25 のように番号の再割り振りは不要らしい。
動作原理は今ひとつ不明ですが・・・。
>>29 SortItems呼び出し中はアイテムの位置が変わらないんだよ。
比較関数が呼ばれるたびに位置が入れ替わるクイックソートとは違うわけだ。
だから、インデックスで指定するGetItemやGetItemTextは
常に同じアイテムからデータを取得することができる。
そのためにlParamにインデックスを振って識別できるようにするわけだ。
これが、lParamがリストビュー以外で構成されているデータを指すポインタであっても同じ。
要はlParamが一意のアイテムに対応付けられていて比較に必要なデータを取り出すことができればいいわけだ。
(ソートが必要なければ対応付けは当然要らない)
インデックスをlParamに振るのは楽だけど、アイテムが多くなるとパフォーマンスの問題が出る。
でも、もっと大量になるとオーナーデータになって、SortItemsが使えなくなるんだけどな。
どもども。 まともなリストビューの実装はほんと難しいですね。 エクスプローラを目指しているんですが、CImageListの 画像もデフォルトだと黒っぽくて汚いし、一筋縄では いかない感じです。
リストビューで質問なんですが、複数のアイテムをドラッグするには どうしたらいいのでしょう? 1つのアイテムのドラッグはできたし、選択された複数のアイテムの 取得もできたみたいなのですが、CImageList のドラッグする関数が static なので複数のドラッグイメージを同時にMoveできない みたいなんです。 CListCtrl::CreateDragImage() を繰り返して各アイテムのイメージを 作って、それを結合して1つの大きなイメージを作ることはできるん ですかね。
>>32 ふーむ。よくよく見てみると、エクスプローラの場合、
複数同時ドラッグは独自イメージを作っている感じ・・。
自分でイメージ作るのか・・・マンドクセ。
CImageList ってCDCあたりからイメージを作成することって できないんでしょうか? アイコンとビットマップからの作成は あるんですが、メモリ上で作る方法が知りたい。 CListCtrl::CreateDragImage があるので、不可能ではないので しょうけど、どうやってんだろ?
CBitmapから作れるんだから、いくらでも可能だろ。
ダイアログの左側にツリー貼っつけて、 右側のコントロールを切り替える奴はどうやって実装してるんですか?
漏れはDialogを子ウィンドウで作って ShowWindow()で切り替えしてる。 それが正しいかどうかは知らね。
>>37 回答ありがとうです。
子ウィンドウかー。やってみるですよ。
WTLを使ってIEツールバーを自作しています。 リソースにビットマップ画像の列を入れて ボタンに画像を入れていますが、 あれって全部同じサイズじゃないとダメなのでしょうか? Googleツールバーだと最初のロゴだけ 違うサイズなのでできるはずなのですが・・・。 あそこだけ、違うウィンドウなのかな?
特定のディレクトリ配下の複数のサブディレクトリからファイルを検索するロジックを 書かなきゃならなくなりそうなんだけど、CFileFindかなんかを使って サブディレクトリにぶち当たるごとに再帰する以外になんかいい方法あるかな。 自分で書くと、テストが面倒で・・・
>>40 再帰する以外を考える方が面倒だと思うけど?
>>41 どっかに拡張APIでも転がってないかと・・・
#なさそうだなぁ。
"dir /s /b" の出力を利用する。自分では再帰していないので全然オッケーさ♪
マウスによるダイアログリサイズ時や移動時、ダイアログの表示は そのままで、リサイズor移動予定の枠だけマウスに追尾した表示 になりますよね?これを実際に枠の移動だけじゃなくダイアログの 実体そのものを追尾させる方法ってありますか?
そもそもダイアログをリサイズ可能になんかしねー 移動の方はまったくもって意味不明
>>44 移動時、リサイズ時にダイアログを移動、リサイズする。
WM_MOUSEMOVEやWM_SIZEのタイミングでダイアログをMoveWindowなりSetWondowPosなりしてみては。
動作は確認してないけど。
>>44 それって画面のプロパティの
”ドラッグ中にウィンドウの内容を表示する”
って設定の問題なんじゃないの?
>>43 どうせ最終的にはフルパスが欲しいから願ったり適ったり。
これでテストが一手間減らせるよ。ありがと♪
ダイアログでのOnButtonでボタンを押したときに効果音がでるようにしたいのですが どうやればいいでしょうか?
♪
>>52 PlaySoundはどのようにして使えばいいのでしょうか?
検索してもいまいち使い方がわからず・・・(ノД`)
今持っているwavファイルの音を効果音として出したいのですが・・・
ヘルプ見れ
>>54 友達の家のPCを使わせてもらってるんですが、ヘルプが見れないんですよ・・・
友達は割れ厨
>>56 検索はもちろんしましたが、詳しく書いてあるサイトがないようなので
>>59 いやホントに検索はしていますが、playsoundと一行書くだけでwavファイルは
鳴らせます・・・とかで、いまいち意味がわかんないんですよ
それでわかんないなら、見込みないからプログラムやめようね。
#include <Mmsystem.h> PlaySound( "music.wav", NULL, SND_FILENAME ); Library: Use Winmm.lib
質問です 今回タブコントロールを初めて使うんですが、コントロールの配置方法が良くわかりません。 おそらくshowwindowで変化させることまではわかったんですが リソースエディタで良いコントロールの配置方法はないでしょうか?
>>64 MFCのプロパティシート/ページのソースでも見てみれば?
66 :
デフォルトの名無しさん :04/02/03 22:52
モードレスダイアログを使おうとしてWeb調べてみたんだけど やり方がHogeDlg *dlg = new HogeDlg()でインスタンスを作成して、PostNcDestroyでdelete thisってやってるのばっかなんだが これってHogeDlg dlg;で作成して、いらなくなったらdlg.DestroyWindow()呼んでやるってのじゃだめなの?(わざわざnewするのに意味あるの?)
HogeDlg dlg;だとスコープ抜けたら自動的に破棄されるだろ。
まぁ、クラスのメンバ変数として(ry
69 :
デフォルトの名無しさん :04/02/05 01:49
ダイアログで、ESCやEnter押しても終わらないようにするには、 どうすればいいのですか?
72 :
デフォルトの名無しさん :04/02/06 22:15
Docクラス、Viewクラス、Appクラス、MainFrameクラス の関係がよくわかりません。 これについて、詳しく書いてある書籍やWebページがあったら教えてください。 入門書(林晴比古のVisualC++6.0入門)をみてもよくわかりませんでした。
>>72 ソース見てみるのもいいよ。俺はそうやって理解した。
74 :
デフォルトの名無しさん :04/02/06 22:40
>>72 View
↑
App → MainFrame
↓
Document
こんな感じだな。
・Viewクラスから
GetDocument()でDocumentクラスへのポインタが取れる。
GetParentFrame() MainFrameへのポインタが取れる。
AfxGetApp() でAppへのポインタが取れる。
これで各クラスの連携が取れるんじゃないか?
あとは、これをそれぞれどう使うかはユーザー次第。
基本的には
メニュー・ツールバー・ステータスバー・メインウインドウの位置 → MainFrame
クライアント領域の描画 → View
こんな感じになってる。
75 :
デフォルトの名無しさん :04/02/07 20:31
エクスプローラみたいなファイルビューワが簡単に使えるViewクラスって MFCに入ってないですか?CListViewとCTreeViewで動作をひとつずつ 作っていかないといけないのでしょうか。
処理したあとのデータとかまともにレイアウトして出力するのって いちいちデバイスコンテキストに線とか引いていくしか無いのでしょうか? 一あわせとか超手間なんですが、。 なんか楽にやるクラスとかツールって無いでしょうか。 今回は一応線引きで出来たんですけど苦労したし、変更とかあったら 調整が大変そうなので、よろしければおしえてください。
>>78 若者よ、それが汝の務めなのです。定型的で間違えやすい作業を見つけたら自動化しなさい。
それが数学的な意味で原始的な内容なら探せばきっと見つかるはず、
あなたの直面する業務に固有な内容ならあなたの身の回りになければ世界中のどこにもありません。
>>78 COMでExcel呼び出すとか? 「楽にやる」って要求を必ずしも満たすとは限らないと思うが・・・。
>>76 お、それ盲点だったかも
CFileDialogをうまく右側に組み込めればありだなぁ
ちょっと研究してみよう
>>79 ありがとう、転職でそんなに若くないけどね。(笑
イラレのデータをデバイスコンテキスト用に出力してくれるコードでも書いてみます。
一ヶ月でよくここまでやったなあ、俺
CFileクラスに関して教えてください。 CFileクラスのReadおよびWrite関数にてメモリの内容をファイルに出力、 またはその逆を行っています。(Read、Writeするサイズは50メガ程度 です。) プログラムを動作させるマシンによって、abnormal program termination が発生するのですが、これは何が原因なのでしょうか? 現状50Mを超える場合は複数回に分けて読み込み、書き込みを行って回避 していますが、原因がわからず困っています。 また、エラーメッセージを出力させるようにしたところ、 「システム リソースが不足しているため、要求されたサービスを完了で きません。」とのこと。 環境 OS :windows200SP4 開発環境:VC++6.0 Enterprise
>>83 CFileくらすというより、API(ReadFile/WriteFile)の問題になると思うが、俺もこの
問題に直面したことがあって、いろいろやった。で、一番手っ取り早いのはI/Oを
小分けに(10MB以下に)することですな。
50Mかそれ以上を 1I/Oでリソースエラー出さずにRead/Writeすることもできたけど、
小分けにするほうが確実。
85 :
デフォルトの名無しさん :04/02/10 21:02
CListViewに関して質問です。 アイテムがダブルクリックされたときのメッセージは、HDN_ITEMDBLCLICKで よろしいのでしょうか。 実際にプログラムを起動してアイテムをダブルクリックしても対応する関数が 呼び出されません。
Win32ででかいファイルをストリーミング以外で扱うなら ファイルマッピングを使うと楽で確実ですよ。
88 :
デフォルトの名無しさん :04/02/11 06:01
>>86 こんな便利なものがあったのですね。
どうもありがとうございました。
89 :
デフォルトの名無しさん :04/02/11 14:44
リソースでなくコード作成したテキストボックスに送られ てくるメッセージの取得ってどうやればいいのかな?
>>89 あなたみたいにわからん人のためにリソースエディタがあるんですが。
>>89 テキストボックスってエディットコントロールのこと?
質問の意味がわからん・・・。
>>89 CreateWindowで"EDIT"を指定して作ったウインドウのことだな?
SetWindowLongのGWL_WNDPROCあたり調べてみそ
>>93 消費者向けの用語と、開発者向けの用語が違ってるのはよくあることだよ
MFC的には CEdit派生クラス作って、その中でメッセージハンドリングするのが一番簡単なんじ ゃないかと。 親ウィンドウ側で何か処理したい場合も、親のBEGIN_MESSAGE_MAP〜END_MESSAGE_MAP に直書きもアリかも知れないし、親のWindowProc()なりで直接処理するとか、派生クラスから ユーザメッセージ飛ばすとか、いろいろ考えられる。
>>95 うわあ、その通り!
スレ間違ってました。吊ってきます。
98 :
デフォルトの名無しさん :04/02/11 21:39
本を読んでいてCWinApp::OnFileNewについての記述に 1. ドキュメントオブジェクトを生成しますが、データをディスクから読み取ろうとはしません。 2. CMainFrameクラスのメインフレームオブジェクトを生成。 さらに、メインフレームウィンドウを生成しますが、まだ表示しません。 このメインフレームウィンドウは、IDR_MAINFRAMEメニュー、ツールバー、ステータスバーを含みます。 3. ビューオブジェクトを生成しますが、まだ表示しません。 4. ドキュメントオブジェクト、メインフレームオブジェクト、ビューオブジェクトの間に接続を確立します。 これらのオブジェクトの接続を、 AddDocTemplate呼び出しによって確立されるクラスの接続と混同しないでください。 という記述があったのですが4が何を言おうとしているのかわかりません。 接続を確立するっていうのは何をしていて、どう混同してはいけないのでしょうか?
>89 別にCreateWindowでもControl IDは設定できるやん。
100 :
デフォルトの名無しさん :04/02/11 22:55
>>98 クラスの接続と、オブジェクトの接続の違いってことだよ。
質問です。他のアプリのメモリを監視するツール(あるゲームのステータスを監視するもの) を作りたいのですが方法が分かりません。 これもフックを使うのでしょうか?
APIスレで聞こうと思ったら誤爆・・・
104 :
デフォルトの名無しさん :04/02/12 16:23
MFCの勉強をしています。 ウインドウの右上にある×を押したときの動作をカスタマイズしたいのですが、 (アプリケーションを終了させるのではなく非表示にしたい) キーワードがわからず検索すらままなりません。 キーワードを教えてください。よろしくお願いします。
106 :
デフォルトの名無しさん :04/02/12 16:32
MFCと言うよりは、Windowsアプリ全般の話やね WM_CLOSEメッセージを検索してみそ MFCならそれをCMainFrameでハンドリングして・・・あとはお好きなように
107 :
デフォルトの名無しさん :04/02/12 16:43
>>105 >>106 どうもありがとうございます。
いきなり検索できるようになりました。
やはりキーワードって重要ですね。
MFCで作ったプログラムの中にファイルなどを含めて、 プログラムを実行したときにそのファイルをC:\\などにコピーしたいんですけど そのファイルのパスの取り方を教えてください。
__argv[0]
GetModuleFileName()
すいません。説明不足でした。 自分はプロジェクトのリソースファイルの中にコピーしたいファイルを登録しているんですが、 そのリソースファイルに登録したファイルのパスをどうやって取得したらいいのかわからないんです。 それともやりかたが間違っているのでしょうか?
>>111 ファイルをリソースに登録というのは具体的にどうやってんだ?
「ソリューションエクスプローラ」→「リソースファイル」右クリック 「リソースの追加」 ってやってたんですけどこれじゃexeの中に追加されていないことに 気づきました。 やっぱ無理なんですかね…
>>113 リソースの追加で何を追加したんだよ?
リソースの種類にパスというのがあるか?
根本的に認識が間違ってるクサイが。
>>114 すいません。初心者なもので…
自分はリソースにchmファイルを追加したんです。
そうすればexeの中にchmファイルが入って、exeをたたくとそのchmを他の場所にコピーできると
考えていました。
javaでいうとクラスもリソースもjarでまとめられた感じです。
MFCではexeの中に追加できないのでしょうか?
FindResource() とか、LoadResource() じゃないか
>>116 ありがとうございます。これでやってみます!
>>115 やっと判ったよ。
jarはアーカイブファイルだから、複数のファイルを一つにまとめる役割をしている。
リソースを追加するのはファイルを追加するのではなくてファイル中身のデータを追加するんだ。
リソースのデータをプログラム内から直接使う。
君のやりたいことはexeファイルとchmファイルをまとめて配布する事じゃないのか?
好きなアーカイバでアーカイブファイル、とくに自己解凍形式で作れば解決なのではないか?
>>118 救世主!!
ついでに言いますと、exeファイルはいりません。chmだけ配りたいんです。
chmを自動コピーするプログラムがexeというわけです。
>>119 それならアーカイブ内にexeが無くても解決法は同じ。
zipでもlhaでもいいから適当なアーカイバで自己解凍書庫作れ。
君が驚くほど高機能なものが出来るよ。
・・・悪い意味じゃないんだが こういうの知らない人がプログラミングやってるんだなぁ 時代は変わったね
>>121 俺なんかHP29Cで高次関数書いてた頃は
ハードウェア/ソフトウェアとは何かさえ説明できなかったよ
アーカイバなんかあってもメインフレームかミニコンだったけど
手元になかったし、もちろん存在すら知らなかった
パソコンのことろくに知らずに新卒でプログラマに就職するのも大勢いるからな たかだか学校で資格取って、授業やった程度で。 家にもWindowsフォルダの中身いろいろ消しちゃった奴がいた。男の子で。 おまえはおばはんの初心者か!!!!
124 :
デフォルトの名無しさん :04/02/15 00:36
CSplitterWnd で分割した小窓の中に、CFormViewを使ってフォームを表示して いるのですが、CFormViewで表示されているフォームにWeb browser controlを 置いているのですが、CFormView(CScrollView)が表示するスクロールバーが じゃまなのですが、これを表示させないようにする方法はありませんでしょうか? 教えてください、すいません。
126 :
デフォルトの名無しさん :04/02/15 01:30
初歩的なことですんません。 あのー、メッセージウインドウにnumっていう やつの数値を入れたいのですがどうすればいいのですか? C言語は一通りわかるのですが、そのノリでいくと MessageBox( "%d",num); と、printfとごっちゃになったものを書いてもだめでした。 おしえてください、おねがいしまつ。
>>126 AFXMessageBox(printf( "%d",num));
でできたっけか?
その辺の書式でうだうだ実験やるのが面倒なんで
CString temp ←文字なり数値なり好きなものつっこむ。
AFXMessageBox(temp);
とでもやっときゃとりあえずでるよ。
>>128 それだとバッファしないとだめじゃなかったっけ?
129 :
デフォルトの名無しさん :04/02/15 01:50
どれもできませんでした・・・・
ここはえらくレベルの低いスレッドですね。 やっぱこうだろ? MessageBox((boost::lexical_cast<std::string>(num)).c_str()); っと冗談はさておいて。 CString str; str.Format("%d", num); MessageBox(str); とか、sprintfを使うんで内科医?
あ、ほんとだsぬけてら、駄目だこりゃ(笑
>AFXMessageBox(printf( "%d",num)); ワロタ
133 :
デフォルトの名無しさん :04/02/15 02:13
CString strms; strms.Format("num==%d",num); AfxMessageBox(strms); これで一応出来る。
やべ、130とかぶっちった。
135 :
デフォルトの名無しさん :04/02/15 02:18
できた!みなさん、ありがとうでした。 実はまったくの初心者がオセロをつくっててこまってたのでし。
すいません、初心者できてたんですが、 答えようとがんばってみたけど無理でした。
>>135 たぶん完成は10年後くらいになるんじゃないかなぁ
10年かかるぐらいなら、ゴールしないと思われ。 10年間オセロプログラムに対するモチベーションを保てたら、それはそれですごいと思うよ。
ここまできたとか言いつつ、始めたばかりだとおもわれ。
リバー氏のアルゴリズム
ツールバーにドロップダウンボタンを入れようとしています。 イベントハンドラTBN_DROPDOWNで、メソッドを実行できるところまでは できているんですが、メニューをロードしようとすると必ず落ちてしまいます。 CMenu cme; cme.LoadMenu(IDR_MENU1);←ここで必ず出る。もちろんリソースにはメニューあり エラーはDebug Assertion Failedと出て、場所はFile: afxwin1.inl Line: 22 と出ます。 メモリ系のエラーということは推測できるのですが・・・。 環境はVC++6.0 WinXP Pro PlatformSDK有です。 どうかお願いいたします。
AfxWinInitが呼ばれて無いような感じのASSERTだな
>場所はFile: afxwin1.inl Line: 22 と出ます。 ここまで出ていて何故ソース見ないんだ?
>>143 それの意味がわかってないんじゃないか?
>>141 です。
>>142 >>143 当然見ました。
_AFXWIN_INLINE BOOL CMenu::LoadMenu(UINT nIDResource)
{ return Attach(::LoadMenu(AfxFindResourceHandle(
MAKEINTRESOURCE(nIDResource), RT_MENU), MAKEINTRESOURCE(nIDResource))); }←ここで落ちる
さらに中へ進むと
AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
if (!pModuleState->m_bSystem)
{
hInst = AfxGetResourceHandle();←ここで落ちる
if (::FindResource(hInst, lpszName, lpszType) != NULL)
return hInst;
}
となってます。
afxwin1.inl を見ないでどうすんだ? ネタとしか思えなくなってきた_| ̄|○
147 :
デフォルトの名無しさん :04/02/16 19:09
コンパイルがエラー・警告なしで実行すると、DebugLibraryというのが開かれて実行できません。 内容は Debug Assertion Failed! Program: D:\〜\Debug\abc.exe(実行ファイルの保存先) File: dbgheap.c Line: 1011 Expression: _CrtIsValidHeapPointer(pUserDate) For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) と出ます。中止、再試行、無視とあるんですが再試行、無視しても実行はされません。 こういうエラーがでる原因は何が考えられるんでしょうか? 解答よろしくお願いします。 ちなみに、dbgheap.c というファイルは検索したんですが見当たりませんでした。
>>147 そのダイアログは、
中止→実行を中断
再試行→デバッガ起動
無視→そのまま続行
だ。
再試行してデバッガ起動すると、とりあえずアサーション起こしたところはわかる
でも、例外を出してる部分の名前を見ただけで 変なポインタをライブラリに渡してるってのは分かるな。 そのライブラリもなんとなくdeleteっぽい気がしないでもないが。
150 :
デフォルトの名無しさん :04/02/17 11:46
Doc/Viewアーキテクチャでアプリを作ったんですが ファイルに関連付けられるドキュメントは扱わないので アプリのタイトルから 無題 - を削除したいのですが、 どうやったらいいんでしょう? 「無題」だけなら、String Tableをいじればいいんですが、 それでも - が残ってしまいます。何か良い方法ないですか?
>>150 下のどれか試してみて
PreCreateWindow()でcs.style &= ~(FWS_ADDTOTITLE | FWS_PREFIXTITLE);
CFrameWnd::OnUpdateFrameTitle()でSetWindowText()
CDocument::SetTitle()
>>150 CMainFrame::PreCreateWindow 内で
cs.style &= ~FWS_ADDTOTITLE;
>>151 クイックレスありがとうございます。
とりあえず
PreCreateWindow()でcs.style &= ~(FWS_ADDTOTITLE | FWS_PREFIXTITLE);
これで表示されなくなりました。
メインのOnCreate()で SetWindowText("(゚д゚)ウマー ver 1.0"); とかでいけるんでないかい?
って更新してなかったよ。_| ̄|○
157 :
デフォルトの名無しさん :04/02/19 13:29
.NET2003のブラウザスタイルのツールバーなんですが、 Rebarのバンド位置を保存したり読み込んだりしたいのですが どのようにすればできるのでしょうか? よろしくお願いします。
.NET2003 のダイアログベースでプロジェクトを作成し、 ダイアログの上にEditBox(EditCntrol)をいくつか置いて、 プロパティでAcceptFilesをTRUEにしました。 要は、このエディットボックスにファイルをドロップして そのファイル名を表示したいのですが PreTranslateMessage()の中でWM_DROPFILEを監視するとかでなく、 OnDropFiles()のように関数が呼ばれるようにはできないのでしょうか? MESSAGE_MAPに ON_EN_DROPFILES(IDC_EDIT1, OnEnDropFileEdit1) みたいなイメージです。 なにか、情報があればよろしくお願い致します。
サブクラス化すれば?
>>157 donutを参考にすればいいと思うよ。
内部で生成したHTML表示させて、 リンクのクリックとかを取得 ってことってできますか?
162 :
デフォルトの名無しさん :04/02/21 19:00
ダイアログバーのコンボボックスついての質問です。 1.リソースエディタでダイアログバーを新規作成してコンボボックス(IDC_COMBO)を貼り付ける。 2.CMainFrameのCDialogBar型メンバ変数(m_wndDlgBar)を追加する 3.CMainFrameのOnCreate関数でCreateする 以上の手順でダイアログバーを生成しました。で、コンボボックスに項目を 追加しようと、CMainFrameのメンバ関数に下のコードを入れました。 CCombBox* pCombo = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_COMBO); pCombo.InsertString(-1, "aaaaa"); ところが実行してみるとコンボボックスに項目が追加されません。 どんな原因が考えられるでしょうか。
ソースからコピペで持ってくることはできんのか 追加されてないというのはどうやって確認したのか
CCombBox* pCombo = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_COMBO); pCombo.InsertString(-1, "aaaaa"); 問題の件はどこが悪いのかはしらんけど、これってコンパイル通るのか? なんかすごいことしまくってるな。
追加されるされないの前にコンパイルできないよねぇ。
もいちど見直してみてはいかが?
>>162
レスありがとうございます >163 コンボボックスをクリックしてもaaaaaが表示されませんでした >164 すいません CComboBox* pCombo = (CComboBox*)m_wndDlgBar.GetDlgItem(IDC_COMBO); pCombo->InsertString(-1, "aaaaa"); の間違いでした。
コンボボックスの高さ設定とかは?よくわかんないけど。
>>167 オレもそう思って高さ縮めてやってみたけど
追加すると拡張されるようだ
そこらへんが気になるならとりあえず SetCurSel
ダイアログバーにメッセージが飛んできてない。
CTreeCtrlで作成した階層構造を保存したり読み込んだりしたいのですが、 どのようにデータを保存したらよいのでしょうか?
ちょっと質問。 CButton.Create()で設定したテキストを取りだしたいんですが、どうすればいいでしょうか? ボタン状態を取得するのはあったんですが、それはスタイル情報だけみたいなんです。 よろしくです。
MFCじゃなくても良いのですが バイナリデータを表示してくれるクラスはありますか?
>>174 そりゃ16進ダンプで出せってことか?
多分ないぞ。自分で作れ。
関係ないけどCButton.Create()という書き方に違和感がある
>>174 デバッグ用ダンプなら
CDumpContext
CObject::Dump
AfxDump
というのがあるが
データを16進数で文字列化したいっていうのだったら
wsprintf(DumpBuf, "%02x", buf[i]);
とかでループすれば?
2進数で表示するって意味だったりして<バイナリデータ
ディレクトリを指定できるエディットボックスを作りたいんだけど、 そんなコントロールないのかな? コンボボックスのボタンの所が"..."ってなってるヤツ。
あるからそういうのが存在するんだろ。
>>181 ようわからんけど、標準のダイアログの引数うんにゃってやってなんかしたら
ディレクトリのパスは取得出来たと思うぞ。
>>181 1."..."というテキストを設定したボタンをエディット・ボックスの横に置く
2.ボタンにCFileDialogを起動してパスを取得するコードを付ける
3.取得したパスをエディット・ボックスに入れる
>>184 4.最後によく煮込んだカレーをまんべんなくかける。
これで完璧。
質問はコンボボックスだっつってんのに。
>>186 > ディレクトリを指定できるエディットボックスを作りたいんだけど、
??????
ぁっ、ソレソレ。 ありがとうございます。
エクスプローラで、デスクトップ以下のディレクトリがツリー表示で出て、 ディレクトリを選択できるヤツあるじゃないですか? あれはどうやるんですか?
ありがとうございます。 なんていい人達なんだ・・・ 金持ちになったら雇ってあげます。
>>193 そんな気使わなくていいから今すぐ千円くれ。
>>193 そんな気使わなくていいから今すぐ一万円くれ。
198 :
デフォルトの名無しさん :04/02/25 12:01
楽しい雰囲気のとこすみません。 CEditViewにログを出力していくようなプログラムなんですが ログを保存しようとすると文字化けしてしまいます。 画面上は正しく表示されているんですが、 保存するとUNICODE変換されてしまっているようです。 hEdit.ReplaceSel(strbuf); //strbufはMBCS でも ::SendMessage(hEdit, WM_GETTEXT, sizeof(buf), (LPARAM)buf); //bufはMBCS でも LockBuffer();でみると勝手にUNICODEに変換されてしまっています。 なにが原因なのかさっぱりわからないんです。 よろしくお願いします。 .Net2003 XPSP1
199 :
デフォルトの名無しさん :04/02/25 18:02
画像の表示について質問があります。 サブクラスにしたstaticコントロールに画像ファイルをドラッグ&ドロップして 画像を表示させようとしていますが、ドラッグした後に一度ウィンドウを 他のウィンドウの下に隠さないと描画されません。 OnPaintを直接呼び出したり、WM_PAINTのメッセージを送ってもダメなので 解決法がわかりません。 .Net2003Pro XPProSP1です。 よろしくお願いします。
InvalidateRect()かな?
PAINTメッセージは無効領域が無いと描画しません 無効領域(Windowsを一度隠すとか)ができるとWM_PAINが発生し、 めでたく描画できます。 InvalidateRectはこの無効領域を発生させるためのものです。
>200-201 OnDropFiles()の最後で利用したら解決しました。 ありがとうございます。
>>198 MFCから離れて久しい俺が答えるのもはばかられるけど
NT系は内部で文字列をUnicodeで管理してるからじゃないですか?
CImageList クラスで、 BOOL GetImageInfo( int nImage, IMAGEINFO* pImageInfo ) const; nImage :イメージの 0 から始まるインデックス。 を用いて、たとえばリストの3番目のIMAGEINFOを得ようと、 nImage に2といれても、 イメージリスト全体の情報が取られるようで、 そこから得られた HBITMAPを描画すると、イメージリストの全体の画像が表示されます、 リストの特定の番目の IMAGEINFO が得られるような雰囲気がある関数なんですが、 そうなってくれません。 任意の IMAGEINFO が欲しいときはどうしたらいいでしょうか?
>>205 pImageInfo->rcImage
208 :
デフォルトの名無しさん :04/03/02 10:13
ちょっと質問を。 "2003/03/02 12:34:56"といったような文字列をCTimeに変換する関数はありますか? sscanf使っても出来るんですが、この手の変換は良く使われそうだからありそうな気が。
>>208 CTimeのメンバを調べてみる
オブジェクト作成に関する関数は以下の三つ
CTime()
GetCurrentTime()
operator =
勝手形式で文字列化したものは自分で処理するべし
>>208 直接は無いような気が。
InternetTimeToSystemTimeとか、COleDateTime::ParseDateTimeとか、代替がきくやつはあるけど。
どっちも反則気味だけど
年月日の形式は国によって全然違うから 一般的なものはないんじゃないかな。
>>210 >>212 おお、出来ました出来ました。
intで年月日バラバラと書くのがかっこ悪いと思っていただけなので、これが求めていたものです。
ありがとうございました〜。
214 :
デフォルトの名無しさん :04/03/02 22:02
質問お願いします。 MFCのAppWizardで生成されあcppファイルには全て先頭に ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif と書かれますが、なぜデバッグ時だけTHIS_FILEを変数として定義 する必要があるのでしょうか?
215 :
デフォルトの名無しさん :04/03/02 22:24
visual C++6.0を使おうと思うんですが、ネットで使い方載ってるサイトあります? 初心者レベルで、本当に1からみたいなやつで。
割れ厨は帰れ。通報するぞごるぁ。
>>214 DEBUG_NEWで確保したメモリをdelete忘れしたときに、DEBUG_NEWされたソースファイル名と行番号を表示するのに使うから。
別に無くてもプログラム自体は動く。
1つのクラス(A)を複数のクラス(B,C,D)で使っているんだけど、 そのAクラスにブレークポイントをおいた場合、 デバッガ上で、どのクラス(A,B,C)から呼び出されたかかを知る方法は無いでしょうか? プログラム的に理解できるように作成するしか無いでしょうか?
221 :
デフォルトの名無しさん :04/03/03 10:10
スタティックとボタンに貼り付けるアイコンについて質問です。 リソースで96x96(256色)のアイコンだけを作成して下のように SetIconで貼り付けたのですが、サイズが32x32に縮小されてしまいます。 m_Static1.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1)); m_Button1.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON2)); 縮小されずに表示するにはどうすればいいですか よろしくおねがいします。
>222 最初はビットマップでやっていたのですが画像の背景を 透過にしたかったのでアイコンにしました。 ビットマップでも画像の背景を透過できるのであれば どのような方法があるのでしょうか?
自己レスです。 m_Button1.SetIcon((HICON)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON,0,0,LR_DEFAULTCOLOR)); LoadImageがキャストできたのでこの方法で解決しました。
225 :
デフォルトの名無しさん :04/03/03 13:14
IDD_FORMVIEWってどうやってはりつけするんですか?
ちょっと質問させてもらいますね。 MFCにはあんまり関係ないんですけど… 最近VCがやたら固まります。 特にビルドとかしたら、かなりの確立で「応答なし」状態になってしまいます 以前まではまったくこんなことはなくすらすらとビルドできていたのですが… どなたか解決法おしえてください おねがいします
>>228 いぁ、普通にビルドしてたんすよ。
そしたら急に固まっちゃって…、それ以来ずっとです
入れ直せば?
取り敢えず.nobファイル消してみ
つりじゃないです。 本当にわからないんです。
だめです、再インストールも試してみましたが。どうしてもコンパイル時に 固まります。 >>.nobファイル これ自体見当たらないのですが…どこにあるのでしょうか?
固まるというよりも、コンパイラからの応答がなくなっているという感じです VC++自体は固まってはいません。ビルドの中止も選べますが…選んでも何の 応答もありません、結局のところ強制終了するしか次の作業に進む方法はありません いったいどうなってるんでしょう…
何度も何度も申し訳わけありません。 Debugフォルダを消すとビルド+コンパイルが可能になります。 しかしいったんDebugフォルダができてしまうと、それ以降コンパイルができなく なるようです…
OSごと再インスコしたら? もしくはVCだけ、アンインスコ/インスコするとか。 メモリ周りは大丈夫かな? うちはメモリ設定がSTDだと、メモリがスピードに ついていけずに誤った値になってしまってたよ。 時々、いきなりリブートしてたんだけど、 メモリ設定を遅めにしたらmemtest86でも エラーが出なくなったし安定した。
237 :
デフォルトの名無しさん :04/03/03 16:40
>>227 それ、うちもたまにある。再現不可能。
でも、忘れたころに起きる(w
ビルド直前にファイルは保存するみたいなので、
KILLしてもソース関係は最新状態で残るみたいだけど。
ビルドは終わったのに制御が戻ってこないっていう感じ。
ボタンやメニューはビルド中のステータスのまま。
なんか、特定の操作を行った時に起こる感じはするが、
それがどういう手順なのかはわからない。
ビルドを中止した後に再ビルドすると、
起きやすい感じ(あくまでも感じ)はする。
もしかして
>>231 は.ncbのことを言ってるのではなかろうか。
239 :
デフォルトの名無しさん :04/03/03 17:06
メニューのオーナードローなんかで、 無効で灰色になっているメニューを描画する関数をなんて言いましたっけ? 誰か覚えている方、関数名とその引数フラグを教えて下さい。
240 :
デフォルトの名無しさん :04/03/03 17:07
>>227 XPで使用しているとき、VCのsp5を入れていないと
起こるようです。sp5を入れたらほぼ無くなります
>>239 DrawState
引数はMSDNで...
>>239 DrawState? 詳細は自分で調べて。
あうちちち。リロードしてから書けばよかった…。
皆さんお騒がせしました。 sp5入れたら解決しました ありがとうございますm(_ _)m
246 :
デフォルトの名無しさん :04/03/03 22:03
VS6.0SP6マダー? マチクタビレターマチクタビレター
98世代だかんねー もうじき(ry
248 :
デフォルトの名無しさん :04/03/03 23:24
MFCでプロセス間でメモリを共有させるにはどうすればよいのでしょうか?
>>248 MSDN読め。
共有メモリ、セマフォ、mutex、選り取り緑だ。
エクスプローラー上で、現在選択しているファイル名を取得したいんですが、 何かいい方法はないですか? アクティブになっているエクスプローラのウィンドウハンドルとか取得すればなんとかなりますか?
252 :
デフォルトの名無しさん :04/03/06 11:52
>>251 すべてXPの場合だが
エクスプローラのウインドウ(クラス名ExploreWClassかCabinetWClass)をEnumWindowsなどを利用して検出、
その子ウインドウのクラス名SHELLDLL_DefViewをFindWindowExを利用して検出
そのまた子ウインドウのクラス名SysListView32のウインドウがフォルダービューのウインドウとなるので
同じくFindWindowExを利用して取得。
int Selected=ListView_GetSelectedCount(ハンドル);
関数を利用すれば選択されているファイル数が取得できる。
while(1)
{
i = ListView_GetNextItem(ハンドル,i,LVNI_ALL|LVNI_SELECTED);
if(LvItem->iItem == -1)
break;
}
と回せば、選択されているアイテムのインデックスが次々に返る。
しかし、残念ながらそのアイテムのテキストを取得する方法がどうしてもわからん。
恐らくListView_GetItemかListView_GetItemTextを使用すると思われるが、
ことごとく失敗するのでその先は自分で調べてください
if(LvItem->iItem == -1) は if(i == -1) に訂正
>>221 いまさらだがCImageList::ExtractIconも結構使えるから
頭の片隅に入れておいて損は無いよ
255 :
デフォルトの名無しさん :04/03/06 21:52
仮想リストのような仮想コンボボックスってないですかね。 データ件数が多すぎてどうにも煮詰まってます。
257 :
デフォルトの名無しさん :04/03/06 22:53
なんでMFCのヘッダファイルにはインクルードガードがついて いるのに#pragma onceまでされているのですか?
258 :
デフォルトの名無しさん :04/03/06 23:07
ちょいと変な質問かと思いますが カスタムリソースとして登録したWAVファイルを MCIで再生させる方法はありますでしょうか? #一時ファイルとして書き出したりしない方法であればお願いいたします
>>257 性善説: M$にもアフォはいる
性悪説: 他社のコンパイラを牽制するため
261 :
デフォルトの名無しさん :04/03/06 23:50
MFCだけじゃなくwindows.hとかにもあるよね > #pragma once
#pragma onceって実質コンパイラ依存じゃないんじゃないの?
てことは性善説か
>>252 ありがとうございます。
その方法で何とかがんばってみます。
リソースのダイアログをメニューを押したときモーダルで呼び出すメソッドです リソース内にはタブがありましてタブをコントロールしたいのですが 下記のようにするとエラーがでます。TCITEMの初期化の問題でしょうか? void CMainFrame::OnTest() { resouce_dialog rd; TCITEM TabCtrlItem; TabCtrlItem.mask = TCIF_TEXT; TabCtrlItem.pszText = "Hi!"; rd.m_tab.InsertItem(1,&TabCtrlItem); rd.DoModal(); }
呼び出す位置が間違ってました。スレ汚し申し訳ない
スプリッタウィンドウの各ペインに割り当ててあるビューを動的に切り替えることは できますか?できるとすればどうやったらいいのですか?
ShowWindowじゃ駄目か。そうか。
>>268 すんません。初心者なのでよく分からないのですが、それはこういうことですか?
例えばビューが2つのコントロールを持っていたとして、その2つのコントロールは
クライアント領域全面を占めている。このとき、切り替えたい場合、一方のコントロールを
ShowWindowで表示、もう一方のコントロールは非表示にする。
これなら簡単そうですね。Visual Studio.NETではコードの編集中とデバッグ中では
スプリッタウィンドウの分割すら切り替わっていますが、これは難しそうですね。
どうも回答ありがとうございました。
現在実行中のアプリケーションが 最小化されているかどうかを知るにはどうすればいいのでしょうか? 最小化されてるのに毎フレーム描画処理してて、無駄かな、と。
271 :
デフォルトの名無しさん :04/03/10 15:59
>>270 GetWindowPlacement()
VS2003で開発してるんですけどメニューに項目を追加してIDを入力して
クラスビューからクラス選択してプロパティでイベントの追加でメニューに
追加したID探しても見つからないことが多いんですけど何ででしょうか?
メニューエディタからプロパティで確認するとIDが数字になってるときがあり、
IDを選択しなおすとイベント追加できるんですけど。
正しい順序とかあれば教えてください。おながいします。
272 :
デフォルトの名無しさん :04/03/10 16:20
CListCtrlをオーナードローでやる場合、チェックボックス付けたい時は自前で貼り付けるしかないのでしょうか? 今はDrawItemの中でCButtonオブジェクトを移動してるんですが、これだと非表示領域の分が画面に残ってしまいます。 行が非表示になる時にイベントが来ればいいのですが、そういうのはありますか?
>>270 BOOL CWnd::IsIconic()
274 :
デフォルトの名無しさん :04/03/12 13:51
リストコントロールで質問です。 レポートビューになっている時に、キー操作でスクロールさせた場合ってメッセージ何もdでこないのでしょうか? OnVScrollは反応しませんでした。
275 :
デフォルトの名無しさん :04/03/12 14:52
276 :
デフォルトの名無しさん :04/03/12 15:02
タスクマネージャで終了できないソフトを作ることは可能?
出来るよ。 サービス関係はそうじゃないか? 試しにタスクマネージャで適当なサービスを 終了させてごらん。アクセスを拒否されましたとか出るでしょ。
278 :
デフォルトの名無しさん :04/03/12 16:29
サービスを使わなくてWMでなんとかできないのですか?
監視用プロセスを作ってお互い監視し合い どっちかが終了したらもう一方が再び起動させるというのは? 同時に終了されるとダメだけど。
確かウィルスで、タスクマネージャにプロセスが 現れないのがあったと思うが、これなら 終了できんぞ。w
rikaidekinai baka↑
wを付けるのが寒いってこったろ
ということはIsWindowをつかえばいいってことかな?
285 :
デフォルトの名無しさん :04/03/12 23:12
分割ウィンドウをもちいていくつかのビューを割り当てたときのメニューハンドラを 書く場所について質問です。 あるビューにメニューハンドラを書くと、そのビューがアクティブのときは、そのメニュー 項目が選択可能となりますが、非アクティブのときは選択が不可能です。 アプリケーションクラスやフレームウィンドウにメニューハンドラを書けば、ビューの 状態に関わらず、メニューが選択可能となりますが、必要な情報にアクセスしづらく なります。 こういった場合のどのようにするのが一番いいのでしょうか?
286 :
デフォルトの名無しさん :04/03/12 23:41
ダイアログの最小化で質問です。 ダイアログベースでメインのダイアログから モードレスダイアログを表示しているのですが、 メインのダイアログを最小化すると、 表示されていたモードレスダイアログも見えなくなります。 そのモードレスダイアログの親はNULLにしてあるのですが... どうすればメインダイアログだけを最小化出来るんでしょうか?
VC++7.0のMFCで自作のATLをラップしたActiveXコントロールクラス作成をしたのですが、 メッセージからイベントを設定してもイベント起こしてくれません。 デバッガで見たところ、そのルートすら通ってくれていないようです。 自作のATLActiveXコントロールをラップしたMFCActiveXコントロールクラスから イベントを受け付ける方法はどうしたらよいのでしょうか?
>>285 >状態に関わらず、メニューが選択可能となりますが、必要な情報にアクセスしづらく
>なります。
なぜ?MainFrameなりWinAppなりからViewにメニューが呼ばれたよと
教えてあげればいイだけジャン
>>285 ビューに関することならSplitter、ドキュメント操作ならDocumentにハンドラ作ればいいんじゃないの?
290 :
デフォルトの名無しさん :04/03/13 20:13
拡張コンボボックス(CComboBoxEx)でGetLBTextLen使うと WinMEの場合、文字列の長さをバイト数で返すんじゃなくて 文字数を返すみたいですが、これってWinMEのバグですか? # 例えば"abcあいう"なら通常9を返すところが6が返って来る。 GetLBTextのMFCの内部コード見てみると明らかにヤバいんですけど。 void CComboBox::GetLBText(int nIndex, CString& rString) const { ASSERT(::IsWindow(m_hWnd)); GetLBText(nIndex, rString.GetBufferSetLength(GetLBTextLen(nIndex))); rString.ReleaseBuffer(); } # GetLBTextLen(nIndex)で本来より少ない文字数が返ってくるため # GetBufferSetLengthで文字数より少ないバッファしか割り当てられず # バッファオーバーフローを引き起こす可能性が。
>>286 MFCの場合、NULLにすると親なしって訳じゃないんだよ
ソースを追っていってごらん
>>290 それはほんと?マルチバイトの文字数を返してる感じ。
ホントだとしたらMEのコンボボックスAPI関連のバグっぽいけど。。。。
>>292 ホントです。
これがWinMEだけの問題なのか9x系全般における問題なのかも気になるところ。
なおXPは無問題でした。
294 :
デフォルトの名無しさん :04/03/14 13:18
>>294 非常に参考になりました。
そりゃそうですわ、拡張コンボボックス扱うプログラム組めば
絶対気が付きますもん。このバグ。
只、関数仕様を良く読んでないだけだな。おかしい。
>>285 BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// アクティブでないビューにもメッセージを送る
if(m_wndSplit.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)){
return TRUE ;
}
CCmdTarget *pview ;
int i, j, n, m ;
n = m_wndSplit.GetRowCount() ;
m = m_wndSplit.GetColumnCount() ;
for(i = 0 ; i < n ; i++){
for(j = 0 ; j < m ; j++){
pview = (CCmdTarget *)m_wndSplit.GetPane(i, j) ;
if(pview->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo)){
return TRUE ;
}
}
}
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
CSplitterWndを持ってるクラスでな
>>297 ぬぉぉ、ありがとうございます。このような丁寧なレスはいまだ頂いた例がありません。
これで汚くなってたソースもすっきりしそうです。
299 :
デフォルトの名無しさん :04/03/16 08:34
ライブラリ関係で質問があります。 スタティックライブラリでクラスや構造体を定義します。 struct TESTSTRUCT{}; class TestClass{}; あるDLL内でそのライブラリ内のクラスを使用します。 class DLL_DECLSPEC DLLTestClass : public TestClass{ TESTSTRUCT str; }; としてDLLをビルドしたとき、 "DLL インターフェイスではない TestClass が DLL インターフェイスのベースになる class 'DLLTestClass' として使われています。 またクラス内でライブラリのクラスや構造体を使用したとき、 "__export キーワードを使って class DLLTestClass にエクスポートしてください" といった警告が出ます。 そして作成したDLLを使用するプログラムでも同様の警告がでます。 この警告を無くすにはどうしたらよいのでしょうか? "ライブラリAがライブラリBを使用する"というライブラリを作成する場合、 どうしたらいいのでしょうか?
300 :
デフォルトの名無しさん :04/03/16 23:29
画像のRGBを格納した配列を描画したいのですが どうやったらいいのでしょうか? いちおうSetPixelを使って↓のようにはできます。 でもこれだと1ピクセルずつ描画するので遅すぎです。 配列を一気に描画する方法はありませんか? for(j=0;j<yh;j++) for(i=0;i<xw;i++){ color=pDC->GetPixel(i,j); r=GetRValue(color); g=GetGValue(color); b=GetBValue(color); pDC->SetPixel(i,j,RGB(r,g,b)); } }
まず遅くなってる原因を突きとめろ
>>300 BitBltはお嫌い?
CreateBitmapにも初期値は指定できるが・・・?
>>300 それだと、
pDC->(i,j, pDC->GetPixel(i,j));
でいいんじゃね?
おっと。 pDC->SetPixel(i,j, pDC->GetPixel(i,j)); な。
レスサンクスです。 あした試して見ます。 X×YのRGBの画像を格納した配列を img[x*y*3]としたとき BitBltを使って描画するとどうなるんでしょうか? デバイスコンテキストの使い方がよくわからないです。。。 Windowsプログラム初心者なものですいません。
308 :
デフォルトの名無しさん :04/03/17 12:44
リストコントロールのソートの方法ですが SortItemsで指定したコールバック関数(CompareFunc)の LPARAM lParam1, LPARAM lParam2って何を示しているのでしょうか。 ぐぐって見たところ比較するアイテムのインデックスとあちらこちらで書いて有りましたが 実際見てみるとインデックスなどではなくなんかのポインタのようです。 これからどのようにしてアイテムを識別するのでしょうか。
309 :
デフォルトの名無しさん :04/03/17 13:14
自己解決しました。 これはSetDataでアイテムに関連付けされたデータのポインタですね。 よくサンプル見てみるとSetDataでインデックスの値を設定していました。
自分のソースではインデックスになっていた。
自分のソースは列ごとにソートするのでデータのポインタになっていた。
299ですが、警告だけなので実際に使うには問題ないのですが、 やはり警告が出るからには間違ったやり方なんだと思うんですけど、 対処法ご存知の方いませんか?
313 :
デフォルトの名無しさん :04/03/17 16:16
CControlBarの派生クラスを、CFrameWnd内にツールバーおよび左ペインとして ドッキングさせているのですが、それぞれ DockControlBar(&myLeftBar, AFX_IDW_DOCKBAR_LEFT); DockControlBar(&myTopBar, AFX_IDW_DOCKBAR_TOP); とした場合に ┏━━━┓ ┣┳━━┫ ┃┃ ┃ ┗┻━━┛ こういう具合にドッキングさせることはできるのですが、 ┏┳━━┓ ┃┣━━┫ ┃┃ ┃ ┗┻━━┛ こういう具合に、左ペインがFrameWnd上端まで貫通した形でドッキング させることができません。DockControlBarを呼ぶ順番を変えてみたりも しましたがダメでした。 コントロールバー類は動的に追加されるので、スプリッタは選択しませんでした。 何か解決法ご存知の方いらっしゃったらよろしくお願いします。
>>313 漏れもそれで苦心したことがあったけど、CControlBarでは多分無理。
何かのドキュメントで読んだ覚えがあるのだけど、
優先順位は、上・下 > 左・右 らしい。
>>314 うーん、そうですか・・・ステータスバーとかツールバーとしての利用が
メインだろうからそういう仕様になっているのかな、困った。
CFrameWnd::RecalcLayout()を上書きでできるかも、やるならCFrameWndのどこかだろ
317 :
デフォルトの名無しさん :04/03/17 18:00
大変申し訳ないのですが、誰か COleCurrency operator/(COleCurrency curX, COleCurrency curY); を定義してくれ〜。 (curX.m_cur.int64 / 10000.0) / (curY.m_cur.int64 / 10000.0) とかは無しで
>>313 ですが、自己解決しました。
MSDNの「テクニカル ノート 31: コントロール バー」に
「コントロール バーの配置アルゴリズム」という項があって、
バーたちはZオーダー順に親のクライアント領域を奪い取って行く、
というのは分かったんですが、実際にそれぞれのBringWindowToTopを
呼んでもZオーダーは変わってくれません。
MFCのソースを読んで行くと、どうやらコントロールバーは一旦
CDockBarを介して配置されているようなので、
HWND hwnd = m_MyLeftBar.GetParent()->GetSafeHwnd();
::BringWindowToTop(hwnd);
としたのちCFrameWnd::RecalcLayout()を呼んだところ無事
313の下のように配置することができました。
でも、この方法だとまだ
┏━━━━┓
┣┳━━━┫
┃┣━━━┫
┃┃ ┃
┗┻━━━┛
というのは実現できないんだよなあ・・・・。
DIB使ったら簡単にできました。 1日でだいぶ上達した気がします。 また何かあったらよろしくお願いします。
320 :
デフォルトの名無しさん :04/03/18 11:24
MFCでWin32APIコールする場合、ネームスペースは何を使いますか?
321 :
デフォルトの名無しさん :04/03/18 11:27
C#
>>318 ユーザレベルの意見で悪いが、そんなドッキングは構造的に無理なんじゃないか?
VC++でやってみてもそんな配置に出来ねえし・・
323 :
デフォルトの名無しさん :04/03/18 14:19
OnDraw中でテキストを表示する時の現在のフォントの文字高は 以下のように取得するのが普通ですか? 10年少々前のお話ですが、昔は、フォントの文字高+行間だったと 記憶しております。確かLogFontEXとかそんな名前の構造体を取得して 行間を取得していたような・・・ // TODOing: この場所にネイティブ データ用の描画コードを追加します。 long lMaxLine = pDoc->m_lMaxLine; int iCharHight; CFont* pFont; if ( ( pFont = pDC->GetCurrentFont() ) == NULL ) iCharHight = 20; else { LOGFONT lf; pFont->GetLogFont(&lf); iCharHight = lf.lfHeight; } for (long i=0; i<lMaxLine; i++) pDC->TextOut(0, i * iCharHight, *(pDoc->m_ppLine[i]));
スレ違いの匂いプンプンだけど、TEXTMETRICだべ。
>>324 ありがとうございます。
LONG lCharHight;
TEXTMETRIC tm;
if ( pDC->GetTextMetrics(&tm) )
lCharHight = tm.tmHeight +tm.tmExternalLeading;
else
lCharHight = 20;
でしたね。
326 :
デフォルトの名無しさん :04/03/18 22:47
vc6使ってます リソースエディタのダイアログエディタでテキストボックスとボタンをつくり ボタンを押したらOpenFileNameでファイルを選択。その選択されたファイル名を テキストボックスの変数に代入、そして画面上でも反映させたいんですけど、どうすればいいのでしょうか?
>ボタンを押したらOpenFileNameでファイルを選択 なんだそりわ
>>326 人に聞かずとも、ちゃんと調べれば誰にでもわかる。
わからなかったら、プログラムやまれ。
>>327 ダイアログエディタでボタン作ってそれを押したときに
GetOpenFileName関数を呼び出してダイアログからファイル名を選択するようにしたいのですが
これじゃ変なんですか?
>>328 時間かければわかると思いますがちょっと今時間がないんです。勝手な理由ですが
ヒントだけでもお願いします
変
ヒントねぇ…MSDN見てみ。良い事あるかもしれない。
UpdateDataでなんなく更新されました 申し訳ないです
334 :
デフォルトの名無しさん :04/03/19 09:30
UNIXサーバにおいてあるCOBOLソースを Winよりワンクリでプレビューするアプリを作成しています。 CinternetSessionクラスを使用して ファイルをWinに落とし込み 漢字コード 改行コードを変換する仕組みなのですが 逆に修正したファイルをそのままUNIX側にPut(書き込み) できないものか思案しています。 変換については、win漢字コード、改行コードのロジックをその まま逆変換でいけそうなのですが、 ファイルを置く処理が見つかりません。どなたか教えていただけないでしょうか?
仕様 環境がもれていましたすいません Win側の操作画面はVBで作成しており一覧が ファイル一覧がFlexGridにより表示されまして 対象ファイルをクリックすると、VC(MFC)で 作成したDLL関数をコールします。 NT4.0 VS97(SP3)となります。
デバッグバージョンでコンパイルすると起動し、 リリースバージョンもVCのデバッガ上なら動作するが、 リリースバージョンを単独で立ち上げると、 DocやViewのコンストラクタまでは行くものの OnNewDocumentまでたどり着けずアプリが起動しない症状には、 どんな原因がありそうですか? #ifdef _DEBUG などはウィザードの作成したもの以外ありません。 リビルドや「プロジェクトの設定」の最適化の無効もだめでした。
エラーを出すのか、それともまったく音沙汰無しなのか。
>>336 カレントディレクトリに依存しているものがある
CBitmapButtonを使おうと思ってるのですが、 メンバ関数のLoadBitmapsにはリソース名かIDしか渡せません。 他のモジュールにあるビットマップリソースを使いたい場合は CBitmapButtonは使うなってことでしょうか?
>>339 CButtonのオーナードローで我慢汁
>>339 派生して好きなようにロードすりゃいいやん。
>>337 ,338
回答ありがとうございます。
エラーの類は皆無です。
タスクマーネジャにちらっと出てきてそのまま終了。
タスクバー等にはまったく反応がありません。
"Release"フォルダ内で実行しても変化なしです。
デバッガで走らせているときはちゃんと動作するので、
どうやって調べたものか困っています。
>>340 ,
>>341 とりあえずオーナードローでなんとかなりますた。
派生だとCBitmapがprotectedで継承すると・・?と、勉強不足で
まだよくわかりません。こっちは将来の宿題にしておきます。
回答どうもでした。
俺はオナニーでドロッとなる フフフ
CEditで特定の行だけ色を変えるのはどうすればいいのでしょうか? ダイアログにエディットボックスを貼り付けてるのですが、エディット ボックス全体の色は変えられても、特定行だけ変える方法が分から ず困っております。 尚、環境はVC6++でMFC42を使っています。
カラフルにするのはエディットボックスの仕事じゃない。 リッチエディットか自作。
>>342 メッセージボックスを使うのは駄目?
1動作ごとにメッセージボックスでとまるようにガシガシ入れ込めば、
どこまでちゃんと動いているか調べられるよ。
ついでに使ってる変数の値なんかも表示するようにしておけば、
面倒だけど、デバックモードみたいに動作をおっかけること可能。
メッセージボックスより OutputDebugString() 使えyo
>>347 ,348
どうもです。一応ポインタ周りなんかは見ましたが、
不正な値ではなさそうです。
前述の通り、MainFrame、Doc、Viewの各コンストラクタ
止まりで謎の落ち方をするのでお手上げ状態。
1ヵ月ぐらいさかのぼって、正常に動いた時点から
やり直すしかなさそうです。
>>349 Appのほうは追っかけてる?
InitInstanceの中おっかけてみそ
>>347 TRACEマクロ知らんのか
printfと同じ使い方で経過表示できるぞ
352 :
デフォルトの名無しさん :04/03/20 22:51
>>351 リリース版でTRACEが使えるとは知らなんだ。
どうやって使うの?
>>348 336は、
>デバッグバージョンでコンパイルすると起動し、
>リリースバージョンもVCのデバッガ上なら動作するが、
>リリースバージョンを単独で立ち上げると、
って言ってるのだが、
OutDebugStringの結果は何で受け取ればいいの?
>>351 俺も知りたい。
OutDebugStringを拾うデバッガならベクターに何個かあるよ
355 :
デフォルトの名無しさん :04/03/20 23:53
ゲームをつくってるんだけど質問です メッセージループのなかでDrawFrame関数を呼び出して いるんだけど void DrawFrame() { static BOOL Flag = FALSE; if( !Flag ) { OpeningInit(); Flag = TRUE; }else OpeningMain(); } OpeningInitで初期化をしてるんだけど もっといい方法ないですか? 単なる変数の初期化なども、このやり方だと不便で・・・ クラスを使ってもいいので簡単な方法教えてください 一度しか呼び出したくない関数や、ある時に一度だけ変数に代入したい 時など困ってます
>>355 そうやるのがいちばん簡単だと思うが。
あと、Flag なんて言う何をしてるかわからん変数名はやめた方がいい。
(これぐらい短いと問題は少ないが。)
void DrawFrame(){
static BOOL FirstTime = TRUE;
if( FirstTime ){
OpeningInit();
FirstTime = FALSE;
} else {
OpeningMain();
}
}
ありがとう これでよかったんですね 後
↑失敗 後、クラスでコンストラクタをつかっての初期化が便利と聞いたけど 関数を呼び出すたびにコンストラクタも呼び出されるんですね 初めの1回だけなら便利なのに・・・
ちょいと相談。 ファイルをロックしたいんでHANDLEが欲しいのだけど、 問題のファイルは既存のライブラリ内でfopen()されている。 #unixならfileno()すればすむんだけど ストリームポインタからHANDLEを取得する手段ってなんかあったっけ?
(HANDLE)_get_osfhandle( _fileno(fp) );
>>359 おまいは参照辺りをしっかり勉強した方がいいぞ
363 :
デフォルトの名無しさん :04/03/21 11:35
>>336 関係ないと思うが、VCから起動する場合と
エクスプローラからダブルクリックで起動する場合、
コマンドライン引数が微妙に違う。(漏れの環境(VC6.0SP5XP)では)
何が違うかと言うとGetCommandLineで返ってくる文字列が
エクスプローラの場合最後にスペースが付加され終わっている。
その違いで出てたバグを発見するのにずいぶん苦労した記憶アリ。
基本的なことだけど 一度中間ファイルの類を全部消してからリビルドしてるかな?
>>363 そのケースだったら、プロジェクトの設定でコマンドラインパラメータに空白を入れておけば再現できそうだね。
>>361 Thanx!
手元に開発環境ないんで検索してみた。
Pythonのマニュアルしか見当たらなくて不安だけど、明日出社したら早速試してみるよ。
367 :
デフォルトの名無しさん :04/03/22 15:03
タスクトレイにある 特定のアイコンを非表示にする方法はありますか? FindWindowでハンドルとって ShowWindowでHide にしても駄目でした。 お願い致します。
ActiveXが何故かWindowsのシャットダウンのWM_ENDSESSIONを 拾ってくれないんですけど仕様ですか?
369 :
デフォルトの名無しさん :04/03/23 00:33
MDIでCDocument一つからCView複数開いた時の各子ウィンドウの キャプションのコロン後の数字ってどういう規則で付いてるの? 教えて下さいませm(_O_)m
>>346 亀ですが、おおせの通りリッチエディットに変更して対応しました。
どうもです。
371 :
デフォルトの名無しさん :04/03/23 23:18
CStringの寿命に関して混乱してきちゃったから、ちょっと教えてください 関数の戻り値にCStringを指定したときの、CStringの動作がよくわからない いったん、コピーされるのかな・・? 1. CString test1(){ CString aaa("test"); return aaa; } 2. CString test2(){ char aaa[] = "test"; return aaa; } 1、2とも問題ないですか?最近までCで、char使ってやってたんで、1でも不安なんだけど、 引き継いだソースに2みたいなのがあって、これはどうなんだろうと・・
1はOK、2はNG
御免、勘違いした。両方ともOK。
>>371 寿命も何も変数なんだからそこはCの基礎とかわらんだろ
あ、OKですか。ありがとです いや確かchar *で返した場合 char *test3(){ char aaa[] = "test"; return aaa; } 関数抜けたら寿命が尽きるので、その配列使っちゃいけないってきいたきがするから不安だったんです。ドモドモ
各々
>>375 にいいたい事はあるだろうがMFCスレなので放置しなさい。
まだレスがついているとは思いませんでした。
どうもありがとうございます。
>>363 それは知りませんでした。その辺、調べてみます。
>>364 はい。もうDebugもReleaseもフォルダごとごっそりと。
あと、ソースファイルの階層には、
消さなきゃいけないものなんてないはずですよねえ……?
379 :
デフォルトの名無しさん :04/03/24 00:50
>>378 .aps.clw.ncb.opt.plg辺りも一応消しておくと良いかも。
.plgは消す必要なし。 尤も、残す必要もさらさらないけどな。
>>381 なきゃ勝手に生成するっしょ。
消すまでもないと思うがな。
383 :
デフォルトの名無しさん :04/03/24 09:37
.clwがおかしくなる事は良く有ります。 ただしそれがコンパイル時にエラーの原因になるかどうかは分かりませんが。
IDを変更しないままコントロールを削除して同じIDをもつコントロール を付け加えたりとか、関数なんかもそうだけど、そういうことが何回も 繰り返していると時々、ソースは正しいとしか見えなくてもコンパイル するとエラーになったり。そういう時は.clwを削除して作り直すと 何事も無かったかのようにコンパイルが通る。
何人もの方にアドバイスをいただけてありがたいです。 残念ながら.clw等の削除もコマンドラインのほうも 解決には至りませんでした。 おそらくポインタ or 配列がらみだと思うんですが、 おとなしくロールバックします。ともかく感謝です。
386 :
デフォルトの名無しさん :04/03/30 11:34
387 :
デフォルトの名無しさん :04/03/31 09:01
VBでいう、DoEventsみたいのは どうやれば良いですか?
DoEventsがよくわかりません。 どんなものですか?
>>388 Windowsに一旦処理を渡す時に使いました
無限ループを組んで、その中にDoEventsを入れとくと、
無限ループ中でもWindowsがメッセージを発行して、
イベントが発生(何か変・・・)してくれるものでした
>>389 ふつうは無限ループの中で直接APIを呼ぶと思うのですが。
VBにはそういうものがあるのですね。
PeekMessage、DispatchMessageあたりを調べてみてはどうでしょう?
>>390 早速の回答ありがとうございます!
こんな感じで出来ました!
MSG msg;
while(1){
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message = WM_QUIT)break;
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
SendMessage(WM_QUIT,0,0);
と思ったら、 msg.message == WM_QUIT に直したら、終了しなくなりました・・・
breakしたあとメッセージはどうなるのでしょう? と、考えてみては?
すいません。REGETのようなGUI作りたいんですけど MFCを勉強するにはどのような書籍を読んだらよいのでしょう?
サルでもわかるMFC
396 :
デフォルトの名無しさん :04/03/31 21:17
397 :
デフォルトの名無しさん :04/03/31 21:53
ノシ
398 :
デフォルトの名無しさん :04/03/31 21:54
SDKヲ理解できる猫もいないだろうな。
>>394 初心者といっても様々。
このスレに記事をつけたのだから「VC++は持ってるんだろうな」
ぐらいしか分からない。
君のレベルが分からないと薦めようもない。
400 :
デフォルトの名無しさん :04/04/01 00:22
ダイアログベースのMFCアプリケーションで、 ダイアログが閉じたあとに、::AfxMessageBox()や::MessageBox()を呼んでも メッセージボックスが画面に表示されないのはなぜでしょうか? CFooApp::InitInstance()で、dlg.DoModal()から帰って来た後で 呼び出してます。
>>399 VC++4.0 時代にMFCを使いこなそうとDocumentとViewクラスを一度に理解しようとして挫折
再度、VC++6.0でMFCプログラミングを始めてここ1日〜2日、Viewクラスへ書いて
テキストボックスやらボタンやらチマチマ書き始めて動いた程度。
今、参考にしているのは「新Visual C++ 6.0入門シニア編」地味?なので少し
色々な事ができないか...と模索中
MFCの定番はKruglinski。 亡くなってから、もうずいぶん経った。
CScrollBarの下側を0として上に行くほど数値が上がるような扱いに したいのですが良い方法はありますか?
スクロールMAXから現在位置を引く
取り合えずなんにも分からん。何でもいいので教えてくれ。
>>405 CString str;
str = "Hello World!"
MessageBox(str);
>>400 多分、m_pMainWndが閉じられたら後は終了するだけ、
新しいウィンドウの作成は許可しないとか言うように
MFCのフレームワークが設計されているんじゃないかな?
実装方法はフックでも使ってるんでしょう。
試しにm_pMainWnd = &dlg;をコメントアウトしてみると使えるようになる。
ただしm_pMainWndを指定していない場合、他の場所で不具合が出るだろうと思うが。
すみません。昨日から悩んでいます。VC6です。 Inside VisualC++ ver.5のサンプルのようにActiveXのオートメーションを作りました。 (659ページ辺りからのexcelのボタンを押すと反応するやつ) まったく同じではありませんがVBAでは動きますしデバッグ用のコンテナでも動きます。 ところがVBS(+ASP)だと動いてくれません。 具体的にはCreateObjectはいくけどmethodを呼ぶとエラーになります。 ググってみたのですがサンプルがありません。 とりあえずVBSがうごくだけでいいのでサンプルの場所を教えてください。
>>407 サンキュ。
Hookの中までさんざんトレースしてみたけどわけがわかなくて。
結局、OnCancelの中で処理をすませるようにごまかした。
すみません。 SDIやMDIのフレームにツールバーやダイアログバーをくっつけたとき、 その縦のサイズが全部でどれだけなのかを知る方法ないでしょうか。 viewの(0,0)をclientToScreenしても、ダイアログバーなどをフレームに くっつけてると、スクリーンにしたとき、yがそのぶんだけずれている ようなのです・・・。ヘルプ!
連続すみません。 最大化しているかどうかなども踏まえてウインドウの位置を レジストリに記憶させておきたいのですが、 GetWindowPlacementの値をbinaryで書き込んでおき、 起動時にSetする、ではうまくいきませんでした。 いろいろやってみたのですが、復元時に最大化状態にセット することができませんでした。 やってる場所がわるいのでしょうか・・。
>>411 ちゃんと書き込めているか、書いた情報がきちんと取り出せているか確認。
>>409 OnDestroy()の方がスマートかもしれん。
414 :
デフォルトの名無しさん :04/04/04 03:29
すいません。どなたか教えてください。 エクスプローラみたく分割ウインドウをつくっていて 左側のウインドウの右クリックからポップアップメニューを 表示をさせようと思っています。 そこで、CLeftViewにContextMenuを追加したのですが 右クリックではイベントはこなくて、右ダブルクリックで イベントがくるのですが、なぜでしょうか? なにか足りないのでしょうか?
>>414 どういうコントロールなのか知らないが、複数選択の許可に関する問題で
「ダウン−ドラッグ−アップ」じゃないとイベントが起きない場合がある。
アップのところに置いてみたらどうか?
返信ありがとうございます。 そして説明不足すいません。さらにMFC初心者でごめんなさい。 >「ダウン−ドラッグ−アップ」じゃないとイベントが起きない場合がある。 >アップのところに置いてみたらどうか? ごめんなさい。「ダウン−ドラッグ−アップ」の意味がわかりません。 アップのところにcontextmenuをおけばいいってことでしょうか? (アップの意味もわかってないのですが) いや、ほんと、初心者でごめんなさい。 ちなみに >どういうコントロールなのか知らないが っていう質問にはどういう風に回答すればいいのでしょうか? ツリーコントロール?SDI? ほんとすいません。
長いから要点だけ 【環境】 ・VC++6.0 【症状,状態】 ・ClassWizard→メンバ変数で作成したクラスに対してインテリセンス機能が働かない(CEditクラス等) ・自作のクラスメンバに対してはインテリセンス機能が働く ・ビルドする際には問題ない. 【考えられる原因(推測)】 自宅と職場で作業ディレクトリの位置が違う これなんとかならないでつか?ビルドには問題ないんですが あれがあるのとないとで便利さが全然違います・・・(つД`) 作業ディレクトリを同じにすればいいんだろうけど こいつの為にわざわざHDD追加したり,パーティション加えたりするの面倒っす.
.clwとか.ncbとか.apsとか.optとかその辺消してプロジェクト立ち上げなおして クラスウィザードでなんか作り直すと上手くいくかもしれない
>>418 オマイ天才!機能が復活すますた.
ありがとうー!やっぱお前は出来る子だと前々から思ってたよ
>>419 悪いがそんなことは、うちのインコでも知ってるよ
FAQ中のFAQであることは間違いないな
そんなのうちの清原でも知ってるよ
清原って誰やねん!
おれ、おれ
うちの桑田はポカンとしてたよ。
うちの北野は仕様書作るのに1年かかったよ。
うちの松坂は未だにprintf止まりだよ。
少しワラタ
431 :
デフォルトの名無しさん :04/04/12 11:25
MDIの任意の子ウィンドウの「閉じる」を禁止にして, 右上の×ボタンも灰色にすることは可能でしょうか? SDIなら可能なようですが・・・
子ウィンドウ毎にフレームとビューを用意してやれば出来ると思うよ。
433 :
デフォルトの名無しさん :04/04/14 14:19
BMP,JPEG,GIF,TIFF,PNGなどの色々な形式の画像ファイルを読込んで、 HDCで描画したいのですが、複数の画像ファイル形式を読込むことが出来る 便利な関数はないでしょうか?(TIFF,PNGは無理そうな気がします。)
HDCって時点で、MFCとは激しく無関係な悪寒。
system("susie ***.png");
>>433 ImageMagickとか?
tiffだけならlibtiff、pngだけならlibpng+zlibって手もあるが。
>>433 CImage
GDI+
OleLoadPicture()
CImageってフリーソフトですか?
440 :
デフォルトの名無しさん :04/04/15 10:52
MFCを使って、Excelのシートのようなもの(コピー&ペーストができたりなど)を ウインドウに組み込むにはどうすればよいのでしょうか?
>>440 /support.microsoft.com/default.aspx?scid=kb;ja;179706
ありがとうございます。 そこを読んでやってみます。
MFCの入門書なら 潟Aンク 最新 これからはじめるVisual C++ はどう? IDEの使い方がわからないレベルから始めてるよ。
>>445 安っぽい理由で諦められるんなら、そもそもWindowsプログラムなんでするなと。
By ゲイツ
447 :
デフォルトの名無しさん :04/04/16 18:27
でも、VCって高いよな。 ACでシェアってよかったけ?
ACって何?
449 :
デフォルトの名無しさん :04/04/16 18:53
アカデミックのことだろ?
誰が諦めたの?
451 :
デフォルトの名無しさん :04/04/16 21:47
>>447 おまえらの話聞いてると金銭感覚があるようで実は無茶苦茶だな
趣味であろうと仕事であろうと共通してるのは動機が希薄ってことだ
その観点じゃ1円でも高すぎなのを
さも投資予算が決まっていそうな口ぶりで難癖つけるだけのハリボテ野郎が
gccだのborlandだののDLにかかる回線使用料が親の金だったらお笑い草だな
むしろ回線使用料に比べて高いって意味じゃ
馬鹿みたいな話かもしれないが、知識のある奴はそれなりの出費をしてるからね。 これをMSへのお布施と思うか、自分への投資と思うかはそれぞれだが。 それを、高価などという理由で「教えてクン」する奴は、やっぱ腹立つもんだと思うよ。
何一人で怒ってるんだ。 教えてくんてどのレスよ?
VCのパッケージは安いものでも一万円オーバーするんだから 特定用途向けツールへの投資としてはちょっと大きいってのはあるだろう 回線は汎用インフラだからな まあでもその話と「教えてクン」ってのがどうつながるのか全くわからんが・・・
(MFC 限定かというとちがうかもしれませんが) #import についての質問です。 vbscript.dll\3 を指定したい場合はどうしたらよいでしょうか。 #import "C:\WINDOWS\system32\vbscript.dll\3" とすると、 コンパイル時にエラーになる。 #import "C:\WINDOWS\system32\vbscript.dll" とすると、 コンパイルできるが、これは目的のものではない。
ごめんいみがわからない。
なんでエラー内容書かないんだろう
\をディレクトリと見ているに 100モグモグ
というか、456は、「vbscript.dllというディレクトリ下の3」以外の 何を期待しているのか。
461 :
デフォルトの名無しさん :04/04/17 02:12
>>447 つーか、常識で考えたら分かるだろ。
なんでVCを他人とシェアして許されると思うのかが不思議だ。
そっちのシェアじゃぁないと思う
ACでシェアウェア作るって言いたいのかな? まぁ、やめとけ、といいたい。 つーか、学校の端末を使って作ったら問題ありだろうしね。
ダイアログベースのプログラムでDIBビットマップを表示したいのですが どのようにすればよいのでしょうか? よろしくお願いいたします.
>>464 まず、googleへ行って"DIBの表示"でぐぐる。
「googleに行ってぐぐる」とはあまり言わないね
頭痛が痛い
MFCのピクチャーを貼り付けて,そこに好きな画像を書きたいのですが サンプル等在りませんでしょうか?
>>470 >>468 の書きぶりから全く外れてるんだが・・・
やりたいことと手段の方向性が見えてないような気がする
そのレベルだったら初心者向けのソースコード付きの解説本でも一冊最初にやったら?
ピクチャボックスに任意のビットマップを張りたいだけ?
その上にキャプション書いたりしたいんでしょ
>>470 の書き方からするとドローかペイントのグラフィック・ソフトのように思えるが
>>474 俺もそう思う。しかもピクチャボックスがそれをサポートするコントロールだと勘違いしてるような気も・・・
まあ最終的にはグラフィックソフトなんだろうけどとりあえずはピクチャボックスを どうしたいんだろ?
strstr関数で、英字の大小を区別しないみたいなやつってありますか? 例:strstr("abcdefg.WaV", ".wav") != NULL が true となるような関数が欲しい
マニュアルくらい読めばぁ?
CStringクラスにありました。。
SDIでペインを作成しペインから他のペインにあるコントロ−ルにアクセスする 方法はどうするのでしょう? AfxGetMainWnd())->m_wndSplitSub.GetPane() ですか?
自己レス。 AppクラスにCWnd のメンバを作ってペインのOnInitUpdate() に thisポインタを入れて、 他のペインからそのメンバのCWndを参照すればアクセスできました。 みなさんはどうやってるのでしょうか。
俺だったら this->GetParentFrame() で親フレームを拾って、 そこに定義しておいた子ペインにアクセスするメソッドを呼び出す。 まあ、操る人が一番迷わない方法でいいんじゃないの。 既に解決してるみたいだし。
どうも。試してみます。 いろいろな方法があるみたいで、それはそれでおもしろいですね。
IEのお気に入りのように、プログラムからメニュー項目を 追加したいのですが。どうやればよろしいんでしょうか?
>>485 CMenu
AppendMenu()
InsertMenu()
487 :
デフォルトの名無しさん :04/04/21 00:37
MFC関連でいい書籍って無い? 林晴彦みたいな、ぬるいのは嫌です。
>>487 いい書籍っていってもあなたの基準が明確でないと返答に詰まる。
ヒントはぬるいのはだめってことだけらしいけど、もう少しどんな感じの
ものが欲しいのか明らかにしたほうがレスがつきやすいと思う。
>>488 新しい仕事でMFCを使用しているんです。
主に、ダイアログベースで細かいデータ表示などをやるプログラムを量産しています。
ダイアログベースと言うのは、間違っていると思うんですが、
そこの会社が昔からこのやり方なので方法を変えたくないらしいです。
CListCtrlを継承させてセル単位で背景色を設定や入力できる物や
コントロール2つ以上を同期で選択とか、ダイアログなのにスプリットバーや
その他いろいろ
基本的に、クラスをそのまま使うことがないんです。
あと、私がWindowsプログラミングにあんまりなれてなくて
細かいメッセージの流れとかがよくわかってない時もあったり
単純なウインドウならわかるけど、ListViewとかのコントロールのメッセージや
MFC独自の物とかのメッセージが、いまいち。
時間をかけて調べればわかることなんですが、
そういうことを書いてある本が欲しかったり
C++のテンプレートなどは理解できています。
ジェネリックプログラミングも多少わかります。Boostもいろいろ使ったり出来ます。
WTLに興味があるんですが、会社で使えるのかわからないので
現在深くやる予定はありませんが、多少知っておきたい。
まあ、結構深く突っ込んだり、コアなTips系とか
いろいろ書いてある本が欲しいです。
現在飼おうと思ってる本は、
http://www.ascii.co.jp/books/detail/4-7561/4-7561-3143-3.html です。
この本っていい?
本ばかり追いかけてると、財布がつらいので、 WEB上で検索かけてサンプルコードを拾ったりしてる。 そのほうがすぐ使えるし。
CodeGuru とか CodeProject 見た方が良いと思うよ。
webページもいいんだが、 仕事場が、すぐにネットにつなげれる環境じゃないんです。 あと、通勤時間が結構あるし 本も欲しいかなと。 なんかないのー 買っちゃうおー
>>492 >仕事場が、すぐにネットにつなげれる環境じゃないんです。
先ず、その環境を何とかせにゃならんと思う。
まさか、会社でダイアルアップでもないでしょ?
確かにネット環境は必要だね。 ちゃんとした情報を得るには書籍やMSDNが一番だけど、ヒントやサンプルはまずGoogleって感じ。
クルグリンスキーと言ってみるデバッグ
496 :
デフォルトの名無しさん :04/04/21 05:16
APIの関数名で検索しても、関連サンプルは出は出るわ。 使わない手は無い。というか、使えないのは明らかに損!
498 :
デフォルトの名無しさん :04/04/21 19:17
コンテナ上にExcelを貼り付けて、 そのExcelから既存のExcelファイルを開くにはどうすれば良いのでしょうか? また、その時マクロを実行するにはどうすれば良いのでしょうか?
CListCtrlで”選択マーク”を外したいのですが、 SetSelectionMark(-1) ってのありでしょうか?
ファイルの権限を変えるのどうするのでしょうか。 アドミンだけ書込みを許可するなどです。
502 :
デフォルトの名無しさん :04/04/23 18:38
\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run レジストリのこの位置に登録すると自動起動しますが、 MFC6.0 で登録するにはどうやるのでしょうか。 H_KEY_CURENT_USER 以外には書き込めないとか..?
そりはMFCとは関係ない。
>>502 MFCでなぜ?
RegOpenKeyEx
RegQueryValueEx
RegSetValueEx
RegCloseKey
>>501 AtlSetDacl()とか調べて頑張れ
pMenu->CMenu::AppendMenu(TRUE, IDM_DINAMIC_MENU, NULL); とやると error C2668: 'AppendMenuA' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) とエラーが出てしまいます。対処法を教えてください
オーバーロードの意味を聞いてるのではなく、MFCの使い方が知りたいのです。 ありえないけどCMenuを書き換えるか、 CMenuを継承したクラスに書き換えてメンバーも修正? それ以前になんでAppendMenu関数が実装されてないの? AppendMenu関数作るとしたらどんな風に書けば良いのですか? ということです。 SDKなら何とかなりそうですが、MFCは変更がしづらくて分かりいにくいです。
>>506 関数の仕様から調べなおしたほうがいいでそ。
>>506 馬鹿だねぇ。オーバーロードをちゃんと理解してれば
コンパイラがオーバーロードを解決できない場合がどんな場合か
わかるだろ。
512 :
デフォルトの名無しさん :04/04/24 22:43
今日からMFCの勉強を始めました。(WIN32SDKで今まで全てを行っていました) 今までは全部手打ちでVSの機能はビルドとデバッグぐらいにしか使っていなかったのですが MFCやるのだし、と思って色々やってみました。 そこで、ちょっと嫌だなとおもったのが(MFCの話じゃないですが) メンバ変数の追加、やメンバ関数の追加でコードをジェネレートして追加すると ヘッダファイルがえれー汚くなります。 これってもう自分で書き直す(コピペで)以外に解決策ってないんでしょうか。
>>512 自分で治せる余地が提供されてるんだから、それでいいと思うんだが。
>>512 自分で書き直すのが最善策だと思います。
つーか、最初から「メンバ変数の追加」なんて使わなければいいのでは?
516 :
デフォルトの名無しさん :04/04/25 08:50
>>512 「メンバ変数の追加」は俺も使わない
インデントもへったくれもない行儀の悪さに加え
極めつけはテンプレートインスタンス型をサポートしていない点
「メンバ関数の追加」にも不満はあるものの
ヘッダとソースの連動修正をやってくれるので
まあ使ってやることもあるが
517 :
デフォルトの名無しさん :04/04/25 14:16
.net使っています。 for文で、 for(int i = 0; i < x; i++) みたいに書くと、標準C++では、変数iはfor文ブロック内が スコープなはずですが、.netだとそうじゃないんですよね。 これってコンパイラで切り替えることってできるのでしょうか?
519 :
デフォルトの名無しさん :04/04/25 16:19
調べる。以上。
>>517 そうじゃないのはどういうことかの説明が不足している。いじょ。
そうじゃないの具体的な説明が無いので反応しようが無い。いじょ。
なにこのスレ?(AA略
具体的も何も、そこで求められている物が一つしかないのは明らかだ。胃腸。
状況がつかめなければアドバイスの仕様が無い。いじょ。
人にものを聞くのに、高飛車な態度になってる香具師に、 まともに答える義理は微塵も無い。以上。
528 :
デフォルトの名無しさん :04/04/25 18:24
>>527 必ずしも高飛車でなくたって低姿勢な香具師にも答える義務がない点に違いはないんだが
しかも高飛車な漏れ(525)は、質問者では無いし。非常。
知らない間に、このスレを荒らしている俺たちは逝ってよし。いじょ。
妹は処女
アタシは痴女
533 :
デフォルトの名無しさん :04/04/25 20:04
C言語初心者ですが 「これはいい!」って参考書ありませんか? 本屋さんにはたくさんの参考書が置いてあり どれがいいのかとても選ぶことはできません。 どなたかおすすめな本を教えてください。
Cマガジンを年間購読する。
日経ソフトウェアを年間購読する。
536 :
デフォルトの名無しさん :04/04/25 20:55
このスレ異常
>>533 参考書っていっても、一冊や二冊で済むもんじゃないからな。
色々買って金を無駄遣いして、数冊に一冊くらいの割合で自分にとっての良本見つけるって感じだし。
何なら、「Cを覚えるまでにいくら消費しましたか?」って聞いてみ。
きっと、すごい額出てくる思うよ。
>>539 悪い、漏れ入門書の類が嫌いなもんで、K&Rとリファレンス本以外は
殆ど金使ってないんだよね。
アケ板から締め出された。
543 :
デフォルトの名無しさん :04/04/26 13:06
イジョウッシュ
おかげさまで、レジストリの登録できました。 ありがとう。関数名が分かったので検索しまくったら そのままの ソースがありました。
545 :
デフォルトの名無しさん :04/04/28 22:24
エクスプローラの、上のアドレスバーの下くらいにある(詳細表示時に) 名前 サイズ 種類 更新日時...... みたいな、押すとソートをかけてくれたり、それぞれの表示領域をかえれたりするのは いったいどのように実現するのでしょうか? なにか、それ専用のコントロールがあるのでしょうか・・・
>>546 CListCtrl
但し、ソートは自前で用意する必要がある。
548 :
デフォルトの名無しさん :04/04/29 13:23
VC6++から、VC.NETへ移行するためのよいページはありますか? MFCで書いたやつが、結構、コンパイルとおらないんですけど...
VC6++
551 :
デフォルトの名無しさん :04/04/29 15:36
>>549 漏れも、VC6しか知らないんだけど、何が変わったの?
どうせ、MFCはいつものウィザードなんでしょ?
553 :
デフォルトの名無しさん :04/04/29 22:52
CreateWindowEXでコントロールを作ろうと思うのですが、 CWndのどのメッセージハンドラで呼び出せばよいのでしょうか? コンストラクタで呼び出すとウインドウができていないのかエラーがでてしまいます。
554 :
デフォルトの名無しさん :04/04/29 23:18
SDIでこう、Viewがスクロールできるようにするにはどうすればよいでしょうか?
スクロールビューっていうそのものずばりなものがあるじゃないか、なあ。
556 :
デフォルトの名無しさん :04/04/29 23:28
でないと、出来ませんか?
557 :
デフォルトの名無しさん :04/04/29 23:37
あのCViewで作ってしまい、CScrollViewに基本クラスを書き換えて OnInitialUpdateを編集したのですが、 スクロールできないんです。
558 :
デフォルトの名無しさん :04/04/29 23:38
>>556 WM_SCROLL捕まえて自分でスクロール実装する
>>556 お手軽にダイアログにコントロールをぺたぺた貼って
みたいなのなら CFormView というのがあることはある。
560 :
デフォルトの名無しさん :04/04/29 23:51
>>557 スクロールバーを引っ張っても
元に戻るんですが。
/:::::::::::::::::::/:::::::::::::::::::::::::::/:::::::/:/::::::::::::ミヽ /::::::::::::::::/:::::::::::::::::::::::::::::/::::::::::/::::/:::::::::/:/:ハr'ヽ /::::::::::::::::/:::::::::::::::::::::::::::::::/::::::::::/::::/::::::/:/:::レ::イ::T:l /::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;ィ:::|:::::ハ::::::|::|::/|::::::|:::::::| /::::::::::::::::::::::::::::::::::::::::__::::::::::::::://|::ト、::L|::::|!:||:!/::::/::::|::! |:::::::::::::::::::::::::::::::::::::r'rヘヽ::::彡 |:! v!|--,.、`゙//:::::/リ |:::::::::::::/::::::::::/:::::::{ (⌒ |:r'´ ` 、l:/ ///l:/〃 /:::::::::::/::::::::::/::::::::;ハヽ. |:! |'´ '′ /::::::::::/:::::::::::/:::::::/:::::::L° ゙、 /::::::::/:::::::/:::/::::::/::::::::::| l _ ヽ /::::::::/:::::::/:::/::::::/::::::::::::| l ____r'´ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ /:::::/:::::::/::::::::::::/::::::::::::::| `7′ < よくわからないモノを /::::::/::::::::::/:::::::::::::/ :::::::::::/ / | 無理して使うからよ /:::::/::::/::::/::::::::::::::/ :::::::::::/二`ヽ、 `iヽ 、____/ \_________ /:::::::::/:::/::::::::/::::::::::::彡.:::::::::::/三ミヽ、 ``=ヽ |:::::::::|::/::::::::::::/:::::::/:::/彡:::::∧`ヽ、 \三ミr'ヽ、 |:::::::::|/:::::::::::::|!::::::::::::::/イ/::::/::::::ヽ \ \/ ̄`ヽ\ |:::::::/::::::/::/::リ::::::::::::/:::/:::::/::::::::ノ /\ \\ \\
>>560 は自分にレスしてないか。
仮に
>>558 へのレスなら自分で実装するということが理解できないのか。
それともどこか別の星と交信してるのか。
ないんですかね?
OnCreateでやれコノヤロウ
春休みより酷いな。こりゃ。
もちろんOnCreateはもう試してるんですがOnCreateに入ってこないんですよ。 やってることがActiveXコントロールのラップクラスがCWndクラスから派生してるので、 CWndの基本クラスとしたクラスを作って、そのCWndをそのラップクラスにあるクラスに 置き換えるということをやってるので普通じゃないんですが、自分でいい方法探すしかないか。 分かる人がいればアドバイスよろしくお願いします。
なんかえらく必死だけど……宿題っすか?
仕事ですな
570 :
デフォルトの名無しさん :04/04/30 00:58
>>553 スクロールの位置はとれているんですか?
GetScrollPositionで試してよ それか値をScrollToPositionに入れるのではだめかなぁ
>570 スクロール関連は553じゃ無いと思う
573 :
デフォルトの名無しさん :04/05/02 00:40
CFormViewをいっぱい切り替えたい。 お手軽にダイアログにコントロールをぺたぺた貼った 画面がいっぱいほしい。 コードのアリカを教えてください。 (現役:悪セス房) いちいちスクロール書いてられるか。 ついでに教えてくれ、べたべた張るやつの制限は 全部で255までか、それとも ボタン255とエデット255とラジオ255でもOK牧場
全部で255まで
CodeProjectに言って二度と戻ってくるな
577 :
デフォルトの名無しさん :04/05/02 01:12
やぱり、255(16列×16行)か ありがと コードのアリカを教えてください。 高度ぐるやM$はCVIEW(SDI,MDI、分割)ばかり。
578 :
デフォルトの名無しさん :04/05/02 01:13
576 お前に相談してない。from573
GWだねぇ。
573は(゚⊇゚)ガイジソー だろ!
htmlから読み込んだら文字コードがUTF-8で文字化けしてしまうんですが、 文字コードを変換して表示するには、どのようにすればいいんでしょうか?
>>582 そういう質問ができる時点で、答えはもう出てるでしょうに。
UTF8からS-JISに変換するプログラムを作ればいい。アルゴリズムはGoogleで検索すれ。
>>582 時間がかかるんで・・・
ライブラリなどで簡単に変換する方法はないですかね?
MultiByteToWideCharで CP_UTF8して、得られたUTF-16文字列に 対して、WideCharToMultiByteでCP_932でもしとけばええやん。
>>586 そういう答えがほしかったんだよ。サンクス
アップロードボタンを押すたびに、<wininet.h>を 使用してFTPでファイルアップロードをする プログラムを作っているのですが、 アップロードボタン3回までは正常に 動作するのですが、4回目から接続に 失敗してしまいます。 このような状況をご存知の方おられましたら、 解決法を教えてもらえないでしょうか?
ソースはこんな感じです。 hInternet = InternetOpen("upload", INTERNET_OPEN_TYPE_DIRECT, NULL,NULL,0); if(hInternet == NULL){ InternetCloseHandle(hInternet); MessageBox("ネットワーク接続に失敗"); goto end; } hHost = InternetConnect(hInternet,distip, INTERNET_DEFAULT_FTP_PORT, dlg.m_uid,dlg.m_passwd, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE,0); if(hHost == NULL){ InternetCloseHandle(hHost); InternetCloseHandle(hInternet); MessageBox("接続に失敗しました。\n"); goto end; } if(!FtpPutFile(hHost,uppath, upfile, FTP_TRANSFER_TYPE_BINARY,0)){ InternetCloseHandle(hHost); InternetCloseHandle(hInternet); MessageBox("アップロードに失敗しました。\n"); goto end; } InternetCloseHandle(hHost); InternetCloseHandle(hInternet);
自己解決しました。 FTPアクセスの後、Socket通信をしていたのですが、 WSAStartupを呼んだ直後にWSACleanupをしていました。 WSACleanupを通信終了時でだけ実行するようにしたら、 現象が起こらなくなりました。 スレよごしスマソ
591 :
デフォルトの名無しさん :04/05/08 04:06
質問です CWhd::MessageBoxのボタン(ハイ、キャンセル等)を任意のメッセージに 変更したいんですけど一番スマートな方法を教えてください 今は、 1.MessageBoxを呼び出す前にフラグを立てる 2.MessageBoxを呼び出す 3.WM_ACTIVATEをハンドリングして、フラグが立っていた場合MessageBoxの ウインドウハンドルからボタンのウインドウハンドルを取得 4.ボタンのウインドウテキストを変更 という、良いんだか悪いんだか分からない方法で変更してます もっとスマートなやり方を知っている方いらっしゃいましたら教えてください
>>591 MessageBoxっていうのは出来合いのダイアログとして雛形で用意された
パターンを選択して使うもの。ボタンの数とかパターンはいくつかあって
変えられるが、あくまで用意されているものを使う。それでwindows標準形式
に沿うものができるわけだ。
ボタンのメッセージからオリジナルのものに変えたいなら、そういうダイアログ
を自分でクラス化して作る。
595 :
デフォルトの名無しさん :04/05/11 16:28
質問があります。 以下のようなコードを記述した場合、DrawLine関数の内部でも古いペンに 戻してやることは必要ですか? DrawLineを抜けた時点でスタック上のpenは消滅するので、SelectObjectされた デバイスコンテキストの状態が気になっています。 この例ではDrawLine()の後すぐに古いペンに戻していますが、Draw関数内の コメントアウトされた行を実行した場合はどうなるのでしょうか? void Draw(CDC *pDC){ CPen *pOldPen = pDC->GetCurrentPen(); DrawLine(pDC); // pDC->LineTo(100, 0); pDC->SelectObject(pOldPen); } void DrawLine(CDC *pDC){ CPen pen(PS_SOLID, 1, RGB(255,0,0)); pDC->SelectObejct(&pen); pDC->MoveTo(0, 0); pDC->LineTo(100,100); }
SelectObjectの戻り値が何か考えたことはあるかね?
MFCでドキュメントビューを使わないソフトを作っているのですが、 CSplitterWndの上にCTreeCtrlとCListCtrlを作成しまして リストにアイテムを追加しようするとNULLが返ってきます。 CtreeView/CListView/CDocumentを使わずに 同じ動作をさせるにはどうすればよいのでしょうか?
Cの入門用のテキストをマスターしたくらいのレベルのC++未経験者です。 最近Windows用のアプリに興味が出てきたのでVC++にチャレンジしてみたいと思っているのですが、 初心者に分かりやすく解説してあるオススメのサイトはありませんか? やはり本屋で一冊買ってきた方が早いのでしょうか。
うん。
601 :
デフォルトの名無しさん :04/05/11 23:37
CPenってDeleteObjectしなくても消滅するんだっけ?
>>597 CViewのソースをよーく見てみるべし
>596 解答ありがとうございます。きちんと選択を戻せということですね。 私がやりたかったのは、抽象化されたボタンクラスを作成して、派生したクラスでGDIオブジェクトの 置き換えに気を使わないでも良い作りにしたかったのです。 virtual void DrawInnerFrame(CDC *pDC) = 0; virtual void DrawOutsideFrame(CDC *pDC) =0; virtual void DrawContents(CDC *pDC) = 0; void Draw(CDC *pCD) { // 実際にはペン以外にも使用されるGDIオブジェクトを取っておく CPen *pOldPen = pDC->GetCurrentPen(); // 描画は派生するクラスによって異なる DrawOutsideFrame(pDC); DrawInnerFrame(pDC); DrawContents(pDC); pDC->SelectObject(pOldPen); } このようなコードの場合は各仮想関数の実装で選択を戻す必要は無いかもしれませんが、 万が一があるかもしれないのでキチンと選択しなおすことにしました。 (使用するのが私だけとは限らないので) 失礼しました。
>>605 >このようなコードの場合は各仮想関数の実装で選択を戻す必要は無いかもしれませんが、
SelectObjectされたGDIオブジェクトを破棄するのはダメだった希ガス
MSDNに書いてあった >Do not delete a drawing object (pen or brush) while it is still selected into a device context.
>606 解答ありがとうございます。 >SelectObjectされたGDIオブジェクトを破棄するのはダメ そうなんですが、追ってテストしてみたところ void Draw(CDC *pDC) { CPen pen(PS_SOLID, 10, RGB(22, 18, 86)); pDC->SelectObject( &pen ); pDC->MoveTo(0, 0); pDC->LineTo(100, 100); CPen *pPen2 = pDC->GetCurrentPen(); } void CViewTestView::OnDraw(CDC* pDC) { CPen *pPen1 = pDC->GetCurrentPen(); Draw( pDC ); pDC->LineTo(100, 0); CPen *pPen3 = pDC->GetCurrentPen(); VERIFY( ::DeleteObject( pPen3->m_hObject ) ); VERIFY( ::DeleteObject( pPen3->m_hObject ) ); VERIFY( ::DeleteObject( pPen3->m_hObject ) ); VERIFY( pPen3->DeleteObject() ); } このようなコードが平然と動いて、もうワケワカメな状態です。 ちなみに pPen1->m_hObject != pPen2->m_hObject pPen2->m_hObject == pPen3->m_hObject でした。
結構そーゆー感じでAPI CALLは失敗しないことがあるんで、 プログラマが注意してSelectObjectする必要がある。 あと、SelectObjectじゃないけど、第三者提供の描画関数呼び出したら マッピングモードやら目茶苦茶にされたまま戻ってきてワヤになった 経験があるんで、それ以来 SaveDC/RestoreDCも愛用している。
595さん、OSは何ですか。9XとNTで動作が違います。
VS2003付属のMSDNにありました。 Platform SDK: Windows 9x Programming Windows 95/98/Me Graphics Device Interface There are platform differences in the way drawing objects are deleted. In Windows NT/Windows 2000, if a drawing object (pen or brush) is deleted while it is still selected into a DC, the DeleteObject function fails. In Windows 95/98/Me, the function succeeds, but the result is a nonfunctioning object. This nonfunctioning object is automatically destroyed when the DC is deleted.
開発環境はWindowsXPですが、Windows2000でもテストを行ってみたところ >608のコードでデバッグしてもエラーにはなりませんでした。 残念ながら95/98/Meで確認できなかったのでこれ以上の追求は出来ませんでした。 >611さんに報告していただいた内容とは異なりますが、OSによって挙動が違う ようですのでSelectObjectは怠けずに行うことにします。 皆様、ありがとうございました。
>>612 怠け者にはSaveDC()とRestoreDC()がお勧め
RestoreDCも、Create->SelectしっぱなしのGDIオブジェクトの面倒は見てくれない。 SelectObjectでの戻しだけは必須。
615 :
デフォルトの名無しさん :04/05/14 09:24
>>614 MSDNライブラリには、SaveDCは選択されているオブジェクトの状態を保存すると書いてあるが?
616 :
デフォルトの名無しさん :04/05/14 23:03
すみません。くだらない質問なんですが、 みなさんはC++をどれくらいの期間で習得しましたか? 一日どれくらい時間勉強しましたか? さらに、何歳から勉強しようと思いましたか?
619 :
デフォルトの名無しさん :04/05/15 19:21
CMDIChildWndに、メニューを設定したいです。 CMDIChildWndを継承したウインドウのOnPreCreate()で、 CMenu m; m.LoadMenu(IDR_MYAPP); this->SetMenu(&m); m.Detch(); とやると落ちます。 デバッグして追ってみると、SetMenuでハングしています。 どうすればよいのでしょうか。
>>619 子ウィンドウにメニューは付けられないはず。
出来るよ 高橋の過去ログで検索すれば出てくる
622 :
デフォルトの名無しさん :04/05/16 03:26
CPen::CreatePenで作ったペンでビットマップに線を引きたいのですが、 線の色を、描画するビットマップの色の反転したものにするにはどうしたらいいでしょうか?
624 :
デフォルトの名無しさん :04/05/16 16:18
ジョイパッドのグローバルフックをしたいんですけど どのようにしたらよいのでしょうか? ジョイパッドのボタンが押された時に とんでいくメッセージは何になるんでしょうか?
625 :
デフォルトの名無しさん :04/05/16 17:26
>>624 DirectInput使わずにオレも制御しようとしたことがあったけど、
メッセージもあったはず。
mmsystem.hを読むとよろし。mmlib32.libのリンク忘れないように
>>625 なるほど
mmsystem.hを読んでみます
627 :
デフォルトの名無しさん :04/05/16 20:05
mmsystem.hをみると Joystickのメッセージは MM_JOY1BUTTONDOWN MM_JOY1BUTTONUP MM_JOY2BUTTONDOWN| MM_JOY2BUTTONUP のようだったので WH_CALLWNDPROCのフックプロシージャを作って そこで(CWPSTRUCT *)lParam->message が 上記の値なら処理するようにしたのですが 接続してるゲームパッドを叩いてみても無反応でした(´;ω;`)ウッ…
俺のジョイスティックは最近元気が無くて。。。
>628 ちゃんと接続されてるか確認しような。
>628 俺もだ。歳のせいかな。
エディットボックスをクリックしたら以前入力した項目が出てくるようにするには どうすればいいでしょうか?
オートコンプリートを付ける。
>>632 もう少し詳しく教えていただけないでしょうか?
>>632 「オートコンプリート」って機能実現のために出来合いの関数群が用意されてる?
ヒストリを実装したエディットコンボボックスで必要十分だと思うんだけど。
>>635 「ヒストリ」とは?
「エディットコンボボックス」ってあったっけ?
中身を編集できるコンボボックスはあるよね。
>>636 >「ヒストリ」とは?
History。履歴。
>「エディットコンボボックス」ってあったっけ?
>>637 の事。
639 :
デフォルトの名無しさん :04/05/18 01:59
お前らは、IAutoComplete も知らないのか。
COMを理解出来るほど上達してない。
COMのメンバ関数につける長ったらしいプリフィックス?が嫌い。
オレ用語使うヤシがいるがそれじゃプログラミング・サポート系スレのレスに ならないよ・・・。短文レスにするならちゃんとしたライブラリ用語とか使えよ。 じゃなかったらやり方をきちんと説明汁。
643 :
デフォルトの名無しさん :04/05/18 11:19
>>642 (°Д°)ハァ?
IAutoComplete をキーワードにヘルプ見たら一発だろうが。
「エディットコンボボックス」のことだべ。
>>644 それは訳分からんな。
「CBS_DROPDOWN」で説明すべきだな。
648 :
デフォルトの名無しさん :04/05/21 18:22
ここMFC限定ですか?VCスレってことで質問です VC6.0sp6で、以下のように宣言するとC2059エラーが出ます。 どこか間違っていますでしょうか? template<class T> class B { }; class A{ template<class T> friend class B; }
>>649 スレ違いすいません
VC6じゃコンパイル出来ないんですね
ありがとうございました
651 :
デフォルトの名無しさん :04/05/21 20:04
自分の作った常駐プロセスをユーザに停止させないようにする方法はどうするのでしょう。 二つ起動させておいてお互いを監視しあって停止させられたら起動かける 方法にしましたが、タスクマネージャから「プロセス ツリーの終了」で 綺麗さっぱり なくなってしまいました。
悪用されるので教えられません。
653 :
デフォルトの名無しさん :04/05/21 20:47
あれれ、そうなんですか。 サービスという方法もありますが難解ですし時間もないので困ってます。 プロセス ツリーの終了 と プロセスの終了 はどう違うのでしょうね。 子プロセスも停止させるのかな。 (ちなみに社内用でデータの持ち出しを防ぐためのツールを作っています)
>>653 停止させられないワームとかウイルスをコードのコピペでお手軽に作られると嫌でしょ。
ユーザの権限ではUSBとかFDDとかのデバイスを使用不可にしとけば?
>>653 そういうのは物理的に持ち出せないようにしないとまずいと思う。
例えば外付けドライブからCDブートのLinux等を
起動させられたりするとどうしようもない。
>654の言うとおりかな。 最低限のハードウェアしか積んでおらず、外部のネットワークと 接続されていない専用端末を用意すればよろしいかと。
private: System::Void button1_Click(System::Object * sender, System::EventArgs * e) { int a; a=textBox1->Text->ToInt32; } 4行目を↓のようにしてもうまくいかず・・・どうやれば上手くいくのでしょうか? a=atoi((char)textBox1->Text); これこのスレで質問してもいいのですか? C/C++スレで聞いたらスレ違いらしかったので
atoiの引数はchar型のポインタじゃなかったか? そのtextBox1とやらがどんなものなのかわからんから何とも言えんが キャストするなら( char* )にしないと。まあ元のデータが char型のポインタじゃ無ければ駄目だけど。
textBox1->TextがCStringならatoi(textBox1->Text)で医院で内科医?
>>658 error C2440 'System::String __gc*'から'char*'に変換できません。
と出ました。CString変数使わずにダイレクトでintにする方法は無いのでしょうか?
>>659 error C2446 'atoi': 一番目の引数を'System::String __gc*'から'const char*'に変換できません。
となります色々試しているのですがヒント程度でも何でもいいのでお願いします。
662 :
正解大魔王 :04/05/23 20:14
CString str="53653"; int b=atoi((LPCTSTR)str);
>>662 それはヒントなのでしょうか?
a=atoi((LPCTSTR)textBox1->Text);
とするもエラー4つ
これは LPCTSTR型 にキャストすれば atoi で変換できるということなんでしょうか?
(LPCTSTR)(textBox1->Text)
strtolとか strtoulとかもあるぞ
657です .NET Visual C++プロジェクト Formアプリケーションから作ってますがその辺と関係があるのでしょうか? CString 宣言すると定義されてない識別子と出るので何かおかしい・・・
>>664 error 2065/2378 LPCTSTRが定義されてません/識別子がtypedefとして再定義
エラーが2つ
>>665 a=strtol(textBox1->Text,NULL,10);
のように使えばいいのでしょうか?
これだと
>>661 同様のエラーが出ました
やはり型のところで何か問題があるようです
それから textBox1.Text はデザイン時に "10" としています
671 :
デフォルトの名無しさん :04/05/23 20:45
char *stop;//<<---これを書いてから int i=strtoul(str,&stop,10);//<<--こうする
managedの話をいつまで続ける気だ?
>>671 private: System::Void button1_Click(System::Object * sender, System::EventArgs * e)
{
int a;
char *stop;
a=strtol(textBox1->Text,&stop,10);
}
error C2664 一番目の引数を'System::String __gc*'から'const char*'に変換できません。
でした。因みに char *stop は宣言だけ使用してるので中身は NULL ということなんでしょうか?
何れしても問題は一番目の引数のようです。
>>672 managedについて調べてみました
MS VisualStudio .NET 2003 での Visual C++
は所謂従来の Visual C++ とはかなり違うもののような雰囲気のようですね
managed C++ という表現があるようですが、それが今自分のやろうとしてるものなんでしょうか?
最初の引数がポインタであることが原因 ポインタじゃなければ(LPCTSTR)でキャストして atoiに放り込める。
ここ、MFC限定ですが。
最初から思いっきりスレ違いだろ・・・
680 :
デフォルトの名無しさん :04/05/23 22:46
カーソルキーで画像うごかそうとしてるのですが 上 下 左 右 はうごくのですが 斜めにうがしたいのですが どうすればいいでしょうか?
GetKeyboardStateとか使えば逝けるかな
682 :
デフォルトの名無しさん :04/05/23 23:10
AI知っている人、手えあげて
683 :
デフォルトの名無しさん :04/05/23 23:37
<<681 GetKeyboardStateでいけますか?
上下左右に動くんなら、ナナメ移動も出来ると思うわけですが… コードが悪い気が。 ただ、ハードウェア制限により、 キーの同時取得が出来ない組み合わせもあるけど。
まことに初歩的な質問で恐縮ですが、MFCアプリで終了コードを 設定して終了する場合はExitInstanceをオーバーライドして int Cほにゃらら::ExitInstance(){ return( 123 ); // return CWinApp::ExitInstance(); // ←元々あったコード } のようにすると思うのですが、この場合に元々呼び出していた CWinApp::ExitInstance()の呼び出しを行う必要はあるのでしょうか?
あるよ。
>>685 CWinApp::ExitInstance()のソースを読めば分かるんだけど、アプリ内で設定されたMRUなどを
保存しているので、無いと色々と不都合が出てきそう。
int Cほにゃらら::ExitInstance(){
CWinApp::ExitInstance(); // ←元々あったコード
return( 123 );
}
どうせなら、こうした方が無難カモ。
レス、ありがとうございます。 他社からメンテナンスで引き継いだソースだと、元々のExitInstanceが コメントアウトされたままの物があったのでどうなのかと思いまして。 しかし、このアプリ既に全国展開で何年も動いているんだよな。ガクブル
動いているなら大丈夫。改変さえしなければね (;´Д`)
「動いている間は触るな」と言う素晴らしい格言がある。触るな。
あるVC5で作成されたアプリが、なんだかソースはすごく変なのに動いてました。 (初期化していない変数に平気でアクセスしている) そのままVC6に持っていったら、案の定まともに動きませんでした。 しょーがないので、そのままVC5で保守しています。 動いているので触りません。
俺も昔は、よく爆弾仕込んだもんだ(爆)
694 :
デフォルトの名無しさん :04/05/27 09:39
VC++6.0 MFC すみませんが、教えてください。 入力画面1>入力画面2>入力画面3>結果画面 といったような画面がどんどん遷移していくアプリを作成したいのですが これを実現するにあたって標準的な方法はどういったものなのでしょうか? (画面遷移は一方通行です。結果画面のあと入力画面に戻ります。) 1.SDIで作って画面ごとにコントロールの表示/非表示を切り替える。 2.画面ごとにダイアログを作成し順番に表示する。 3.MDIで作って画面ごとに子ウィンドウを作成する。 4.その他 よろしくお願いします。
どういう内容を入力させたいのか分らないけど、 ダイアログが一番簡単でユーザーにも分りやすいでしょう。 下手にSDIとかMDIで画面を切替えたりすると、どれがメイン画面か 分りにくくなるし。感じとしてはAppWizardみたいなものになるんだと 思います。
>>694-695 MFCだと、CPropertySheetでSetWizardModeするのがやりやすいかね。
この場合、ステップ毎にCPropertyPage(ほぼダイアログ感覚)を作っていく。
697 :
デフォルトの名無しさん :04/05/27 15:43
APIのSetTimerで時間ごとにメンバ関数を呼び出すにはどうしたらいいでしょうか? SetTimerの第4引数でメンバ関数のアドレスを渡しても呼び出してくれませんでした。
>>697 どこから SetTimer 呼び出してる?
なせ、CWnd::SetTimer を使わない?
CXXXView::InitialUpDate()内でCWnd::SetTimer(1 , 1 , TimerProc);を実行し void CALLBACK EXPORT CXXXView::TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime){} としたのですが無理でした APIでもCWnd::でも同じようです エラーは下のようになりました 'SetTimer' : 3 番目の引数を 'void (struct HWND__ *,unsigned int,unsigned int,unsigned long)' から 'void (__stdcall *)(struct HWND__ *,unsigned int,unsigned int,unsigned long)' に変換できません。 スコープ内でこの名前を持つ関数でターゲット型に一致するものはありません。
FAQ
さすがにコンパイル出来てないのに 呼び出してはくれんだろ。
702 :
デフォルトの名無しさん :04/05/27 19:52
現在スレッドの勉強をしているのですが、 サンプルソースの中に、 CUdpThread ->m_pThreadParams = NULL; class CUdpThread : public CWinThread {・・・・・・・・}; という、部分があり、何のために書かれているのか解かりません。 m_pThreadParamsでMSDN・GOOGLEとうで検索してみたのですが MSDNにいたっては、データ メンバ にすらのっていませんでした・・・。 m_pThreadParams は何の設定を行うものなのでしょうか?
>>702 スレッド起動時のパラメータ、AfxBeginThread の第2引数が入る。
705 :
デフォルトの名無しさん :04/05/28 00:06
処理がいつ終わるかわからないんで、 実行中だというのを示すために、 アニメーションを表示させようと思ってます。 で、たまにみるプログレスバーみたいなのは 自作したものなのでしょうか。 左から右にプログレスバーのブロックが 繰り返し流れていくやつです。 --------------------------------- |→→→→→→■■■■■→→→→→| --------------------------------- XPのエクスプローラで検索するとでてくるのに似てます。 (検索コンパニオンをOFFにしてるとでないかもしれません)
質問です コンボボックスをオーナー描画にすると、なぜか高さが大きくなってしまうのですが これを通常時(オーナー描画しないときと同じ)高さにする方法はないですか VC6sp6 Windows2000
707 :
デフォルトの名無しさん :04/05/28 01:33
age
自己解決しました お騒がせしました
704さん ありがとうございました
710 :
デフォルトの名無しさん :04/05/28 21:17
質問させて頂きます。 カーソルがウィンドウ外に出た時にメッセージが欲しいのですが そういうウィンドウメッセージはありますか?
SetCapture() ReleaseCapture() で自己解決しました。
712 :
デフォルトの名無しさん :04/05/29 14:35
VC6です。 エクスプローラと同じように、フォルダを一覧するツリーを作成しています。 表示は出来るようになったのですが、動的な更新に対応したい.と思って困っています。 つまりエクスプローラなどで、フォルダを作成したり、削除した.りしたときに、その変更を検知して、自分のツリーも更新を.かけたいのですが、その変更をどうやって検知すればよいか.がわからなくて困っています。 エクスプローラからブロードキャストされるようなメッセージが.あるのでしょうか? よろしくお願いいたします。
>>712 マルチやめれ
厨房、いや、新人必死だな
>>712 初心者板で解決いたしました。お世話がセ氏真下。
715 :
デフォルトの名無しさん :04/05/29 22:06
すまそ。 アプリケーションでよく見るファイルの参照ボタンって、 どうやって作るの? どっかのコントロールにあるんですかね?
CFileDialogだったかな。
「参照ボタン」という事だから、CButton だろ。
718 :
デフォルトの名無しさん :04/05/30 00:54
ダイアログベースのアプリを作成して, 起動時に最大化させようと思っているんですが, うまくいきません. 起動後に「最大化ボタン」を押すと最大化 できるんですが...
719 :
デフォルトの名無しさん :04/05/30 01:21
つか、悪いこといわないから、Winアプリ作ろうと思ってる人は とりあえずWin32APIをある程度理解してからとりかかったほうがいいよ。 わけもわからずスケルトン生成 →なんかソースがたくさんできる →どこ変えたらいいかわからない みたいな質問ばかりだけど。
720 :
デフォルトの名無しさん :04/05/30 01:43
>>718 STARTUPINFO::wShowWindowあたり調べたか?
BOOL CXXDlg::PreCreateWindow(CREATESTRUCT& cs)の中で, cs.style |= (WS_MAXMIZE | WS_VISIBLE); としてもダメだったので,WM_CREATEのメッセージハンドラを作成して 以下のようにしました. int CXXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)内で ShowWindow(SW_SHOWMAXIMIZED); これで最大化されるようになりましたが,これでいいんでしょうか? 最初の方法でもいいような気が... あっ720さん どうも
722 :
デフォルトの名無しさん :04/05/30 01:56
PreCreateWindow
InitInstance
>>722 さん
PreCreateWindow内でShowWindowをよんでも最大化しませんでした.
>>723 さん
InitInstance内での使用方法が分かりませんでした(すいません)
色々やってみると,
BOOL CXXDlg::OnInitDialog()内で,
ShowWindow(SW_SHOWMAXIMIZED);
でもOKでした.こっちの方がいいのかな
725 :
デフォルトの名無しさん :04/05/30 02:41
ダイアログベースのアプリからHTTPプロトコルをつかってサーバーサイドのアプリのActionしたいのですがそんな関数有りますか?
726 :
デフォルトの名無しさん :04/05/30 03:12
初心者ですいません。 MFCでボタンを作って、それを押すことで何かの処理をするってときに 計算に時間がかかるような処理だったりすると、ほかのボタンを受け付けなくなります。 ボタンを押すことによって計算を一時中断したいけど、皆さんはこういうのはどうやってるんですか?
マルチスレッドとか。
>708 自己解決って、どうやったの?
729 :
デフォルトの名無しさん :04/05/30 10:09
>>724 >PreCreateWindow内でShowWindowをよんでも最大化しませんでした.
そりゃ無理じゃん Pre だぜ?
そこでやるならCREATESTRUCTの修正だよ
>>724 最初は初期化関連処理はOnInitDialog()内で一通りやるように覚えておけば良いよ
それが無難
>>726 マルチスレッドを使う。
プログラム本体の動作はそのままにそれと別に裏で処理を行う場合は、
その処理用のスレッドを作成してそこで処理する。管理が面倒なので
若干高度なプログラムになるよ。何か適当にソースを拾ってきてマネする
ところから始める。
>>726 中断ボタンが押されたらフラグを立てるようなメッセージ処理を作っておく。
処理ループ中では、上記フラグの監視(フラグが立ったら強制終了)と、
PeekMessage,TranslateMessage,DispatchMessaheを使ってボタンコントロールの
メッセージを受けられるようにする。
こうすっと、シングルスレッドでもできる。
ウインドウの初期設定はCREATESTRUCTでやるってことを知らないから
>>718 みたいな質問が来るんだろうな。
>>734 ダイアログって CREATESTRUCT だっけか?
ニヤニヤ
>>727 ,732,733
ありがとうございました。早速勉強して作ってみたいと思います。
738 :
デフォルトの名無しさん :04/05/30 21:21
タイマーの処理にInvalidate();を入れたのに画面が更新されません。 なじぇ?
InvalidateはメッセージキューにWM_PAINTをPostするだけ だから。 UpdateWindowですぐに描画させる。
再描画は、RedrawWindow()ってやってるけど それじゃいかんのでしょうねぇ…。
741 :
デフォルトの名無しさん :04/05/30 22:47
>>739 Invalidate自身はポストしないよ
Windowsがポストする条件の1つを真にするだけ
>>738 ,741
ごめん。
× InvalidateはメッセージキューにWM_PAINTをPostするだけ
○ Invalidateはクライアント領域を無効にするだけ
ですた。PostするのはOSですた。逝ってくる。。。
下手すると、無限ループに陥るは仕様です。
744 :
デフォルトの名無しさん :04/05/31 00:05
void CShadowDlg::OnButton1() { //ボタンが@が押された処理 if(){ //ボタンがAが押された処理 }else if(){ } } 押されボタンによって処理を分けたいのですがどのように判定すればよろしいですか?
>>744 IDで判別するとか?
wizard使わずに自分でメッセージマップを書く必要があるかも。
ON_COMMAND_RANGEだろ。
OnCommand()なら、パラメータからIDが取得できる。 あとは744の好きなように料理すれ。
751 :
デフォルトの名無しさん :04/05/31 23:38
ダイアログにポップアップメニューが表示されるようにしているのですが ポップアップメニューの項目のチェックのON,OFFが出来ません… UPDATE_COMMAND_UIもダメですし、直接 CheckMenuItem()してもダメでした。 もう、分けがわかりません。 誰か分かる方が居たらお願いします。
WM_INITMENUのハンドラで更新
こういうの見るとMFCって罪作りだと改めて思う今日この頃。
>>751 CDialogには「WM_INITMENU」に対応する関数が無いみたいです。
あったとしても、CheckMenuItem()で変更が出来ないんですよね…
OnContextMenu()の中で、CheckMenuItem()しても、全く変化なしです…
スミマセンレス番号と自分の番号を間違えました…
>>752 CDialogには「WM_INITMENU」に対応する関数が無いみたいです。
あったとしても、CheckMenuItem()で変更が出来ないんですよね…
OnContextMenu()の中で、CheckMenuItem()しても、全く変化なしです…
OnInitMenuPopupだろ。 少し前からわからんくせに回答してる奴が紛れてるようだが何かあったのか?
>>756 いや、ダイアログには無いですよ…
AppendMenu()で追加は出来ても
CheckMenuItem()でチェックは付けれないんです…
>>757 なかったら、メッセージのフィルタを変える。
ダイアログリソースエディタ上で右クリ→イベント→クラスで使用可能なメッセージ用フィルタ→「ウィンドウ」
CheckMenuItemでチェックできないはずはない。第二引数をTRUEにしてたとかは初心者にありがちだが(MF_CHECKED)
759 :
デフォルトの名無しさん :04/06/01 13:21
ダウンロードのダイアログとか インストーラのダイアログとかの バーば伸びていくタイプのメーターチックな実装を実現するクラスはなんですか?
761 :
デフォルトの名無しさん :04/06/01 14:22
バーばっパパ
>>758 「MF_CHECKED」を完全に見落としてました…
なんでこんな事が分からなかったのか…
本当に何度もすみませんでした!!
お陰で上手くチェックできますた!!
CheckMenuItem()の、nCheckパラメータってビットのフラグだったんですねぇ… 完全に見落としてました… 普通に型がUINTだから、分かり難いです… パラメータがビットのフラグを取る時は いっその事 型を「BITFLAG」とか「BITVECTOR」とかにして欲しい。
わかったから、仕事に戻れ。
>>763-764 まあ、俺は一回しかレスしてないけどな。
こじれてきたら該当箇所を晒してみればサクっと解決することも多いよ。
昔こんなことあったなって思いついて付け加えたのがたまたまハマって良かったが。
フラグに型か・・・次の仕事はDelphiを押せ
質問っす。 CEditのコントロールにフォーカスが来ると、自動的にカーソルが末尾に行くようにしたいんですが、なにかいい方法ないでしょうか? void Cxxx::OnEnSetfocusEdit() { m_Edit.SetSel(-1, -1, FALSE); } 調べたところ、これで出来るという風なことなんですが、うまくいきません。。
質問の仕方としては最低の部類だな
769 :
デフォルトの名無しさん :04/06/03 12:31
現在のダイアログ上に埋めたままのCProgressCtrlなら使えるのですが ダイアログのウィンドウとは別あのバーだけ表示させてさらに背後のダイアログ上で処理を進めるにはどうしたらいいですか
>>769 プログレス持ったダイアログ表示させれば良いだけだろ。
DoModal ではなく Create で作る。
771 :
デフォルトの名無しさん :04/06/03 13:35
>>770 サンクス
CForProgfp;
ってやって
fp.Create(IDD_DLG_FOR_PROG,NULL); // 失敗?
fp.DoModal();//成功
失敗しているのかどうかしらんけども窓が出てこない
DoModalでやったらちゃんと表示される
なんでかわかんない
772 :
デフォルトの名無しさん :04/06/03 13:43
ちなみに CForProgfp; fp.Create(fp.IDD,NULL); でも駄目ですね 一緒か
>>771 ShowWindow しないとダメ。
念のため書いておくけど、
↓これ含んだ関数を抜けちゃうと、破棄されてしまうオチが。
CForProg fp;
ShowWindow入れてみようというくらいの知恵は働かんのかなー
775 :
デフォルトの名無しさん :04/06/03 15:07
うまくいきました ShowWindowなんてものがあることをしりませんでした ところで僕はいまVisualStudioを使ってグラフィカルなプログラムをかいているのですが それの各要素にIDというのが振られていますが 動作中のプログラムはどこにこれを保持しているのでしょうか? 勘違いだったらすんません
勘違いだ。
777 :
デフォルトの名無しさん :04/06/03 15:33
void のポインタをキャストしてインクリメントしたいのですが、 コンパイルの段階でエラーになります。(gccでは出来るのに。) void *vp= aiueo; (int *)vp ++; これって文法的にはどうなんでしょ? VCがそういう仕様なんでしょうか? そもそも、Cの文法(ANSI C?)で規定されていないんでしょうか?
778 :
デフォルトの名無しさん :04/06/03 15:38
そうですか IDを持っていないウィンドウとかをClassっぽく使うにはどうしたら良いのですか? 要はダイアログとかのエディット画面を使わずに座標指定だけで CProgressCtrlを使いたいのですがどうすればいいのかさっぱりわからんのです
CProgressCtrl *p=new CProgressCtrl(); p->Create(...);
なんでわざわざMFC限定って書いてるのにCの質問する奴がいるんだよ あとVC++初心者スレもあるから、なんつーか・・・察すれ
>>780 そういう気遣いすらできないから、初心者なんだろ?
この場合、「ネット初心者」っつうプログラム以前の問題になってくるけどな。
782 :
デフォルトの名無しさん :04/06/03 21:03
MDI tabs を実装したいのですが、どうしたらいいのでしょうか?
スレ汚してすいませんでした。急いでいたのできちんと 確認しないまま書き込んでしまいました。
struct Flg{ int flg; //flg = 0; int getFlg(){ struct Flg f ; return f.flg ; } ; void setFlg(int updown){ struct Flg f ; f.flg = updown ; } ; } ;
785 :
デフォルトの名無しさん :04/06/05 15:01
//784の続き void CShadowDlg::OnButton5() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください Flg l; int a = l.getFlg(); l.setFlg(2); a = l.getFlg(); UpdateData(TRUE); m_ie2.Format("%d",a); UpdateData(FALSE); if(a == 0 || a == NULL ){ setFlg(1); UpdateData(TRUE); m_e1.Format("テスト2"); UpdateData(FALSE); }else if(a == 1){ setFlg(0); UpdateData(TRUE); m_e1.Format("テスト1"); UpdateData(FALSE); }
ボタンが押されるたびにエディットボックスのテキストを交互に変更したいのですが784,785のようにやったら構造体Flgのflgの値が、「-858993460」と、なってしまいます。 なにかいいほうほうはないでしょうか?よろしく願いします。
>>784 struct Flg{
int flg; ← [A]
//flg = 0; ← このコメントもわけわからんが...
int getFlg(){
struct Flg f ; ← これはもっとわからん...
return f.flg ; ← まさか、[A] の値を返しているつもりか.... ?
} ;
788 :
デフォルトの名無しさん :04/06/05 15:27
そうです・・・Aの値を返してます・・・・・ まずかった? すみません私JAVAあがりなもので・・・・
JAVAもわかってないような...
すごいもの見ちゃった。。。
普通に OnButton(){ static int f = 0; f ^= 1; if (f){ } else{ } } じゃだめなの?
javaのゲッターとセッターのつもりで書いたんですが・・・・ class Flg{ privete flg; public int getFlg(){ retrun flg } public void setFlg(int i){ flg = i; } } javaでかくとだとこんなかんじにしたいです。C++オブジェクト指向でしょ・・・・?
フラグにいちいちクラス用意するやつはじめて見た。
なんでJAVAのそのコードがC++になると 上のようになって 「C++オブジェクト指向でしょ・・・・? 」 なのかが全くわからない
たぶんオブジェクト指向を理解できていない、もしくはとんでもな方向に理解してるやつだな。
「すみません私JAVAあがりなもので」 高倉健みたいなセリフでつ
高倉健です
無礼なこと言って失礼しますた
誰かに「javaのclassはC/C++のstructと同じだよ!」見たいなこといわれたのかな?
いわれた・・・・
802 :
デフォルトの名無しさん :04/06/05 15:56
厳密にいうとclassじゃなくて「javaのBeanとC/C++のstructはおんなじだよ!!!」っていわれました
>>792 のpriveteやretrunには触れないところがおまえらの優しいところだ。
あ、すぺるまちがってた・・・
805 :
デフォルトの名無しさん :04/06/05 17:03
wavファイルやbmpファイルなどの音声やイメージを exeファイルに全て入れて配布したいのですですが、 どうすればいいのでしょうか?
それって自己解凍圧縮ファイルじゃねぇの?
リソースに持てば?
EXEだと起動時に全てメモリ上に読み込まれるんじゃなかったっけ。
リソースにもつというのはどういうことですか?
Windowsは実行ファイルのなかに、画像、文字といった 情報(リソース)をセクションを作って持つことができる。
811 :
デフォルトの名無しさん :04/06/05 22:07
if(m_e5.GetLength() != 0){ m_b1.EnableWindow(FALSE); GetDlgItem(IDC_RADIO1)->EnableWindow(FALSE); GetDlgItem(IDC_RADIO4)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT5)->EnableWindow(FALSE); GetDlgItem(IDC_EDIT6)->EnableWindow(FALSE); UpdateData(TRUE); m_e1.Format("準備完了"); UpdateData(FALSE); } エディットボックスに入力されてるかどうかを判定したいのだけど、これでうまく判定されないのはなぜですか? またどのように判定すればいいのですか?
UpdateDataの前後でm_e5の中身を見比べてみよう。
>>811 入力判定ってのは、最初の「if(m_e5.GetLength() != 0){」のこと?
なら、その前にUpdateData(TRUE);がないとダメなのでは?
MFCワカンネ 授業で夏休み前までにグラフィックエディタ作るとか言ってるよ 漏れには2時間かけてサンプルに ステータスバーに座標表示を追加するのが精一杯でした…
Doc/View どうにかならんものか・・・
>>815 テンプレ作った後、自分ではずしちゃえば?
SDIだったら、フレームだけですべて制御できるとオモタ。
>>814 ソースを見てみるのも一つの手。
俺はそうやって理解した。
MFCわからんっていってる人はWin32プログラミング自体を知らない人が多い。 Win32知れば、MFCわかってくるし、ある程度便利なライブラリって事もわかるよ。 つーわけで近道せずにWin32からはじめることを勧める。 (激しくスレの趣旨に合ってないがごめんちゃい)
>>819 才能ないやつは、どっち先にやったところで同じ。
才能あれば、MFCだろうがWin32だろうが容易に理解できる。
>>820 確かに。
漏れも仕事でMFC使う羽目になって、デバッグモードでトレースかけながら
MFCとAPIも一緒に勉強できたよ。
漏れ程度でも判るんだから、MFCわからねなんて言ってる香具師は工夫が足りないね。
今のガッコは勉強の仕方を教えてくれんらしいからの。
MFCでダイアログを作っているのだけれど、一つ質問。 大雑把にこんなダイアログがあったとする。 ┌───┐ │■□□│ └───┘(注:□はStaticフレームとその中のコントロール部品群) このダイアログ、リサイズすることになったのだが そのときは■を大きくしたい。 縦方向の伸びに対してはなんとかなった。 しかし、横方向の伸びに対応するのがなかなか巧くいかない。 何かいい手立てはないもんだろうか。
>>823 どうデザインするか、あなたのセンスが問われるところ。
これといった答えはない。
>>823 MFCだと自前だねえ。
他の開発環境ならアンカー(anchor)とかそんなプロパティがあって、相対的なウィンドウの配置を決めることができる。
上下左右辺(top,bottom,left,right)毎にウィンドウのサイズに合わせてリサイズや移動するような仕組みで、
その図で■がleftはanchor=falseになっているがright=true、そのとなりの□はleft=true, right=trueな場合、
┌───―┐
│■■□□│
└───―┘(■は二つじゃなくて拡大されている)
ってな動きになる。
と、まあ、こんなのは考え方の一つだけど、参考にはなるんじゃなかろうか
>>823 ┌───┐
│3 2 1 │
└───┘
この順番で計算していく。
cx = ウィンドゥの大きさ、として。
1.right = cx - {1と右端の隙間の幅};
1.left = 1.right - {1の幅};
2.right = 1.left - {1と2の隙間の幅};
2.left = 2.right - {2の幅};
3.right = 2.left - {2と3の隙間の幅};
rightとleftは各コントロールのGetWindowRect、MoveWindowに対応する値と思ってくれい。
>>826 1つの方法だな。
こーゆーのは理屈で書けんか?
2,3の幅は固定して、窓幅に応じて1幅を可変にする とか。
WTLだと一発なのにね
ふーむ、なるほど。 幅を固定するブロックも位置は変えなきゃいけないわけだし、厄介だねぇ。 いやさ、Motifに慣れているとどうもね。 CodeGuruも参考にして、今日の午後にでもクラスをこさえてみるよ。 情報感謝。>ALL
>>830 俺もMotifから入ったから、Winの不便さはようわかる。
枠の大きさに応じてパーツの大きさを自動可変してくれる、
あれは便利だぁね。
手書きでもいいから、絵に描いてみて、 各コントロールの位置と大きさを、クライアント(ウィンドウ)サイズから 計算して、OnSize()内あたりでSetWindowRect()かMoveWindow()でも使えば うまくいくかと。
その手のウィンドウ・サイズ変更で引っかかるところなんだけど GetWindowRect()とGetClientRect()の区別を意識しておいた方が良い。 Windowsのデスクトップ・デザインはユーザーによって可変のものだから ウィンドウ境界線の太い細いが環境によって違うことがある。GetWindowRect() で取ってクライアント領域だと思ってると、場合によっておかしなことになるので 注意が必要。
>>833 座標の取り扱いは非常にやっかいだね。
Get と Set で基点が違うから、わざわざ座標変換しないとあかん。
その辺の意味が分からないから、サンプルや便利ツールに逃げたりするんだろうな。
>>832 のSetWindowRectには誰もつっこまないのか
CodeGuruにあった、Resizerってのが便利そうだったんで
それを「参考にして」クラスを製作中。
>>831 だよね〜。尤もMotifにも不満はあって、RowColumnの使えなさは泣けたけど。
>>833 お約束のように、どっちか5分間悩んだ。
>>835 只逃げるのでは癪だから↑の如く製作中ですよ。
>>836 Resizerを見ると、予めサイズを計算しておいて最後にSetWindowPos()してますね。
Resizer、依存関係の定義にちょっと癖があるけどそこそこ便利。
#余り続けると日記にするなって怒られそうなので名無しに戻ります。
VisualStudio.Netです。 MFC C++でダイアログベースでアプリを作ってるのですが、 CStirngに格納されたデータ(\r\n入り)を印刷するときに、 DrawTextを使って印刷してるのですが、 複数枚にわたる印刷が出来ません。 どうしたらいいのでしょうか?
自分でページを管理
mfc-mlでも同じ投稿が
841 :
デフォルトの名無しさん :04/06/09 22:33
OnPaintを作るとOnDrawが作れなくなりますが、どっちかしか使えないのでしょうか? この二つの関数の長所と短所はなんでしょうか? 両者択一ならば長所と短所を教えていただければ、これ幸いです。
OnDraw=ドキュメント上でビューを表示するため OnPaint=Windows またはアプリケーションがアプリケーション ウィンドウの一部の 再描画を要求するとき
OnPaintはイベントハンドラで、OnDrawはそうでないってことですか?
ちょっとMFCのソースを見て、OnDrawがどこから呼び出されているか 見てみようとか、そんな気は さ ら さ ら 無 い よ う で す ね
MFCのソースというのはどこにありますか?
なるほど。 じゃあこの辺で次の質問にいってみましょう。
>>845 VSのセットアップ。
あとは、普通に参照するだけで、簡単に閲覧できる。
>>845 適当にブレーク張って、MFC関数内にステップイン するのが一番簡単。
VisualStudio6.0、Windows2000、ドキュメント/ビューアーキテクチャを使ってます。 メニューバーが必要ないので、PreCreateWindowで「cs.hMenu = NULL」を追加して メニューを削除したのですが、メニューバーの境界線(水平線?)だけ残ってしまいます。 これって消えないんでしょうか?
OnPaintって、OnDrawがあれば事足りるのか? OnPaintの利点がさっぱり分かりません。
マジレスすると、新Visual C++6.0入門ビギナー編 林著221ページから OnPaintとOnDrawの関係について詳しく書かれているから 本屋へ行って読んで来い。
854 :
デフォルトの名無しさん :04/06/11 16:14
ダイアログバー(CDialogBar)作ったらトップレベルのウィンドウ(CMDIFrameWnd)にマウスメッセージがこなくなってしまいました。 マウスメッセ−ジゲットするにはどうしたらいいですか?
アプリケーションクラスでゲッツすればいいんじゃね?
>OnPaintって、OnDrawがあれば事足りるのか? >OnPaintの利点がさっぱり分かりません。 CXXViewクラスを使う時には、OnDraw()を使って、 CXXWndクラスを使うときには、OnPaint()を使う。
857 :
デフォルトの名無しさん :04/06/13 18:04
はじめまして 突然の質問ですが、ワーカースレッドで処理を行うライブラリを書いていたのですが、 1処理1スレッドを起動するので、とりあえずテストとしてスレッドが起動できなくなった とき、どうなるのかなーテストをやってみました。 で、 pThread = AfxBeginThread(WorkerMain, pCommand, ...); てな感じのものを2000回ほどやってみました。 すると、まぁ予想通りNULLが返ってきたので、ふむふむ、と納得していたのです。 が、タスクマネージャーをみてみると「1スレッド起動できない」あたり2個のハンドルが 増えていくではありませんか! で、質問ですがこれはどうにかできないのでしょうか? MSDNには、失敗時にはうまく開放する、うんぬんといった記述があったようなのですが。
860 :
デフォルトの名無しさん :04/06/13 20:19
861 :
デフォルトの名無しさん :04/06/13 22:32
え〜と、別スレですれ違いとのご指摘を受けてしまったので、 こちらで質問させてください。 ダイアログベースでウインドウを作っているのですが、 もうひとつのダイアログを呼び出すにはどうしたらいいのでしょう? それと、ボタン押下でアプリケーションを終了させるときは、 DestroyWindowでよいのでしょうか?
リソースビューのツリーで右クリック→挿入→Dialog ダイアログをダブルクリック→ClassWizard→好きな名前つける ダイアログを呼び出したいクラスで作ったダイアログクラスを宣言 表示したい場所でDoModal モーダルじゃないダイアログを呼び出したければ メンバで宣言して適当にCreateしてShowWindowで呼び出す
863 :
デフォルトの名無しさん :04/06/13 22:48
>>861 >アプリケーションを終了させるときは
PostQuitMessage
864 :
デフォルトの名無しさん :04/06/13 23:37
>>862 ,863
どうもありがとうございます!
助かりました!
865 :
デフォルトの名無しさん :04/06/14 22:48
ダイアログボックスから、 ボタン押したらもう一個ダイアログが立ち上がるアプリケーション 作ってるんですけど、 ダイアログが起動した時に、一度だけ行いたい処理があるんですが、 どうやったら実現できますか? Activateのメッセージを使ってみたんですけど、 Activeになるたびに処理が走るので、これじゃ駄目だな。と。 VBで言うところの、FormLoadや、Initみたいなものってないでしょうか?
867 :
デフォルトの名無しさん :04/06/14 23:34
お〜。 もう一個の方にもハンドリングできたんですね。 まぁ、当たり前っちゃ当たり前ですね。 あと、最後に一個だけお願いします。 ダイアログボックスで、escキーを押すとウインドウが閉じてしまいますが、 これを無効にするにはどうしたらいいですか?
>>867 PreTranslateMessageあたりを使ってEscキーだったらTranslateを中止するのが無難。
具体的なやり方はぐぐれば出てくるかと。
他には、OnCancel()を自前で処理してCDialog::OnCancel()しないようにする手もあるが、
その場合はEscキー以外の手段でも(例えばAlt+F4)終了できなくなるので要注意。
#勿論OnOK()はできる。
870 :
デフォルトの名無しさん :04/06/15 21:54
871 :
デフォルトの名無しさん :04/06/15 22:14
void W(CString &str) { str = TEXT("Hello"); //ここで例外 } みたいな関数を呼んだ場合、同じEXE内の関数だったらOKだけど DLLの関数を呼んだ時、例外になるんですけど何故だか分かりますか?? ちなみに、EXEの方をデバッグ版でMFC共有DLLでビルドした時だけ 動きました。 他は例外になります。
まず引数が正常かどうか、とCStringのソース追う
>>871 根本的にCStringの使い方を間違えている。クラスとして作られていて機能を
与えられているところがどうなのかをちょっと考えてみた方が良い。
874 :
デフォルトの名無しさん :04/06/16 00:05
ListBoxコントロールって、MS Pゴシックで表示されてしまいますよね? これって、外観を変えることできないのですか? プロパティみてもそれらしいものはないし・・・。
>>874 どこから言っていいのかわからんが、CWndの使い方覚えれ。
派生クラスはわかってるだろ?
SetFont
それ以前の問題かと
878 :
デフォルトの名無しさん :04/06/16 06:56
CImageクラスを使用しています。 イメージをJpeg形式で保存したいのですが、圧縮率が変えられません。 Imageクラスなら変えられるんですが、DIBじゃないので困っております。 CImageでエンコードの設定ってできないですか? どなたかお助けを・・・
879 :
デフォルトの名無しさん :04/06/16 10:36
VCでソフト作ってて疑問に思ったんだけど メニューで 新規作成(N) 開く(O)... のように、ショートカットキーの後ろに ... が付くものと、付かないものとあるんだけど これってどういう意味があるんですか?
メニューから 直に実行 と ダイアログを経由して実行 の違い
常識的に知っている
そう作れというガイドラインがあるわけで こんなことも知らねーとわ、情けなくって父ちゃん涙が出てくらあ
884 :
デフォルトの名無しさん :04/06/16 14:10
質問です。 自作メッセージを識別するためにウインドウメッセージでは WM_USER +独自番号のような形で使用すると思いますが 自作コントロールにおいて、コマンドメッセージを作りたい場合に コマンドメッセージのユーザー定義初期番号のようなものはありますでしょうか?
コマンドメッセージ?
886 :
デフォルトの名無しさん :04/06/16 14:27
>>885 勝手な日本語ですいません。
正確に言うとWM_COMMANDで通知があったときの
WPARAMのHIWORDの値のことです。
例えば、ListBoxコントロールだと選択の変更が発生すると
WM_COMMANDメッセージのWPARAMのHIWORDにLBN_SELCHANGEが入ってくると思います。
独自コントロールで通知をしたい時に、LBN_USERNOTIFYのようなことをする必要が出てきます。
この番号を勝手につけてしまって良いのかどうか?ということです。
もし、WM_USERのように独自定義したければこの番号以降を使えというようなものがあるので
有れば、それを教えていただきたいと思いまして・・・
>>886 MFCだとすでに決まってるものもいくつかあるので、変な数値使うと問題あり。
WM_USERに相当するものは残念ながら知らないけど、
普通にやってれば重複したのは注意してくれるから問題ないんじゃない?
ていうか、LBN_〜とかって、NotifyメッセージのIDじゃん。
Notifyだとウィンドウのidとかと組み合わせて重複しないようになるから
ウィンドウクラスが違ってると同じ値使ってる場合もあるね。
888 :
デフォルトの名無しさん :04/06/16 16:18
よく、範囲指定の際に、破線の囲いが出てきますけど、 MFCでそれを実現したいのです。 そこで、前回描画した線を消すにはどうしたら良いでしょうか? 一番いいのは、XORで線が描画できると良いのですが・・・
>>887 返答ありがとう御座います。
MFCのCCheckListBoxで、独自につけているくだり(CLBN_CHKCHANGE)
があったのでここの値は重複しないように勝手につけて良いと勝手に解釈
することにしました
890 :
デフォルトの名無しさん :04/06/16 17:00
>>890 今ちょっと、SetROP2でも試してみたんですが、
DrawFocusRectの方が断然イイです!
感謝感激!
駄問ですみません。現在 .NET 2003 使ってるんですが ClassWizardはどうやって表示させるんでしょうか? キーワード検索してみると、「ClassWizard の使い方」の中に "ClassWizard ([表示] メニューの [ClassWizard] を選択) "って あるんだけど、どこにもないんですが・・・。
ClassWizardつかえるのはWizardで作ったClassだけ
894 :
デフォルトの名無しさん :04/06/16 19:33
>>894 !
今まで結構色々ソフト開発してきましたけど
ずっとWM_USERを使ってました
紛らわしいなぁMS
896 :
デフォルトの名無しさん :04/06/16 20:27
MFCで新規クラス追加するときって基本クラスなし ではつくれないのでしょうか?
897 :
デフォルトの名無しさん :04/06/16 20:38
>>896 「一般C++クラス」でできるじゃん
つーか、それ以前にWizardの類を無視して
勝手にclass書けばいいだけの話
898 :
デフォルトの名無しさん :04/06/16 20:40
MFC自体にだってCObjectから派生してないクラスとかごまんとあるし
MFCに5万もクラスがあったとは・・・
900 :
デフォルトの名無しさん :04/06/16 21:13
一般C++クラスってどこにあります?
901 :
デフォルトの名無しさん :04/06/16 21:24
クラスビューから右クリックで[追加] ・・・ここまで面倒みてやるのは本来なら有料 今日は妙に機嫌が良いがこれが限度
質問なのですが… CTreeCtrlで全てのルートのアイテムを取得するにはどうすればよいでしょうか? CTreeCtrl::GetNextItem()で取得できそうなのですがどうしてもうまくいきません。 どなたかご存知でしたらご教授お願いいたします。 以下、参考にしたマイクロソフトのサンプルをです。 HTREEITEM hCurrent = pCtrl->GetNextItem(TVI_ROOT, TVGN_NEXT); ↑の箇所で失敗してしまいます… [sample]------------------------------------------------------------- CTreeCtrl* pCtrl = (CTreeCtrl*) GetDlgItem(IDC_TREE1); HTREEITEM hCurrent = pCtrl->GetNextItem(TVI_ROOT, TVGN_NEXT); while (hCurrent != NULL) { // 何らかの処理 hCurrent = pCtrl->GetNextItem(hCurrent, TVGN_NEXT); }
903 :
デフォルトの名無しさん :04/06/16 21:35
追加っていうのがないんですが 右クリックすると クラスの新規作成はあるのですが 基本クラスを選ばなければ追加できないのですが
MFCって何ですか?
906 :
デフォルトの名無しさん :04/06/16 21:55
>>904 Microsoft Foregroud Constructionの略。
使いやすさを全面的に出してプログラミングにおける
プログラマの負担を軽くしようという発想から
開発されたらしい。今ではMFCも肥大化してしまったけどね。
|
|
|
|
/V\ J
/◎;;;,;,,,,ヽ
>>907 _ ム::::(;;゚Д゚)::| ジー
ヽツ.(ノ::::::::::.:::::.:..|)
ヾソ:::::::::::::::::.:ノ
` ー U'"U'
あぁ、釣りだったのかマジレスしそうだった。 さり気無くスペル間違えてる辺りとか高度だなw
910 :
デフォルトの名無しさん :04/06/18 02:51
ActiveXの取り込みを行って、MSFlexGridを使ってるのですが、 セルの自動幅調整はどうやって行ったらよいのでしょうか?
911 :
デフォルトの名無しさん :04/06/19 01:48
>>910 ちと難しいな。
試してみたが、うまくフォントのサイズがとれなかった。
わかるひとフォロープリーズ
912 :
デフォルトの名無しさん :04/06/19 14:33
SDIで簡単なペイントソフトを作っています。マウスで矩形を描いたりできるのですがマウスを動かすたびに再描画しているので画面がひどくちらつきます。 なんとか解決したいのですが、どうすればいいでしょうか?
>>910 MSFlexGridはよくわからないのだが、姉妹品(おねえさん?)
のvsFlexGridには列をパラメータにしてAutoSizeという
メソッドがあったが。。。
>>915 再描画時に背景消去をさせないにはどうすればいいですか?
>>916 OnEraseBkgnd をオーバーライドしる!
>>916 InvalidateRect(NULL,FALSE);
2番目の引数をFALSEで背景消去抑制
>>911 フォントサイズをとる方法なら
MSFlexGrid.GetCellFontSize
で各セルのフォントのサイズが取れる
viewからMainFrameのポインタを取得するにはどうすればいいですか?
921 :
デフォルトの名無しさん :04/06/19 17:31
923 :
デフォルトの名無しさん :04/06/19 18:59
SDIにスクロールバーをつけたいのですが最初のAppWizardとかで設定しておかないとだめですか?
そんなことないよ〜
>>923 あ、簡単なペイントソフト作ってる人じゃないか?
>>923 新規プロジェクトでCScrollViewにして作成して
今のCViewプロジェクトと変化している部分を変えたり追加するのが
一番簡単
気をつけるのは、基底クラスを呼び出している部分とか
メッセージマップの基底クラス部分とかね
C++.net使用しています。 質問なんですが for(int i=0; ... みたいにiを定義すると標準C++ではfor文のブロック内のみが スコープになると思うのですが、.netだと外側からも見えるようです。 これを標準C++仕様にするにはどうしたらいいのでしょうか?
forの外にも定義しておく
929 :
デフォルトの名無しさん :04/06/19 23:11
>>927 #define for if(false) else for
>>927 そうそうfor文のスコープはなにかがおかしい。オレもこれではまったことがある。
for( int i=0; ...) {statementA}
for( int i=0; ...) {statementB}
ってやると、statementBにAのiが影響していた。詳しく調べなかったのでこれ以上のことは判らない。
>>930 詳しく調べてくれ、気になる・・・
後のfor文のi=0の初期化は無視か?
932 :
デフォルトの名無しさん :04/06/19 23:28
/Zc
{ for(int i=0;...){ } } コンパイルオプションでも直せるらしいけど、 それはそれで不都合があるらしいので、 こうするといいよ。
934 :
デフォルトの名無しさん :04/06/20 00:04
MFC でwebブラウザつくりたいのですが わかりやすく載ってるサイトとかないですか?
おかしいと思ったら、曖昧な記述じゃなくて、 はっきりコーディングレベルで明快に書けばいいのに。。。 なんで、そんなに書き方にこだわるんだろう。
936 :
デフォルトの名無しさん :04/06/20 00:08
>>935 んだな
組み込み用のクロスとかローカルルール満載の処理系はよくある
割り切らねーと仕事にならん
int i=1; for(int i=0;;){break;} std::cout << i; // iは0 二重定義でエラーにはならないけど 同一のiを意味するという・・・なんとも不可思議だ
>>934 マジレスすると、ウィザードで基本のビュークラスを
CHtmlViewにしてスケルトンを作ったら、
すぐにビルドして実行しろ。
それでブラウザは完成だ。
939 :
デフォルトの名無しさん :04/06/20 00:26
>>939 じゃ、ダイアログバーにコンボボックスあたりつければOK
941 :
デフォルトの名無しさん :04/06/20 20:09
あらかじめ用意されているDLLを、 自分のプロジェクトで参照して、DLLの関数を使用したいのですが、 どうしたらよいでしょうか? プロジェクト設定のリンクにDLL名を入れたのですが、 ファイルが無効か壊れているってメッセージがでてしまうので、 やり方が間違っているようなのですが、 どうやって参照させたらよいでしょうか?
942 :
デフォルトの名無しさん :04/06/20 20:16
>>941 DLLの使い方は、起動時に自動的にロードして使うやり方と自分でロードして使うやり方がある。
起動時にロードするためには、DLLと一緒に配布されているlibファイル
を実行ファイルにリンクしないといけない
もしDLLにlibファイルがついていないならば、自分でロードして使えということだろう
その方法についてはLoadLibraryというAPIを調べてみればよい
944 :
デフォルトの名無しさん :04/06/21 01:57
> プロジェクト設定のリンクにDLL名
・・・LIB名(拡張子=.lib)
持ってない場合
A.
>>943 の方法
B.DLLの提供元にねだる
C.DLLの作り損ない
SP6にしてからリソースエディタでダイアログのサイズをドラッグして変更 しようとしても、輪郭のところをマウスで掴めなくなってしまったのですが どうしたらマウスで掴めるようになるでしょうか。 ShiftKey+矢印Keyで一応サイズ変更はできるのですが、いったい何が どうなっているのか・・・
946 :
デフォルトの名無しさん :04/06/21 23:29
ダイアログフォームを最大化した時に、 ListBoxやTabコントロールも一緒にリサイズさせたいのですが、 GetClientRectでフォームのサイズをとったあと、 どうやって設定させたらよいでしょうか? SetClientRectってないし・・・
movewindow
948 :
デフォルトの名無しさん :04/06/21 23:48
>>947 OnSizeでは、CX,CYしか取れないのですが、
MoveWindowを使うときにはX,Yも必要らしいのですが、
X,Yはどうやってとったら良いでしょうか?
自分で計算しろ
>>946 まともなリサイズ処理ははそれなりに複雑だよ
codeguruとかcodeprojectで、resizable dialogの
言葉に引っかかりそうなソースを読んでみたら?
GetWindowRect、GetClientRect、ScreenToClient この辺の意味をちゃんと理解しておれば、リサイズなんて怖くねーべ。
私ゃCodeGuruで見つけたResizerってのをベースに使ってるよ。
WTLだと一発なのにね
>>951 単純な拡大縮小ならそれほどでもないけど
コントロール同士の関係を含めてのリサイズの場合結構複雑になるよ
946がどこまで求めているかは知らないけれど
955 :
デフォルトの名無しさん :04/06/22 16:03
CListを入れ子にして使ったら c:\Program Files\Microsoft Visual Studio .NET\Vc7\atlmfc\include\afxtempl.h(1159): error C2582: 'operator '=' 関数を 'MDB' で使用できません。 と言われました CListから生成したオブジェクトの中でCListを使うことはできないのでしょうか? 以下のような感じでソースをかいてみました
typedef struct Seqnoinfo{ int Seqno; int Rcvsize; int Type; }Seqnoinfo; typedef struct MDB{ int No; int Done; CList<Seqnoinfo> Silist; int Mtopaddr; int Msize; int Rcvsize; }MDB;
class CMemBuf { public: CMemBuf(void); ~CMemBuf(void); int Send(void); int Run(int startaddr); int Add(CCmdBuf&CmdBuf); int Getcmdlen(DWORD cmd); char* Getcmdname(DWORD cmd); void Clear(void); void Reset(void); DWORD* TmpBuf; DWORD* SendBuf; int BufN; int Maddr; int Up; CList<MDB,MDB&> MDBlist; };
何かアドバイスなどありましたらご教授お願いします
MDB構造体に operator=を定義して CList間の=を明確化してあげればいい
ありがとうございます。 うまく出来ました
961 :
デフォルトの名無しさん :04/06/22 21:41
>>950-954 どもです。
コントロールを含めてのリサイズだったので、結構参りましたが、
なんとかなりました。
情報ありがとうございます。
すみません、VC++.Net2003でソリューションのmakefileをエクスポートしたいんですがどうすればよいですか?
964 :
デフォルトの名無しさん :
04/06/23 22:57 CStringの文字を数値に変換するのにatoiを使ってるのですが、 これの例外って、どうやって取ったらよいでしょうか?