トップページ⇒tech
1001コメント335KB

■MFC相談室 mfc17d.dll■

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/11/21(火) 10:38:31
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■MFC相談室 mfc16d.dll■
http://pc8.2ch.net/test/read.cgi/tech/1146117893/
0067602006/11/30(木) 04:56:11
>>66
前書き込んだ者ですけど、多分、ダイアログバーを自分で改造して
似た様な物が出来るんじゃないかと思うんですが。
設置したコントロールもダイアログの状態によって位置、大きさを変更する等して。
外観は全部自分で独自に描画して似せて。
例えば、あの二本線のRebarみたいなのも自分で描画して。
CDialogBarのDDXが効かないのは、CDialogに書き直せば確かOKだった筈ですし。
0068デフォルトの名無しさん2006/11/30(木) 19:00:30
アプリケーションの英語化作業中です
リソースを日本語版と英語版を用意して、以下のような設定にしています
 英語版ビルド時には日本語を無視
 日本語の場合には英語リソースを無視

この方法でビルドした場合、ダイアログに直接貼り付けてあるStaticテキストや
ボタンのCaption等は正しく言語の切替が行われていますが
StringTableから読み込んで表示する場合、英語版が全て空白になってしまいます

正しく読むにはどうしたらいいでしょうか?
0069デフォルトの名無しさん2006/11/30(木) 19:09:49
英語と日本語でそれぞれプロジェクト作って比べてみれば馬鹿でもわかる。
0070682006/11/30(木) 19:43:41
すみません、解決しました
開発しているのはプラグインなのですが、対象となるソフトの言語設定を変更したら上手く行きました
0071492006/11/30(木) 22:37:56
>>55

CDockContextの派生クラスを作成し、以下の3つをオーバーライド。
・virtual void StartResize(int nHitTest, CPoint pt);
・void Stretch(CPoint pt);
・BOOL Track();
StartResize()とTrack()は、CDockContextのものをそのまま手を入れずにコピー。
Stretch()は、例の部分をVC2005版に修正し、それ以外はそのままコピー。
そのほかに、これらの関数で使われている定数や構造体の宣言をそのままコピー。

CToolBarの派生クラスを作成し、EnableDocking()をオーバーライド。
m_pDockContext = new CDockContext(this);
の部分を、上のCDockContextの派生クラスをnewするように修正し、
それ以外はそのままコピー。

というソースファイルを作成し、
SDIのツールバーをこのCToolBarの派生クラスに置き換えてみたところ、
無事にセカンダリモニタ上でもサイズできました。

「当方では一応成功」っていうのも、やはりこのような感じなのでしょうか?
0072622006/11/30(木) 22:54:50
とりあえずウィンドウをDLL側で生成して表示させることはできました
フレームとビューとドキュメントをCCreateContextで連結させるのに苦労しました
上手に表示されたときはとってもハッピーになりました

さて、申し訳ないですが本日も質問があります
それはビュー(CFormView)に張り付けたダイアログリソースについてです
なぜか分からないですが、呼び出しアプリケーション側のダイアログリソースに置き換わってしまいます
DLLのダイアログリソースが表示されません
Resource.hが怪しいと思っていますが、どうすれば解決できるのか分かりません
アドヴァイスを頂けませんか?

あと、昨日の質問が残っています
>>62の後半、メモリ開放についてです
CFormWndのインスタンスを持っているのはDLL側です
ユーザが閉じるボタンやAlt+F4でデストロイしたことを察知して2度デストロイやdeleteするのを防ぎたいです
大変にクリティカルな問題なのでとても悩んでいます
インターネット検索や書籍で解決策を探していますが、まだ解決には至っていません
アドヴァイスをお願いします
0073デフォルトの名無しさん2006/12/01(金) 00:14:31
>>72
相変わらずFrameの位置が不明瞭です...

次の3つの内から一つを選択しなさい。
1.Exe側のCMainFrameにDLL側で作成したCFormViewを結合している
2.ExeとDLLにそれぞれFrame&Viewの対がある
3.その他

