■MFC相談室 mfc20d.d ..
385:デフォルトの名無しさん
09/03/02 10:18:58
MSDNのScribbleサンプルなんかを見ると、
リスト(m_strokeList)や配列(m_pointArray)などのメンバは堂々とpublicで、
描画時などは外から直接参照したり操作してるけど、
これってやはり手を抜いているだけでしょうか?
それとも、この程度のものはいちいちカプセル化しないものなのでしょうか?
386:デフォルトの名無しさん
09/03/02 10:44:12
Scribbleサンプルって15年くらい前からあるよな・・・
387:デフォルトの名無しさん
09/03/02 11:48:51
>>385
クラスウィザードでメンバ変数を作ると、意識して設定しない限り public になる。
388:デフォルトの名無しさん
09/03/02 12:00:41
MSのサンプルは「動けばまだマシな方」くらいに思っとかないと。
389:デフォルトの名無しさん
09/03/02 20:03:47
CPaneDialog型って、リサイズをさせたくない場合どうすればいいんでしょ?
知っておられる方、情報をお願いします。
390:デフォルトの名無しさん
09/03/02 20:31:33
CBasePane::CanBeResized をオーバーライドして FALSE を返す
391:デフォルトの名無しさん
09/03/02 20:32:21
「このメソッドは現在実装されていません。」だった。すまん
392:デフォルトの名無しさん
09/03/02 20:34:25
実装すればいんだから、それでいい
393:389
09/03/03 09:10:56
>>390-392
Visual Studio 2008のIDEでは、
派生元へのオーバーライドができないのね・・・手書きなのか・・・
できました!
ありがとうございます!
394:デフォルトの名無しさん
09/03/03 14:23:17
むみません。
ダイアログ上でレイアウトされたグループボックスにて、
文字色をで変更しようとSetTextColorを使ったのですが、
反映されませんでした。
何かコツみたいなものがあるのでしょうか?
ちなみに環境はVS2008でMFC Feature Packを使っています。
395:デフォルトの名無しさん
09/03/03 14:56:00
むみません。
396:デフォルトの名無しさん
09/03/03 17:47:13
>>394
CWnd::OnCtlColor
397:デフォルトの名無しさん
09/03/07 17:37:02
VC++ 6 でプログラミングしています。
ポップアップメニューを表示しています。
各行で文字位置を合わせたいので固定ピッチのフォント
を利用したいのですが、ポップアップメニューのフォント
はどのようにすれば変更できますか?
ポップアップメニュー作成は、TrackPopupMenuを使っています。
398:デフォルトの名無しさん
09/03/07 17:53:49
>>397
OwnerDraw Menu にする
399:デフォルトの名無しさん
09/03/07 21:48:22
ちと古いけど>>129の件、おれも悩んでたんで調べた結果を貼っとく。
afxGlobalData.SetMenuFontで設定するといいらしい。
他にもafxGlobalDataをいじるといろいろできるけど、
これ直接いじっていいんかな?
400:デフォルトの名無しさん
09/03/07 22:37:04
それをいじる関数として、CMFCMenuBar::SetMenuFont() が用意されているんだが。
401:デフォルトの名無しさん
09/03/07 23:27:13
あれ、CMFCMenuBarのヘルプを見てもFont関係が見あたらなかったから
MFCのソースを追っかけたのに・・・・
思いっきり見落としたらしい。
402:デフォルトの名無しさん
09/03/08 00:56:41
ついでに言っておくと、WM_SETTINGCHANGE が飛んでくると
CMFCMenuBar::SetMenuFont() した内容はクリアされるから、再度設定しなおすこと。:-)
403: ◆8x8z91r9YM
09/03/09 21:08:28
質問です。
VS2005 MFCでCrystalReport(PUSH型)を扱ってる
参考になりそうなサイトをご存知の方おられましたら
教えていただけませんでしょうか?
C#やVBなどは表示したいデータをDataSetでまとめて
Crystalreportに渡して表示できますが、
それをMFCでどのように実装すればいいのか悩んでおります。。
よろしくお願い致します。
404:デフォルトの名無しさん
09/03/11 00:51:10
VS2008SP1のCMFCToolbarで、初期状態からアイコンの右側にテキストラベルを表示する方法は無いでしょうか。
ToolbarResetを発行してやると、文字は表示されるにはされるんですが、
カスタマイズ設定も消えてしまうので・・・
405:デフォルトの名無しさん
09/03/11 02:04:50
横に表示できたっけ?
CMFCToolBar::EnableTextLabels() だと下に表示だよな。
CMFCToolBar::GetButton( nIndex)->m_bText = TRUE; あたりで試してみ。
406:デフォルトの名無しさん
09/03/11 06:25:28
VS2005 WinInet で http Postを使ってファイルアップロードをするプログラムを書いているのですが
うまくいきません。 ソース 80行程度をアップしてアドバイスを頂いてもよろしいでしょうか?
1週間ぐらい頑張りましたが分からなかったもので・・・。
407:デフォルトの名無しさん
09/03/11 08:02:46
それのどこがMFC?
408:デフォルトの名無しさん
09/03/11 09:28:21
質問部分にCInternetSession等のMFCクラスを使ってれば質問は可
ただ「うまくいきません」としか説明できないんじゃ答えるつもりはない。
409:デフォルトの名無しさん
09/03/11 10:47:21
406です。スレ汚し失礼します。
状態としてはデバッガ出力ではエラーは帰ってきていませんが
スニファツールで見ると サーバから501エラーが帰ってきています。
サーバ側のPHPテストプログラムの方は $_FILES["upfile"]["tmp_name"]
にも $_FILES['userfile']['error']にも 値が入ってきません。
多分ヘッダの送り方、設定の仕方がおかしいと思うのですが。。。
ソースは以下になります。
410:デフォルトの名無しさん
09/03/11 10:49:25
80行貼るのかよ
ろだ使っては
411:デフォルトの名無しさん
09/03/11 10:49:28
#define APP_NAME "PostTool"
#define BOUNDARY "hogehoge"
#define POST_FILE "C:\\TEST.DAT"
#define BUF_SIZE 2048
bool PostData(TCHAR* uri){
bool bRtn = false;
try
{
DWORD dwServiceType = 0, statusCode;
CString strServer, strObject, strBuf, strBoundary = TEXT(BOUNDARY);
INTERNET_PORT nPort;
char szBuf[BUF_SIZE + 1];
if (AfxParseURL(uri, dwServiceType, strServer, strObject, nPort) == false)
{OutputDebugString(TEXT("PostData() AfxParseURL失敗\n")); goto pd_End;}
CInternetSession session(TEXT(APP_NAME));
CHttpConnection* conn = session.GetHttpConnection(strServer,
CHttpConnection::HTTP_VERB_POST, nPort, NULL, NULL);
CHttpFile* file = conn->OpenRequest(CHttpConnection::HTTP_VERB_POST,
strObject, NULL, 1, NULL, NULL,
INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);
412:デフォルトの名無しさん
09/03/11 10:59:43
すいません あっぷろだに置きました。
411の投稿すいませんでした。
URLリンク(www7.uploader.jp)
413:デフォルトの名無しさん
09/03/11 11:04:14
URLリンク(support.microsoft.com)
エラー メッセージ : エラー 501/505 - 未実装または未サポート
[HTTP 1.1 を使用する] チェック ボックスをクリックしてオフにし、[OK] をクリックします。
テストして問題が解決したかどうかを調べます。
2002 年 12 月現在、HTTP 1.1 は新しい Internet プロトコルです。
一部の Web サイトでは HTTP 1.0 が使用されているため、HTTP 1.1 を使用した場合、
接続の問題が発生することがあります。
414:デフォルトの名無しさん
09/03/11 11:44:28
こういう場合
プログラムに問題がある
設定が間違ってる
使い方が間違ってる
ネット上にトラブルがある
メールを送った相手に問題がある
みたいにありとあらゆる原因が考えられるわけだけど
いきなりプログラムのソース見ろと言われても
設定が間違ってる
使い方が間違ってる
ネット上にトラブルがある
メールを送った相手に問題がある
だったら見るだけ無駄だろ
415:デフォルトの名無しさん
09/03/11 11:49:36
サーバ側のhttpdのログ見たらわかると思うよ
416:デフォルトの名無しさん
09/03/11 14:01:28
こういった感じでソース書いている人って多いのか?
・グローバル関数だし、
・コメントないし、
・goto ラベル使い放題だし、
・for(;;)だし・・・ (while() 使えよ)
417:デフォルトの名無しさん
09/03/11 14:15:34
別に習作なんだし
そういう関係ないところつっこむからソース出したがらない質問者が増える
418:デフォルトの名無しさん
09/03/11 17:29:12
Httpは手順が多くてネストが深くなるしエラー処理も多いからどうやっても汚くなる
手抜きしないできれいに書いてあるサンプルあったら見てみたい
419:デフォルトの名無しさん
09/03/11 17:32:03
>>416
> ・グローバル関数だし、
> ・コメントないし、
コミュニケーション能力重視とか、ヒューマンスキル重視の現場では、
ありがちだ。 業務で引き継ぐと悲惨なパターン。
しかも極端な場合、グローバル変数の名前が「i」なんて場合もある。
> ・for(;;)だし・・・ (while() 使えよ)
個人的には「while(1)」の方が好みだけど、「for(;;)」の方が推奨
されているらしい。
しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」
はやめてほしい。
420:デフォルトの名無しさん
09/03/11 22:46:05
>>419
>しかし、「for(;;)」を使いながら、forループ内で「if(...) break;」
そりゃ無茶や。
全く脱出しないループで外部から殺してもらうってことなら兎も角、
ループ内の何かの事象で脱出したくなることくらいあるだろよ。
421:デフォルトの名無しさん
09/03/11 22:52:57
>>416
while(1)はMS-C V6がwarning吐いてたから、おれはfor(;;)使うよ。
>>420
そういう場合forに脱出条件を入れろという説がある。
おれは基本的に嫌いだけどね。
422:デフォルトの名無しさん
09/03/11 23:05:32
for (;;) {
...;
someStatus = someFunction();
if (someStatus) break;
...;
...;
}
--
よくありがちなこんなコードを否定するのかな?
423:デフォルトの名無しさん
09/03/11 23:25:55
someStatus が いつか必ず TRUE になるという保証があるなら、かまわんのでは。
無限ループの可能性を残すコードを、おれ個人は書かないけど。
424:デフォルトの名無しさん
09/03/11 23:30:58
for (;;)の正しい使い方が良くわからないからMFCのソースの中探してみたけど
やっぱfor (;;)とbreakはセットで使ってるね
以下VC6のMFC
SRC\AFXMEM.CPP(322): for (;;)
SRC\AFXMEM.CPP(371): for (;;)
SRC\APPUI1.CPP(172): for (;;)
SRC\ARCCORE.CPP(816): for (;;)
425:デフォルトの名無しさん
09/03/11 23:35:02
下らない疑問かもしれませんが質問させてください。
MFCでコントローラに追加した文字列のメモリ管理ってどうなってるんでしょうか?
例えば、以下のような場合、FuncA()関数を抜けたときに
strのアドレス先のメモリが解放されて、コンボボックスで
strの文字列が参照できなくならないのでしょうか?
試したところ問題ないようですが、不思議です。
void FuncA() {
CString str;
m_pCmbBox->AddString(str); //メンバ変数であるコンボボックスに文字列追加
}
426:デフォルトの名無しさん
09/03/11 23:45:01
コントロールが別のところでメモリを割り当ててるのさ。メモリの割り当てに失敗したら
CBN_ERRSPACE が通知されてくる。
これはMFCの質問じゃないな。
427:デフォルトの名無しさん
09/03/11 23:50:26
>>426
すみません、もう一歩だけお願いします。
調べるなら、C++のメモリ管理で調べればいいでしょうか?
428:デフォルトの名無しさん
09/03/11 23:51:14
フォントなんかが参照不能になるのは
描画のタイミングが関数抜けた後だから
文字列は渡し終わってるから問題なし
429:デフォルトの名無しさん
09/03/12 00:10:04
>>426, 428
まとめるとこうでしょうか。
・コントローラに文字列を渡すと、コントローラが新たにメモリを割り当てる。
・この場合、関数を抜けた後も、描画タイミングで割り当てられたメモリが参照されるので問題なし
ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能
コントローラのメモリ管理について調べてみます。
ありがとうございました。
430:デフォルトの名無しさん
09/03/12 00:18:04
どうでもいいけど「コントローラ」ってなんだよ。
controllerじゃなくてcontrolだぞ。
431:デフォルトの名無しさん
09/03/12 00:28:17
>>430
訂正thx。気をつけますw
432:デフォルトの名無しさん
09/03/12 00:44:32
>ただしフォントの場合は、メモリ割り当てが行われない(?)ので、関数を抜けると参照不能
これは単にスコープの問題
433:デフォルトの名無しさん
09/03/12 10:43:00
スコープの問題じゃなくて、寿命の問題。
スコープが外れても寿命が続くのなら大丈夫。
だから例えば、staticでも(一代限りは)使える。
434:デフォルトの名無しさん
09/03/12 20:06:01
フォントって、CFontクラスやCBrushクラス等のGDIオブジェクトをローカル
変数で作成したなら、関数を抜けた時点で変数の寿命が尽き、DeleteObject()
を呼んでいなくてもデストラクタから(メンバ変数のm_hObjectを使って)強制
的にDeleteObject()が呼び出され、(GDIオブジェクトとそのハンドルが)破棄
される。
CFont *pFont=new CFont;
などとやった場合、ポインタ変数の寿命が尽きても、newしたオブジェクト
自体はdeleteはされないので、プロセス終了まで、紐が切れた凧のように
メモリ空間に残る。
95系だとプロセス終了でも解放されず、リソースリークになるんだっけか?
static で宣言したオブジェクトでも、
if(s_FontStatic.GetSafeHandle())
s_FontStatic.DeleteObject();
s_FontStatic.CreateFontIndirect(...);
と破棄する手順を踏めば、何回でもリサイクルできる。
435:デフォルトの名無しさん
09/03/14 02:34:29
CMFCToolbar上にStatic Textを作成できないですかねぇ・・・
436:デフォルトの名無しさん
09/03/14 10:05:36
>>435
CMFCToolbar って、CDialogBar よりも美味しいの?
スタティックテキスト相当な機能なら、わざわざウィンドウを置かなくても
CString型のメンバ変数を追加して、ツールバーの描画処理を自前でやれば
いいだけのような肝。
437:デフォルトの名無しさん
09/03/17 23:37:17
>>435
つCStatic::Create
438:デフォルトの名無しさん
09/03/22 15:54:16
ダイアログ上のコントロールのタブオーダーが一つ前のコントロールIDを調べるにはどうしたらいいんですか?
例えばCEditが10個並んでいるとして、5番目のタブオーダーのCEditにフォーカスがある時に、
4番目のタブオーダーのコントロールIDを調べたいんですが。
"タブオーダー MFC"でググってもタブオーダーを変更する方法しか見つからなくて。
タブオーダーがらみのAPIって無いんですかね?
439:デフォルトの名無しさん
09/03/22 16:23:08
CWnd* pWnd = wndEdit.GetWindow( GW_HWNDPREV):
if ( pWnd->GetStyle() & WS_TABSTOP) UINT nID = pWnd->GetDlgCtrlID(); // こいつがそう。
else pWnd = pWnd->GetWindow( GW_HWNDPREV);
以下繰り返しってな感じで取得できないかな。
実際には while ループするほうがお得だろうが。
440:デフォルトの名無しさん
09/03/22 17:14:26
>>439
どうもありがとうございます。
GW_HWNDPREVというのはウインドウのZオーダー順であるだけでなく、
Window上のコントロールのタブオーダー順でもあるんですね。
441:デフォルトの名無しさん
09/03/22 21:59:09
C初心者スレで相手にされなかったので、質問させてください
MFCでアプリを作っているのですが、
動作確認のため、コンソールも起動しております。
_cprintf_sや_cscanf_s関数を使っているのですが、
_cscanf_s関数でバックスペースのキーを入力すると、
プログラムが無限ループで暴走してしまいます。
普通のscanf()関数のようにバックスペースで一つ前の文字を削除するには
どうすればよいでしょうか?
442:デフォルトの名無しさん
09/03/22 22:07:52
暴走するようなもの使うな
443:名無し募集中。。。
09/03/23 09:08:39
MFCも使っているのかもしれないけど_cscanf_s関数ってMFCじゃないし
コンソールならダイアログにEditコントロールを置いて表示・入力するって感じになりそうだけど
デバッグ表示だけならTRACEマクロが便利
値の入力は・・・ちょっと試すだけならブレイクポイントで値の代入とか
444:デフォルトの名無しさん
09/03/23 21:24:49
いまさらながら、mfcおもしろいお。
詳しい説明書ないかお?
445:デフォルトの名無しさん
09/03/24 10:07:58
SP1以降の解説か、まだないかもな。
446:デフォルトの名無しさん
09/03/24 17:14:26
>>444
SP1非対応でよければMicrosoft Pressの「プログラミングVisual C++.NET Vol.1/2」
Vol.2の最後にちょろっと.NETの説明があるけど、それ以外はMFCの説明になってる
447:デフォルトの名無しさん
09/03/24 20:59:37
後はmfcのソース読んどけ、ってところだな。
ドキュメント化されていない情報が山ほどあるし。
別に全部目を通さなくても、疑問に思った箇所だけで十分。
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5387日前に更新/106 KB
担当:undef