■ VisualC++(MFC限定)相談室 MFC7.dll■
2 :
デフォルトの名無しさん:03/03/18 10:19
CListCtrl系のDrag&Dropについて参考になるサイトを教えて下さい。
Googleで引っかからん・・・
3 :
デフォルトの名無しさん:03/03/18 10:43
4 :
デフォルトの名無しさん:03/03/18 14:35
禁煙パピコ
CStringからconst WCHAR*型に変換する方法を教えてくれ。すぐ教えてくれ。
いや、まじでお願いします。
7 :
デフォルトの名無しさん:03/03/18 14:41
MFCでWebブラウザコントロールを用いてそれを印刷したい場合、
// Verify the Web Browser control is valid.
LPDISPATCH lpDispApp = m_web_view1.GetApplication();
if(lpDispApp)
{
// Get the HTMLDocument interface.
LPDISPATCH lpDispDoc = m_web_view1.GetDocument();
if (lpDispDoc != NULL)
{
// Get the IOleCommandTarget interface so that we can dispatch the command.
LPOLECOMMANDTARGET lpTarget = NULL;
if (SUCCEEDED(lpDispDoc->QueryInterface(IID_IOleCommandTarget,(LPVOID*) &lpTarget)))
{
// Execute the print preview command. The control will handle the print preview GUI.
// OLECMDID_PRINTPREVIEW is defined in "docobj.h".
lpTarget->Exec(NULL, OLECMDID_PRINTPREVIEW, 0, NULL, NULL);
lpTarget->Release();
}
lpDispDoc->Release();
}
lpDispApp->Release();
}
みたいなコードで出来ますが、URLが印刷されちゃいますよね。
それを隠す方法があれば、ご教授ください
よろしくお願いします
>>6 GetBuffer()
MultiByteToWideChar()
11 :
デフォルトの名無しさん :03/03/18 19:40
void CPgmDoc::Serialize(CArchive& ar)
の中で
int max = 255;
int H = 640; int V=480;
ar.Write("P5\n",3);
ar.Write(&H ,1);
ar.Write("" ,1);
ar.Write(&V ,1);
ar.Write("\n" ,1);
ar.Write(&max,1);
ar.Write("\n" ,1);
ar.Write(image_data, H*V);
って書き込んだら、ファイルに
P5\n
640 480\n
255\n
data[0]data[1]...
って書き込まれますか?
ダメなのですが、
変数をファイルのストリームに書き込む方法は
どうすればいいでしょうか?
>>13 MFCのシリアライズはバイナリーファイルになる。
if (ar.IsStoring()){
// TODO: この位置に保存用のコードを追加してください。
CString str = "P5" ;
ar << str ;
ar << h ;
ar << v ;
}else{
// TODO: この位置に読み込み用のコードを追加してください。
CString str ;
ar >> str ;
ar >> h ;
ar >> v ;
}
こんなかんじにしろ。文字列はCStringな
テキスト出力にするならSerializeは使わないほうが楽
>>14 hとかの変数の値が入らないのですが・・・。
16 :
デフォルトの名無しさん:03/03/18 21:39
オブジェクトの挿入とかの「Microsoft Excel ワークシート」みたいな文字列を
ID から取得する方法はありますか?
Cに関する雑談のできるIRCチャンネルはありませんか?
22 :
デフォルトの名無しさん:03/03/19 00:09
誰も7の疑問わからないのか?
答えてやれよ
24 :
デフォルトの名無しさん:03/03/19 02:51
レジストリに関連付けの変更や定義アイコンの変更を施した後、
実際にデスクトップ上のアイコンにも適用を施す処理ってありますか?
どうもそのままだと、アイコンが更新されないのですが・・・
すいませんが教えてください
>>24 SHChangeNotify( SHCNE_ASSOCCHANGED, ... );
これ何だろ?
ダイアログベースアプリ終了時に出力ウィンドウに出て来るんだが・・・
子ウィンドウのモードレスダイアログがあるからその関係かな・・・
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.
自己レスだけど、メッセージそのままの意味だった。
親ウィンドウのOnDestroyで、明示的に子ウィンドウをDestroyWindow
してやると消えた。
つーか明示的に破棄すんのが普通だわな。確かに俺が悪かった。
意図しないデストラクションとか起こったときのために、これwarningで報告するんだね。
今日は.netくんにメモリリーク報告してもらったし。いつもありがとう.netくん。
28 :
デフォルトの名無しさん:03/03/19 15:03
>>7 ええとね、たしかあったと思うよ
プリントアウト結果に表示されるURLを消すんだよね?
うーーんと、失念してしまった
ちょっと覚えている方、ヘルプよろしく!
>>7 IEのページ設定のヘッダー・フッターどうかするんじゃないの
自分のプログラムだけなら一時的にそのへんのレジストリいじるとか
30 :
デフォルトの名無しさん:03/03/20 17:54
MDIでプログラミングをしたいんだけど、
子ウィンドウを複数種類作りたいんです。
デフォルト以外の子ウィンドウを足すにはどうすればよいでしょうか?
参考になるサイトか方法を教えてください。
31 :
デフォルトの名無しさん:03/03/20 17:56
まずは本買いなさい。
話はそれからだ。
32 :
デフォルトの名無しさん:03/03/20 19:20
ふつーそんなこと書いてませんよ。
本当にどう書けばいいのでしょう?
VC++のように、ソース、リソースダイアログ etc.
のようにしたいのですが。
34 :
デフォルトの名無しさん:03/03/20 21:37
このスレッドで消化されていない7の質問
誰もわかるやついねえのか?
そろそろ教えてあげなよ
37 :
デフォルトの名無しさん:03/03/22 11:18
CListCtrlをレポートビューで使っています。
コラムの幅より長い文字列をInsertItemすると略されて「hogehoge...」
と表示されますよね。これを全て表示するようにする方法はありますでしょうか。
>>37 コラムの幅を増やせば良いとおもうが...。
自分で計算するのがめんどかったら
ListView_SetColumnWidthでLVSCW_AUTOSIZE
CTreeCtrlでCImageListで画像を関連づけて
その画像を表示することはできるのですが
画像の背景の色を透過できないんですが
どうすればできるでしょうか?
CImageListの方でSetBkColor(CLR_NONE)あたりを使うと思うのですが
マスクを使うというのがいまいちよく分かりません
41 :
デフォルトの名無しさん:03/03/22 21:21
MFCの仕事はまだあるんですか?
これからもあるんですか?
42 :
デフォルトの名無しさん:03/03/22 21:23
パソコン部長ですがなにか?
すいません質問です。
PlatformSDKの最新をインストールして、新たにMFCアプリを作ろうとしてビルドしたところ、
意味不明なエラーが出てきました。
↓エラー
「d:\microsoft sdk\include\exdisp.h(1119) : error C2061: 構文エラー : 識別子 'SHANDLE_PTR' がシンタックスエラーを起こしました。」
これってどうやれば解決できるのですかね?
だいたいその'SHANDLE_PTR' というのが何なのかがわかりません。
PlatformSDKを入れる前は、問題なくMFCアプリがビルドできていました。
開発環境はVC++6、WinXPPROです。
だれかご存知な方はいますでしょうか?
MFCアプリ(ダイアログベース)を作ってるんですが、
エンターキーを押すとアプリが終了してしまいます。
終了しないようにするにはどうやったらいいのでしょうか?
>>47 PreTranslateMessageでキーをトラップしてreturn false;
ちなみにESCキーでも同じ現象が起こる
できました。ありがとうございました。
>>49 ただそれだとtabによる移動や
改行許可のエディットボックスが上手く動かなくなるはずだから
↓みたいな感じで書くといいかも
BOOL CMainDialog::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message){
case WM_KEYDOWN:
switch(pMsg->wParam){
case VK_RETURN:
const CEdit* pcEdit;
pcEdit = dynamic_cast<const CEdit* >(this->GetFocus());
if(!pcEdit || !(pcEdit->GetStyle() & ES_AUTOVSCROLL))
return TRUE;
break;
}
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
>>ただそれだとtabによる移動や
おっとこれは大丈夫だね
52 :
デフォルトの名無しさん:03/03/24 00:07
すいません。MDIの新規作成の子ウィンドウの追加の方法はわかったのですが、
VC++がツリーをクリックすれば、子ウィンドウを作るように
メニュー以外で必要なダイアログを必要な情報(ファイル)を足して
子ウィンドウを作るにはどうすればいいのでしょうか?
>48-52
void CHogeDlg::OnOk()
{
//do nothing
}
の方がよくね?簡単だし。 ま、解決してるならいいか。
× void CHogeDlg::OnOk()
○ void CHogeDlg::OnOK()
>>53 DoModal()で作るならそれでいいけど
Create()で作る場合もあると考えるとPreTranslateMessage()を使う方がいい
Create()で作った場合はOnOK()使わんし
CreateでもOnOKでdo nothingには変わりないと思うが
ん? あれれ? Create()で作った場合ってOnOK()にメッセージdできたっけ?
飛んでこなかったから私はPreTranslateMessage()を使い始めたような・・・
以前はOnOK()のデフォルト処理をコメントアウトしてたけど
>MFCアプリ(ダイアログベース)を作ってるんですが、
OnOKに一票
>>52 質問が意味不明でわかりにくい。
何がわからないのかちゃんと書かないと?
CDocTemplate::OpenDocumentFileのことか?
>>55 >>57 モードレスでも OnOK呼ばれる。IDOKボタンがなくても呼ばれる。
>>59 VCは、ツリーのダイアログバーをクリックすると、子ウィンドウが新規に作成されるじゃないですか。
で、必要に応じて、対応しているファイルを開いてエディットに表示するじゃないですか。
それから、メニューバーのファイル から、ワークスペースを閉じる で子ウィンドウを
終了できるじゃないですか。
そのような仕組みはどのようにすればいいのかな?
と質問しました。
わかりにくくてごめんなさい。
※急募!※
MFCのドキュメント・ビューアーキテクチャーにIShellBrowserをぶっこむ方法を知ってる人
63 :
デフォルトの名無しさん:03/03/24 20:16
VC++/MFCは、UNICODEを簡単にASCIIというかSJISに変える方法も無いんで鹿?
>64
どの項目をみればいいんでしょうか。
67 :
デフォルトの名無しさん:03/03/24 22:32
>>66 なんか、定義されてないってコンパイルエラーだけど。
>>61 CMultiDocTemplate::OpenDocumentFile()でファイルが開けるんじゃないの?
子ウィンドウが閉じたかったら、アクティブなフレームにPostMessage(WM_CLOSE)
とりあえず『MFCアンサーブック』でも立ち読みしてくれ。
前スレの985ですが、思い出したので追記しておきます。
CDocTemplate::OpenDocumentFile(NULL) だと
ビューに加えてドキュメントも作成されてしまうので、
ドキュメントとビューの関係が 1 対 多 ではなく 多 対 多 になってしまっていました。
CDocTemplate::CreateNewFrame() と CDocTemplate::CreateNewDocument()
を分けて使うことで今度こそ期待通りの動作をするようになりました。
が、[ウインドウ | 新しいウインドウを開く] で新しいウインドウを開いた時と同じように、
ウインドウのキャプションに :1 とか :2 が付くようになってしまいました。
まぁこっちはそのうち何とかできればいいなぁと思ってます。
>>61 この発言が参考にはなりませんか?
また全てのウインドウを閉じるのは CloseAllDocument() というのがあります。
71 :
デフォルトの名無しさん:03/03/25 09:10
ちょっと、変なこと聞くかも知れないんだけど、
コンボボックスとかリストボックスってデータの数が増えても対応するじゃん。
で、配列を動的に宣言して増やしてるんだと思うんだけど、
どうやってそういうのをかきゃいんですか?
有難うございました。
>>69 ATLかMFCのバージョン違いみたいで、自分のバージョンでは、
CString str = CString(bstr);strcpy(cBuf, str);
みたいな感じになりましたが。
73 :
デフォルトの名無しさん:03/03/25 10:17
UNICODE文字列の配列宣言教えてください。
>>70 助言ありがとうございます。
騒がせながら、CMainFrame のなかで、Create()で作れました。
しかし、子ウィンドウを操作するに当たり、
子ウィンドウの持っている変数に値を代入したり
する方法がわかりません。MDIGetActive()ではアクティブな
ものしか取得できませんし。
何かご存じないですか?
76 :
デフォルトの名無しさん:03/03/25 13:48
動的に作られたCEditにスクロールバーをつけたいんですが
どうしたらいいでしょうか?
ModifyStyle, ModifyStyleEx のとちらも試しましたがだめです、、。
77 :
デフォルトの名無しさん:03/03/25 14:31
ListCtrl を派生させて色々作ってるんだけど
あるセルの値が変わった時に例えば1秒間
表示色を変えよう、と思ったらどういう手段がありますか?
全然思いつかないんだが・・・
>>76 >ModifyStyle, ModifyStyleEx のとちらも試しましたがだめです
どんなスタイルを設定してダメだったか書けよ。
Createするときにちゃんと ES_ 系のスタイルを指定したか?
WS_HSCROLL や WS_VSCROLL を忘れてないか?
80 :
デフォルトの名無しさん:03/03/26 03:14
>>79 コントロールをCreateしているソースの個所は私が見ることができないのでわかりません。
が、一旦作成されたCEditに対して、
ModifyStyleEX( 0, WS_HSCROLL|WS_VSCROLL)
を呼んでもスクロールバーがつかないというのはどういうことなのでしょうか?
m_edit.ModifyStyleEX( 0, WS_HSCROLL|WS_VSCROLL);
^^^^^^^
↑これが無いってオチじゃないよね
82 :
デフォルトの名無しさん:03/03/26 03:42
>>81 m_zEdit.ModifyStyleEX( 0, WS_HSCROLL|WS_VSCROLL);
ってコールしてます。
むぅ。。。
>>82 >>79も書いてるけどES_ 系のスタイルは指定してんの?ES_MULTILINEとか。
>>82 m_zEdit.ModifyStyle(0, WS_HSCROLL | WS_VSCROLL, SWP_DRAWFRAME);
85 :
デフォルトの名無しさん:03/03/26 07:28
>>84 ありがとうございます。でもだめみたいです。
CEditはリードオンリーモードになっていて、その内容が動的に
変わるようになっています。CEditが貼り付けられているメインダイアログ
のOnInitDialog()内と、テキストの内容を書き換えるごとに
m_zEdit.ModifyStyle(0, WS_HSCROLL | WS_VSCROLL, SWP_DRAWFRAME);
をコールしてみましたがだめです。ユーザの実務上クリティカルな問題なので
何とかしたいと思っています。何かアイデアがありますでしょうか、、、。
86 :
デフォルトの名無しさん:03/03/26 07:45
>>84 あわわ、やっぱりそれで正しかったようです。
ES_AUTO*SCROLLとWS_*SCROLLを混乱していました。おっしゃるように
コーディングしたところ動作しました。ありがとうございました!
まとめ。
m_zEdit.ModifyStyle(0, WS_HSCROLL | WS_VSCROLL, SWP_DRAWFRAME);
SWP_DRAWFRAMEの指定がポイントでした。
87 :
名無し@沢村:03/03/26 07:58
>>87 おお!ありがとうございます!
半分あきらめかけていたところでした!
タイムリミット9分前の劇的なレスにちょっとシビれています。
CHtmlViewですか。
さっそく調べてきます。
89 :
デフォルトの名無しさん:03/03/26 18:14
スプリッタつかって縦3分割してるフレームをサイズ変更する際に
デフォルトではスプリッタ自体の位置が変わらないと思うのですが
真中のViewの高さだけを変える方法はありますか?
あ、90は勘違い。
自分で計算してWM_SIZEで変えたら?
スプリッタのsetrowinfoだったかでできなかったっけ?
(うろおぼえ)
93 :
デフォルトの名無しさん:03/03/27 05:33
ファイルダイアログをセーブモードで使っていて、既存のファイルを指定して
保存ボタンが押された場合上書き確認のダイアログを出したいのですが、
フラグか何かでMFCにやってもらう方法はありますでしょうか。
それとも自前で実装するしかないんでしょうか。
>>93 CFileDialog でMSDN見たらそのまんま載っていると思うが。
95 :
デフォルトの名無しさん:03/03/27 09:02
>>94 ありました。OFN_OVERWRITEPROMPTですね。
てめーで調べずにここですぐ聞こうとする癖を改めますです。
96 :
デフォルトの名無しさん:03/03/27 11:30
97 :
デフォルトの名無しさん:03/03/27 14:29
CFrameWnd でコントロールバーがDockingした時点を検出する方法はあります?
98 :
デフォルトの名無しさん:03/03/27 14:43
Button1を押してファイル選択ダイアログを出し、そこで取得したパスを
エディットボックスに表示させ、エディットボックスに表示されてる文字を
out.txtに書き出したいのですがうまくいきません。
ダイアログボックスをださずに、エディットボックスに手入力した場合
out.txtに書き出されるのですが、ダイアログボックスを出すと
out.txtファイルさえ作られません。
m_filepathには、きちんとパスが入っています。
どこがおかしいのでしょうか?以下コードです。
void myProjectDlg::OnButton1()
{
CFileDialog dlg(TRUE, "exe", NULL, OFN_FILEMUSTEXIST, "実行ファイル (*.exe)|*.exe|", this);
if(dlg.DoModal() == IDOK){
m_filepath = dlg.GetPathName();
UpdateData(FALSE);
}
}
void myProjectDlg::OnOK()
{
UpdateData(TRUE);
CStdioFilefp("out.txt",CFile::modeCreate | CFile::modeWrite );
fp.WriteString(m_filepath);
fp.Close();
CDialog::OnOK();
}
>>97 自信ないけどCDockBar::DockControlBar(), CDockBar::ReDockControlBar()あたりか、
どちらも仮想関数ではないし、CDockBarを持ってるCMiniDockFrameWndもポインタでは
持っていないのでDockControlBar()などから検出するには書き足さないとむりだな、
CDockBarとCMiniDockFrameWndの派生クラスを作って、、、も、無理か
>>98 CFileDialogで指定したパスにout.txtが作られていると見た。
ファイル選択するときにカレントディレクトリが変わってんじゃない?
>>97 多分、CDockContext::StartDrag()で検出できる。これは仮想関数なので
派生して、オーバーライドすればよいはず。CDockContextを持っている
CControlBarはポインタでCDockContextを持っているので都合はよいが
CDockContextを生成するEnableDocking()が仮想関数で無いのでCToolBar
などを使用する場合には都合が悪い。ただ、EnableDocking()はプログラム中では
明示的に呼び出しているので(普通はCMainFrame::OnCreate())その後で
普通に生成されたCDockContextのCControlBar::m_pDockContextをdeleteして
CDockContextの派生クラスをnewしてm_pDockContextにいれればOKか
これであってるのかは知らないけどな。
もっと簡単な方法があったらアフォですな。
さびれたねぇ。
たった四時間でか
>>100 Σ(´Д`ズガガーン
大正解ですた。いたる所にout.txtが!!
これで成仏できます。ありがとう。ありがとう。
>いたる所にout.txt
ワラタ
107 :
デフォルトの名無しさん:03/03/28 19:55
CTreeCtrlの選択されたアイテムのラベルをコンテキストメニューでクリップボードに
コピーできるようにしたいのですが方法がありますでしょうか。
>>107 あります。
ちょっと調べりゃ分かるだろ……
>>105 俺も昔それやった
スタートメニュー→ファイル検索でtest.txt検索したらあちこちのフォルダに保存されてた(w
MFCでアプリケーション作成しているのですが、midiを流す方法がわかりません。
DirectXの知識がないので、APIを使えばできるとか聞いたのですが。
まだWindowsプログラミングは初心者なものでどうしていいか・・・
アドバイスお願いします。
ダイアログベースのピクチャボックスにマウスクリックで線を引きたいんだけど
>>112 何を聞きたいのか分からないんだけど。
入門書でも読んでろ。
>>111 検索しろ・・・か。
それもそうだな。
じゃ、どうする?死ぬか?
ゴチャゴチャ言わずにサッサト教えろ。
ごめんなさい。もうゴチャゴチャいいません。氏にマス。
>>115 まず検索して、試行錯誤して、詰まってから来い。
、と釣られてみる。
119 :
デフォルトの名無しさん:03/03/30 18:17
MFCのWebブラウザオブジェクトにホームページを表示させて
制御する際に、User-Agentを変更する方法ってありますか?
何がやりたいかというと、バナーページ(HTML)を表示させる際に
履歴が残らないようにしたいのです。
もし、いい代案があれば、ご教授ください
よろしくお願いします
Navigate()で変えられる。
バナー処理とはまた別の話で、Webブラウザオブジェクトに表示させた
Webページ上から、別のページにリンクした際に、そのURLを
履歴に残さないようにする方法ってありますか?
>>122 ありがとうございます
そこでかかれているようなコンテンツ側ではなくプログラム側で
制御することはできないでしょうか?
Navigateで表示したページから張られているリンク先も
履歴に加えたくないのです
mciSendStringでmidiを鳴らそうとして、とりあえず1が入力されたらplayになるようにしたのですが鳴りません。
誰か助けてください
#include<stdio.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
void main()
{
int t=0;
mciSendString("open C:\test.mid alias mcitest",NULL,0,0);
for(;;){
scanf("%d",&t);
if(t==1){
mciSendString("play mcitest",NULL,0,0);
}
else if(t==2){
break;
}
}
mciSendString("close mcitest",NULL,0,0);
exit(0);
}
MFCちゃうやん
せっかくなんで聞くけど
mciSend***でmidi鳴らすときって
ハードで鳴らせればハード、
ない場合はソフトみたいに自動的に選択してくれてるの?
(´-`).。oO(何がせっかくなんだ?)
MFCを使って、AAAviewクラス(プロジェクト名がAAA)のコンストラクタに
mciSendString("open 'C:\test.mid' alias mcitest",NULL,0,NULL);
mciSendString("play mcitest",NULL,0,NULL);
を書き
デストラクタでクローズするようにしました。
これでもならないのですが・・・
>>124 細かいつっこみはしないが、
mciSendString("open C:\\test.mid alias mcitest",NULL,0,0);
↑のようにすればいい。クラスは関係ない。
130 :
デフォルトの名無しさん:03/03/31 06:04
mciSendString("open C:\test.mid alias mcitest",NULL,0,0);
type sequencer をファイル名のあとに挿入するとか?
『Winwdows 95 API パワフルテクニック大全集』より
>129
(⊃Д`)ありがとう。できました
>>123 答えそのものが載ってるわけじゃないよ。
そこをヒントにすればプログラム側でも制御できる。
133 :
デフォルトの名無しさん:03/03/31 17:01
>>121 OnBeforeNavigate2のフラグ制御は?
って調べてみたら、このフラグ、未使用なんだね
134 :
デフォルトの名無しさん:03/03/31 19:11
mfcで選んだディレクトリにあるファイルやフォルダの名前やサイズを
全部取得したいんですが、便利な関数無いですかね?
いちおうMSDNで調べてみるとCFindFileというクラスが見つかったのですが、
ファイル名指定しないと行けないみたいなので悩んでいます。
関係ないけど_findfirstと_findnextの方が数倍早くね?
138 :
デフォルトの名無しさん:03/04/01 14:30
CHtmlView上で左クリックを検知して親ウィンドウにイベントを発生させたいのですが、
どのようにして左クリックを検知すればいいのでしょうか?
140 :
任意のIE履歴を消す:03/04/01 21:57
unsigned shortwStr[256];
MultiByteToWideChar(
CP_ACP, // ANSI code page
0, // 既定の変換方法
"
http://www.microsoft.com", // 変換元文字列
-1, // 変換元文字列サイズ(-1指定で自動計算)
&wStr[0], // 変換先バッファ
256); // 変換先バッファサイズ
CoInitialize(NULL);
IUrlHistoryStg2* pUrlHistoryStg2 = NULL;
HRESULT hr = CoCreateInstance(CLSID_CUrlHistory,
NULL, CLSCTX_INPROC_SERVER, IID_IUrlHistoryStg2,
(void**)&pUrlHistoryStg2);
if (SUCCEEDED(hr))
{
hr = pUrlHistoryStg2->ClearHistory();
hr = pUrlHistoryStg2->DeleteUrl((LPCOLESTR)&wStr[0],0);
pUrlHistoryStg2->Release();
}
CoUninitialize();
こんな感じで組みましたがうまく消えてくれません
どこに問題があるかご教授お願いします
本当に使いたいのはDeleteURLです。
試しにClearURLも使ってみましたが、
こちらもうまく機能しません。
(エラーコードは0なのですが・・・)
どなたか教えてください
141 :
デフォルトの名無しさん:03/04/02 10:41
FAQかもしれませんが、IHTMLElement2が未定義と言われてしまいます。
#include <mshtml.h>
してもダメでした。
MSHTML::IHTMLElement2* pIHTMLElement2;
と書いたり、
CComQIPtr<IHTMLDocument2> pIHTMLElement2;
と書いても未定義と言われてしまいます。どうすれば解決できますでしょうか?
環境はWinXP+VC6SP5+IE6SP1です。
142 :
名無し@沢村:03/04/02 12:58
>>141 ヌヒよ、#import "mshtml.idl" でどうだ。
>>141 mshtml.hが古いんじゃないの?
とりあえずGoogleでIHTMLElement2をキーワードに検索することを薦める。
144 :
デフォルトの名無しさん:03/04/02 16:32
だれか
>>140に教えてやれよ
せっかくコードまでのせてんだからさ
>>142 ありがとうございます。「.idl」では開けなかったのですが
#import "mshtml.tlb"
と書いたらコンパイル通りましたです。
>>143 ありがとうございます。
IHTMLElement2でググッてはいたのですが、どうも節穴だったようで
上に書いた #import の方法が見つかりましたヽ(´ー`)ノ
>>147 回答を得られる可能性を自分で断ったな。
>>708 お口添えありがとうございます
やっぱり特殊分野なので、さすがにみんなわからないんでしょうね
>>148 147は私ではありません
ちょっとせっぱ詰まっています。
解決できなければ上司におこられます
よろしくお願いします
708は向こうのスレの「協力者」だな。
708てものすごいあからさまなコピペに笑った
スゲェよ!
>>149!
あんた最高のネタ野郎だ!!
まぁ
>>140のどこがMFCと関係あるのかという根本的な問題があるわけだが
つーか、
>>7==
>>22もだよな。
仕事で詰まったら全部他人にやらせるつもりか。
157 :
デフォルトの名無しさん:03/04/03 15:00
まあまあ、みんな相談室の原点に戻ってさ、
140の質問も勉強だと思って、消化していこうよ
すでに「スレ違い」ということで消化されている罠。
c++でiso-2022-jpをデコードできるサンプルありませんか?
JIS>Unicodeの変換の例ならRougewaveのドキュメントが京大の鯖に転がってるが
だからMFCと何の関係があるのかと・・・
システムメニューのサブメニューにチェックを入れたいのですが
Debug Assertion Failed! とVCに怒られてしまいます。
サブメニューは CMainFrame::OnCreate 内で
CMenu mMenu;
mMenu.LoadMenu(IDR_SUBMENU);
pSysMenu->InsertMenu(4,MF_BYPOSITION|MF_POPUP, (UINT)mMenu.m_hMenu , _T("サブメニュー"));
のように作って表示もちゃんとされています。
ただ、CMainFrame::OnSysCommand で
nID = LOWORD ( nID ) & 0xFFF0;
if ( nID == ID_SUBMENUITEM )
{
CMenu* pSysMenu = GetSystemMenu(FALSE);
pSysMenu->GetSubMenu(4)->CheckMenuItem(nID, MF_CHECKED | MF_BYCOMMAND);
}
と呼ぶとダメなようです。
どのあたりが問題でしょうか?
すみません。質問なのでage升
OnCreate内のCMenuをグローバルで持たせたら解決しました。
首吊ってきます…
せめてメンバ変数に汁
あ、メンバ変数にしてました。ひよっこで申し訳ないです。
167 :
デフォルトの名無しさん:03/04/04 17:23
ドラッグ中にマウスのポインタを変えるにはどうすればいいですか?
ドラッグは検知できているとして
169 :
デフォルトの名無しさん:03/04/05 19:08
突然で申し訳ありません。前も似たものをかきこしたのですが、
MDIで開く を自前で実装するにはどうすればいいのですか?
(実際はファイルが決まっているのでダイアログを表示しないでいいのですが)
ご存じであれば教えてください。お願いします。
170 :
デフォルトの名無しさん:03/04/05 19:17
VISUALSTUDIO.NETっていくらするの?
ものによってです。アカデミックの3万ぐらいから上は30万ぐらいまで。
>>170 ものによってです。アカデミックの3万ぐらいから上は30万ぐらいまで。
174 :
デフォルトの名無しさん:03/04/07 10:24
thread の中で、this ポインタを引き継いでって
SetWindowTextとはなら成功するんですが...
UpdateData が必ず 「Debug Assertion Failed!」って
失敗してしまうんですが、
そういう仕様なんでしょうか?
175 :
デフォルトの名無しさん:03/04/07 11:13
VC++.NETにもMFCはあるの?
>>174 多分、SetWindowText()はウインドウメッセージを送るだけの処理なので
HWNDを生成したスレッドでなくても大丈夫で、
UpdateData()は普通のメンバー関数なので、別のスレッドから
呼び出せないようにASSERT()いれてあるんだと思う
178 :
デフォルトの名無しさん:03/04/07 21:10
CListCtrlのヘッダ部分の高さを変えるにはどうすればいいんでしょうか?
CheaderCtrlでヘッダ取得してSetWindowPosで無理矢理変えたらヘッダだけは高さ変わったんですが
ヘッダの裏にあたる(?)リストの部分の高さが変わらずヘッダの部分が内容に被ってしまいますた。
179 :
デフォルトの名無しさん:03/04/07 23:06
CImageList
180 :
デフォルトの名無しさん:03/04/08 15:26
CEditであるキーが入らないようにするにはどうすればいいですか?
例えば「a」が入らないように・・・
>>180 CEditの派生クラスで好きなようにしる!
182 :
デフォルトの名無しさん:03/04/08 15:39
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ < OnCharで出来ました。
( ´_ゝ`) \ アリガトー!
>>181 /::☆::::☆::\ \________
/:/\:::::☆::/ ̄\
_| ̄ ̄ \☆/ ヽ \_
\ ̄ ̄ ̄ ̄ ̄ ̄ \__)
||\ \
||\|| ̄ ̄ ̄ ̄ ̄ ̄ ̄|| ̄
|| || ̄ ̄ ̄ ̄ ̄ ̄ ̄||
.|| ||
183 :
デフォルトの名無しさん:03/04/10 13:13
MFCでアイドルループどう書きますか?
const int kago = 1000;
for (int tsuji = 0; tsuji < kago; tsuji++)
{
・・・・
}
ワラタ
186 :
デフォルトの名無しさん:03/04/10 16:16
複数ダイアログバーあるとき
親のフレームのサイズを縮めると
かってにはみ出たダイアログバーが
下に下がっちゃうんだけど・・・
下がって欲しくないときはどうするん?
187 :
デフォルトの名無しさん:03/04/10 16:18
少しMFCと話題ずれるけど、EXEに関連づけられた
アイコンって、あとからbmpとかを読み込んで再定義とか
できるの?
本来なら、レジストリで、exeに埋め込まれたアイコンデータを
参照するようだけど。
教えてください
exeのリソース書き換えてアイコンを変更することはできる。
>>188
うーん・・・
外部に画像ファイルとして持たせて、ユーザーが選択
できるようにしたいのですが・・・
exeのリソースを書き換えるプログラムを同梱すれ。
191 :
デフォルトの名無しさん:03/04/10 20:01
ウィンドウの垂直位置をMoveWindowで負の座標にもっていっても
自動的に、タイトルバーが見える状態に下がってしまいますが
(デスクトップ上で移動で試しても確認できます)
これを禁止するか、座標が修正されたタイミングを取得する方法って
ありますか?
192 :
デフォルトの名無しさん:03/04/10 21:22
CSocketやCAsyncsocketを使った場合、相手側もCSocketやCAsyncsocketを使った
アプリケーションじゃないと通信出来なかったりする事ありますか?
>>191 >ウィンドウの垂直位置をMoveWindowで負の座標にもっていっても
>自動的に、タイトルバーが見える状態に下がってしまいますが
SDIでもダイアログでも下がりませんですた
Windows2000SP3 VC6SP5 MFC4.2
>>194 要するにオリジナルスキンを持ったウィンドウのドラッグ操作の
部分なのですが、
MoveWindowを呼んだ直後は下がらないけど、その後(タイミングが不明)に
修正されます。
例えば、
WindowsMediaPlayerの下をドラッグして上に持っていくまでは
OK(MoveWindowでも負のy座標が適当される)だけど
マウスを放したときに、戻っちゃいます
タイトルバーを削除しちゃいかんのか?
>>196 プロパティでタイトルバーはオフにしていますが
同じ結果です
198 :
デフォルトの名無しさん:03/04/10 23:31
VC2003まだ〜
>>195 それはWindowsの仕様なんじゃないか……?
うーむ、実はドラッグでMoveWindowしたウィンドウに追随させて
ほかのウィンドウも制御してるのですが、OSに勝手に移動されると、
つじつまが合わなくなりますね
>>191 MoveWindowというか、ユーザがドラッグや Alt+Space,M でウィンドウを動かした
ときの話でしょ?
LBUTTONUP や Enterで位置を確定した後、↓みたいにメッセージが飛んできたよ
位置の修正がないとき
WM_POSCHANGEING (移動した座標)
WM_POSCHANGEING ( 〃 )
位置の修正があったとき
WM_POSCHANGEING (移動した座標)
WM_POSCHANGEING (修正された座標)
WM_POSCHANGED ( 〃 )
>>201 ヒント
ありがとうございます
無事解決できそうです
リストボックスが空の状態でリストボックスの内容を保存しようとすると
エラーのメッセージを表示させたいです。どのようなコードを書き込めばよいでしょうか?
ご教授お願いいたします。
>>203 中身があるかどうか確認してから保存する。
205 :
デフォルトの名無しさん:03/04/11 22:44
ずっと疑問に思っていたのですが、デバッグウィンドウで
dllのロード後に
「○○.dllをロードしました。合致するシンボル情報は見つかりませんでした。」
ってどういう意味なんでしょ??
>>206 町に出て日本語知っている人に聞いて答えてもらえると思いますか?
あなたは質問の意味が理解できてないように思われます。
日本語わかりますでしょうか?
>>205 合致するシンボル情報(foo.dllに対してfoo.dbgあるいはfoo.pdb)
があれば、VisualC++のデバッガはそれを使ってDLL内の関数名とか
を表示することができる。それができませんよ、ってこと。
>>208 一番上に回答がくるようにしない奴はム板にむいてない
>>209 ありがとう!!
よくわかりましたっ!!!m(__)m
最近の厨房様は検索という言葉をご存知ないらしい
シリアライズして保存したいのですが
保存する変数を配列で定義してるせいか
二項演算子'>>':型'CString[15][100]'の右オペランドを扱う演算子が見つかりません(または変換できません)
と出ます。ar >> m_id >> m_account >> m_name >> m_address >> m_day; ってな感じでやってるんですが
解決策ありますか?
>>214 イマイチ分かり辛いが、
配列ならをforで回して保存したらどうよ
>>216 *.objはサイズが大きいから、次回うpするときは、削除してから
うpするよーに。
218 :
デフォルトの名無しさん:03/04/12 17:49
と言うことで、誰も見ないから放置プレイ?
シリアライズできる配列クラスを作れってこったろ。
>217
了解です。
>219
あほなのでよくわからんのですが
配列の変数でも保存が可能なシリアライズクラスを作れってことですか?
こんな感じの作ってみたんですが構文エラー出ちゃいます。。。
ar << m_id;
for(i=0;i<m_id;i++)
{
m_account[][i] << m_name[][i] << m_address[][i] << m_day[][i];
}
if (ar.IsStoring())
{
ar << m_id;
for(m=0;m<=15;m++)
{
for(i=0;i<m_id;i++)
{
ar << m_account[m][i] << m_name[m][i] << m_address[m][i] << m_day[m][i];
}
}
}
これでできました。何回もコピペすいません。。。
ですが今度は
error LINK2005:"class CData m_data"(?m_data@@3VCData@@A)は既にData.objで定義されています。
とでます。オブジェクト名を変えるとまたそのオブジェクト名でエラーが出るので
二重定義定義しているとは思えません。ググってみてもそれらしい物がでないので。。。よろしくです
>>222 とりあえず中間ファイルを消してリビルドすることをオススメする
>>222 ……と、そのまえに>216の中のdata.hはギャグだよな?
data.hを2つ以上のcppファイルでインクルードすると当然2重定義になるわけだが……
ぬぁに!知らなかった。。。
二つ以上のcppファイルでdata.hを使いたいときはどうすればよい?
あ、ヘッダファイルでインクルードすればよいわけか。
どっちにしてもエラー消えません(泣
>>227 検索しても何もでないです。。俺がへたれのせい?!
>>228 いや、ミスタイプしたものの誰かが訂正してくれるだろうと放置した俺の責任だ。スマソ。
ifdef
>>229 #ifdefが条件付コンパイルってとこまでわかったんですがそこからがどうも。。。
他のヘッダファイルで定義したクラス使うにはどうすればよい?
いや、つーか、クラス宣言と切り離せよ
data.hでは
class CData
{
:
:
};
んで他のcppふぁいるで
CData data;
これでオブジェクトは1つだけ宣言される。
あとはヘッダファイルでextern宣言でもしとけ。
>>230 ヘッダファイルを#include
まさかとは思うが
class hogehoge
{
/* 変数とか関数とか */
} hage;
とかやってないだろうな。
>232
もちろんやりました(笑)
>231
extern宣言見つけました!って書こうとしたら書き込みが。。。
感謝です。確かにcppで宣言した方がいいっすね。
そしたら今度は外部シンボルが未解決やら言い出しました。
エラーってつきないっすね(泣)一応メインフレームのオンクリエイトで
オブジェクトできるようにしたんですけど、何がだめなんだろ・・・
>あとはヘッダファイルでextern宣言でもしとけ。
ってどこのヘッダファイルですか??
とりあえず全部のヘッダファイルに書いてみたけどだめでした。。。
>>233 MFCには関係ないようだな。
とりあえずその書き込みからわかることは
変数または関数の実体がない
エラー文のコピペとOnCreateのあたりのソースを見ないとなんとも言えん。
>>234 (;´Д`)
何がダメだったのか、どんなエラーがでるかくらい書けよ。
グローバルな変数だったら
プロジェクト名.cppに変数宣言して、
プロジェクト名.hにextern宣言しておけば大丈夫だと思うけど。
(全ファイルでプロジェクト名.hを#includeする必要があるが)
俺はグローバル変数嫌いだから、
アプリケーションクラスのpublic変数として宣言しておいて
CHoheApp *pApp = (CHoheApp *)::AfxGetApp();
pApp->data = ....
っていう風にするけど。
(それ以前にグローバル変数を使わない設計にするがw)
あああ!グローバルじゃなかった罠。お騒がせしました。。。
ほんとすいません。。。分かってたんですが急いでたもんで(泣)
いちおう解決しました。どもでした。
(´-`).。oO(急がば回れ……)
あれ。。。消せた。さっきはデバッグフォルダの中身にロックかかってて
消すのに一回.NET閉じたんですよ。また閉じるとなると相当時間かかるから
そのまま圧縮しちまいました
243 :
デフォルトの名無しさん:03/04/13 14:03
244 :
デフォルトの名無しさん:03/04/13 14:32
289件のビルドタスクエラーがでたので顔殴らせてください
DDXでコントロールしてる文字列があるんですが
その文字列のコピーの仕方が分かりません。
どうやればこぴれますか?
246 :
教えてクン:03/04/13 17:32
モードレスダイアログのZオーダをアプリケーション内で最前面に固定するにはどうすれば?
(システムで最前面ではなく。)
>>246 SetWindowPos(&wndTop);
>>248 俺の記憶が確かならウィンドウは親ウィンドウよりも前に来る
>>214 2重インクルード防止に#ifdefなんてもう古い。
#pragma once 使え。
>>249-250 ???
以下のコードでm_bForeがドッチでもZオーダに関する動作は同じっぽいのだが?
何か間違ってる??
(ダイアログクラス)
if ( m_bFore )
{
// 常に手前に表示
SetWindowPos( &wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
}
else
{
// 手前でなくともよい
SetWindowPos( &wndNoTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE );
}
あ、まさか。
>251
どもです。とりあえず問題解決したので余裕ができたら調べます。
質問なんですが
あるcppファイルから他のヘッダを取り込んで
他のヘッダにあるクラスでオブジェクトを宣言しようとすると、
コンストラクタ関数を呼び出したことになってしまいます。
オブジェクトを新たに宣言できないんですがどうすればいいですか?
両方使え
>>252 >固定、したいんですが‥‥。
(゚Д゚)ハァ?
アハハ。親をデスクトップにしてたyo!
>>255 これが自分へのレスなのかすら分からない俺は馬鹿だ・・・
||
∧||∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( / ⌒ヽ < みんなありがとー。
| | 、, | \__________
∪ ノ )〜
| | |
∪∪
:
:
‐ニ三ニ‐
>>214 ( ´ー`)y-~~.。oO(C言語について基礎からやったら?)
>>261 いくらC言語を勉強しても解決できない悪寒
>261
基礎特訓中です。。。へたれですいません・・・。
なんでコンストラクタ関数になっちまうんだろぅ
>>262 ヘッダに
int Global_HOGE;
と書くわけだ。( ´_ゝ`)フーン…
わざわざVC++初心者スレがあるのに・・・
>265
いってきまつ
268 :
デフォルトの名無しさん:03/04/14 05:14
3つ質問させてください。締め切り間際で焦っております(つД`)
1.タスクバーのキャプションだけを変更する方法はありますでしょうか?
タイトルバーと違うキャプションにしたいのですが・・・
2.アプリが完全に立ち上がるまでの間、
砂時計をだすためにCWaitCursorを使っているのですが、
アプリをバッチファイルから起動した場合砂時計がでてきません。
(直接アプリを起動すると、最初から砂時計がでるようです)
バッチファイルからの起動で砂時計を出すためには何か必要なのでしょうか?
3.signalをひろって、アプリを落とす処理があるのですが、
そのときsignalの種類によっては、アプリケーションエラーのダイアログが出てきます。
このダイアログを表示させない方法はあるのでしょうか?
どうかご教授お願いいたします。
>>268 低能プログラマはクビになってしまえ
1. ムリ
2. 別に?
3. エラーをなくす
>>269 回答ありがとうございます。
2.はもう少し調べてみます・・・
3.に関しては私もエラーを無くすのが当然だと思うのですが、
仕様に含まれているため、処理を入れないといけないのです・・・。
アプリケーションエラーのダイアログはプログラムでは操作できないのでしょうか?
signalを無視するなど試してみたのですが、上手くいきませんでした。
271 :
デフォルトの名無しさん:03/04/14 07:15
_, ._
( ゚ Д゚) ・・・
CFileDialogで詳細表示の項目にオリジナルの項目を追加したいのですが
どうすれば宜しいでしょうか?ご指導願います(名前、サイズ とか表示されているところです)
>>268 >アプリを落とす処理
ど う や っ て 落 と し て る ん で す か ?
274 :
デフォルトの名無しさん:03/04/14 21:17
アホな質問でしみません。
デバッグ中にMFCのコードで止まるのですが、コードを修正しても
ステップ実行で無視されます。またMFCのソースコードを修正しても
いいものなのでしょうか?
アホな質問というか日本語的にどうかと。
>>270 1に関してはVCLは実現していますね。
二つのウィンドウを使って擬似的に行っているようです。
>>278 そっちで答えでてんのにどうしてわざわざこっちへ?
>>278 有る。探せ。
それかPIDL(ITEMIDLIST)勉強しる。
ちなみに人に聞いて回ることは「勉強する」って言わないからね
>> 272 です。CFileDialogを拡張して
hList = GetListViewInner();// リストビューのハンドル確保
hHead = ::GetWindow(hList, GW_CHILD);// そのヘッダーのハンドル確保
LV_COLUMNを利用して項目を追加するも詳細表示の表示項目その他を選択すると
落ちてしまいます。どなたかよきアドバイスをお願いします。
やはり1から作成するしかないのでしょうか?
284 :
デフォルトの名無しさん:03/04/15 10:51
RichEdit2.0の機能をつかってるサンプルソースを公開してる
サイトとかないでしょうか?
あのリンク機能とかバックカラー、アンダーラインなんかを使ってる
サンプルが欲しいんですが・・
285 :
デフォルトの名無しさん:03/04/15 11:25
>>285 英語のサイトなんか教えられても、ちっとも嬉しくないんだよ。
287 :
デフォルトの名無しさん:03/04/15 11:39
>>285 codeguruもcodeprojectも見てみましたが
RichEdit1.0のサンプルが主で、いくつか1.0の機能拡張とか2.0の単機能だけ
引っぱってきたサンプルはあるようなんですが
RichEdit2.0を前面につかったサンプルがまるでないようで・・・
あの程度の英語に学歴は関係ない。とにかく読め。
>>285 さん ありがとうございました
早速拝見させていただいたのですが
自分のほしい内容がありませんでした。
ほかに無いか再度探してみます
>>292 マジレスするが、エディタは自作が最強。
>>280 それっぽいのが見つかりました。
レスどうもです。
296 :
デフォルトの名無しさん:03/04/16 02:50
唐突なんですが、携帯電話とPCとを接続するケーブルってありますよね。
で、それを利用するアプリケーションは、そのケーブルのドライバを内部で使用しますよね。
....で、このドライバ仕様..というか携帯電話とのインタフェースって、公開されているモノ
なんでしょうか。
って、要するに「ケータイ・エディ」のようなソフトを作ってみたいんです。
ちなみにIOデータの"USB-CDMA"に付属のドライバ、UCDMAM.SYSでは、当然内部で
USBD.SYSをimportしてるんですが、これの仕様もどこか(例えばMSDN等)で公開
されてるんでしょうか。
298 :
2chブラウザつくってるわけじゃないですが:03/04/16 07:51
静的分割ウィンドウの分割方向って変更でき……ないですよね。
ホットゾヌみたいに表示形式を変えたい場合はどうすればいいんでしょう?
_______ _______
| | B | | | | |
| A |______.| | A. | B | C |
| | | | | | |
| | C | | | | |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ ̄
--
Windows2000SP3 VC6SP5
ふと考えたのが
1. AとBをダイアログバーにしてしまう
2. CFormViewにしてA,B,Cをコントロールとして貼り付ける(VBみたいに)
……あんまりスマートじゃないな。
ヒントやキーワードがあったらお願いします。
300 :
フルカラーアイコン:03/04/16 09:19
XP上のIEのように、ツールバーをフルカラーアイコンにしようと調べてるけど、
IEって、画面のプロパティの色設定が反映されないの。
ツールバーや、メニューなど。
同じようにプログラム側で固定の色にしようとやってみたら、
ツールバーとステータスバーは、SetBkColor()で出来るけど、
メニューやリストビュー、ツリービューのヘッダやスクロールバーなどの色を
固定化する方法が見つからないの。
どうすれば、IEのようにできるのでしょう?
フルカラーのツールバー用アイコンをアルファチャネルのデータを
反映させて透過色にできるのが本当は一番いいんだけど。
よろしくね。
オーナードロー
302 :
デフォルトの名無しさん:03/04/16 09:56
>>298=299
垂直分割と水平分割の切り替えはやったことが無いんだが、
分割したViewの中身を後から入れ替えたことはある。
Googleで「CSplitterWnd 切り替え」でヒットする情報なんかが参考になるかと。
一眠りしたら頭がすっきりしますた
CCreateContext context;
context.m_pCurrentDoc = GetActiveDocument();
このcontectをCSplitterWnd::CreateView()で使えばよかったんですね。
CSplitterWnd::DestroyWindow()で一度壊してから、
改めて普通に分割ウィンドウを作るように組んだらできました。
>>302 キーワードありがとうです。
訪問済みリンク率は高かったんですが「切り替え」が思い浮かばなかった……
>>303 見る前に解決してしまいました。
レスありがとう。
>>282 codeproject内にて"Column Settings"で
検索すると見つかりましたのでここに報告します。
レスをいただいた方々にこちらにてお礼の返事とさせていただきます。
ありがとうございました。また何かありましたらよろしくお願いいたします
>>268 1.逆に、タイトルバーの方を自分で描画すればいいだろ。
どうしてもタスクバーの方を変えたいなら、
クラス名が"Shell_TrayWnd"のウィンヅゥの中のタブコントロールを探せ。
タスクバーはタブコントロールだから、
うまいことメッセージを送れば表示を変えられる。
>>268 クラシックスタイルまでは、SetWIndowText()でタスクバー、
WM_GETTEXTでキャプションだったのだが、
LUNAでこけてしまった。
私も知りたい。
>>270 例外を無視する・・・・んじゃ駄目なんだろうなぁ・・・。
(^^)
310 :
デフォルトの名無しさん:03/04/17 16:16
Spy++って便利だねぇ。
まさかデスクトップが
311 :
デフォルトの名無しさん:03/04/17 17:32
CHtmlViewからCMainFrameの関数を使おうと
(CMainFrame*)GetParentFrame()->xxx();
のようにしたのですが、
「'CMainFrame' 定義されていない識別子です」
と言われてしまいました。MainFrm.hをincludeしてみたら、
「'xxx'(CMainFrameの関数名):'CFrameWnd'のメンバではありません」
と怒られます。どうやったら解決しますでしょうか?
((CMainFrame*)GetParentFrame())->xxx();
こうじゃねえか。
うう、本当だ。ありがとうございます。
MainFrm.hはincludeの必要ありでいいのでしょうか? CmainFrameの定義が書いてあるので
とりあえずincludeしてみましたが、Google等で調べたサイトなんかでは特にそんなことは書か
れていなかったのですが…。
問題ないと思う。俺はいつもそうしてる。
気になるようならCMainFrameに向かってSendMessage()すればいい。
AfxGetMainWnd()->SendMessage(・・・・);な感じ。
ありがとうございます。安心しますた。
どうしてもダメだったらSendMessageしかないかなー、とは少し思っていました。
SendMessageか
最近つかわないなぁ
今はPostMessageの方を使ってる
こっちの方がなんとなく安全そうだし
その「なんとなく」ってのがコワイ
変数の生存期間とか考えてちゃんと使い分けないとダメだよ(^_^;)
>>316 もしかしてPostMessageでローカル変数のポインタとか渡してないか?
もしかしてPostMessageでローカル変数のポインタとか渡してないか?
320 :
デフォルトの名無しさん:03/04/17 22:30
安全って面ではSendMessageの方が安全っぽい感じがするけどなあ・・・・
322 :
デフォルトの名無しさん:03/04/18 00:02
cs.style |= WS_CLIPCHILDREN;
とすると、
CRect rc;
GetClientRect(&rc);
InvalidateRect(rc, TRUE);
で再描画されなくなってしまうのですが、
何か他に描画を促す方法ありませんか?
324 :
デフォルトの名無しさん:03/04/18 00:32
>>323 UpdateWindow駄目だったけれど、
RedrawWindowでいけました。
ありがとう。
325 :
デフォルトの名無しさん:03/04/18 09:50
ダイアログベースアプリで
そこからCFrameWndとCViewを構築したんですが
ViewのON_UPDATE_COMMAND_UIが呼ばれてこないんですが
どんな問題が考えられるでしょうか?
ちなみにCFrameWndにはメニューはついてませんが
ツールバーはついてます。
>ダイアログベースアプリで
>そこからCFrameWndとCViewを構築したんですが
_, ._
( ゚ Д゚) ・・・
327 :
デフォルトの名無しさん:03/04/18 10:38
>>326 ダイアログベースアプリから呼び出すダイアログを
CFrameWndの派生クラスから作った感じです。
単純にCFrameWnd::Createを呼んでOnCreateClientでViewを作っただけなんですが
そのCFrameWnd::OnCreateで普通に作ったツールバーのEnable/Disable更新のため
CViewの派生クラスにON_UPDATE_COMMAND_UIを作ったんですが
これが呼ばれてこないんで??な状況です。
一応ツールバーのボタンをクリックすればViewにあるON_COMMANDは呼ばれてます。
328 :
bloom:03/04/18 10:53
ドキュメント・ビューについて勉強することをおすすめする
すんません解決しました。
親ダイアログでWM_KICKIDLEをひろって
そこで子のCFrameWndに
SendMessageToDescendants(WM_IDLEUPDATECMDUI・・・を
送ったらViewのON_UPDATE_COMMAND_UIが呼ばれるようになりました。
331 :
デフォルトの名無しさん:03/04/18 19:21
CxxxAppのInitInstanceでProcessShellCommandの
app filename → 開く
という場合だけ処理させないようにしたいのですが、どうすれば
いいでしょうか?
app → 新規作成
はそのまま残しておきたいのですが。あるいは、ProcessShellCommandの
行を丸ごとコメントアウトして、コマンドライン引数がないときのみ新規作成
処理をさせる方法も考えたのですが、方法が解らずです…。
お願いします。
>>331 ProcessShellCommand filenew
あたりでググってみれ
ところでおまえらもうMFC7に移行してる?
VS.NET2003のMFCが8になるのかどうかは知らんが、
やはりWin95(そろそろWin98も斬り捨てるのかなぁ)では動かないだろうから、
今のところMFC6から先に行かず、むしろATL/WTLに興味を持ち始めた
今日この頃の俺なんだが。
∧_∧
( ^^ )< ぬるぽ(^^)
∧_∧
( ^^ )< ぬるぽ(^^)
いいんじゃない?
>やはりWin95(そろそろWin98も斬り捨てるのかなぁ)では動かないだろうから、
95はすでにMSがサポート打ち切ってんじゃん。
98とNT4.0は6月までだっけか。
>>337 MSがWin95のサポート打ち切ったのとMFC7がWin95を斬り捨てたのはなんか関係あんの?
その論理で行くと次のMFCはWin98/NTを斬り捨てることになるが。
Win95のサポートが2001年3月まで、
MFC7(VisualStudio.NET)の発売が2002年3月末であることを考えると
MFC7は95をサポートしていない、と見ていいんじゃないかな……。
CFileDialog表示時
詳細項目表示状態画面にて
詳細項目の表示欄の項目をこちらの
希望どおりにプログラムにて
表示させる方法があれば
教えていただけませんか。
(例 CFailDialogを開く前に
Aを選択すると
名前 サイズ タイトル と表示
Bを選択すると
名前 サイズ 種類 と表示
)
ツールとOSは
VC++6 WIN2000です。
>>341 自分でCFileDialogみたいなダイアログを自作する
343 :
デフォルトの名無しさん:03/04/21 13:59
フォトショップのツールの様なウインドウをMDIにて作成中です。
はじめにモードレスダイアログで作成したのですが、これだとダイアログを
アクティブにしたときにメインフレームがアクティブ状態でなくなります。
次に、ダイアログバーのフローティングを利用して作成してみました。
この場合はどのウインドウもアクティブ状態になるのですが
複数のダイアログバーを作成してダイアログバー同士が重なった場合
下のダイアログバーをクリックしてもウインドウのが前面に
出てきてくれないのです。
何か良い方法があればご教授いただけたらと思います。
>>343 ツールバーでしか試したこと無いからできるかわからないけど
まず、CDialogBar(これの派生クラス使ってるんだよな)の派生クラスを
別にこんな感じで作ってくれ。
ヘッダーファイル
class CMyDialogBar : public CDialogBar {
public:
CMyDialogBar(){ ; }
virtual ~CMyDialogBar(){ ; }
afx_msg void OnLButtonDown(UINT nFlags, CPoint point) ;
DECLARE_MESSAGE_MAP()
} ;
cppファイル
BEGIN_MESSAGE_MAP(CMyDialogBar, CDialogBar)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
void CMyDialogBar::OnLButtonDown(UINT nFlags, CPoint point)
{
if(IsFloating()){
CRectrect ;
CWnd*pwnd1, *pwnd2 ;
pwnd1 = GetParent() ;
pwnd2 = pwnd1->GetParent() ;
pwnd2->GetWindowRect(&rect) ;
pwnd2->SetWindowPos(&wndTop, rect.left, rect.top
, rect.Width(), rect.Height(), SWP_SHOWWINDOW) ;
}
CDialogBar::OnLButtonDown(nFlags, point);
}
ぬけてた、class CMyDialogBar 内に
DECLARE_DYNCREATE(CMyDialogBar)
をついか、
ああ、すまん345はいらなかった、無視してくれ。
つぎはこれ
ヘッダーファイル
#include <afxpriv.h>
class CMyMiniDockFrameWnd : public CMiniDockFrameWnd {
DECLARE_DYNCREATE(CMyMiniDockFrameWnd)
protected:
CMyMiniDockFrameWnd(){ ; }
virtual ~CMyMiniDockFrameWnd(){ ; }
afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point);
DECLARE_MESSAGE_MAP()
};
cppファイル
IMPLEMENT_DYNCREATE(CMyMiniDockFrameWnd, CMiniDockFrameWnd)
BEGIN_MESSAGE_MAP(CMyMiniDockFrameWnd, CMiniDockFrameWnd)
ON_WM_NCLBUTTONDOWN()
END_MESSAGE_MAP()
void CMyMiniDockFrameWnd::OnNcLButtonDown(UINT nHitTest, CPoint point){
if (nHitTest == HTCAPTION){
CRectrect ;
GetWindowRect(&rect) ;
SetWindowPos(&wndTop, rect.left, rect.top, rect.Width(), rect.Height()
, SWP_SHOWWINDOW) ;
}else if (nHitTest >= HTSIZEFIRST && nHitTest <= HTSIZELAST){
CRectrect ;
GetWindowRect(&rect) ;
SetWindowPos(&wndTop, rect.left, rect.top, rect.Width(), rect.Height()
, SWP_SHOWWINDOW) ;
}
CMiniDockFrameWnd::OnNcLButtonDown(nHitTest, point);
}
で、自分が作ってたダイアログバーの派生もとのクラスを
CMyDialogBarに変更して、CMainFrame::OnCreate()内の
EnableDocking()を呼び出している後ぐらいに
m_pFloatingFrameClass = RUNTIME_CLASS(CMyMiniDockFrameWnd) ;
を付け足して終わり
試したことないから報告よろしく
ちなみに、やっていることは単にクリックされたら一番前に来るように
してるだけ。
ツールバーの時にはツールバー自体のウインドウとその枠の部分のウインドウ
になってたのでCMyDialogBarとCMyMiniDockFrameWndの二つが必要なはず
>>344さん出来ましたどうもありがとう!
返事が早くて恐縮です。
>>350 問題なしのようでなにより。
ちなみにツールバーの場合は(もうわかってると思うけど)
class CMyDialogBar : public CDialogBar {
のところをCToolBarにして、同様にすればOk
今回の例では右クリックは実装していないのでお好みで、
ダイアログバーでも使えることがわかったのでこちらからもサンクス
352 :
デフォルトの名無しさん:03/04/21 19:35
DrawFrameControl で
DrawFrameControl(rc, DFC_BUTTON, DFCS_BUTTONPUSH);
とかやって、ボタンっぽいのを書いているんですが
これの表示色を変える方法はないですか?
SetBkColorとかじゃ変わらないのですが?
SetTextColorは違うのか?
MDIで複数の子ウィンドウを表示させている時、特定のウィンドウだけをwndTopMostみたいに
他の子ウィンドウに対して常に前面に表示させるという事は出来ますか?
ちなみにその子ウィンドウに対し、SetWindowPosでwndTopMostを試して見ましたが駄目でした。
よろしくお願いします。
CPropertySheetを使って設定のプロパティーシートを作ってみたのですが、
どうしてもクラスの外(C〜View)からコンストラクタのみでCPropertyPage内の関数を呼び出したいのですが、
何かよい方法をご存じないでしょうか?
表示しないようにして関数を使いたいのです・・
やっぱりCreateとかを呼び出さないと無理なんでしょうか?
そのC〜ViewをShowWindow(...)で表示しないで
プロパティウィンドウを普通に表示すればいいと思うが・・・
おっとちょっと間違えたかな
>>コンストラクタのみでCPropertyPage内の関数を呼び出したいのですが
??? シートのコンストラクタからページの関数を呼び出すということか?
普通にできると思うが
>>357 レスありがとうございます。書き方が悪かったです。スミマセン。
もともとViewは表示してあって、プロパティーシートの方を表示したくないのです。
CPropertySheet sheet("設定");
sheet.m_Page1.関数();
これだとエラーが出てしまいます。
>>359 最近の厨房様は「エラーが出ます」と書けば回答者がエラーを推測して答えてくれるとお考えらしい。
>>354 やっぱ、無理っすか。サンクス。
自前で描画すりゃいいのか。
スミマセン自己解決できました。イベントハンドラの関数を呼び出していたのがいけなかったらしいです。
やっぱりダメでした。GetDlgItemを呼び出すと
Debug Assertion Failed!
File: Winocc.cpp
Line: 94
というエラーが出てしまいます。
VS.NET2003出たね。ダウンロードだけど。
>>363 ウインドウハンドルを使用する関数などはDoModal()やCreate()の後でなければ
hwndが無効な値なので使用できない。GetDlgItem()もhwndを使用するので無理。
これはダイアログのときも同様。
MFCではダイアログ データ エクスチェンジ(DDX)でコントロールに変数に
int, CStringなどの値を設定しているときはその変数へのアクセスはDoModal()等
しなくても普通にできるが、コントロールクラス(CListBox等)を設定した場合は
DoModal()等の後でなければならない。GetDlgItem()等も同様。
これらのコントロールクラスにアクセスするタイミングは普通、OnInitDialog()の
中であるので、この関数をオーバーライドしてCListBox等の初期化を行う。
プロパティーシートの場合はシート・ページ別々にあるのが、普通はページのほう
をオーバーライドする。
>>365 ありがとうございます。別の方法を考えてみます。
フレームにビューを使わず自作のコントロール(CXXXCtrlを派生したもの)
を直接張るにはどうすればいいですか?
>>367 ・ダイアログベースで作る
・ドキュメント/ビューを使わない
>>369 CViewにも子ウィンドウは貼り付けられますが?
コントロールから独自のViewを作れるよ。
>>371 大まかで良いからやり方を教えてください。または参考になる文書でもいいです。
CCtrlView絡みだとは思っているのですが、何回かやった時には出来ませんでした。
>>372 CEditViewとかCListViewのソースを見ればよろしい。
>>372 「MFCによるWindowsプログラミング」という本のP657に載ってる。
WEBでもCodeGuruやCodeProjectあたりにありそうだけど確認してない。
>>370 ビューを使わず、って書いてあったからさ……
>>341 です。
できればCFileDialogを拡張して
動作可能な状態にしたいのですが・・・
CodeGuruやCodeProjectでも見つかりませんでした。
どなたか回答していただけませんでしょうか
よろしくお願いいたします。
リソーススクリプト(*.rc)のアイコン定義部分を
#define APP1
・・・
#ifdef APP1
IDR_MAINFRAME ICON DISCARDABLE "res\\app1.ico"
#else
IDR_MAINFRAME ICON DISCARDABLE "res\\app2.ico"
#endif
みたいにしてマクロの切り替えでアイコンを切り替えるようにしてみたのですが、
rcファイルのセーブを行うと、
IDR_MAINFRAME ICON DISCARDABLE "res\\app1.ico"
みたいに現在有効な行以外が全て消されてしまいます。
何かいい方法は無いでしょうか?
379 :
デフォルトの名無しさん:03/04/24 22:10
>「MFCによるWindowsプログラミング」という本のP657に載ってる。
今でも買えるところ教えてください。
増刷してくれんかな・・・
>>378 app.rc2 とかに書いてインクルードすべし。
っていうか別に手で書かなくても IDE で出来るでしょ。。
なんだっけ、リソース(アイコン)を右クリックしてコピーの挿入とかそんなので。
>>380 IDEが勝手に「#ifdef APP1」とかの記述を消してしまうんです。
#includeも試したのですが、結果は同じでした。
(#includeも消されます)
コンパイルオプションによってアプリのアイコンを変えるのが
目的なので、rcファイル以外の方法があれば・・・。
383 :
デフォルトの名無しさん:03/04/24 23:02
MFCの場合、コールバック関数(WndProcとか)はどこに記述されているのですか?
デスクトップ上のウインドウを列挙したくてヘルプを見ると、
EnumWindows関数でウインドウハンドルをコールバック関数であるEnumWindowProcに
送り、その中で処理をしろと書かれているのですが、EnumWindowProcがどこに記述されて
いるのか分りません。
EnumWindowProcを適当に追加してみると、
「(?EnumWindowsProc@@YGHPAUHWND__@@J@Z) はすでに test1.obj で定義されています」
というエラーがでてしまします。VC++6.0です。
384 :
デフォルトの名無しさん:03/04/24 23:07
>>383 その手の質問(単一のAPI関数の使い方のような質問)は、
まずGoogle行った方が確実な情報が見つかりますよ。
385 :
デフォルトの名無しさん:03/04/24 23:08
>>382 いえ、私は以前の人とは別で、
あの本を探しているだけの者でして・・・
そういうことにしたいのですね
>>381 VisualStudio 6.x だと、アイコンリソースを右クリックして「コピーの挿入」、
出てきたダイアログの「条件」のとこにdefine 名(ReleaseとかDebugとか)を
書けばできますよ。.NET ではどうやるのかシランけど。
>>387 できました!!!。
#if defined(APSTUDIO_INVOKED)
という記述で変更禁止をしているみたいです。
380さん、387さん、大変お世話になりました。
390 :
デフォルトの名無しさん:03/04/28 10:21
MFCを使ったドトネトは流行ってますか?
391 :
動画直リン:03/04/28 10:26
392 :
デフォルトの名無しさん:03/04/29 12:56
すいません。(またですが)
ドッキングダイアログ上のリストボックス・ツリーボックスのクリックイベント
の取得と初期化と選択している項目の変更ってどうすればよいでしょうか?
393 :
デフォルトの名無しさん:03/04/29 13:13
>>392 用語をもっと正確かつ具体的に!
ドッキングダイアログって?
ツリーボックスって?
すまそ。
ツリービューとドッキングバーです。
397 :
デフォルトの名無しさん:03/04/30 22:21
知ってる人教えてください
VC++をインストールしたら特定のWebを開くとランタイムエラーと表示されます
どうやったら消えるか分からないので
とりあえずインストールしたVC++をアンインストールしました
しかしまだランタイムエラーと出ます
これを表示させなくする方法知ってるひといませんか?
>>397 VCはだいぶ前の商品だから古いDLLが上書きされちゃったんでしょうね。
WindowsのSPを当てなおしてみるのとかどうですか?
それで動けば、またVCをインストしてその上からさらにSPを当てる。
まぁボクはその状況になってないので、正確な答えじゃないかもしれませんが。
でも、なんでMFC限定のこのスレに?(  ̄ー ̄)
リサイズ可能ドッキングバーってCodeGuruあたりにサンプルなかったっけ
402 :
デフォルトの名無しさん:03/05/01 09:31
403 :
デフォルトの名無しさん:03/05/01 12:45
SetWindowRgnについて質問があるのですが、
この関数を使ってウインドウのリージョンを変更する場合は、
ダイアログベースで作成するのが基本と思っていいでしょうか。
ダイアログベースで作成したCTestDlg::OnInitDlg(){ ・・・に記述したら
正常にリージョンが変更反映されましたが、
SDIやMDIで作成したCTestView::OnInitialUpdate(){ ・・・ に記述したら
通常のウインドウ枠が表示され、その中にリージョンも作成されるというなんか
ヘンな動作となってしまったのです。SDIやMDIだとCMainFrameやCChildFrameクラスが
あるからムリなのでしょうか?それとも私のコードの記述の仕方がまずかったのでしょうか?
CRgn* m_windowRegion;
void CTestView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
m_windowRegion = new CRgn;
m_windowRegion->CreateEllipticRgn(0, 0, 200, 200);
SetWindowRgn(*m_windowRegion, TRUE);
SetWindowPos(&wndTop, 0, 0, 200, 200, SWP_NOMOVE);
}
404 :
デフォルトの名無しさん:03/05/01 13:54
>>403 ViewにRegionくっつけても
Viewの親にCFrameWndがいるからおかしな事になるんでないの?
やるなら、CTestFrameWnd::OnCreateあたりでためしてみたら?
OnInitDialogとOnIntialUpdateは動作的に別物と考えた方がいい。
406 :
デフォルトの名無しさん:03/05/01 23:00
LoadBitmap関数を使ってCBitmapオブジェクトにBMPファイルをロードしたいのですが
MSDNを見ると
BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );
と、2つあります。リソースIDを使用してLoadBitmapする方法は上手くいきました。
が、私はファイル名を引数としてLoadBitmapしたいのですが上手くいきません。
「引数 lpszResourceName
ビットマップ リソース名を表す NULL で終わる文字列へのポインタ。」
と書いてあるので、文字列リテラルを渡せばいいと思うのですが、
何が間違っているのでしょうか?
CBitmap bmp;
BOOL bl;
// bl = bmp.LoadBitmap(IDB_BITMAP1); ←これだと上手くいく
bl = bmp.LoadBitmap("test.bmp"); ←これだと0=FALSEが帰ってきてしまう。
>>404-405 レスありがとうございます。
言われた通り、CMainFrame::OnCreate以下に
>>403と全く同じコードで
希望のSDI/MDIができました!!!ヽ(´ー`)ノ
>>406 LoadBitmapはあくまでもリソースからロードする関数なので、
ファイルから直接ロードしたい場合はLoadImageで。
>>408 レスありがとうございます。
納得しました!!!ヽ(´ー`)ノ
MFCでフォーム作ると、1つの大きなrcファイルになるのでしょうか。
フォームを色んなシステムで使いまわししたいとき不便だと思うのですが、
どうなんでしょう。
411 :
デフォルトの名無しさん:03/05/02 17:07
プロパティページのエディットボックスコントロールに
あらかじめ値を入れておくにはどこに記述すればいいんでしょうか?
PreCreateWindowは通らないみたいだし
PreInitDialogの中でSetWindowTextをやっても
「Debug Assertion Failed!」になってしまいます。
おしえてください。おねがいします。
412 :
動画直リン:03/05/02 17:13
>>411 そのAssertion は ASSERT(IsWindow(m_hWnd)) みたいなのでは?
だとしたら、その意味をよく考えることですな。
OnInitDialog
>>411 OnInitDialog()でやれ、つーか値ならDDX使え
>>413-415 ありがとうございました。
できるようになりました。
>>415 コントロールのメンバ変数が
CStringじゃなくてCEditでもできるんですか?
>>416 CEditの他にCString変数も作ればええやん
DDXやら CString はコードが肥大化するから、大して必要も無いならやめとけ
なんでやねん
420 :
デフォルトの名無しさん:03/05/06 15:45
モードレスダイアログにリストビューを貼って、LVS_EX_INFOTIPスタイルを追加したのですが、
ツールチップがダイアログの後ろに表示されているようです。
ちゃんと前面に表示させるにはどうすればよいのでしょうか?
プロパティシートでも同様の問題が起こるんだけど、みんなどうしてるのかな・・・
マジで
>>420はどうすれば・・・
モードレスダイアログまたはプロパティシート状のリストビューコントロールで
m_list.SetExtendedStyle(LVS_EX_INFOTIP);
とするとツールチップが後ろに表示されてしまう・・・
426 :
デフォルトの名無しさん:03/05/08 10:46
MFCのプロジェクトで、
throw std::runtime_error
しても、文字列も出ないしプログラムが終了してしまいまつ。
キャッチを自分で書かなきゃならないでつか?
それともMFC用のエラークラスがあるのでしょうか?
例えば、BCBとかだと、キャッチのコードが生成されてて、
throw Exception("")すると、
エラー系のメッセージボックスが出てプログラムが終了しませんけど。
「MFCのWinMainがライブラリに閉じられてるがために、
アプリケーション全体のキャッチを記述出来ない」なんてことは無いですよね?
もしそうだったら、やっぱ、さっさとBCBにコンバートした方がヨサゲ。
CWinApp::InitInstance()のオーバーライドのソースに
#include <iostream>を入れると、
>error LNK2005: "void __cdecl operator delete(void *)" はすでに
>libcpmtd.lib(delop.obj) で定義されています
>fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました
>link.exe の実行エラー
というエラーがでまつ。
MSDNでは、マルチスレッド対応してないライブラリが混ざってると。
MFCって本当にC++でつか?
>>428 リンクするライブラリ・使用するランタイムライブラリの指定を確認するか、BCBにカエレ
マルチポストするほど必死なのになぜ煽る?
>>426 強制終了させたいならabort()でも呼び出しとけば?
>>426 MSDNで「処理されない C++ 例外」とか。
>現在の例外に対して該当するハンドラ (または省略記号の catch ハンドラ) が
>見つからないと、定義済みの terminate 関数が呼び出されます。
>terminate のデフォルト機能は、abort を呼び出すことです。
MFCにもエラークラス(CxxxException)はある。
MFCでTHROW使ったときに関しても
>CATCH ブロックを用意していないときは、制御は Microsoft Foundation Class
>ライブラリのモジュールに移り、エラー メッセージを出力してプログラムを終了
>します。
強制終了になるのを回避したくて、キャッチしたのですが、
>>428 に書いたようなコンパイルエラーです。
>>433 /MD(/MDd) or /MT(/MTd) かな?
コンパイルは通るようになりました。有難うございまつ。
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
これがBCBでのコードです。これだとプログラムは終了しません。
が、MFCで、
BOOL CWinApp::InitInstance()
{
try {
int nResponse = dlg.DoModal();
} catch (const std::exception& e) {
MessageBox(0, e.what(), "catchされてないエラー", MB_OK);
}
}
だと、プログラム自体終わってしまいます。
もっと良いキャッチの場所は無いでしょうか?
>>435 それはSEH使わんといかんのかな?詳しい人きぼんぬ。
たったいま例外処理スレの方に書いたとこ。
>>435-436 ダイアログベースかー。
そのダイアログクラスのWindowProcをオーバーライドしてそこで
try-catchすればいける、かも?
でもオレならSDI とフォームビューで書き換えるな。
SEHは放っておいてワトソン博士に任せたい。
自分でコールスタック解析したりしたくないから。
ところで
>>435のVCのコードって、エラーメッセージボックスも出ないで
終わっちゃうの?
メインウィンドウが破棄されるとMFCがPostQuitMessageを
コールするので、メッセージボックスが出せなくなるってやつかな?
>>440 エラーメッセージボックスは出まつ。
が、キャッチを入れずにdlg.DoModal();の後にメッセージボックスコールを入れも、仰るとおりメッセージボックスは出ません。
>でもオレならSDI とフォームビューで書き換えるな。
すごい興味深い内容だけど、ソースコードで見たいな...
>>435 Wincore.cpp にある AfxCallWndProc() 関数内の CATCH_ALL に引っかかってる?
444 :
デフォルトの名無しさん:03/05/09 20:39
超初心者でもうしわけないのですが、
Editコントロールに複数行をコードから表示したい場合どうすればいいのですか?
リソースエディタのスタイルでは複数行と改行を許可にチェックは入れています。
CString str1 = "aaaa\nbbbb" とすると
エディットボックスには、
aaaa
bbbb
と表示されてしまいます
aaaa
bbbb
と表示したいのです・・・。
>aaaa
>bbbb
>と表示されてしまいます
>aaaa
>bbbb
>と表示したいのです・・・。
何が違うのこれ。
>>445 ん?分かんない?環境が違うのかな・・・俺んとこじゃあ(ry
_, ._
( ゚ Д゚) ・・・
よくわからんけど\r\nで解決。
俺んとこでも同じに見えるよ・・・
>>445-448 レスありがとうございます。
あうっΣ(´Д`lll) カキコで変換されてしまってたようです。
aaaa・bbbb みたいな形で1行になってしまっていたのでした。
>>448さんの言う通り
CString str1 = "aaaa\r\nbbbb"としたら2行に表示されました。
ありがとうございました。
450 :
デフォルトの名無しさん:03/05/09 23:59
すいませんが、もう1つ質問があります。
FormView上に貼り付けたEditコントロールのフォントを変更したいのですが、
どうにもよくわからないのです。ヒントでいいので教えてください。
SetFont
>>451 上手くいきました。ありがとうございました。
(このくらい調べろと言われそうですが、、調べてSetFontとか
CreateFontIndirectとかわかってたのですが、どうにも上手く
いかなくて、もしやエディットコントロールは無理なのでは?Σ(´Д`lll)
といろいろ悩んで・・・レスが出たときにやっぱりできるのだと
もう1度試行錯誤して・・・なのでご了承を!ヽ(`Д´)ノ)
>>442 ごめん。ソース書くのはめんどくさい。
あらすじだけで勘弁して。別に普通にこうするんだけど。
MFC AppWizardでSDIアプリを作って、
ビューの基底クラスをCFormViewにおきかえて、
そのビューのダイアログリソースは旧ダイアログアプリで
使ってたダイアログをコピってきて貼り付ける。
あとはごりごりとロジックを移植していく。
で、例外処理はInitInstance, ExitInstanceと
各ウィンドウのWindowProcの中をtry-catchして処理。
454 :
デフォルトの名無しさん:03/05/10 21:23
CTreeCtrl で LVITEM と関連付いていないものがあるとします。
それで、ItemTextなどを指定してLIVTEM を取得する方法はありませんか?
455 :
デフォルトの名無しさん:03/05/11 06:36
CTreeCtrlなのにLVITEM?
CListCtrlみたいなFindItemとかがなければ
ループで一つ一つ探すしかないんじゃない?
456 :
デフォルトの名無しさん:03/05/12 00:26
すいません。HTREEITEMです。
かなり遅れましたが原因がわかりました。全然違いところにありました。
メインのダイアログをSetWindowPosでTopmostに表示していたため、
リストビューにLVS_EX_INFOTIPスタイルを設定しても、ツールヒントが
メインダイアログの後ろに表示されていました。
これは仕様なんでしょうね・・・
458 :
デフォルトの名無しさん:03/05/12 13:57
テキストをマウスでクリックしたときのイベントを
ClassWizzardで作成しましたが、起動されません。
どうしたら良いのでしょうか?
具体的には、CTEXTのクリックイベントを作りたいです。
>>459 CStaticとかCEditではないの?
なんだ、それが言いたかっただけか
>>461 ダイアログだったらリソースエディターで通(略
某島社員も大変だな…
>>463 ちゃんと嫁。
ダイアログエディタでダブルクリックしただけじゃ、イベントハンドラできるけど、起動されん。
M$厨ったら...
BCBのTLabelのイベント調べたら、
>OnClick, OnContextPopup, OnDblClick, OnDragDrop, OnDragOver
>OnEndDrag, OnMouseDown, OnMouseMove, OnMouseUp, OnStartDrag
これだけあるし、派生でイベント足せるし。
それに対して、CTEXTは、BN_CLICKEDだけってどういうことよ?
今更な話題をあえてもってくる理由とは
VC初心者のBCB信者も大変だな。
とりあえず、CTEXTってなんだよ…
CTEXT age
リソーススクリプトのCTEXTのことかな。
スタティックコントロールくらいは言って欲しかったね。
MFC プロジェクト作りますた。
何も変更せずビルドしますた。
そのままデバッグ実行しますた。
フリーズしますた。
ど う す れ ば い い ん だ
ちょっとふざけた書き方でしたが、
ホントにどうすればいいのかサッパリで...。
何が原因なんでしょうか?
>>471 っで環境は?
と煽って欲しいんですね。
>471
VS.NETproでそれなったことある。
漏れの場合、IISのインストールが正しく出来てなかった。
マニュアル見てIISだけ入れなおしたら、デバッグ通るようになった。
MFC7で追加されたクラスで何か便利だと思うものある?
よく言われるのはDHTML系のクラスとメッセージマクロだけど、
他にもこんなのがこんなふうに使える!とかあったらきぼん。
>>474 経験したことのある人なら環境も分かるかと思いまして。
ちなみに、環境は Windows XP Pro. + Visual Studio .NET Academic です。
>>475 その線でチャレンジしてみたいと思います。
>経験したことのある人なら環境も分かるかと思いまして。
真の教えて君としてはなかなかの筋。
479 :
デフォルトの名無しさん:03/05/12 21:39
CListCtrl(リストビュー)のことでお聞きしたいのですが、
エクスプローラなどでは、
選択→濃い青、未選択→白、選択(フォーカスなし)→灰 ですが、
CListCtrlを貼り付けて適当にアイテム追加して実行すると
選択→濃い青、未選択→白、選択(フォーカスなし)→白 となってしまいます。
これでは、未選択と選択(フォーカスなし)の区別がつかないのですが、
これは、フォーカスを自分でチェックしてその時に灰色で描画するように
ぐりぐりとコードを書かなければならないのでしょうか?
>>478 真の教えて君は必要なことを書かずについ余計なこと書いちゃうからね。
>>475 IIS ではありませんが、
一部修復インストールすることで解決しました。
ありがとうございました。
482 :
デフォルトの名無しさん:03/05/12 23:24
>>499 試してないんで違うかもしれんが、
LVS_SHOWSELALWAYSを追加したらどう?
と思ったら、何かまた新規プロジェクトを作ったら
同様の症状が現れましたね。
とりあえず何かすれば症状が治まるようです。
まぁ、訳分かりませんが、とりあえずそれで我慢しときます。
>>482 ビンゴです!エクスプローラと同様の表示になりました。
CListCtrl(リストビュー)のプロパティに「常に選択を表示」と
いうのがありました。o( 〃゜O゜〃)ゝアイタタタ・・・
ありがとうございました。
DDX/DDVってなんじゃ
これってpublicな変数とちゃうんか
わけわかめ酒
MFC Programmer's SourceBookの日本語訳のページが見つからないのですが、
どこにあるのか教えて下さい
CReBar使った時の各コントロールバーの位置を
記憶しておく方法ってなんか無いですか?
>>488 GetReBarCtrl()とGetBandInfo()かな?
REBARINFO のどこにその手の情報が入っているのですか?
>>489
レバーコントロール。
語源:取っ手の形をしているから。
レバー = lever
>>490 REBARINFOじゃなくてREBARBANDINFO
UINT cxMinChild
UINT cyMinChild
UINT cx
UINT wID
UINT cyChild
UINT cyMaxChild
UINT cxIdeal
UINT cxHeade
あたりでどうにかならないか?
>>491 猫ではそう呼んでるね
494 :
デフォルトの名無しさん:03/05/15 23:46
ReBarの様なフラットなビットマップボタンをダイアログ上で
利用するにはどうすれば良いのでしょうか?
ご教授お願いいたします。
495 :
デフォルトの名無しさん:03/05/15 23:49
496 :
デフォルトの名無しさん:03/05/15 23:57
マルチスレッド@MFCの質問っす
MSDNには「CWinThreadオブジェクトを使わずにスレッドを作成したアプリではそのスレッドからMFCオブジェクトにアクセスできない」とあります。
これはつまり、たとえばスレッド関数内のローカル変数のCStringオブジェクトを作ったり使ったりしちゃまずいということですか?
AfxBegiんThreadでつくったスレドも上記の「CWinThreadオブジェクトを使わないで作成したスレッド」に該当しますか?
>>496 AfxBeginThreadはCWinThread オブジェクトへのポインタを返す
自由に配置したいんです。
>>498 そういうボタンを自分で作るか、MFC7にあるCDHtmlDialgみたいな名前のクラス使ってはどうか。
>>498 CReBarCtrlをCreate()できない?
ダイアログ上でもできそうだけど
501 :
デフォルトの名無しさん:03/05/16 00:33
>>494 CBitMapButtonかCButtonをオーナードローかけるか...
>500
そもそもReBarってコンテナだからボタンとは関係ないのでは?
なるへそ
Dialgってなんだ。CDHtmlDialogね。
506 :
デフォルトの名無しさん:03/05/18 01:08
自前で、スクロールバーのような機能を持つボタンを作成しています。
1.CMyButton::OnLButtonDown()の中でGetCaptureし、
2.CMyButton::OnMouseMove()の中でマウスを追跡&関連付けられたエディットの数値更新
3.CMyButton::OnLButtonUp()でReleaseCapture
という感じになっているんですが、2のエディットの数値を更新する所で、エディット
が再描画されず困っています。
なんででしょうか。エディットにWM_PAINT自体行ってないように見えます。
507 :
デフォルトの名無しさん:03/05/18 01:23
今からMFC初めてもいいですか?
>>506 エディットってCEdit?
よくわからんが、とりあえず途中にTRACEマクロとか入れたりして、
どこまでがちゃんと動いてるかを確認しよう。
>>507 いいんじゃない?がんがれ〜
>>508 >エディットってCEdit?
そうです、CEditです。
2.の中で、SetCursorPosを使って、マウスが動いた分を無かった事にしているのですが、
どうもこれが問題のようです。わけがわかりません。
GetCaptureじゃなくSetCaptureってのはどうでもいいのか・
511 :
デフォルトの名無しさん:03/05/18 05:22
switch(result) {
case IDOK:
CString fullPath = dialog.GetPathName();
try {
CFile aFile( char fullPath );
}
catch(CFileException *e) {
e->Delete();
}
case IDCANCEL:
break;
っていうプログラムで
fullPath' の初期化が 'case' ラベルによって行われませんでした。
こんなエラーがでてくるのですが…
どうすればいいですか?(゚д゚;)
>>511 CString fullPath;
switch(result) {
case IDOK:
fullPath = dialog.GetPathName();
以下略
>>512 どもありがとうございました〜〜〜〜〜!
解決しますた!
>>506 Invalidate() を調べてみるよろし
>>509 あー、3Dモデリングソフトによくあるアレね。
<ボタン押してマウスドラッグすると、関連したCEditの値が変わる
OnLButtonDown,OnMouseMove,OnLButtonUpの
ソース上げてもらえれば原因わかるかもよ。
>>513 switch case文の中で変数の宣言をするとエラーになります。
場合によって変数が宣言されないということがあるためです。
517 :
デフォルトの名無しさん:03/05/18 15:21
ドラッグしてからドロップするまでマウスカーソルが変わるというSpy++のような
動作を作りたいのですが、上手くいきません。
void CTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
::SetCursor(::LoadCursor(NULL, IDC_SIZEALL)); // とりあえず4方向矢印カーソル(IDC_SIZEALL)でテスト
CDialog::OnLButtonDown(nFlags, point);
}
上記のように書いたのですが、ドラッグして少しでもマウスを移動させると
もとのカーソル形状に戻ってしまいます。
どうすればいいのでしょうか?
SetCursorのあとでSetCaptureしてみるとか。
>>518 ありがとうございました。上手くいきましたヽ(´ー`)ノ
エディットボックスに書いた文字列を
振り当てたCEditの関数m_editを使ってdatというCStringに書きこむとき、
m_edit.SetWindowText(dat);
なのですが、読みこみはどうしたらいいのでしょうか??
GetWindowText
>>511 すでに解決した質問にレスつけるのもなんだけど……
switch(result) {
case IDOK:
{ //ここから
CString fullPath = dialog.GetPathName();
try {
CFile aFile( char fullPath );
}
catch(CFileException *e) {
e->Delete();
}
} //ここまで
case IDCANCEL:
break;
スコープ使うという手も。
523 :
デフォルトの名無しさん:03/05/18 23:26
MFCのプログラムを見るとよくCWndから派生しながらCeate時には
AfxRegisterWndClass()で独自のウィンドウクラスを登録している
のを見かけますがこれってどんな意味があるのですか?
エディットボックス(edit1)に、00 1A CA 8D
の様に、ファイルのバイナリを表示させ、
もう一つのエディットボックス(edit2)に
8DCA1A00 hex
の十進数になおした整数を表示させたいのですが、
HANDLE afile;
BYTE buff[4];
CString buf;
CString path;
DWORD dw;
m_edit3.GetWindowText(path); ←これはパス所得用エディットボックスです。
afile = CreateFile(path,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(afile == INVALID_HANDLE_VALUE){
MessageBox("ファイルがオープンできません", "ファイルのオープンの失敗", MB_OK);
}
SetFilePointer(afile, 0, NULL, FILE_BEGIN);
memset(buff, 0, sizeof(buff));
ReadFile(afile, &buff, sizeof(buff),&dw,NULL);
ここの処理がわかりません…
m_edit1.SetWindowText(なにか);
m_edit2.SetWindowText(なにか);
どうしたらいいでしょうか
DrawText で矩形に文字書くときに
左右にマージンとる方法ないですか?
文字列に空白足すとかはしないで
>>527 センタリングはダメなんです・・・
数字なので、元々右寄せしてて・・・
>>526 マージン分だけ矩形を狭めればいいんじゃないの?
>>529 DrawTextの前に、引数として渡すRECTに
InflateRect(-4, 0)したらできました。ありがとう。
>>525 すみません汗
いろんなスレの先輩達にさまざまな方法
を教えてもらいたかったんです…涙
>>531 もう二度と来るな
回線切って首吊って氏ね
533 :
デフォルトの名無しさん:03/05/21 00:17
>回線切って首吊って
いまどき古いな・・・
>>533 そんなことをわざわざageて書くおまえに惚れた
ウインドウメッセージが
全てのアプリケーションに送られる前に捕まえて、
加工するようなことは可能でしょうか。
(自アプリと関係ないウインドウメッセージを補足・加工)
もし、可能でしたら、その実現方法(プロジェクトの種類など)も
教えていただけるとうれしいです。よろしくお願いします。
>>536 漏れは良く知らんが、DLLでフックじゃないかい?
そうだね。フックだね。
実は漏れもフックだと思った
逆にフックじゃないかな?
フックってなんだろう?
どうでもいいがピーターパンを思い出した
漏れはノックだと思う。
甘いな。サップだ。
モックンかもしれない。
/ヽ /ヽ
/ ヽ / ヽ
______ /U ヽ___/ ヽ
| ____ / U :::::::::::U:\
| | // ___ \ ::::::::::::::|
| | | | | U :::::::::::::|
| | .|U | | ::::::U::::| ・・・・・
| | | ├―-┤ U.....:::::::::::::::::::/
| |____ ヽ .....:::::::::::::::::::::::<
└___/ ̄ ̄ :::::::::::::::::::::::::|
|\ | :::::::::::::::::::::::|
\ \ \___ ::::::
SDIのプログラムを作っているのですがダイアログベースのOnOKに相当する
オーバーライドできる関数はどれなんでしょうか。終了するときにダイアログを出したいんです。
ノックはセクハラだから違うと思うけど、逆に当たってるかも。
パンチは引退したから違うな。
正解はファック
>>548 ちゃんとできました。ありがとうございました。
ダイアログベースのアプリで
ShowWindow(SW_HIDE)したときのような
ウィンドウを表示しない状態で起動させるには
どうすればよいのでしょうか
>>552 非表示にして起動って、どういうUIなの?タスクトレイアプリか何か?
それによって答えが違う。
>>553 コンヌツワ
>>554 そのとおりです
現状はボタンクリックでHIDE->アイコン表示としています。
でOnInitDialogでHIDEしたりしても無駄みたいなのでどうしたものかと・・
そもそもトレイに入れるときHIDEでいいのかという疑問もあったり・・
あー、前に試したけどDialogアプリケーションって非表示には出来なかった
気がする。
俺は非表示のウィンドウをメインウィンドウにして、必要なときにダイアログ
を表示するように組んだ記憶がある。
ウソ言え。簡単にできたはず。
>>555 だったら >556の「非表示のウィンドウをメインウィンドウにして、必要なときに
ダイアログ」がよいでしょう。
>そもそもトレイに入れるときHIDEでいいのか
省リソースという点から言うとあまり良い方法ではないと思う。
>>556 >前に試したけどDialogアプリケーションって非表示には出来なかった気がする。
CWinApp::InitInstance()でDoModal()せず、モードレスにすれば実現可能。
>>558 どもです
やってみます。
ところでモードレスにした場合すぐにアプリケーションが終わってしまいますが
使いどころは有りですか?
>>559 // ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、
// アプリケーションを終了するために FALSE を返してください。
return TRUE;
CListCtrlにCImageListのアイコンを設定したのですが、InsertItemの時でなく、そのあとに
アイコンを変更する方法はないでしょうか。
>>560 なるほど〜
InitInstance()で
dlg = new CTestDlg; dlg->Create( ... ); m_pMainWnd = dlg; return TRUE;
デストラクタで
dlg = (CTestDlg*)m_pMainWnd; dlg->DestroyWindow(); delete dlg;
でいいんでしょうか?
(´-`).。oO(OK押したらウィンドウはどこへ行くんだろう・・・)
563 :
デフォルトの名無しさん:03/05/22 19:29
ユーザー定義メッセージを使ってプロセス間でやり取りしたい場合、
受信側はCWnd::WindowProc()をオーバーライドしてそこで処理すればいいですか?
処理をしたらTRUEを返し、関係ないメッセージだった場合は基底クラスのWindowProcに渡す
でOKですか?
>>563 んなことしないでON_MESSAGE使えばいいのでわ?
>>562 消滅は違う。こんな感じ↓で ~CTestApp は何もしない。
void CTestDlg::OnCancel() { DestroyWindow(); }
void CTestDlg::OnOK() { DestroyWindow(); }
void CTestDlg::PostNcDestroy() { delete this; }
MDIアプリのCXXXDoc::Serializeでファイルを読み込み、
1.読み込みに成功したらMDI子ウィンドウのサイズを固定する
2.読み込みに失敗したらMDI子ウィンドウを破棄する
としたいのです。
(可能であれば、CXXXDoc::Serialize内での)MDI子ウィンドウのサイズ固定方法と破棄方法を教えて下さい。
>>567 ModifyStyle/ModifyStyleEx使えばスタイルの変更ができる。
破棄する場合はWM_CLOSEとかを送ればいいんでないかい?
>>567 ウィンドウハンドルを得るにはどうすればいいのですか?
571 :
デフォルトの名無しさん:03/05/23 19:50
ドッキングウィンドウ(ダイアログバー)を使っているのですが、
その中のTreeViewからCMainFrame にイベントを受けたいのですが、
afx_msg void OnDblClickTree();
と、
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_CBN_DBLCLK(IDC_TREE, OnDblClickTree)
END_MESSAGE_MAP()
で、
void CMainFrame::OnDblClickTree()
{
}
では受け取れません。
どう対処すべきですか?
572 :
サンプルです:03/05/23 19:55
>>571 ダイアログバーにメッセージをルーティングしてないんじゃ?
575 :
デフォルトの名無しさん:03/05/23 23:06
>>574 調べてここまで行き着いてダウンしたんっす。
576 :
デフォルトの名無しさん:03/05/24 00:20
スレッドの排他制御をしたいんだがCRITICAL_SECTIONをグローバルにしちゃ
ダメですか?
クリティカルセクションってグローバルで使うもんでないの?
>>577 んなことないだろ。
保護したいもんと同じスコープで使えばいいと思う。
579 :
名無し@沢村:03/05/24 02:24
>>575 CDocument::GetFirsutViewPosition()
CDocument::GetNextView()
>>579 >>575ではありませんが、ありがとうございます。
CXXXDoc内からCXXXViewにアクセスできました。
(既に、CXXXViewのOnInitialUpdateでGetDocumentして、CXXXDocに設定したフラグを得るように実装してしまいましたが)
×CXXXDoc内からCXXXViewにアクセスできました。
○CXXXDoc内からCViewにアクセスできました。
です。
メインスレッドとワーカスレッドという本質的に異なる2つのクラス
の両方の間を取り持ち、インスタンスは一つしかないクリティカルセクション
どちらか一方のクラスのメンバにするべきかグローバルにすべきか。。
みんなならどうする?
すれ違いスマソ〜
簡単にいうと
クリティカルセクションのオブジェクトをどこに持たすか。
です。
グローバルに持たすかCDialogのメンバにして
そのCSを利用するスレッドにはCDialogへのポインタを渡して利用するとか。
どちらがより優れていますか?
もしグローバルにCRITICAL_SECTIONのオブジェクトとか
イベント通知用のHANDLEを宣言しても
初期化処理とかはCDialogの初期化時にいっしょにしてしまうことになるから
CDialogのメンバにすべきかな。でもポインタ渡すのめんどいしな。
なやムー
CStringで10*10の配列に文字列を格納したいときにとどのように配列を作ればいいのでしょうか
int x = 10, y = 10;
CString* pTest = new CString[x][y];
このようにすると、文字列ではなく1文字だけしか格納できなくて困っています。
通りませんでした。
CStringArrayをnewしてはどうか?
>>590 ありがとうございます。そうしてみます。
>>587 std::vector<std::vector<CString> >
593 :
デフォルトの名無しさん:03/05/25 00:17
>>587 CArray<CString,CString&>
594 :
デフォルトの名無しさん:03/05/25 10:06
エディットボックスの変数がint型の時、変数に何を代入すれば
実行した時、表示を空白にできますか?
NULL入れたら「0」って表示されてしまいました。
CString型だったら「""」を変数に代入したら空白が表示されました。
>>594 空白表示したいんなら、int 型じゃまずいんじゃないの ?
int a; printf("%d", a);
さて、a に何を代入したら空白が表示されるでしょうか ? と聞いてるのと同じだと思うが。
素直に CString 型にしといて、普通は文字列に直して表図するようにすればいいと思う。
エディットボックス側でなんか強制的に空白を表示するような機能があるなら別だけど...。
>>595 エディットボックスにint型を割り当てても、変換してWindowTextを表示しているだけだ。
空白にしたければエディットボックス自体を操作すればよい。
>>594 int型、CString型なんてやめて、CEdit型で操作しれ。
598 :
デフォルトの名無しさん:03/05/25 12:45
if( !m_iEdit )
SetDlgItemText( IDC_EDIT, "");
601 :
デフォルトの名無しさん:03/05/25 13:37
別のプロジェクトで作成される DLL があって、その中のリソースと
して定義されてるダイアログを、自分のプロジェクト内からクラス
ウィザードで操作するのって、なんかいい方法ある?
アプリケーションを終了させる為に
::PostQuitMessage(0);
とすると、メモリーリークが出てしまうんです。(涙
どうしたら良いんでしょう? 助けてください。
>>602 その質問で答えが出てくると思う?
その質問で答えが出てくると思う?
>>602 おもしろい質問だなあー(w.さすがの吉岡美穂でもむりだろ.
メモリーリークの意味から考えていったらいいと思います.
605 :
デフォルトの名無しさん:03/05/25 21:01
>>599 やってみたけど、「0」って表示された。もう少し説明をお願いします。
ES_NUMBERスタイルがついてるんぢゃない?
IDがMFC4…
>>602 それはメモリリークしてるんだよ。
お前の頭含めて。
>>608 最近漏れの頭のなかのスタック領域の破壊が
進んで来ているようなんだが…
>>602 つかさ、命令を全角で書くなんざプログラマの風下にもおけないと思うわけよ
612 :
デフォルトの名無しさん:03/05/26 11:34
どなたか教えて下さい、質問です。
C#では画面(DOS画面)のクリアの時にエスケープシーケンスで
printf("\033[2J");
とやれば画面のクリアができますが、C++ではどのようにコーディングすればいいのですか?
ちなみにOSはWindows2000を使用しています。
>>611 「命令」って...
ベーシッカーですか?、あんた
アセンブりゃーだろ
615 :
デフォルトの名無しさん:03/05/26 13:23
普通に閉じてもリークしないなら、送るウィンドウが違うかかな
617 :
デフォルトの名無しさん:03/05/26 16:36
ツールバーを使いたくてMicrosoft Toolbarコンポーネントをダイアログ上に配置しました
ボタンの追加やクリックイベントの検出までは出来たのですが、
どのボタンが押されたのかが判定出来ません…
皆様はどのようにしてるのでしょうか?
>>612 いつC#にprintfなんか出来たんだ?
619 :
デフォルトの名無しさん:03/05/26 17:06
すんません、ちょっと質問させて下さい。
VC++ 6.0(MFC) & Win2000 SP3 & IE6 SP1です。
通常、アプリケーションを起動すると
タスクバーにそのアプリケーションのスイッチ(ボタン)が追加されますが、
これを右クリックした時に出るコントロールボックス?のメニューに
自分で作った項目を追加、あるいは既存メニューの削除をしたいのですが、
どのクラスのメンバを追ったらいいのかいまいち検討がつきません。
どなたかご教授頂ければと思います。
>>620さん
ありがとうございます。なんとかやってみます。
質問です。
VBで既に出来上がっているプログラムをVCに書き直す作業が必要です。
手っ取り早くやるにはどうしたらいいですか?
VCで書き直した後にいろいろと拡張したいのですが。
624 :
デフォルトの名無しさん:03/05/27 00:33
VC6.0のIDEのツールバーですが、これはMFCのCToolBarを使って
ないみたいですがなんででしょう。
(VCはVC(MFC)で作られているんじゃ...)
624の質問に便乗して、ついでに回答よろ。
VCのツールバーは全部クラスから作ってるんじゃ?
>>625 CodeGuruにある。URLは失念した。
>>624 VC使ったからと言ってMFCつかわにゃならん義務があるわけじゃねぇし。
630 :
デフォルトの名無しさん:03/05/27 16:12
どなたかご指南願います・・
VC++6.0+MFCなんですが、
コンボボックスのリストのアイテムを選択した後
エディット部分に表示される瞬間が取得したいのですが・・
CBN_EDITCHANGE
CBN_EDITUPDATE
の2つは、リスト選択時にはまったく動きません。
CBN_SELCHANGE
の方は、まだエディット部分にテキストが表示される前なので
やはりダメです・・
何か良い方法はないでしょうか?
632 :
デフォルトの名無しさん:03/05/27 16:31
よろしくおながいします。
実行したとき、ウィンドウも開かずフォーカスも移らずに
そっと内容を実行して終了する(例えばデータファイルを
開いてフィルタリングして終了する、など)、そんなプログラムを
VC++で作りたいのですが、ベストな方法は?
他のプログラムから呼び出して使いたいのですが、
フォーカスが移るとまずいのです。
634 :
デフォルトの名無しさん:03/05/27 16:31
CBN_CLOSEUPは?
CBN_CLOSEUPもマズイです・・
これも、まだエデット部分に表示される前なので・・
>>632 単にShowWindow()しなければいいだけかも
他のプログラムから実行するのであればコンソールアプリにして
呼び出すプログラムがCreateProcess()でコンソールを
作らないようにしてもいいけど
も・もしかして不可能?・・(泣
>>630 >CBN_SELCHANGE
>の方は、まだエディット部分にテキストが表示される前なので
テキストを取得するのであれば、このときにGetLBText(), GetCurSel()
>>639 コンボボックスのリスト選択時に、
選択された文字列が、エデット部分に表示されたますよね?
その表示された瞬間に、エデット部分の文字列を変更したんですよ・・
その為には、リストを選択されたあと、
エデット部分に表示される瞬間の取得が必要な訳でして、
その表示される瞬間が取得したいのですが、
630にも書いたとおり うまく取得できません・・
>>640 ダメなんですよ、それも・・
CBN_SELCHANGEでイベントを受けとって
GetLBText()でテキストを取得して、テキストを変更したとしても
その時点では、リストで選択されたテキストが、エデット部分に表示されていないので
自分が変更した後に、再度変更されるんですよ・・(泣きじゃくり
>>630 CBN_SELCHANGE受け取った後自分に自前のメッセージをPostしなおせ。
>>630 いっそのことコンボボックスの上に別のエデットボックスを上書きして
そのエデットボックスに表示するようにしたら
>>637 回答ありがとうございます。
え?DOS窓抜きで実行できるコンソールアプリが
作成できれば理想的なんですが、そんなの出来るんですか?
(^_^;;
呼び出し側は実行するファイル名を指定できるだけで、
中のソースは書き換えられないのですが…
>呼び出し側は実行するファイル名を指定できるだけで、
>中のソースは書き換えられないのですが…
呼び出し側のCreateProcess()でコンソールを出ないようにする方法しか
しらない。
起動直後にFreeConsole()しても多分一瞬コンソールが表示されると思うし、
このへんのことはここよりもWin32Apiスレのほうがいいと思う。
647 :
デフォルトの名無しさん:03/05/27 18:25
CString cs;
m_combo1.GetWindowText(cs);
という記述をOnButton関数内で行ない、デバックしてみるとcsに関して以下のような
CXX0017: Error: シンボル "cs" が見つかりません
というようなコメントがでて、コンボボックス内に表示している文字を読み取ることができませんでした。
何故なのでしょうか。だれか教えてください。
レスどうもです。
>>643 でも、リストからエデット部分に表示される前では
意味が無いような気がするんですが・・
エデット部分に表示された直後にメッセージを取得する事は可能ですか?
具体的に教えて頂けるとありがたいのですが・・
>>644 たしかに、その方法だとイケそうなんですが、
コンボボックスにアクセスするコードが大量にありますので
すべて書き直すのはちょっと・・
出来れば、コンボボックス自体でやりたいんですよね・・
>>647 そのコード自体は間違ってないとおもいますよ。
OnButton関数全体を書いた方がいいかも。
>>648 >出来れば、コンボボックス自体でやりたいんですよね・・
...サブクラス化せいよ
>>646 ありがとうございます。
そっちで聞いてみます。
>>650 なるほど・・ サブクラス化ですか。
こういう方法があるのか・・
ちょっと調べてみます。どうも。
>>648 SendとPostの違いはわかるよね。
>>653 分かってなかったッス・・
サブクラス化にPostMessage、よい勉強になりました。
どうもです。
655 :
デフォルトの名無しさん:03/05/28 09:33
AppWizard 使ってダイアログベースのアプリケーションを作成して、
App クラスの InitInstance() でやりたい事やって、FALSE で
抜ければいいんじゃん?
コマンドラインとGUIの両方から実行できるツールで、引数やらの
実行環境が正しい時のみ実行し、そうでない時はダイアログを
表示して…なんてやりたい時に、よくやる手だが。
A.exe が作成するプログラムだったら、こんな感じに
BOOL A::InitInstance()
{
AfxEnableControlContainer();
…
#ifdef _AFXDLL
Enable3dControls();
#else
Enable3dControlsStatic();
#endif
{ ←ここから
// do whatever you want like if (2 == _argc) {
// or CString csStrTmp(__argv[1]);
…
return FALSE;
}←ここまで
CWADlg dlg;
m_pMainWnd = &dlg;
…
}
656 :
デフォルトの名無しさん:03/05/28 09:36
↑632、637、646 の話ね。抜けてたけど。
>>655 わざわざソースまで書いていただいて、ありがとうございます。
win32APIスレでも同じやり方を教えていただき、試してみた
ところ、上手く行きました。ありがとうございました。
勉強になりました。
現在大学の課題をやってます。ワケわかりません。
おまいら、助けれ。
<例>
#include<stdio.h>
double beki(int m, int n);
void main()
{
int i;
for(i=2;i>=-2;i--){
printf("3^%d=%f\n",i,beki(3,i));
}
}
double beki(int m,int n)
{
int i;
double p=1.0;
if(n>=0){
for(i=1;i<=n;i++)
p=p*m;
return p;
}
else
for(i=1;i<=-n;i++)
p=p/m;
return p;
}
<課題>
beki(m,n)関数を用いて、数列an=(1+1/n)^nが自然対数e=2,71828に近づくことを調べよ。
ってかbekiって何よ。
659 :
デフォルトの名無しさん:03/05/28 11:42
リストビューコントロールの表示をレポートにして、そのリスト内の
各アイテムをコンボボックスには出来まつか?
662 :
デフォルトの名無しさん:03/05/28 13:58
山崎渉のせいですごいことになってんな。
とりあえずage
質問です。
MSDNでは以下のようなことが記述されています
■マルチスレッド : プログラミングのヒント■
「非MFCのセカンダリスレッドからはMFCオブジェクトにアクセスできない」
ここで非MFCのセカンダリスレッドとは_beginthread()などのwin32apiで作成したスレッドとします
(ここで間違ってるかもしれませんが。。)
前述のことは以下のどれでしょう??
@非MFCのセカンダリスレッド内部ではいかなるMFCクラス、オブジェクトも利用できない
A非MFCのセカンダリスレッド内部では主スレッドで生成したいかなるMFCオブジェクトも利用できない
B非MFCのセカンダリスレッド内部ではハンドルラッピング系のMFCクラス、オブジェクトも利用できない
C非MFCのセカンダリスレッド内部では主スレッドで生成したハンドルラッピング系のMFCオブジェクトを利用できない
ここでハンドルラッピング系とはHWND→CWndみたいなハンドルをラッピングするクラスのことです。
アクセス違反で会えなかったキミと、
久しぶりに対面できたから、
今日はSpy++記念日
>663
(1)に一票。
AfxBeginThreadで起動したスレッドだとMFCに必要ななんやかんやを初期化してくれてる
んじゃなかったかな。
ハンドルラッピングっていうと単純に思えるけど、CWndなんてかなりいろいろやってるから
ちっとも単純なラッピングじゃない。
ま、使えるやつもあるかもしれないけど…。
666 :
デフォルトの名無しさん:03/05/29 01:11
AfxMessageBoxの逆みたいに、ポンと文字列を尋ねるような関数ないすか
667 :
名無し@沢村:03/05/29 01:17
668 :
デフォルトの名無しさん:03/05/29 01:27
ダイアログ自作すりゃいいじゃん。
Editコンポーネント貼り付けるだけだし。
>>665 レスありがとうございます。
自分はCかな〜(というか、Cならいいなー)と思ってるんですよ。(^^;)
実はCSringを非MFCセカンダリスレッドで使ってます。
stringに書き直すべきでしょうか?
みなさんならどうします??
671 :
bloom:03/05/29 19:13
ひとまず寝てから考える。
ちょっと調べたら「終了時にリークする」とかあったけど。
この辺は CRTが使われている場合、CreateThreadでなく_beginthreadにしないと
リークする場合があるのと同じでないの?
ってか素直に AfxBeginThreadを...
_beginthreadex使え
CreateThreadなんて使うな
675 :
デフォルトの名無しさん:03/05/31 00:13
初心者板から追い出されました。
質問です。VC++6.0 MFCでアプリを作ってるんですけど、
クラス外からもアクセスできる外部変数は普通はどのように宣言しますか?
やっぱりcppの先頭でグローバル宣言しておいて、他のクラスでextern宣言して
使用するのが普通なのですか?
今、あるクラスのpublicでメンバ変数(char [255])を宣言しておいて、他のクラスからは
CXxxx* pApp = (CXxxx*)AfxGetApp();
として、pApp->メンバ変数にアクセスしてますが、アサートを起こします。
やり方が間違っているのでしょうか?
それってグローバル宣言というより
単にCWinApp派生クラスのメンバでないの?
>>676 そうです。
派生クラスのメンバをあらゆるクラスから操作したいのです。
やはり問題あるコーディングでしょうか?
678 :
デフォルトの名無しさん:03/05/31 00:24
>>677 問題も何も。
アサートってどこでどんなアサート?
>>675 >やっぱりcppの先頭でグローバル宣言しておいて、他のクラスでextern宣言して
>使用するのが普通なのですか?
あんまり良い事ではないみたいだけどそれで良いんじゃない?
漏れもそうしちゃってたりする(´ー`;)
>>678 アサートを起こしたり起こさなかったり。
ダイアログを切り替えた場合にアサートとなるようです。
今ちょっと再現しないので、内容がちょっとわかりません。。
問題はなさそうですか?
オーババッファフローを起こしてるんかな〜。。
>>678 でました。
File:appcore.cpp
Line:545
For information no how your program can cause an assertion failure,
see the Visual C++ documantation on asserts.
です。
>>679 やっぱりそれで良いですか。。
皆さんそうしてますか?
周りにVC使いがいなくて相談できないんです。
683 :
デフォルトの名無しさん:03/05/31 00:40
CWinAppの派生クラスのメンバにして他のクラスからはAfxGetAppでポインタをとって
つーのはやり方としてはあると思われ。漏れはいつもグローバルにしちまうけどね。
多分別の原因じゃ。。
684 :
デフォルトの名無しさん:03/05/31 00:43
>>683 とりあえず、グローバルにして使ってみます。
その方が楽ちんですしね。
ども、ありがとうございました。
>>684 あっ、時間差が。。
ちょっと待ちます。
687 :
デフォルトの名無しさん:03/05/31 00:48
680の文脈から
アサート ≒ ワーニング、エラー
みたいな意味でアサートという言葉を使用しているけど、
一般的に通じるの?
ASSERTなんとかっていうチェックでエラーを起こしてるから
アサートという表現にしましたけど間違ってますか?
アサートって予期せぬエラーって感じですよね?
>>686 VC6だよね。
#ifdef _DEBUG
void CWinApp::AssertValid() const
{
(略)
ASSERT(afxCurrentInstanceHandle == m_hInstance);←ココ
(略)
}
該当行は↑なんだけどよく分からん。力になれんなスマン
690 :
デフォルトの名無しさん:03/05/31 00:57
ASSERT()だろ?
多分MFCの内部でハンドルとかを判定してそこでアサートが出たとかそんなんだろ?
別にエラーやわーにんぐをアサートという言い方はしないし、680も言ってないと思うが
>>689 うーん。m_hInstanceが0にでもなってそうですね。
ちょっと調査します。
ども、ありがとうございました。
693 :
デフォルトの名無しさん:03/05/31 01:29
構造体についての質問です。
public内に
struct set{・・・・・・・};
struct set mySet;
と宣言すると構造体を宣言する前はきちんとダイアログが表示されるのですが、構造体を宣言すると例外処理が行なわれダイアログも表示されないまま終了されてしまいました。
どうすればよいのでしょうか?
本当に宣言しただけ?
メモリ解放し忘れとかないよね?
>>693 デバッグしろ。
メモリは位置がずれて、バグが顕在化したんじゃないの ?
>>693 つぅかクラス内の構造体って合法なんでつか?
>>696 合法だよ。
クラス宣言のネスト
クラスは、別のクラスのスコープ内でも宣言できます。
このようなクラスを "ネストされたクラス" と呼びます。
ネストされたクラスは、これを囲むクラスのスコープにあるとみなされ、
このスコープ内で利用できます。
ネストされたクラスを囲むクラスのスコープの外から、このネストされたクラスを参照するには、
完全な限定名を使います。
(MSDNより)
>>697 昔仮に書いたスコープ違いの同名構造体がソースに残ってたりとかしてるんですかね?
699 :
デフォルトの名無しさん:03/05/31 12:59
>>694 メモリ解放???
ソースの中でですか?それとも構造体自信のですか?
ホントに宣言しただけ・・・だと思います。
なんでなんでしょうね・・・
>>699 マルチポストすんな
氏ね
二度と来るなカスが
701 :
デフォルトの名無しさん:03/05/31 15:04
>>700 答えられないからってカッカするなよ プププ
マルチポストが嫌われることぐらい常識だと思うが。
厨房様に常識はない
↓次の人どうぞ
宣言しただけでエラーが突然多発するようになった。
というタイプのバグはあります。
そういうバグはたいていメモリ関連です。
たとえば昔は構造体のメンバにアクセスするのに先頭アドレスから何バイト目とかいう形で
コーディングしたりする人も居ました。
この場合単純にメンバを追加しただけで(バイナリオフセットがずれるから
)エラーになるわけ。
そのほかにもメモリを壊してたけど程度がひどくないため表面化しなかったものが
コードが変化してメモリの使い方がかわってドカンとメモリを壊す→アプリ例外
とか。
706 :
デフォルトの名無しさん:03/05/31 17:48
VC6++の初心者です。
タブコントロールのやり方がよくわからないので調べてたら、
[プロジェクト]→[プロジェクトに追加]→[コンポーネント及びコントロール]→[プロパティーシート]
でそれっぽいのが出来るというのを見つけて、
それっぽいのが出来たんですが、
リソースにはタブの部分のダイアログがなくて、
プロパティーに標準でついてると思われる
「OK」「キャンセル」「適用」「ヘルプ」ボタン
ってのが削除ができません。
「適用」「ヘルプ」とかは削除したいのですが、どうすればよいですか?
>>706 propSheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
propSheet.DoModal();
で適用は消えるが、ヘルプが消せない(;´Д`)
propSheet.m_psh.dwFlags &= ~PSH_HASHELP ;
もダメ。
自分で作ってる他のアプリでは、ヘルプボタンは何もしなくても最初から
消えてるんだが...おかしいな。
>>707 ありがとうございました!
早速やってみます!
リストコントロールのメッセージハンドラ(カラムを押したときの)を呼び出したいのですが
うまくいきません。下は試しに書いてみたのですが、
LPNMLISTVIEW pNMLV;
LRESULT pResult;
NMHDR pNMHDR = reinterpret_cast<NMHDR>(pNMLV);// '型キャスト' : 'LPNMLISTVIEW' から 'tagNMHDR' に変換できません。
SendMessage(LVN_COLUMNCLICK, (WPARAM)pNMHDR, (LPARAM)pResult);// '型キャスト' : 'NMHDR' から 'WPARAM' に変換できません。
どうしたらいいでしょうか。
>>710 こうじゃないか?
NMHDR *pNMHDR = (NMHDR*)pNMLV;
LP〜っていう型はポインタ型だから、NMHDRではなくNMHDR*にキャストすべし。
下のエラーは上のエラーを直せば消える。と思う。
NMHDR pNMHDR
これポインタになってないじゃん
>>711>>712さん
ありがとうございます。無事コンパイルは通ったのですが、警告が出てしまいました。
無視して構わないのでしょうか
値が割り当てられていないローカルな変数 'pResult' に対して参照が行われました。
>>713 お前はCを理解しているのかと小一時間問い詰めたい…
>>713 あっ 出来ましたすみません。 説明までしてもらったのに..
申し訳ないんですが、今度はSendMessageがうまくいきません。関数が呼ばれないんです。
>>715 前提知識がなさ過ぎる。
CWndクラスのSendMessageを呼んだのならそのクラスにメッセージが飛ぶから、
別のウィンドウに送りたいならそのウィンドウのポインタなりウィンドウハンドラなりを取得して
pWnd->SendMessage(〜〜〜); または
::SendMessage(hWnd, 〜〜〜);
みたいにする必要がある。
どうやってポインタを取得するんですか、とか聞くなよ。
>>716 同じクラスです。
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnLvnColumnclick)
関数もちゃんとあります
そもそも何がしたいんだ?リストビューコントロールのヘッダクリックをシミュレートしたいのか?
だとしたらカラのNMHDRやNMLISTVIEWを送りつけて何の意味があるのかと小一時間
>>719 だったらSendMessageする必要ないじゃん。
OnLvnColumnclickにソート処理書けよ。
722 :
デフォルトの名無しさん:03/06/01 15:05
CObjectから派生してシリアライズ機能を追加したクラスをDLLに作りました。(CMyClassとする)
メインのEXEでそのDLLを読み込みそのCMyClassをインポートして、インスタンスをつくります。
シリアライズの書き出しのとき、operator << で書き出すとそのインスタンスが正しく出力されるのですが、
読み込みのとき、operator >> で失敗してしまいます。
CRuntimeClass::Load(CArchive& ar, UINT* pwSchemaNum)のなかでCMyClassを見つけることができず失敗しています。
DLLからインポートしたクラスでCObjectのシリアライズ機能は使えないもなのでしょうか?
723 :
デフォルトの名無しさん:03/06/01 15:09
724 :
デフォルトの名無しさん:03/06/01 19:03
?c@b@@AAGXM@Z
装飾名の後半部(AAGXM@Z)の
命名規則をまとめてあるところってないでしょうか?
描画するオブジェクト数が多く、逐一OnDraw()を使うと描画に時間がかかりそうなので、
一度バックグラウンドに描画してから、必要な部分を随時ウィンドウにコピーしようと思うのですが
どのようにすれば良いのでしょうか。
まったく分からないので、概略や参考HPだけでも教えていただけると助かります。
729 :
デフォルトの名無しさん:03/06/03 11:23
_T マクロでSJIS/UNICODEを切り分けてRDBに文字を保存できるのは良いと思うのですが、UCS-2でなくUTF-16で保存したい場合にはどういう記述になりますか?
マルチ〜
731 :
デフォルトの名無しさん:03/06/03 17:32
>>729 NT や 2000 では、1文字 16 bit を仮定している(Unicode 3.0以前の)
Unicode しか対応してないから、UCS-2 も UTF-16 も同じ意味
XP は0xFFFF を超えるコードポイントも一部のAPIでサポートするように
なってるけど、Unicode 3.0 以降で追加されたサロゲート領域に対応した
グリフを含むフォントは中国語版のOffice XP を買わないと入手できな
かったりする。ってか実際に SimSun Founder Extended とかの
フォントを使ってる日本人は居るのか超疑問
UCS-4 のフルレンジをカバーし実用的に使えるようになるのは、次期
Windows バージョンだって MS も言ってるしね。今は UCS-2 == UTF-16
と考えてていいと思うがなー
732 :
デフォルトの名無しさん:03/06/03 18:38
COM/ActiveXにGUIDってありますよね。
あれって何て読むんでしょう。
グイド?
ぐーいどイイマース
チナミニGUIハぐーいデース
// VB上の記述
Public Type tblA
m_a As String * 100
m_b As String * 17
m_c As Long
m_d As Long
m_e As Long
m_f As Long
End Type
Public Type tblB
m_h As String * 300
End Type
Declare Sub Start Lib "A.dll" (pParam As tblA, ByVal sA As String, ByVal sB As String, ByVal lc As Long, ByVal ld As Long, ByVal le As Long)
Declare Function Open Lib "A.dll" (pParam As tblA, ByVal lA As Long) As Long
Declare Function RcvData Lib "A.dll" (rcvData As tblB, pParam As tblA) As Long
// VC上の記述
void (WINAPI *Start )(void *, char *, char *, int, int, int);
int (WINAPI *Open )(void *, int);
int (WINAPI *RcvData )(void *, void *);
VBのプログラムでDLLを呼んで正常な動きをします。
VCのプログラムではOPEN呼んで受信関数のRcvDataの戻りがうまくいきません。
VCのメンバ関数の引数の定義があやしいと思っていますが、
誰か教えてください。
737 :
デフォルトの名無しさん:03/06/04 09:31
>>GUID
アメ公の発音は グイッド って言ってるように聞こえる
グに強調で、イの前までこころもち伸ばし気味
ジー・ユー・アイ・ディー、でも通じるけど
GUID は MSI インストーラでも多用されとるがな
3つの数値を入力したとき、それらの値を辺とする三角形ができるか否かを判断して結果を表示せよ。
問題 各自の名前を入れた文字配列を決め、その順序を逆にして表示せよ。
>>738 値は辺の長さ?
それなら一番長い辺がその他の2つの辺の合計よりも短ければいい。
っていうか、738も739も宿題みたいだが、MFCで解くっていう課題なのか?
>>739 MFC-MLにも「解いてください」とかいって投稿しただろ! ○海大学生!
ちょっと教えてください。おながいします。
三つの返り値をもつメンバ関数を作成したのですが
呼出元から この関数を呼ぶと 最初の一つは値が引き継がれるのですが
残りの二つは値が消失してしまいます。関数内では値取得できているのですが
なぜでしょうか。それぞれの違いは
最初の返り値の定義をchar型で残りの2つはDWORD型というくらいです
たすけてください。
>>744 「戻り値」の意味をよく理解してから出直せ。
>三つの返り値をもつメンバ関数を作成したのですが
それたぶんCじゃない。
C++でもない。
return (1,2,3);
としたのか
いや1番目の値が残るならこれだろうか。
return 1,2,3;
return 1;
return 2;
return 3;
でおおけい
>>746-749 バカばっかりだな。
#include <stdio.h>
#include <windows.h>
class ThreeValues {
public:
char C;
DWORD D[2];
ThreeValues(char C0, DWORD D0, DWORD D1){
C = C0; D[0] = D0; D[1] = D1;
};
};
class Test {
public:
ThreeValues GetThreeValue();
};
ThreeValues Test::GetThreeValue()
{
return ThreeValues(1, 2, 3);
}
int main()
{
Test T;
ThreeValues V = T.GetThreeValue();
printf("%d, %d, %d\n", V.C, V.D[0], V.D[1]);
return 0;
}
>>744 マジな話すると、「ソース晒せ」。まずはそれからだ。
751 :
デフォルトの名無しさん:03/06/04 22:22
3つの値を返したいなら、3つの値を持つ構造体を返り値にしてもできるぞ
ま、引数を参照渡しするのが普通だと思うが
関数型の言語って、x = f(a,b,c) のように入力と複数で出力が1個の
場合はすっきりするんだが、入出力がそれぞれ複数の場合はなんか
スマートでない気がしたんだな。慣れちゃうとそんな事あまり考えなく
なるのだが
753 :
デフォルトの名無しさん:03/06/04 22:38
>>752 C も C++ でも事情は一緒だと思うがなー
VC++6.0SP5のMFC使ってます
CRichEditCtrlを初めて使ってみましたが
通知メッセージ(EN_SETFOCUS, EN_KILLFOCUSなど)が
全く飛んでこないんですが・・・(CEditは普通に飛んでくる
::AfxInitRichEdit();はきちんと呼び出しています(WinAppの派生クラスの関数InitInstance内で
>>755 MSDN見るとCEditやCListBoxには通知メッセージの説明があるけれど、
CRichEditにはありませんな〜。
ひょっとして、EN_〜じゃなくてNM_〜では?
>>46 久々にMFC使ったら俺もそうなったので焦った。
オプションのディレクトリ設定で"Microsoft SDK"のパスの優先度を下げて解決。
759 :
デフォルトの名無しさん:03/06/06 12:17
リスト状に、コントロールが乗っている子ウインドウを並べて操作したいと思っております。
CListBox、CListCtrl等の中に子ウインドウを並べる事は出来るでしょうか?
色々と試行錯誤している段階なので、よろしければヒント等をいただけたらと思います。
>>759 一般論だけど、ダメ。無理。ムダ。
普段はカスタムドローでも何でも使って普通に描画しといて、
クリックされたりした瞬間だけ(使いまわした)コントロールを show するのが良いよ。
761 :
デフォルトの名無しさん:03/06/06 18:43
MFCのAppWizardで作成したソフトで、「ファイル→開く」から複数の拡張子を選べるようにしたのですが、保存する時は開いた時の拡張子でしか保存できません。
これを「開く」と同じようにファイルの種類を選べるようにするにはどうすればいいのですか?
それと、開くときにフィルタを(*.txt; *.doc)のようにして、ダイアログに.txtと.docを両方表示させるようにするにはどこをいじればいいのですか?
GetDocString あたりを調べれば何とかなりそうな予感。
あるいは保存部分を自作コードで……
763 :
デフォルトの名無しさん:03/06/07 20:12
MFC内部で使われてる関数って、勝手に使うと問題あるのかね...?
例えば mfc\src\afximpl.hで定義されてるような香具師を、afximpl.h を
includeして使うとか。
>>762 GetDocStringをいろいろと試してみます。
あと保存部分の自作も挑戦してみます。
ありがとうございました。
>>763 自分が何やってるか理解できればいいと思うよ。
MFC ったって、単なるクラスだからね。
(まあ、複雑に絡み合ってるだろうから、解析するのは大変だろうけど。)
VC++.NET で MFC も消滅の運命を歩むだろう。
もうMFCは古い。
VC++.NETも儲からなければあっさり捨てられるだろう。
COMのように。
769 :
デフォルトの名無しさん:03/06/07 22:04
メインフレームってどういった概念なのでしょうか?
viewクラスとdocクラスとメインフレームクラスをわざわざ分けるのはなぜですか?
単純にwin32のように一つのcppにまとめて書いてあってもいい気がするのですが。
>>769 document-viewについて勉強することを勧める。
俺の理解では(間違ってるかもしれんが)
アプリケーションというのはドキュメント(テキストや画像のデータ)があり、
ビューはそのドキュメントの内容を描画するだけ。
それらを収めてメニューやツールバーを管理するのがフレーム(枠)、ということ。
フォルダにファイルを作成→関連付けたアプリを起動、というように、
ドキュメント(ファイル)を起点にしたものがWindowsの思想だと思ってる。
描画するだけ、ってのはちょっと語弊があるな。スマソ
アプリケーションはデータを編集するためのツール、という視点で捕らえればわかるかもしれない。
もちろんそういうアプリばかりではないが、doc-view構造を持つということはそういうことだと思う。
>>769 VBから離れるとその利点が良くわかる。
MSDNってこういう使い方もあるんですね。
APIの解説しか読んでなかったや。
熟読してみます。皆さん、ありがとうございました。
776 :
デフォルトの名無しさん:03/06/08 17:46
エクスプローラみたいなファイラを練習として作ってます。
エクスプローラなら、ツリーで選択されているディレクトリに
変更があった場合(新しいディレクトリが追加されたとか)、
ツリービュー・リストビューともに更新されますが、これって
エクスプローラが何かの方法でディレクトリの変化を知った
ということですよね。1秒置きにポーリングするなどの原始的な
方法以外で、変化を知る方法があるのでしょうか?
>>776 あるよ。忘れたけど。
確かFindfastなんちゃらかんちゃらだ。
>>776 FindFirstChangeNotification
FindNextChangeNotification
かな?
使ったことないから知らんけど。
>>755 ON_NOTIFY(EN_SETFOCUS, IDC_XXX_EDIT1, OnSetfocusXXXEdit1)
ON_NOTIFY(EN_KILLFOCUS, IDC_XXX_EDIT1, OnKillfocusXXXEdit1)
を、下記のように変更する。
ON_EN_SETFOCUS(IDC_XXX_EDIT1, OnSetfocusXXXEdit1)
ON_EN_KILLFOCUS(IDC_XXX_EDIT1, OnKillfocusXXXEdit1)
782 :
名無し@沢村:03/06/08 22:47
>>776 SHChangeNotifyRegister()
ReadDirectoryChangesW()
783 :
デフォルトの名無しさん:03/06/09 11:06
質問です。
ポートlistenしてUIスレッドを生成、
それぞれのスレッドがAsyncSocket派生クラスで通信を行うようなサーバプログラムなのですが、
ときどきデバッガ実行中に無言で落ちるときがあります。
次のような出力がありますが、その他ASSERTやらは一切出ず。
「スレッド'Win32 スレッド'(0xXXX)はコード3(0x3)で終了しました。」
デストラクタ等も動いていないようなので落ちてるのは間違いないようです。
これはどういう現象でしょうか?
または突き止めるにはどういう方法が有効でしょう?
環境はWin2kPro/SP3、VC++.NET
動作環境がかなり貧弱でペン3/600MHz、メモリ128
動作環境でしょうかねぇ・・・?
追記。
スレッドは多いときで20〜30くらい立ちます。
ソケットメッセージ編集のためにふんだんにメモリ使います。
書けば書くほど動作環境のような気がしてきた。
出力されるメッセージとの関連がわかれば、それで納得できるのですが・・・
786 :
デフォルトの名無しさん:03/06/09 21:51
MDIでプログラミングした時などに、「最近使ったファイル」というものがメニュー内にあります。
それを操作するにはどうすればいいでしょうか?
788 :
デフォルトの名無しさん:03/06/10 05:37
OSがアップデートされたときなどに右下のタスクバーに吹き出しが
でるけど、あれってどうやって表示させればよいのですか?
なるべく自分で調べますので関連するキーワードとか教えてください
よろしくお願いします
>>788 バルーンだね。この質問も定期的にあるなぁ。
791 :
デフォルトの名無しさん:03/06/10 14:51
例えばMFCのCDC::FillSolidRect()でCRectのポインタを引数
として受け取るようになっているのですが、変数をそのまま渡しても
ちゃんと走ります。これはおかしくないのでしょうか?
CRect::operator LPCRECT
>>792 ハッ!そういうことでしたか。
厨な質問ですみませんでしたm(__)m
794 :
デフォルトの名無し:03/06/10 16:47
Visual C++ .netのキーバインドってemacs風にはならないのかな???
選択開始が割り当てられない・・・・
誰か教えてください、よろしくお願いします。
>>794 emacsを.net風にカスタマイズするほうが楽だよ。
>>794 カスタマイズ可能。
.NETだったら [キーボード マップ スキーム]なるものがあって、そこに
emacs風とかあったり? (.NET使ってないから分からん)
VC6は一個一個キーバインドをシコシコ替えなければならんかったが。
誰かがemacs風のキーバインド定義して、レジストリ公開すればいいんだけどね(w
>>794 マルチうぜぇ
市ね
二度と来るな
回線切って首吊(ry
そんな事よりよ、1、ちょいと聞いてくれよ。
このあいだ、Visual C++ .netでプログラム書いてたんですよ。Visual C++ .netで。
そしたらなんか「Visual C++ .netのキーバインドってemacs風にはならないのかな」
とか、いってるやつがいるんですよ。(ry
もうね、アホかと。馬鹿かと。 (ry
お前ら、emacsって言いたいだけちゃうんかと。(ry
Windowsを超えるOSをVCで作りたいと思っています。
どなたか参考になるサイトあったら教えてください。
800 :
デフォルトの名無しさん:03/06/10 17:50
>>800
見るな。ブラクラだったよ。
>>797 マルチうぜぇ
市ね
二度と来るな
回線切って首吊(ry
789は死ね
788なら、キーワード教えてくれっつーんだから十分だろ?
806 :
デフォルトの名無しさん:03/06/10 23:03
CRectにCopyRect()という他のCRectインスタンスをコピーする
関数がありますが、これってどんなとき使うのですか?
dest=sorcでいけるのに何のためにあるのでしょう?
807 :
名無し@沢村:03/06/11 00:33
808 :
デフォルトの名無しさん:03/06/11 01:31
OSがアップデートされたときなどに右下のタスクバーに吹き出しが
でるけど、あれってどうやって表示させればよいのですか?
なるべく自分で調べますので関連するキーワードをAPI名で
教えてください。
809 :
名無し@沢村:03/06/11 01:33
>>808 うちのOSであるHP-UXでは出ません。以上。
くだらねぇ煽り合戦やめれ。
あー原因がつかめん・・・
何も言わずに落ちるのは何故?
キーワードは
>>790でとっくに出てるのにマルチする厨はほっとけ
へんなのとレス番間違えちゃったw
VisualC++ってタダ?
818 :
デフォルトの名無しさん:03/06/12 23:23
VC++でデータベースを使ったプログラムを作る場合、
データベースは何がいいのでしょうか?やはりソフトが
必要なんですよね?
本当に簡単なのでもいいのですが・・・。
820 :
名無し@沢村:03/06/12 23:39
>>818 Standard版には最適化コンパイラは付いてないですよ。
Visual Studio .NETに付いてるのがProfessional版です。
>>821 そうなのか? リンク先を見る限り .NET2003 では、VC++ Standard版に
最適化コンパイラがついているように見えるが。
だとしたら、俺も買いたい。
>>823 いや、だから .NET「2003」は違うんじゃないか?
>>824 製品構成と価格から見ても微妙だと思うけど…
仮に Standard .NET 2003に最適化コンパイラが付いてたら
VS.NET買っちゃった人はブチギレですな
最適化コンパイラがついてるなら、俺もStandard買うよ。
ListViewの MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
が呼び出された後で、パラメータを変更したいとき、
みんなどうやってる?
たとえば、
lpMeasureItemStruct->itemHeight
を後で変更したくなったようなとき。
ウィンドウサイズを変更して、MeasureItem()が呼び出されるようにとか
色々試してはいるけど、決定打がないのよね。
CHtmlView::GetHtmlDocumentについて疑問があります。
MFCのコードは以下のようになっていますが、
LPDISPATCH result;
m_pBrowserApp->get_Document(&result);
return result;
これだと、呼び出すたびにドキュメントの参照カウントが増加すると思います。
しかし、GetHtmlDocumentを使用している部分ではそのことを考慮しているようには見えません。
Releaseしなくても良いのでしょうか?
828 :
デフォルトの名無しさん:03/06/13 06:34
>>825 StandardにはMFCのソースコードが付いていないだろ。
そんな環境でMFCのアプリの開発なんかやってられるかよ。
>>827 使い終わったらReleaseしましょう……
>>819 別に何でもいいんじゃないの。
Access持ってるならそれで作っちゃうとか。
>>829 やはりReleaseは必要なのでしょうか?
MFCのCHtmlViewのソースではCComPtrを使っているためAddRef/Releaseが対で呼ばれてしまい、get_Document内でAddRefされた分のReleaseが呼ばれていないような気がします。
またWeb上の多くの文章やMSDNでもReleaseは呼んでいないようです。
832 :
デフォルトの名無しさん:03/06/13 11:21
>>820 >>830 レスどうもです。確かに別になんでもいいのですが、少なくとも
今はVC++.NETしか持ってない状態なので・・・。
ほんとに簡単なものでもいいんですよね。自前で検索効率のいい
ファイル構造を作っちゃえるならそれでもいいし・・・。
でもそんな技術ないし・・・。
とりあえず、たくさんのデータをためて、そこからいろんな条件で
検索とかするという構想なので、やはりデータベースですよね。
MSDEってけっこう大掛かりじゃないのでしょうか?
個人レベルならAccessですかね・・・。
>>833 つか、使い方なんて、どれでも一緒。
Access持ってるなら使っても良いけど、買う気ならやめれ。
MSDEでも一緒だし、いっそのことフリーのDB選ぶのもよし。
>>833 たいしたものでないならAccess買うなんて勿体無い。
834の言うようにフリーのモノを使うべし。
ところでMySQLって商用目的に使わないならOKだっけか。
>>833 条件つけて検索するだけで、ちょいちょいと作るならPerl/Tkがいいぞ。
ん?スレ違いか?
838 :
デフォルトの名無しさん:03/06/14 10:25
ダイアログボックスでコントロールを配置するときに
見やすく線で区切りたいのですがフレームコントロールではなく
横棒一本(あるいは縦棒)を引きたいです。
でもどれを使っていいか分かりません。
やりかた教えてください。
>>838 OnPaintで線を引けばいいんでないの。
フリーですか・・・。ちょっと探してみます。
フリーのがあったんですね(汗
アドバイス感謝です。
841 :
デフォルトの名無しさん:03/06/14 18:14
VC++ Standard はリモートデバッガが付いていないんだな。
こりゃ話にならん。
つか、Standard版の話なんかどうでもいい。
もっと言えば、Windows開発環境でフリーに固執する奴らの気が知れねー
くだらねーことで右往左往するのが楽しいんだろうな・・・
843 :
デフォルトの名無しさん:03/06/14 20:37
AfxGetApp()->OpenDocumentFile("-");
でMDIではファイルを表示しますが、子ウィンドウを新規作成で表示するにはどうすればいいでしょうか?
それから、VC++のように、「全て保存」という機能はどのように実装すればいいのですか?
>>843 ::AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_NEW)
これで無理かのう?
「すべて保存」は自分でチマチマつくるんじゃないかな。
開いているドキュメントをスキャンして。
845 :
デフォルトの名無しさん:03/06/14 22:51
>>844 チマチマスキャンするには、
MDIGetActive,MDINextを組み合わせる方法しか思いつかないのですが、
いい方法はありますか?
BOOL CWinApp::SaveAllModified()
を参考にするのもいいかもしれません。
847 :
デフォルトの名無しさん:03/06/14 23:53
>>843 子ウィンドウの新規作成は844で書かれているやり方で多分
いいと思う。試してないけど。
すべて保存は次のように書いてみてはどないやろ?
HWND hWnd = ::AfxGetMainWnd()->m_hWndMDIClient; //メインフレームウィンドウのMDICLIENTウィンドウのハンドルを取得
CWnd *pWnd = CWnd::FromHandle(hWnd);
pWnd->SendMessageToDescendants(WM_COMMAND,ID_FILE_CLOSE,FALSE,FALSE); //MDI子ウィンドウの全ての直系の子に対しメッセージ送信
知ったか君の言うことなのであまり信用しないように。:-)
おいらならこれを試してみる、という程度。
TCKってなんですか?
849 :
デフォルトの名無しさん:03/06/15 00:00
847なんだが、
「MDI子ウィンドウの全ての直系の子」
じゃなくて、
「MDICLIENTウィンドウの全ての直系の子」
だった。スマソ
回線切って首吊って逝ってくる。
今後VC++はどうなるんでしょう?
C#がでてきたし、マイクロソフト自身の手によって
葬り去られるのでしょうか・・・。
というのも、勉強はしたいのですが、ことC++に関しては
他より勉強量が必要かと。でも、消えちゃうならやる気が
半減なんすよね・・・D言語とかいうのも出てくるみたいだし。
どうなんでしょうか。
>>851 .NETはあくまで最上位レベルでの開発にしか使えんからなぁ。
そう言うことだ。
>>851 C++は死滅しないに一票。
なるべく非MFCで書くよう心がければ
MSと心中することもないだろう。
>>851 PC、OS、プログラム言語については、先の事なんて考えるだけ無駄。
その時手に入る物で、使いたいように使うべし。
新しいの出たら、その時考えれ。
悩んでるだけ時間の無駄だ。
大抵は応用が利くしね。
勉強して損するって事はないよ。
始める前にあれこれ躊躇しているようなヤツは
いざ始めてもやっぱりああすればよかった、こうすればよかったと
いつまでたっても後悔ばかりしているものだ。
つまんないことで悩んでるヒマがあったら何でもいいから
始めてみろとの忠告はまるで耳に入ってないやつが多い。
まあまずは作ってみろってこったな。
MFCのダイアログアプリ辺りでもなんでもいいから。
>>856 激しく同意。人生多少の無駄をしても余る位の時間はある。
店頭での販売まだ〜???
誤爆スィタ〜!スマソ。
861 :
デフォルトの名無しさん:03/06/16 11:31
質問さして下さい。MFCでタスクトレイ常駐型のアプリ作ってます。
(環境:Win2000 SP3 / MSVC6.0 / IE6.0SP1)
リソースでアクセラレータキーを割り当てておいて、
それをそのアプリが常駐している(タスクトレイにアイコンが表示されている)間は
常に有効にしたいと思っています。
プログラムの挙動としては、最初に非表示の空ウィンドウを生成して
それをベースにポップアップメニューを出したり、ダイアログを表示したりと
やっております。
この場合、前述の空ウィンドウにアクセラレータの処理を記述する方がいいんでしょうか?
それともどこか別なクラスの方が適切なのでしょうか。
また、具体的に記述してあるサイト等知っていらっしゃいましたら
お教え頂けますと有難いです。
862 :
デフォルトの名無しさん:03/06/16 11:37
コンマで区切っているテキストを読み込んでコンマで挟まれているテキストを
取り出すにはどうすればよいですか?
>>863さん
試してみます。ありがとうございます。
>>863さん
もう少し詳しくお願いできませんか?
>>865 いや、ていうかスレタイ5万回復唱して回線切って首(ry
>>862 CString s("abcd,あいうえお,123456,四面楚歌");
CArray<CString*,CString*> a;
int start,end,i, len = s.GetLength();
start = end = 0;
while(1){
if(start >= len) break;
if((end = s.Find(',',start)) == -1){
if(end >= len) break;
else end = len;
}
CString &tmp= *(new CString());
for(i=start;i<end;i++) tmp += s[i];
a.Add(&tmp);
start = end + 1;
}
CStringにstrncpyはないんか・・・
>>869 フツーにCStringArray使えばいいじゃん。
>>869 何故CString::LeftとかCString::Midとかを使わない?
わっは、初心者がばれた。CStringArrayか・・・。
そーすると、
forでまわしてるところを、
a.Add( * new CString(s.Mid(start,end)) );
とすりゃいいんかな。
aはCStringArrayにして、保存するのはポインタじゃなくインスタンスになるので注意っと。
ちがった文字数だった Mid(start,end-start) 。スレ汚しスマソ。
>>873 Addに渡すインスタンスは一時オブジェクト。
うい、newはいらんすね。
しかも配列をローカルにとって、その中にnewでつくったオブジェクト入れてる、意味不明だ。
>>866さん
アドバイスどもです。下のようにしてみました。
#define WM_USER_HOTKEY_EXITWM_USER+110
class CMona : public CWnd{ … }
BOOL CMona::Create(){
…
RegisterHotKey(m_hWnd, WM_USER_HOTKEY_EXIT, MOD_CONTROL, VK_F12);
…
}
LRESULT CMona::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){
switch(message){
…
case WM_HOTKEY:
switch(wParam){
case WM_USER_HOTKEY_EXIT:
OnPopExit(); //タスクトレイのポップアップメニュー[終了]と同じ処理
}
…
}
}
void CMona::PostNcDestroy(){
…
unregisterHotKey(m_hWnd, WM_USER_HOTKEY_EXIT);
…
}
WindowProc()で直接拾ってます。
878 :
デフォルトの名無しさん:03/06/16 17:17
>>847 ありがとうございます。
もう一つあるのですが、
childview のメンバ変数として int i;
とし、mainframe から その i の値を書き換えることができるのでしょうか?
MFCの関数が仮想になってなくてむかつくことって結構ない?
InitialUpdateFrameとかさ
>>878 GetActiveView()等で子ウィンドウのポインタを取得して
childviewにキャストすれば使えるんでないかい。
# データはドキュメントクラスが持つべきだとは思うが……
>>879 仮想である必要はあるかな……?
俺はCViewのOnInitialUpdateをオーバーライドして用事を済ますから必要を感じないだけかもしレンガ。
std::stringちょっと嫌い
std::string str;
str = "";
これだとメモリ確保されないから困ることがある
884 :
デフォルトの名無しさん:03/06/16 21:46
>>880 CView は CChildFrame にキャストできないそうです。
>>883 何でメモリ確保されないと困るのか後学のために教えていただきたい。
>>884 当然でしょ……。
少し考えればGetActiveFrame()を思いつきそうなもんだが、
最近のお子様たちは応用力がないのかな。
1、TreeViewやListViewに表示するデータをドキュメントでどう持つべきでしょう?
2、AppAのバージョンアップをAppBとして
それぞれで作成されたファイルをFileA,FileBとします(Serialize経由のファイル)
AppAでFileBも読み込めるようなうまい方法はありますか?
以上、お願いします。
↑
あ、1と2は別々の質問です。
>>887 1.あんたの勝手
2.VERSIONABLE_SCHEMA
1、
ちょっと質問がおかしかったです。
通常TreeViewの各アイテムにオブジェクトを結び付けたい
場合は、SetItemDataなどをつかうのが簡単なんですが、これだとたとえば、アプリ起動時
にファイルを読み込む場合、TreeViewが作成される前にSerializeが呼ばれてしまうし、
ドキュメントとまったく関係ないのであんまりうれしくないんです。
2、
VERSIONABLE_SCHEMAはAppBでFileAを読み込むための仕組みではないのでしょうか?
891 :
デフォルトの名無しさん:03/06/16 23:56
CDC::FrameRectを使って、XORでワクを描きたいんですけど、どうやったら描画モードをXORに変えられるんでしょうか?
>>890 なぜTreeViewの作成とSerializeの呼び出しタイミングが関係あるのかわからん。
ノードの登録は当然View側でやるんだからOnInitialUpdate時点ですでにSerializeは完了してるので何の問題もない。
>>887 よく分からんが、まずドキュメント&ビューの概念は理解しているのかい?
>>891 FrameRectはブラシつかって描画するから、直接XORはできないんじゃないかな。
ビットマップに描画してXORで重ねるくらいしか思いつかない。
895 :
デフォルトの名無しさん:03/06/17 09:37
CWinThreadについて質問です。
クラスウィザード(クラスビュー)からCWinThreadの派生クラスを作成すると、
コンストラクタがprotectedになってますよね。
これはいったい何のためでしょうか?
暗にAfxBeginThreadを使え!と言っているのでしょうか。
# サンプルの\ADVANCED\MTGDIではpublicになっているところを見ると、
# publicに書き換えても問題なさそうな気はしますが……。
896 :
デフォルトの名無しさん:03/06/17 09:54
>>894 Windowsのグラフィックエンジンって、ペンとBlt以外で転送モード指定できないの?
フォントを凝った描き方するのも無理みたいだし
>>896 MSがWin95の時代にそんな設計を考慮に入れる余裕はなかったと思うw
便乗で申し訳ないんですがFrameRect()ってどんな時便利
なのですか?
Rectangle()とはどう使い分けるんですか?
>>890 1.について
Document-Viewを前提とすれば、データの管理はCDocumentがするべき。
TreeViewとかItemDataというのは表示の問題。
CDocument::OnNewDocument()
CDocument::OnOpenDocument()
CDocument::UpdateAllViews()
CView::OnInitialUpdate()
CView::OnUpdate()
などをヘルプで
>>890 2.について
旧Verをマイナーアップできるのであれば、VERSINABLE_SCHEMAで。
旧Verをいじくれないのであれば、あくまで案だが
新Verでの保存前に『旧Verとの互換有モード』と『互換無モード』を選択させて
1)互換無モードのときは普通に保存。
2)互換有モードのとき
旧Verと共有できる部分を最初に保存し、
新Verの追加部分をa)続けて保存する、または、b)別ファイルとして保存。
たぶんa)で旧Verでも読めると思うが、旧Verには新Verのデータを保存するコードがないので、
旧Verで編集して保存した場合は新Verのデータは失われてしまう。
保存する変数が一つ二つ増えただけのときは簡単そうだが、
あるクラスのメンバ変数が追加されていて、それが配列やリストなどに格納されているような場合は
新Verで読み込んだときに新データの部分をどうアタッチさせるか考慮しなければならず面倒かも。
861です。引き続きタスクトレイ常駐型アプリ作ってます。
(環境:Win2000 SP3 / MSVC6.0 / IE6.0SP1)
タスクトレイのアイコンを右クリックすると、ポップアップメニューを表示するような
処理を記述しているのですが、ここで負に落ちない点が2点程あります。
A. 表示されたポップアップメニューから[設定]を選ぶと、
dlg.DoModal()で設定用のウィンドウが開きます。(CDlgOptionと仮定)
で、この CDlgOption で[OK]あるいは[キャンセル]を押すとウィンドウを閉じるようにしています。
これらの動作で CDlgOption を閉じ、またすぐにタスクトレイのアイコンを
右クリックしようとしても、なぜかクリック一回分の反応が無視されてしまうようです。
(間をおいて2回クリックするとまたポップアップメニューが表示されます)
この現象に関してどなたか覚えのある方いらっしゃますでしょうか?
近いヒントだけでも構いませんので、お教え頂ければ幸いです。
B. 右クリックでポップアップメニューが表示されますが、このメニューは現在
いずれかのメニューアイテムをクリックしないと消えないようになっています。
一般的なタスクトレイアプリケーションのポップアップメニューのように、
例えばメニューとは別な場所をクリックした場合はメニューを消す、といった
挙動がありますが、これらの処理は自分で記述する必要があるのでしょうか?
よくある挙動なので、既存の関数か何かがあればと思っているのですが…。
毎度長くなってしまいすいませんが、ご教授頂ければと思います。
B.は
ポップアップメニューを表示する前に、メニューの
オーナーウィンドウにフォーカスをセットする
>>903さん
ありがとうございます。
これはフォーカスをオーナーに設定する事によって、
それ以外の部分にフォーカスが当たった場合、それを無効化する
…という解釈で宜しいでしょうか?
>>904 オーナーからフォーカスが外れれば、メニューの標準仕様により勝手に消える。
>>903さん
表示する直前の部分に SetFocus(); で動作しました。
ありがとうございました。
> ノードの登録は当然View側でやるんだからOnInitialUpdate時点ですでにSerializeは完了してるので何の問題もない。
> Document-Viewを前提とすれば、データの管理はCDocumentがするべき。
なるほどわかりました。
とすると、Treeの階層構造そのものをDocumentが持たなくてはならないわけですよね。
これは結構大変の予感。TRee構造のほかにHTREEITEMとのMAPも必要になりそうですし。
2について
やはり簡単な方法はないみたいですね。
ご意見ありがとうございます。
しかしこれ、ファイルヘッダも付けずにファイルをつくってると
はまりますよね。旧VERでの読み込みエラーに対応できなくなる。
もっとも拡張子もアイコンも変えて別アプリのようにしてしまえばいいんですが。
908 :
デフォルトの名無しさん:03/06/17 20:55
Visual C++のAPIのリファレンスが載っている
ページはないでしょうか
>Visual C++のAPI
この時点でもうちょっと悩め、
>>909よ。
どういたしましてm(__)m
915 :
デフォルトの名無しさん:03/06/19 10:45
OSはWindows2000、Visual Studio 6.0でVC++つかってます。
タスクバー(通常デスクトップの下部にあるアレ)の高さを取得したいのですが、
具体的にどんな手順を踏めばいいんでしょうか?
ググってもそれらしきものが出て来なかったので…
>>915 GetSystemMetrics(SM_CXFULLSCREEN),GetSystemMetrics(SM_CYFULLSCREEN)と
SystemParametersInfo(SPI_GETWORKAREA,...)の差分を取る。
詰まっています。質問させてください。
多少長くなってしまいますがすいません。
MFC AppWizard(exe)のダイアログ形式でアプリのスケルトンを作成すると、
例えばプロジェクト名をGikoとすれば"CGikoApp"という
CWinAppのクラスができますよね?
このクラスに、今現在アプリケーションがどのような状態なのかを
IDで保持しておく変数を付け加えました。
private:
UINT m_uStatus;
そして、この変数に対して値を読み書きする為の
メンバ関数も付け加えました。
public:
BOOL SetAppStatus(UINT uIDStatus);
UINT GetAppStatus();
(つづく)
(つづき)
CGikiAppはgikoapp.cppでグローバル変数として宣言されています。
CGikoApp theApp;
なので、別なクラスのメンバ関数からこのm_uStatusに対して
アクセスする為の記述として、以下のようにコードを書きました。
//ステータス初期化(ログオフ)
theApp.SetAppStatus(UM_APP_LOGOFF);
…
//ステータス変更(ログオン)
theApp.SetAppStatus(UM_APP_LOGON);
…
//ステータスの取得
if(theApp.GetAppStatus()==UM_APP_LOGON){
ですが、この時点で「theApp : 定義されていない識別子です」というエラーが出ます。
コードもtheApp. とまで入力した場合、メンバ一覧にちゃんと
先の2つのメンバ関数も出てきます。(SetAppStatus, GetAppStatus)
本アプリケーションの処理は基本的に一本道なので、
CGikoAppで情報を保持した方が良いのではと思いメンバ変数を追加したのですが…。
何が原因なのでしょうか?ご教授頂ければ幸いです。
環境は、Windows2000 サービスパック3 + Visual C++ 6.0 Professional Editionです。
theAppを参照するファイル内に、
extern theApp;
てしたらどう?
extern CGikoApp theApp; だった。
cppがインクルードしているヘッダファイルでも可
>UINT GetAppStatus();
UINT GetAppStatus() const;
こうしたい(ボソ
((CGikoApp*)AfxGetApp())->GetAppStatus()
で解決。
>>923 もしそれでいけるのなら、なんでtheApp->GetAppStatus()
でいけないのだろう...
フレームワークがポインタを持ってるんじゃない?
>>924 それじゃどうやってもコンパイルエラーになるからだな。
>>920-926 皆様ありがとうございます。
extern CGikoApp theApp;
または
((CGikoApp*)AfxGetApp())->GetAppStatus();
のように修正したところ、コンパイルエラーがなくなりました。
Giko.h(CGikoAppが宣言されているヘッダファイル)をインクルードしているので、
externは必要ないのかなと思ったのですが…。
また、
>>922さんのご指摘もありがとうございます。
UINT GetAppStatus() const;
に修正致しました。
確かに、この方がより確実ですね。
回答が遅くなってしまいすいませんでした&ありがとうございました。
>CGikiAppはgikoapp.cppでグローバル変数として宣言されています。
externされてないグローバル変数がgikoapp.cppの外で参照できないのは当然かと
タスクトレイアプリ制作中の861です。ハマってます。
(環境:Win2000 SP3 / MSVC6.0 / IE6.0SP1)
CTaskMainをメインのクラス(CWnd)、CTaskDlgConfigをメインから呼ばれて
表示されるダイアログのクラス(CDialog)として制作しています。
具体的には以下のような感じです。
//タスクトレイのポップアップメニューで[Config]を押した時の処理
void CTaskMain::OnConfigClick(){
CTaskDlgConfig dlg;
int nResult = dlg.DoModal();
if(nResult == WM_USER_RESULTOK)
AddNotifyIcon(IDR_ICONRED);
}
CTaskDlgChildクラスのダイアログを表示し、それがWM_USER_RESULTOKを返した場合
タスクトレイのアイコンを変化させるというような処理になっています。
AddNotifyIcon(UINT nIconResID)で、引数で指定したリソースのアイコンに変更します。
で、このCTaskDlgChildが開かれている間に、ダイアログ上のあるボタンをクリックすると
タスクトレイのアイコンが変わるような処理を追加したいと考えています。
なので、AddNotifyIcon()はCTaskMainのメンバ関数なので
CTaskMain::AddNotifyIcon(IDI_ICONGREEN);
としてみたのですが、
静的でないメンバ関数の中で呼び出しが正しくありません。
と言った旨のエラーにてはじかれてしまいます。
他に色々試してはみたのですが、どれもコンパイルエラーではじかれてしまうので
どうにもいかない状況です。
派生クラス(CTaskDlgConfig=CDialog)から継承したクラス(CTaskMain=CWnd)を
参照しているからいけないのか?等々考えてみましたが、いま一つ突破口になる
ものがつかめません。どなたかご教授頂ければ幸いです。
>>929 CTaskDlgChildからCTaskMainのインスタンスを参照できればいい。
((CTaskMain*)GetParent())->AddNotifyIcon(IDI_ICONGREEN);
で解決。
>>931さん
機能しました!ありがとうございます。
クラスに関する学習が不十分だったと思います。精進します。
>>930さん
もっともです。現在時間があまり無い中での制作なので、
C++の概要と基本的な構文ぐらいしか勉強できていない状況です。
時間を取り、書籍で勉強したいところではあるのですが…。
確かにMFCはC++の知識無しでは理解できないし、
それに加えてWin32API等に関する勉強も必要なのですが、
最近新規に移行したものでどれもいっぺんに覚えられないのがもどかしいところです。
C++だけ知っていてもWin32APIの各種命令、関数など知らなければいけませんし、
MFCをやろうとしてもC++の概要を知っていなければ意味不明ですし…。
難しいところです。
休日は家にこもってC++の学習に勤しみたいと思います。
CSocketを使用するプログラムを作っているのですが、
Connectで接続後、接続がきれるまで次の処理を待ちたいのですが
ソケットが閉じているか、閉じていないかを判別するには
どうしたらよいのでしょうか?
// コードにすると
while( /* 接続している */ )
Sleep(100);
// 次の処理へ
質問のage忘れすいません。
>>935 本当なのですが…
OnReceive() で全て処理しているのですが
駄目ですか?
OnReceiveってCAsyncSocketの派生クラスでオーバーライドするメンバ関数でしょ?
CSocketとは関係ないような……???
CSocketでもオーバーライドするんでなかったかな、OnReceiveは。
>>937 本当ですね。
親クラスをCAsyncSocketにしても動きました。
OnConnect() でフラグを立てて、
OnClose() でフラグを消すことにします。
ありがとうございました。
941 :
デフォルトの名無しさん:03/06/21 12:02
ダイアログでピクチャボックスなどを貼り付けていると座標やらサイズが右下の方にでますよね
でもデバッグしててGetClientRectとかでとったサイズで、はなからこの大きさにしよう、
とおもってダイアログエディタで座標とサイズを見ながらぴったしほしいサイズにしても
実際に表示されると違った大きさになりませんか?
実際ダイアログエディタで出る座標は実際の座標とは違うから、何故か。
コントロールの配置にしても座標は1ずつ変わってるのに画面上では微妙に合わなかったりする。
複数ダイアログ作る場合等に参考にする程度のものって感じ。
「ダイアログ単位」って香具師が絡んでるんでしょ?
スタティックコントロールを表みたいに並べた時に微妙に行間、列間が
合わなかったりするからね(´Д`;)
なんなんだろ、この仕様。
フォントサイズが環境依存だからじゃないの?
ダイアログ単位についてはMSDNの GetDialogBaseUnits() 参照。
DWORD base = ::GetDialogBaseUnits();
int pixelX = MulDiv( 1, LOWORD(base), 4 );
int pixelY = MulDiv( 1, HIWORD(base), 8 );
を実行すると、pixelX = pixelY = 2 となり、1ダイアログテンプレート単位が
2ピクセルに相当することがわかる。
すなわち2ピクセルの精度でしかコントロールを配置できない、ということになる...?
RECT wrTarget, crTarget;
::GetWindowRect(hWnd, &wrTarget);
::GetWindowRect(hWnd, &crTarget);
#define DUX (LOWORD(GetDialogBaseUnits()))
#define DUY (HIWORD(GetDialogBaseUnits()))
#define DSX(x) ((x) * 4) / (DUX)
#define DSY(y) ((y) * 8) / (DUY)
CString kekka;
kekka.Format( "ピクセル座標\r\n"
"ウインドサイズ :(%4d, %4d)-(%4d, %4d) 幅=%4d, 高=%4d\r\n"
"クライアントサイズ:(%4d, %4d)-(%4d, %4d) 幅=%4d, 高=%4d\r\n"
"ダイアログ座標\r\n"
"ウインドサイズ :(%4d, %4d)-(%4d, %4d) 幅=%4d, 高=%4d\r\n"
"クライアントサイズ:(%4d, %4d)-(%4d, %4d) 幅=%4d, 高=%4d\r\n"
, wrTarget.left, wrTarget.top, wrTarget.right, wrTarget.bottom, wrTarget.right - wrTarget.left, wrTarget.bottom - wrTarget.top
, crTarget.left, crTarget.top, crTarget.right, crTarget.bottom, crTarget.right - crTarget.left, crTarget.bottom - crTarget.top
, DSX(wrTarget.left), DSY(wrTarget.top), DSX(wrTarget.right), DSY(wrTarget.bottom), DSX(wrTarget.right - wrTarget.left), DSY(wrTarget.bottom - wrTarget.top)
, DSX(crTarget.left), DSY(crTarget.top), DSX(crTarget.right), DSY(crTarget.bottom), DSX(crTarget.right - crTarget.left), DSY(crTarget.bottom - crTarget.top)
);
でためしますた。ダイアログエディタの表示とは異なる結果が・・
ちなみにたて横15ピクセルの窓ですが7*6という結果になってしまいました。
>>947 MapDialogRect()使ってね♥
949 :
デフォルトの名無しさん:03/06/22 16:27
CMainFrameで子ウィンドウを新規に作成するには
::AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_NEW);
って教えてもらったんですけど、
メッセージボックスのエラーがでます。
新規作成の関数を消してMFCに依存すると上手く実行できるのですが。
MFCは糞ライブラリの代名詞
952 :
デフォルトの名無しさん:03/06/22 17:00
>>951 例外unknown software exception(0xc00000fd)がアプリケーションの0x5f466cbcで発生しました。
どなたかワトソン先生の詳しい使い方を書いたサイトを教えてください。
>>949 >新規作成の関数を消してMFCに依存すると上手く実行できるのですが。
あたりまえだと思う。
>>952 何がしたいのかさっぱりわからんが
DocTemplate辺りを読んで見れ。
956 :
デフォルトの名無しさん:03/06/22 21:56
>>955 そうなんです。DocTemplateを使いたいのですが、
OpenDocumentFileでパラメータを入れないと受け付けないし、
といった具合でうまくいかないのです。
958 :
デフォルトの名無しさん:03/06/23 17:10
>>957 問題はCMainFrameで使いたいことにあるのです。
960 :
デフォルトの名無しさん:03/06/23 19:48
961 :
デフォルトの名無しさん:03/06/23 22:45
VisualStudioの『プロジェクト』の『設定』の『リンク』に関するオプションは,
プログラム中に以下のように記すことが出来ますが,
#pragma comment(linker, 〜
『プロジェクト』の『設定』の『C/C++』に関するオプションは,
同じように,#pragma 〜 で記述することは出来ないでしょうか?
よろしくお願いします.
出来ないです。
スレ違いでもあるが。
>>962 残念です.
微妙にスレ違いかと思いましたが,多分,このスレの人の方が関係あるかと・・・
どうも有り難うございました.
964 :
デフォルトの名無しさん:03/06/24 18:21
>>964 そのページにある「超M」ってソフトにソース付いてるヨ(MFC)
原理はどれかのヘルプで説明してるでしょ
片っ端からダウンロードして読みな!
>>965 ありがとうございます。
ソース付のもあったんですね……。
大量にメモリを確保して、スワップを起こさせてるのか。
API スレのほうで聞くべき質問でした、すいません。
スレ違いだったら申し訳ないんですが、vc6でcファイルやcppファイルの関連付け
のパラメータ設定ってどうなってますか?
他の開発ツールが勝手に関連づけ変えちゃったのでエクスプローラーから
"C:\Microsoft Visual Studio\Common\MSDev98\Bin\msdev.exe" "%1"
って感じに修正したら・・・
必ず新しいMSDEVを起動してソースを開くようになっちゃいました( ´Д⊂ヽ
※以前は最後にアクティブにしたmsdevウインドウで開いてくれたのですが
>>967 DDEなんで説明がメンドー。だし、やっぱりスレ違い。
>>968 DDEメッセージに[open("%1")]て入れたら行けマスタ。スレ汚しスマソ(´・ω・`)
970 :
デフォルトの名無しさん:03/06/25 00:19
CFormViewの中身の大きさを、作成時にプログラムからで設定するにはどうすたらいいんですか
GetDlgItem( )->SetWindowPos
違うな。SetScrollSizesだ。
973 :
デフォルトの名無しさん:03/06/25 02:06
MFCって理解しにくいよ。
そこでお願いなんだけど、良い参考書、お勧めの参考書を教えて欲しいんだ。
出来ればAppWizを使わないで解説してくれるようなのがいいな。
>>973 AppWiz使うとどういう不都合がありますか?
975 :
デフォルトの名無しさん:03/06/25 18:53
976 :
デフォルトの名無しさん:03/06/25 18:55
ダイアログウィンドウをリサイズさせたいんですが、イベントはどのように受け取ればいいでしょうか?
ご存じのかたがおられましたら教えてください。
977 :
デフォルトの名無しさん:03/06/25 19:14
CListCtrl で Itemの無い領域(最大列(行)数より右(下)) も
OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) で
描画させる方法はありますか?
>>973 とりあえず4000円未満の本は無視。
10000万円前後で探せばあるかも。
あと洋書、もしくは原著が外人。
>>975 try{
::AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_FILE_NEW);
}
catch(...){
MessageBox("MFC逝ってよし!");
}
買えるかなあ?
>977
OnEraseBkgnd じゃだめなの?
AВГД・EЁ
985 :
デフォルトの名無しさん:03/06/25 23:34
買え!
次スレまだ〜?
>>985 ウィザードの吐くコードなんかたかが知れてるだろ。
あの程度把握できなきゃMFCの内部なんか到底無理。
「MFCによるWindowsプログラミング」を薦めたいところだが売ってないみたいだしな
991 :
デフォルトの名無しさん:03/06/26 08:48