上段で上手に表示されたと書いてるけど、中段読むとFrameとViewの
結合に失敗してるし訳分からない。別な話?
下段CFormWndのbase class はCFormView or CFrameWnd ?
0074722006/12/01(金) 00:16:17
>>73
すみません
選択肢1が該当します
0075デフォルトの名無しさん2006/12/01(金) 00:27:52
dll内でnewしたインスタンスはdll内でdeleteしないといけないのでしょうか。
0076デフォルトの名無しさん2006/12/01(金) 00:49:13
>>74
であれば、Viewをdeleteする必要はない。
FrameとViewが正しく結合されていれば、exe側Frameが閉じられる際に自動で削除される。
CView::PostNCDestroy()参照。
0077デフォルトの名無しさん2006/12/01(金) 01:11:51
>>75
うん
0078デフォルトの名無しさん2006/12/01(金) 01:18:01
>>75
例えば開発時に、EXEがReleaseでDLLがDebugだとすると。
メモリ管理のランタイムが別になるんで、EXEでnewしたメモリをDLLで開放しようとすると、
当然そんなメモリは管理してないから落ちてしまうと。
0079デフォルトの名無しさん2006/12/01(金) 01:27:38
exe-dllで使用しているMFCのバージョンが同じで >>78の言うことに気をつけていれば
問題ないんじゃないの?
77は根拠を示すべし。
0080デフォルトの名無しさん2006/12/01(金) 06:53:15
>>79
別のアプリで確保したメモリを別のアプリで解放できるか?って話しになるんじゃない?
0081デフォルトの名無しさん2006/12/01(金) 09:12:04
この子は何をほざいているのだろう・・・
0082デフォルトの名無しさん2006/12/01(金) 10:26:11
>>79
バージョンが同じでも、MFCをスタティックリンクしてるとダメだよ。
0083デフォルトの名無しさん2006/12/01(金) 14:28:49
論点がばらけ過ぎてる
0084552006/12/01(金) 19:42:03
>>71
そんな感じです。というより全く同じですね。
VC6ではやむを得ないと思います。

>>65-67
http://www.codeproject.com/docking/
http://www.codeguru.com/cpp/w-d/docking/
スクリーンショット見た感じ、↓のが参考になるかも。
http://www.codeguru.com/cpp/w-d/docking/article.php/c1447/
http://www.codeguru.com/cpp/w-d/docking/article.php/c1451/
http://www.codeproject.com/docking/sizecbar.asp

>>62&>>72
どっかのスレで参考になる文献はないかと聞かれたから
URL貼ったんだが全く読んでないんだな。
考えられる原因の一つは、delete this;して自殺するクラスがあるということ。
CFrameWndやCViewがまさにそういうクラスなのでその可能性があるんじゃない?
76も答えてくれてる通り。
0085デフォルトの名無しさん2006/12/02(土) 16:41:12
VC++.NET2003で開発しています。

MDIから別プロジェクトの画面を子画面として表示させたいのですが、
どういう風に作ればいいのでしょうか。
0086デフォルトの名無しさん2006/12/02(土) 17:26:41
またMDIか
0087デフォルトの名無しさん2006/12/02(土) 17:32:47
このまえ質問してたやつはどこに消えた?
0088492006/12/03(日) 13:05:02
>>84
やはりこういう派生になるのですね。安心しました。
VC7でも同じ問題が発生するようで、VC2005じゃないと直ってないようです。
0089402006/12/03(日) 16:05:47
>CViewのメニューなりからのイベントでCFormViewを開く時は、
の続きで、Viewの差し替えは、Viewクラスでのメニューイベントハンドラーで
CWinApp* myapp=AfxGetApp();
CDocTemplate* mydoctemp=(CDocTemplate*)RUNTIME_CLASS(CDocTemplate);
POSITION myps=myapp->GetFirstDocTemplatePosition();
mydoctemp=myapp->GetNextDocTemplate(myps);//テンプレートリストの1番目を選択するイテレータ
mydoctemp=myapp->GetNextDocTemplate(myps);//テンプレートリストの2番目を選択するイテレータ
mydoctemp->OpenDocumentFile(NULL);
でドキュメントテンプレートに入れられた2番目のViewを新規子ウィンドウで表示できたよ
0090デフォルトの名無しさん2006/12/04(月) 13:59:24
ダイアログにタブコントロールを乗せ、複数のリストビューの表示をタブで切り替える
ソフトを書いていたんですが、タブに重ねたリストビューの列サイズを操作すると
リストビューの表示が乱れる現象が出てしまいました。

http://www.uploda.org/uporg604606.zip.html
サンプルプロジェクトです。VC2005で作りました。
http://www.uploda.org/uporg604603.gif
1つめのリスト。こういう感じで一番右の列境界をタブの外へ右にドラッグすると
スクロールバーが現れます。通常の動作です。
http://www.uploda.org/uporg604604.gif
2つめのリスト。1つ目と同じく一番右の列境界を右へドラッグするとスクロールバー
が現れるタイミングで表示が乱れます。

どうして2つ目のリストでのみ表示が乱れるのか悩んだ結果、ダイアログのリソース
定義ファイル中の、
> CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | (以下略)
> CONTROL "",IDC_TAB1,"SysTabControl32",0x0,7,7,173,186
> CONTROL "",IDC_LIST2,"SysListView32",LVS_REPORT | (以下略)
を
> CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | (以下略)
> CONTROL "",IDC_LIST2,"SysListView32",LVS_REPORT | (以下略)
> CONTROL "",IDC_TAB1,"SysTabControl32",0x0,7,7,173,186
と順番を入れ替えると表示が乱れなくなりました。逆に、タブの行をリストの先頭
に持っていくと今度は両方のタブでリストの表示が乱れるようになります。

結果オーライといえばそれまでなんですが、どうしてこれで問題が解決するのか納得が
いきません。リソース中の定義順が何に影響しているのでしょうか?
0091デフォルトの名無しさん2006/12/04(月) 14:05:47
普通はプロパティシート
0092デフォルトの名無しさん2006/12/04(月) 14:46:26
>>90
Zオーダーの問題じゃね?
0093デフォルトの名無しさん2006/12/04(月) 16:30:03
Zオーダーの問題
0094902006/12/04(月) 22:53:30
確かにZオーダの問題でした。どうもありがとうございます。

リソース定義の順番がZオーダになるというのが将来にわたって保障された
仕様なのかどうかが疑問なので、コントロールを重ねる場合のZオーダは
きちんとSetWindowPosでコード中に書いておくことにします。
0095デフォルトの名無しさん2006/12/06(水) 06:13:15
VC6.0のMFCで作ったプログラムを実行したときにレジストリへ一切書き込まないようにしたいのですが
HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache
に VS_VERSION_INFO の FileDescription の値が書き込まれてしまいます。
FileDescription を消しても実行ファイル名が変わりに書き込まれてしまいます。
どうしたら書き込まないように出来るでしょうか?
0096デフォルトの名無しさん2006/12/06(水) 10:01:56
そのキーを書込み禁止にすると(・∀・)イイヨ!!
0097デフォルトの名無しさん2006/12/06(水) 23:59:45
CFtpConnectionを使ってFTPクライアントを実験的に作ってみたのですが、
PASVモードを使ったときにどのポートが使われているかというのは
どうやって取得すれば良いでしょうか?
0098デフォルトの名無しさん2006/12/12(火) 21:25:29
CListCtrl (以下、リスト)をレポート形式で使用しているのですが、
このリストの特定セルだけ背景色を変えるにはどうしたら良いですか?
ステータス値に応じてセルの色が変わるような機能を実現したいのですが……
0099デフォルトの名無しさん2006/12/12(火) 21:26:36
ダイアログ上に複数のスタティックなコントロールを配置しています。
各コントロール毎に違う背景色を設定したいのですがどのようにすればよいのでしょうか?
OnCtlColor()メソッド内でコントロールの判定ができればよいと思うのですが・・・。
どなたかご教授の程よろしくお願い致します。

OSはWinXP SP2、開発環境はVC++ 2005です。
0100デフォルトの名無しさん2006/12/12(火) 21:45:51
>>98
カスタムドローじゃねぇの?

>>99
普通にウィンドウハンドル比べたらどうよ?
0101982006/12/12(火) 21:47:33
>>100
無知で申し訳ないのですが、カスタムドローとはどのようなものですか?
0102デフォルトの名無しさん2006/12/12(火) 21:55:03
>>101
http://www.google.co.jp/search?hl=ja&safe=off&c2coff=1&q=%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%AD%E3%83%BC+CListCtrl&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
0103982006/12/12(火) 21:57:44
>>102
すみません、自分で検索するべきでした
どうもありがとうございました
0104992006/12/12(火) 22:00:20
>>100
レスありがとうございます。

if(GetDlgItem(IDC_STATIC_COLOR1) == pWnd){
AfxMessageBox(L"一番目のコントロール");
}
//以降コントロールの数分else if

試しにこんなコードでやってみたのですが引っかかりませんでした。
比較処理が悪いのでしょうか?

0105デフォルトの名無しさん2006/12/12(火) 22:06:07
MFCってpWnd->m_hWnd == GetDlgItem(IDC_STATIC_COLOR1)->m_hWndってやらなくてもいいんだっけ?
まあ、駄目だったら、そもそもIDC_STATIC_COLOR1が本当にそいつの直下に配置してあるコントロールなのかどうなのか
ってところがあやしいんじゃね?
0106992006/12/12(火) 22:22:41
>>105
OnInitDialog内で
GetDlgItem(IDC_STATIC_COLOR1)->SetWindowText("あいう");
で文字は表示されたので問題はないと思うのですが・・・。
もう少し調べてみます。
0107992006/12/12(火) 22:31:54
>>105
すみません、教えていただいた
pWnd->m_hWnd == GetDlgItem(IDC_STATIC_COLOR1)->m_hWnd
でできていました。(メッセージボックスが表示されていなかったのでできていないと思っていました)
どうもありがとうございます。
0108デフォルトの名無しさん2006/12/12(火) 22:38:02
それはえがった
0109デフォルトの名無しさん2006/12/13(水) 16:35:12
VC6を使って、MDIアプリにMDIタブを実装したい
まずは、CMainFrame に MDIタブ用の CDocBar を配置したいのだが、
どこをどうオーバーライドしたらいいんだ?

CMainFrame::recalcLayout() あたり?
0110デフォルトの名無しさん2006/12/13(水) 17:02:48
またお前か
0111デフォルトの名無しさん2006/12/13(水) 19:25:44
その前にMDIの作り方は間違っていないのかね?
なんだかこの間からぶち当たった問題をことごとく質問してないか?
0112デフォルトの名無しさん2006/12/13(水) 19:32:03
相談室だから質問しています
0113デフォルトの名無しさん2006/12/13(水) 19:34:02
>>112
相談しようぜ。
MDIの基本的な部分はOKなん?
0114デフォルトの名無しさん2006/12/13(水) 19:52:36
ここは自分でできもしないことを相談する所か?
0115デフォルトの名無しさん2006/12/13(水) 20:17:28
まあ、MFCスレってここしかないんだから、そう厳しいこといわんと。
MFCって結構むずいじゃん。
俺、ドキュメントビューアーキテクチャーとかいう仕組み覚えるのに何日も必要だったぞ。
まず、ドキュメントビューアーキテクチャーの構造なんて大して重要なもんだと思ってなかったし(SDIで組んでたのもあって)。
この状態でMDIプログラミング特攻すると、はっきりいってハマルじゃんw
0116デフォルトの名無しさん2006/12/13(水) 20:57:27
プロパティシートについて質問があります。
ダイアログをいくつか作成(このときフォントをMSゴシックの12ptに変更)し、
各ダイアログ毎にクラスを作成(CPropertyPageクラスの派生クラス)して
メインメニューに[プロパティ]項目を追加、そのイベント内で
・プロパティシートのインスタンス生成
・プロパティページをプロパティページにAddPage
・DoModalで表示
しています。
このとき、表示された各ページのフォントサイズが標準のMS UI Gothicの9pt
で表示されてしまっています。なのでCPropertySheetの派生クラスを作り、
OnInitDialog内でフォントサイズの変更を行ってみたのですが変化なしでした。
なぜこのような現象が起こるのでしょうか?
0117デフォルトの名無しさん2006/12/13(水) 21:00:50
プロパティシート使ったことないけど
タブコントロールなら、全ページフォントを設定する必要があるな。
プロパティシートにもそんなのあんじゃね?(適当w)
0118デフォルトの名無しさん2006/12/13(水) 21:10:57
OnInitDialog内でGetPage()->SetFont();は行っているのですが
それでも変わらないんですよ。各ページのコントロールのサイズも
ちっちゃくなってますし。全ページのコントロールの位置、サイズ、フォントを
設定しないといけないんでしょうか。
0119デフォルトの名無しさん2006/12/13(水) 21:42:18
CPropertySheet フォント で検索
0120デフォルトの名無しさん2006/12/13(水) 21:44:25
MDIの基本的な部分はたぶんオケ

だからおいらの相談に答えてくれよー
0121デフォルトの名無しさん2006/12/13(水) 21:46:33
>>119
あ、やっぱ、手動なんだw
0122デフォルトの名無しさん2006/12/13(水) 21:48:25
>>120
ドキュメントビューアーキテクチャ(なげぇなw)の理解は大丈夫ということでOK?
0123デフォルトの名無しさん2006/12/13(水) 21:57:52
>まずは、CMainFrame に MDIタブ用の CDocBar を配置したいのだが、

MFCにCDocBarなんてあったけ?
0124デフォルトの名無しさん2006/12/13(水) 22:20:15
>>123
すまん CDockBar だった

CDockBar はアンドキュメンテッドなクラスで、CControlBar を配置するための滑走路みたいなものだよ
01251162006/12/13(水) 22:43:28
>>119
SendMessageToDescendants()?でフォントは変更できましたが、
サイズとかの変更の仕方が分かりませんでした。
0126デフォルトの名無しさん2006/12/13(水) 23:09:57
MFCを理解しようとしないで自分のやりたいことだけ質問する馬鹿ばっかりだな
0127デフォルトの名無しさん2006/12/13(水) 23:33:37
MFCのすべてを理解してるなら、すべての質問・相談にちゃっちゃ答えて神になってくれ
0128デフォルトの名無しさん2006/12/13(水) 23:47:28
何のためにソースがついてるんだろ
0129デフォルトの名無しさん2006/12/13(水) 23:49:05
非効率だよね。
まず、全体っちゅーか概要ぐらいは理解しないと
なにやるにも知ってる人間にお伺いを立てないと何もできなくなっちゃうぞ。
0130デフォルトの名無しさん2006/12/14(木) 01:57:25
なんかMFC使うほうがかえって面倒くさそうだ
0131デフォルトの名無しさん2006/12/14(木) 03:22:11
馬鹿じゃねぇの
0132デフォルトの名無しさん2006/12/14(木) 07:02:17
>>130
そういうときもある。
0133デフォルトの名無しさん2006/12/14(木) 09:06:58
コントロールのサイズと位置はピクセル単位じゃなくてダイアログベース単位で、
ダイアログベース単位はフォントの幅が元になってる。
だからダイアログのフォントを変えると
コントロールのサイズと位置もフォントに比例して変わる。

このフォントサイズはダイアログを作る時に指定した
ダイアログボックステンプレートに定義されている。
ダイアログを作った後でフォントを変えても
コントロールは既に作成されてしまっているから
コントロールのサイズと位置は後で指定したフォントには影響されない。

以上ここまでMFCに限らずWin32でも同様

プロパティシートがリソースで定義されたダイアログのフォントを無視しているということは
たぶんメモリ上に読み込んだダイアログボックステンプレートのフォントを書き換えてから
その変更を加えたダイアログボックステンプレートでダイアログを作っているのではないか
と推測されるけど、あとはCPropertyPageのソース等を読めばわかることだから省略
0134デフォルトの名無しさん2006/12/14(木) 10:51:38
  ☆ チン

        ☆ チン  〃  ∧_∧   / ̄ ̄ ̄ ̄ ̄ ̄ ̄
          ヽ ___\(\・∀・)<  MDIタブ実装方法 まだー?
             \_/⊂ ⊂_)_ \_______
           / ̄ ̄ ̄ ̄ ̄ ̄ ̄/|
        |  ̄  ̄ ̄ ̄ ̄ ̄ ̄:| :|
        |           .|/
0135デフォルトの名無しさん2006/12/14(木) 11:22:30
ソースを読めばわかることだから省略
0136デフォルトの名無しさん2006/12/14(木) 11:43:33
MDIタブのこと書こうか迷ってたんだけど、AAみて踏ん切りがついたよ。
0137デフォルトの名無しさん2006/12/14(木) 13:05:50
MDIタブの何を書こうかと迷ってたんだ?
0138デフォルトの名無しさん2006/12/16(土) 17:26:02
Button(OKやCancelや適用など)をDisableにしたいのですが、どの関数を使うのですか?
SetCheck()かと思ったのですが違うようでした。。
0139デフォルトの名無しさん2006/12/16(土) 17:46:32
>>138
基本クラスのメンバEnableWindowで
0140デフォルトの名無しさん2006/12/16(土) 18:12:46
なるほど…
やってみます。ありがとうございました。
0141デフォルトの名無しさん2006/12/17(日) 19:17:51
リストコントロール(CListCtrl)をリードオンリにするにはどうすれば良いですか?
0142デフォルトの名無しさん2006/12/17(日) 19:21:10
2つ目の質問です

ツリーリストコントロールって標準で存在しませんか?
存在しない場合はどうすれば使えますか?
MFCで作ったフリーソフトでツリーリストが使われていたので、
何らかの方法でできるのではないかと考えているのですが・・・

ちなみに、今の自分の技術力では自作は無理です
0143デフォルトの名無しさん2006/12/17(日) 19:25:35
3つ目の質問です

MDI子ウィンドウのビュー(フォームビュー)でリストコントロール(CListCtrl)を使っているのですが、
他の子ウィンドウがリスト部分の前に重なった後、リスト部分をクリックしてリストがある子ウィンドウを
アクティブにすると重なっていたリスト部分だけが再描画されません
原因はまったく不明です
どのようにすれば子ウィンドウがアクティブになった時に正常に再描画されるようにできますか?
0144デフォルトの名無しさん2006/12/17(日) 19:29:21
最後の質問です

MDI子ウィンドウのビューでリストコントロールを使っているのですが、
子ウィンドウのサイズ変更にあわせてリストのサイズを動的に変更するには
どのようにすれば良いですか?

VC#ではプロパティ画面で簡単に設定できたのですが、
VC++にはないのでとても困っています・・・





以上4つ質問させて頂きました
何かご存知の方は、ご回答をよろしくお願いしますm(_ _)m
0145デフォルトの名無しさん2006/12/17(日) 19:37:53
最後のやつの答えは
子ウィンドウのサイズ変更にあわせてリストのサイズを動的に変更する
0146デフォルトの名無しさん2006/12/17(日) 19:45:00
MDI野郎の質問は意味不明
0147デフォルトの名無しさん2006/12/17(日) 19:51:36
具体的にはOnSizeとかOnSizingとかOnExitSizeMoveとか用途に合わせて使うと吉。
0148デフォルトの名無しさん2006/12/17(日) 19:53:22
>>141
普通リードオンリーでできんじゃねぇっけ?
リソースファイルの方の設定に編集できるとかできないとかそういうプロパティあった希ガス。
0149デフォルトの名無しさん2006/12/17(日) 20:00:56
>>142
昔、俺がみたのは自力で描画してたのしかみたことないな。
今、どうなってるのかはよくわからん。
0150デフォルトの名無しさん2006/12/17(日) 21:27:01
>141-144
勉強してないの丸わかりなんだけど
よくリストコントロール表示できたね
どっかからソースぱくってきた?
0151デフォルトの名無しさん2006/12/17(日) 21:43:34
たしかにこうなんもかんもわからんようだとどうしようもないなw
0152デフォルトの名無しさん2006/12/18(月) 01:37:33
いつも質問しっぱなしで消えて行く人と文体がそっくりだな
0153デフォルトの名無しさん2006/12/18(月) 16:59:07
お願いします。MFCを使い大量の点を打って画像を描画するプログラムを作っています。
点の数は数千を越えていると思うのですが かなり処理に時間がかかります。

自分なりに色々調べたところ SetPixelは遅い ということがわかりました
同時に BitBlt とか 裏画面 などと 高速化に関するワードも出てきましたが
全く分かりませんでした
この言葉で全て解決しようとするのが悪いのですが 初心者です。
しかし、時間が本当に無いので時間をかけて勉強して… ができません。

ちなみに 点は一色です。 SetPixelの遅さを解決する方法で
まだ分かり易いだろう と思う方法を教えていただけませんか?
0154デフォルトの名無しさん2006/12/18(月) 17:15:42
かなり遅いって具体的に何秒?たった数千なら一瞬のはずだけど...
0155デフォルトの名無しさん2006/12/18(月) 17:27:01
えっ・・・ そうなんですか?
具体的にはループ回数が3万でそのうちの一部の点を
描画しているので、最大でも3万ですね
1万は越えているかも知れませんが…

時間は3分から5分程度でした。
0156デフォルトの名無しさん2006/12/18(月) 17:31:20
うちのPCは最新鋭からは程遠いセレロンだけど10万個の点をSetPixelで
描いても0.1秒ぐらいだったよ。(裏画面とか未使用)
描画以外の部分に時間かかってるんじゃないかな。
0157デフォルトの名無しさん2006/12/18(月) 17:35:59
配列に直接描画すればいいんじゃない?
0158デフォルトの名無しさん2006/12/18(月) 17:39:17
そうでしたか… スペック的には確実問題になるほどではありません。
ループ回数を増やすと比例関数的に時間も延びたので
てっきりそこが問題だと思っていました。

そうなるとどこに時間がかかっているのか全く分かりませんね…
ランダムウォークさせているのんですが そこか
1024*768もの配列を作って その中身全てを参照(検索)するという作業を
何度かしているのも原因かもしれませんね。
mallocなんかも全く使っていませんし…

ループ回数をこれ以上にするとエラーになり途中で動作が止まってしまうのも
同じ原因から来ているのかも…

しかし ここまでくるとここで相談させてもらう内容ではなくなってしまいますね。
0159デフォルトの名無しさん2006/12/18(月) 17:42:35
1024*768*30000=230億強
それは遅いだろ...
0160デフォルトの名無しさん2006/12/18(月) 17:57:38
>BitBlt とか 裏画面 などと 高速化に関するワードも出てきましたが全く分かりませんでした
>初心者です
>時間が本当に無いので時間をかけて勉強して… ができません。

結論: 無理
0161デフォルトの名無しさん2006/12/18(月) 17:57:46
最後に一回だけ描画すればいいのに
いちいちSetPixel使うからだよ。
0162デフォルトの名無しさん2006/12/18(月) 18:01:51
えっと 最後に一回だけ描画してます。

まぁ特に考えてたわけではなく、むしろ本当は描画の
様子が分かるように1回1回点を打ちたかったのですが
それができなくて 最後にだけ描画してます。
(点を打つ配列に目印をいれて最後にその部分だけ描画)

結論を言うと そのループ及び巨大な配列の中身を参照するのに
時間がかかってるというわけなんですね・・・

>>160 ってことでFAですかね。

検索の仕方や配列の使用法などを再考してみますね。
こんなくだ質に付き合ってくださってありがとうございました。
0163デフォルトの名無しさん2006/12/18(月) 18:13:41
SetPixelをループに入れてる時点で一回だけじゃないじゃん。
0164デフォルトの名無しさん2006/12/18(月) 18:17:04
GDIにじゃなくてメモリに対して書くようにすればいいんじゃないの?
0165デフォルトの名無しさん2006/12/18(月) 18:20:29
たった一色ならcharで1024*768の配列をnewして
0か1を直接書き込めばいいじゃない。

その後BMPに変換すれば?
0166デフォルトの名無しさん2006/12/18(月) 18:54:30
正直MFCと全然関係ない
■ このスレッドは過去ログ倉庫に格納されています