■MFC相談室 mfc19d.d ..
486:デフォルトの名無しさん
08/10/16 21:01:29
>>483-485
CWnd::GetCurrentMessage()を使って
WM_COMMANDの付加情報からコマンド発生元を取れました。
ありがとうございます。
487:デフォルトの名無しさん
08/10/17 17:54:12
CListCtrlレポート形式で
たくさん表示させると重いです
何か回避方法はありますか?
488:デフォルトの名無しさん
08/10/17 17:57:51
仮想リストビューとか
489:デフォルトの名無しさん
08/10/17 17:59:14
こういうやつね
仮想リストコントロール
URLリンク(msdn.microsoft.com)(VS.80).aspx
490:デフォルトの名無しさん
08/10/17 18:34:18
>>488-489
ありがとうございます。
心持ち軽くなったような気がするけどやっぱり重いです
これって
LVS_OWNERDATA で作成して
描画する文字列の部分を自分で割り当てるってことでいいんですよね。
仮想リストビュー
URLリンク(www.hokuriku.ne.jp)
ここも参考にしました。
やりかたまちがえてるのかな^^;
491:デフォルトの名無しさん
08/10/17 18:39:04
>>490
更新すべき場所だけ更新すればOK
普通のリストだと表示部分全てに更新がかかるから重いだけ。
492:デフォルトの名無しさん
08/10/17 23:49:31
ダイアログAに
ラジオボタン1
ラジオボタン2
が設置されていて、この二つのラジオボタンがグループで、
2を押したら1のチェックが外れるとします(逆もあり)。
今、2を押して、1のチェックが外れました。
ダイアログAのWindowProcにはラジオボタン1のコントロールIDで何かしらのメッセージが
飛んでくるのでしょうか?
ちなみに自分で試してみたところだとどうも飛んでこないようなのです。
ではラジオボタン1のチェックが外れた!というイベントをダイアログA上でキャッチすることはできないのでしょうか?
493:デフォルトの名無しさん
08/10/18 10:21:36
(コントロール変数).GetCheck(); で調べればよろし。
チェックのON/OFFを手動にすれば、チェックをつけなおす前に以前の状態を調べればチェックが外れたかどうか調べれる。
494:デフォルトの名無しさん
08/10/18 10:22:25
>>492
「ラジオボタン2が押された」→「ラジオボタン1のチェックが外れた」
でいいじゃん。
495:デフォルトの名無しさん
08/10/18 11:24:17
メッセージは飛んでるよ
WindowProc使った方法は知らん
496:デフォルトの名無しさん
08/10/18 13:10:47
>>493
>>494
説明が足りませんでしたが事情によりチェックが外れた瞬間のイベント駆動の処理が必要なんです
まだチェックオンの瞬間は、オンクリックで拾うことはできますが、
ラジオボタンの場合、他のボタンを押したときに勝手に外れるので、オンクリックでは拾えず
また、SetCheck関数などで変更されたときもオンクリックでは拾えませんし悩んでます。
クリックから、関数から、などの入力方法に関わらず、とにかく「チェックが切り替わったとき」の
イベントが欲しいのです…
例えばエディットボックスなら内容を変更されたときのイベントを取れるとおもうんですが、
考えてるのは「今変わった!」というのがわかる、そんなイメージです…
>>495
どういったメッセージか、もしわかればヒントだけでも教えてください><
できるだけ自分で調べるつもりですので
497:デフォルトの名無しさん
08/10/18 13:16:17
オンクリック→正確にはBN_CLICKEDです
498:デフォルトの名無しさん
08/10/18 17:36:14
>>496
URLリンク(msdn.microsoft.com)
499:デフォルトの名無しさん
08/10/18 18:11:09
>>496
>ラジオボタンの場合、他のボタンを押したときに勝手に外れるので
ラジオボタンのプロパティでそういう風に設定しているからだろ。
リソースでラジオボタンをダブルクリックしたときに作られる関数で、
SetCheckする前にチェックの状態が変わったかどうか自分で調べれば解決。
500:デフォルトの名無しさん
08/10/18 20:45:55
>>494と似た考え方だが
とりあえずそのグループのラジオボタンのイベントを一箇所で捕まえて
今回選択されたラジオボタンと前回で選択されたラジオボタンが異なっていたら、
「前回選択されたラジオボタンのチェックが外れた」
と考えればいいと思う。
なんとなく>>496はWindowProcとか言ってるからMFCじゃない気もするが、
MFCならON_COMMAND_RANGE使って10行も必要ないから
とりあえずダメ元で試してみたら?
501:名無し募集中。。。
08/10/18 23:14:23
話それるけどON_COMMAND_RANGEで扱うために
リソースIDを連続させるためにresource.hを編集しちゃう俺はヘタレですか?
502:デフォルトの名無しさん
08/10/19 03:21:49
いいんじゃない?
ID指定するとき、=つけて数値指定できるけど、面倒だもんね。
503:デフォルトの名無しさん
08/10/19 22:43:58
ON_COMMAND_EXを使えば、IDを引数にとるハンドラを作れるから、
リソースIDが飛び飛びでも一つのハンドラにまとめられるけど、
こっちはあまり使われないのかな。
504:デフォルトの名無しさん
08/10/21 11:17:02
MFCを使う標準DLLを作成すると
CWinAppを派生したアプリケーションクラスが用意されますが、
これはDLL内の単独のスレッドというわけではないのでしょうか?
OnIdle()をオーバーライドしてもコールされないのですが。
505:デフォルトの名無しさん
08/10/21 18:20:07
んー、そのままだと自分のメッセージループは使わないからな。
506:デフォルトの名無しさん
08/10/21 19:20:58
すみません。他で聞いても返事が無いのでここできかせてください。
VC6で本の通りにブラウザとかつくりました。VC6の生成するブラウザだから
いまどきのWebページは開けないだろうと思っていたんですが、普通にうまくひらけました。Flushとかもです。
これは、VC6とはいえ、ブラウザエンジン?はいまどきのPCの最新のを(要するにIE7のを)
作成してくれるのでしょうか?
よろしく教えてください。
507:506
08/10/21 19:34:59
元のスレを今見たら、今日の夕方に返答がきてました。
解決したので、>>506はスルーしてください。
508:デフォルトの名無しさん
08/10/23 02:18:54
SDIでグラフ描画するソフトを作ろうとしてるんですが
ViewのOnDrawで縦軸横軸を引いて
その上にグラフを描画する方法がわかりません。
どなたか、わかる人教えてください。
509:デフォルトの名無しさん
08/10/23 06:44:33
どこまでわかっててどこからわからないの?
510:デフォルトの名無しさん
08/10/23 15:16:36
VC6で、_MBCSを使い、日本語と英語のプログラムを作っています。
一つのEXEで問題なく、
日本語Win上では、日本語のダイアログ、
英語Win上では、追加した英語のダイアログが表示されたのですが、
現在選択しているリソースが日本語か英語か知りたいのですが、
プログラム実行時、
英語日本語のリソース切り替え選択はどの値を見て読み替えてるのでしょうか?
GetSystemDefaultLangID() 辺りは、コントロールパネルによって変化しているのは確認したのですが、
リソース読み替えとは関係ない様でした。
GetACP() , GetVersionEx()でも取得はできませんでした。
ご存知の方、ヒントだけでも御教授下さい。
よろしくお願いします。
511:デフォルトの名無しさん
08/10/23 15:32:35
GetSystemDefaultUILanguageとかGetUserDefaultUILanguageあたりかね?
でも自分でFindResourceExする必要はある気がする。
512:デフォルトの名無しさん
08/10/23 15:44:51
って動的に切り替えるのが目的じゃないのか
513:デフォルトの名無しさん
08/10/23 16:21:45
ありがとうございます。
GetSystemDefaultUILanguage
も調べていたのですが、これはVC7以降のAPIの様です。
多分ですが、
GetSystemDefaultLangIDと同様、コントロールパネルのロケールIDを返すのではないかと思います。
コントロールパネルからロケールIDは変更できるのですが、
実行時に使用されるリソースは変化ありませんでした。
現在の状態が知りたいだけですので、動的に読み替える必要は今のところありません。
どうしても・・・となれば、リソースに番号振って、プログラム中から判定するという方法もあるのですが、
Kernel32あたりで、どう判断しているのかが知れればと思った次第です。
514:デフォルトの名無しさん
08/10/23 16:26:19
winnls.h インクルードして使えないか?
515:デフォルトの名無しさん
08/10/23 16:29:43
そもそもAPIなのにVC7以降、とか関係ないでしょ。
インポートライブラリにもヘッダーにもないのなら作ればいいし。
516:513
08/10/23 18:13:02
>>515
karnel32.libに無いので、呼べないのかと思ってました。
karnel32.dll をLoadLibraryして呼び出すことができました。
結果、
・日本語Win
GetSystemDefaultUILanguage() = 1041
GetUserDefaultUILanguage() = 1041
・英語Win (XP-Pro SPなし)
GetSystemDefaultUILanguage() = 2011628553
GetUserDefaultUILanguage() = 1033
と、
コントロールパネルに影響されないGetSystemDefaultLangID()と同じ値が取得できました。
ただ、リソース読み替えに使われているのかは不明なのと、
英語Winで、GetSystemDefaultUILanguageが不思議な値を返してくるのですが、
とりあえずは目的を果たせそうです。
助かりました。ありがとうございました。
517:デフォルトの名無しさん
08/10/23 18:18:39
その不思議な値、16進で0x77E70409だね。
下16ビット、0x0409は10進で1033だから上と下で別々に意味もってるのかも。
518:デフォルトの名無しさん
08/10/23 19:16:01
GDI系のAPIの基本の話か?w
519:513
08/10/23 19:27:20
>>517
LANGIDFROMLCIDマクロを使ったところ、下位だけ抜けました。
言われるとおりのHEXで見るべきでした。
WINNT.H には、上位16bitは、Reserved、SortIDとコメントがありましたから、
Reservedは不明ですが、何か意味はありそうですね。
520:デフォルトの名無しさん
08/10/24 00:46:43
CMyDialog mydlg;
if ( dlg.doModal() ){
521:名無し募集中。。。
08/10/24 13:39:41
DoModal()じゃねぇのか?
返り値はIDOKじゃないのか?
そもそもmydlgじゃないdlgって何者?
522:デフォルトの名無しさん
08/10/28 16:49:40
CheckBoxの表示手法について教えて下さい。
通常はプロパティのCaptionで設定されている文字を表示させておいて
途中で文字の代わりにアイコンを表示させたいと思ってます。
最初からCheckBoxにアイコンを表示させる事はできてるのですが、途中で
テキストからアイコンへの変更ができません。
途中から変える事は無理なのでしょうか?
HINSTANCE hInst = AfxGetInstanceHandle();
HICON h_Icon1 = (HICON)LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),IMAGE_ICON,128,128,LR_DEFAULTCOLOR);
m_Check1.SetButtonStyle(m_Check1.GetButtonStyle() | BS_ICON);
m_Check1.SetIcon(h_Icon1);
523:デフォルトの名無しさん
08/10/28 17:48:42
ボタンスタイルは | でつなげても意味ないぞ。
m_Check1.SetButtonStyle(BS_ICON);
でもウィンドウサイズも変えないとアイコンの大きさにはならないかもな。
524:デフォルトの名無しさん
08/10/28 17:53:27
つーか、チェックボックスでかつアイコンというのが無いのか
525:デフォルトの名無しさん
08/10/28 19:36:32
ボタンみたいに動くものじゃないんだから
絵や文字と一体化してる必要ないし、
隣に自分で絵や文字書いても何の問題もない。
526:デフォルトの名無しさん
08/10/28 19:42:59
そんなにチェックボックスにアイコン使いたいなら擬似的に実現したクラス作ればいいじゃん
527:デフォルトの名無しさん
08/10/31 18:07:01
子ウィンドウとしてダイアログを利用しているのですが、
起動時、非表示にしたいのです。
CDialog dlg;
dlg.Create( IDD , this );
dlg.ShowWindow( SW_HIDE );
とやっているのですが、
一瞬表示されるのです。
OnInitdialogで
ShowWindow( SW_HIDE );
と記入しても。
回避できませんでした。
他に方法はありますか?
528:デフォルトの名無しさん
08/10/31 18:26:03
子ウィンドウってメインじゃないってこと?
ダイアログエディタでVisibleの初期値をfalseにしてもだめかな?
529:デフォルトの名無しさん
08/10/31 18:35:43
>>528
いけました
ありがとうございます><
530:デフォルトの名無しさん
08/11/01 19:08:11
MFC 9.0って、どこでダウンロードできますか?
531:デフォルトの名無しさん
08/11/01 19:48:43
できません。
standard以上を買ってください。
532:デフォルトの名無しさん
08/11/01 20:08:26
>>531
ありがとうございました。
しつこい質問で申し訳ないですが、今少し困っていることがあります。
当方
Visual C++ Express 2008
OS XP SP2
を使用していて、C++によってSQL Serverへの接続を試みています。
しかし、CDatabase db; のところで躓いてしまっています。
よく調べたところ、#include "afxdb.h" を使用する必要など
があるようで、更に調べたところ、MFCが関係していると知りました。
そこで、このスレの本質に従う質問をしたいと思います。
MFC9.0が使用できないことは分かりました。
MFCのシリーズで無料で(違法ではなく、公式な方法で)使用が可能な
方法はありませんか?
また、MFCがない場合
#include "afxdb.h" や CDatabase db;
などは、自分で1から記述しなければならないのでしょうか?
(初心者のため、バカなことかもしれませんが、ライブラリ
にはないため、自分で定義しなくてはならないのでしょうか?)
長文の上、稚拙な文になってしまいましたが、躓いてしまっている
ので、ご助力を加えて下されば幸いです。
よろしくお願いします。
533:デフォルトの名無しさん
08/11/01 20:25:42
CDatabaseを使用しないでDBにアクセスしなきゃなんないよ。
CDatabaseは C++ からODBCを介してSQL-Serverにアクセスするもので、
CDatabaseはMFCのクラスで、あなたは利用できないから、
ほかの手段を探すことになる。
ODBCの代わりにOLE-DBを使うこともできるし、
今からDBの勉強はじめるならこちらをお勧めする人が多いと思う。
"C++ OLE-DB SQL-SERVER アクセス"あたりのキーワードでぐぐればいいんじゃないかな。
というわけで、さようなら。
534:デフォルトの名無しさん
08/11/01 20:36:51
>>533
ご教授ありがとうございました。
貴重なお時間を割いていただき、申し訳ございませんでした。
535:デフォルトの名無しさん
08/11/02 02:30:04
質問しつれいします。
vc 2005
MFCを使ってGETやPOSTでデータを送信するプログラムを作成しようと思います。
勉強になるサイトなどありませんか?
検索のヒントでもいいので宜しくお願いしまっす
536:デフォルトの名無しさん
08/11/02 05:29:15
つWinInet
537:デフォルトの名無しさん
08/11/02 18:18:14
>>535
WebProg板
538:535
08/11/02 18:19:43
>>536
ありがとうございます
そのキーワードを頼りに自分なりに調べてやってみます
>>537
すいません板違いでしたかー
539:デフォルトの名無しさん
08/11/02 18:22:36
検索のヒントを提示しただけ。鼬害かどうかは白根。
540:デフォルトの名無しさん
08/11/02 19:04:18
MFCのクラスを使うんなら、使えそうなクラスぐらいすぐ見つかると思うが
MFCのクラスを使わずにやるんならスレ違い
541:デフォルトの名無しさん
08/11/02 19:16:10
>>540
いやぁMFCのクラスを使いたいのですが・・・
んー検討つかないんです
検索ワードだけでもヒントをぉぉぉぉぉ・・・orz
542:デフォルトの名無しさん
08/11/02 19:31:30
URLリンク(msdn.microsoft.com)
MFC ライブラリ リファレンス
インターネット クライアント アプリケーションの作成用の MFC クラス
更新 : 2007 年 11 月
MFC には、インターネット クライアント アプリケーションを作成するための以下のクラスとグローバル関数があります。
543:デフォルトの名無しさん
08/11/02 19:44:46
>>542
ありがとうございます!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
544:デフォルトの名無しさん
08/11/02 20:44:58
とりあえず、この辺一通り眺めといた方がいいかもね。
MFC > 階層図
URLリンク(msdn.microsoft.com)
545:デフォルトの名無しさん
08/11/03 02:18:47
>>544
本当にありがとうございます・・・
階層図・・・目から鱗です・・・
546:デフォルトの名無しさん
08/11/11 10:30:14
xp sp2 VS2005
CString GetString(void)
{
CString strTemp;
strTemp = "1234";
return strTemp;
}
void Main(void)
{
CString strHoge;
CString strValue;
strValue = GetString();
strHoge.Format("%08s", (LPCTSTR)strValue);
strValue = GetString();
strHoge.Format("%s%08s", (LPCTSTR)strHoge, (LPCTSTR)strValue);
// 以下略
}
という感じの処理をするとFormatで落ちてしまうのですが、
何故なのでしょうか?
あと CString でイメージ検索するとエr
547:デフォルトの名無しさん
08/11/11 10:51:26
>>546
CStringT::Format
--------
文字列オブジェクト自体をパラメータとして Format に渡すと、呼び出しは失敗します。たとえば、次のコードの結果は保証されません。
CAtlString str = "Some Data";
str.Format("%s%d", str, 123);
--------
548:デフォルトの名無しさん
08/11/11 11:08:54
>>547
その下に
----------
オプションの引数として文字列を渡すときは、LPCTSTR に明示的にキャストしてください。
書式は、printf 関数の書式引数と同じ機能を持っています。(書式や引数の説明は、
『ランタイム ライブラリ リファレンス』の「printf」を参照してください)。
書き込まれる文字列の終わりには NULL 文字が追加されます。
----------
とあったのですが、これはそもそも>>546の中でいう strValue のことであって、
自身を引数に指定するのはキャストしようが何しようがダメってことなんですよね?
549:デフォルトの名無しさん
08/11/11 11:36:26
>>548
URLリンク(msdn.microsoft.com)(VS.80).aspx
のほうには書いてないけど、
その説明は「キャストすれば自分自身を渡せるよ」ということでは無いと思う。
CStringTに書いてないということは昔はそういう制限でもあったのか、
それとも「CString::operator intなどを追加するかもしれないから、
LPCTSTRも明示的にキャストして渡しておけ」という意味じゃないだろうか。
550:デフォルトの名無しさん
08/11/11 12:52:46
const char*へのキャストは、operatorで内部のバッファ返してるだけ。
Format中に元のバッファが変わったら長さがかわるからバッファ足りなくなる。
551:デフォルトの名無しさん
08/11/11 14:19:28
>>547>>549>>550
なるほど、ありがとうございました。
ちなみに>>548の文は
URLリンク(msdn.microsoft.com)(VS.80).aspx
では無くなっちゃってるみたいですが、
VC6付属のMSDNに書かれていた文章です。
552:デフォルトの名無しさん
08/11/11 20:41:35
C#やった後にこれやると、
GUI画面作成、メッセージ処理、メモリ管理、例外処理とか泣けてくるな…
まあでも刺激はあるからいいか…
553:デフォルトの名無しさん
08/11/13 13:07:49
質問いいかな?
以下のようなプログラムでスレッド起動してスレッド終了を見ようとしているんだが、
WaitForSingleObject関数で毎回タイムアウト発生…理由分かる人いる?
void CMainClass::Start()
{
g_pThread = AfxBeginThread(Test, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
g_pThread->m_bAutoDelete = FALSE;
}
UINT Test(LPVOID pParam)
{
while(!g_Flg){ // ここで処理 //
}
return 0;
}
void CMainClass::Stop()
{
g_Flg = TRUE;
ULONG ret = WaitForSingleObject(g_pThread[0]->m_hThread, 10000);
delete g_pThread;
}
554:デフォルトの名無しさん
08/11/13 13:09:15
ULONG ret = WaitForSingleObject(g_pThread->m_hThread, 10000);
の間違い。配列はなしね。
なお「g_」をつけているのはグローバル変数
555:デフォルトの名無しさん
08/11/13 14:12:14
Test関数でちゃんと動いてる?
サスペンド中だったりしない?
556:デフォルトの名無しさん
08/11/13 14:38:07
>>555
いま調べているんだけど、タイムアウトの10000ms以内には
絶対に終わるはずなんだけどなー。
でもそれが疑わしいか…
回答してくれてありがとん。
557:デフォルトの名無しさん
08/11/13 14:46:42
とりあえず>>553のまんま動かしてみたけど、WAIT_OBJECT_0でした。
原因はそこ以外にある?
558:デフォルトの名無しさん
08/11/13 14:57:53
>>557
自分でもやってみたら確かに動いたんだよね。
Test()の処理部分に原因がありそうなのは間違いない。
(ここで10秒かかるってのは考えにくかったからここで質問させてもらったけど)
お騒がせさせてすまんかった。
>>557もありがとん
559:名無し募集中。。。
08/11/13 15:24:33
threadのreturn 0にブレイクポイントを置いてみるとか
560:デフォルトの名無しさん
08/11/13 16:11:23
>>553-554だが、新たな発見。
Test()の処理部分に処理回数をカウントアップして、
Editボックスに毎回その値を表示する処理として
SetWindowTextを使っているんだけど、
Stop関数をコールした後、どうもそこで固まるらしい。
(SetWindowTextをコメント化したら問題がでなくなった)
…意味分からん。なんで最後の1回のSetWindowTextで固まる!?
561:デフォルトの名無しさん
08/11/13 16:17:20
具体的には
ULONG num; //処理回数
CString str;
str.Format("%d", num);
EditBox->SetWindowText(str);
とこんな感じ。
もちろん、メインウィンドウのハンドルはもらってきて、
使っている(その部分は省略しているけど)
562:デフォルトの名無しさん
08/11/13 16:50:11
そりゃあそのSetWindowTextで呼んでるスレッドはもうWaitForしてるからだろ。
563:デフォルトの名無しさん
08/11/13 16:53:40
SetWindowTextはSendMessageを呼んでる。
メインスレッドのメッセージループでそれを受け取らない以上、SetWindowTextからは返ってこないよ。
564:デフォルトの名無しさん
08/11/13 17:00:11
あ、そういうことか!言われてみれば激しく納得w
>>562-563ありがとん
565:デフォルトの名無しさん
08/11/14 06:39:27
SDKを使わないでMFCアプリケーション作る方法を解説してるサイトはないでしょうか?
566:デフォルトの名無しさん
08/11/14 06:41:17
SDKじゃんくてIDEでした
567:デフォルトの名無しさん
08/11/14 08:09:46
リソースエディタとコマンドラインからコンパイラを動かすってことかな?
568:デフォルトの名無しさん
08/11/14 08:39:36
>>567
そうです。
ウィザードの吐き出すコードの解説と、リソースエディタの使い方が解説してあるサイトや本なんかが
あればいいなあ、と。
569:デフォルトの名無しさん
08/11/14 08:56:25
というかMFC詳しい人ってAFX*.Hに宣言されてるクラスを全部覚えてるのか・・・
ウィザードの吐き出すコードの前に、ここを熟読して出直してきます
570:デフォルトの名無しさん
08/11/14 23:08:06
>>569
覚えてないよ。ただ、よく使うクラスは限られるし、自分で使い勝手の
よいMFC派生クラスのライブラリを用意してあるので、それをプロジェ
クトに読み込んで使うことの方が多いな。
慣れてくると、ウィザードがどんなコードを吐き出すか判るので、既存の
テキトーなクラスの.cpp/.hをコピー&リネーム&文字列置換して、新しい
クラスの雛型にして、あとは全部手で書いている。
VC++ 6.0は、クラスウィザードがコード挿入位置を知るために使う特別な
書式のコメントがあるけど、これもクラスウィザードがコード生成したのと
同じように書いている。 その後、一度.clwファイルを消してからクラス
ウィザードを起動して.clwを再構築させれば、手で書いたクラスもちゃんと
クラスウィザードで認識させられる。
571:デフォルトの名無しさん
08/11/15 12:42:17
>>561
こういうの見るとSetDlgItemInt使えといいたくなる。
572:デフォルトの名無しさん
08/11/15 14:36:25
VS2008SP1のFeature Packで機能増えたけど、
新機能使うとレジストリでなくてiniファイルに保存・読み込みできないのだが(´ω`)・・トホー
573:デフォルトの名無しさん
08/11/15 15:56:10
>>571
素人さんですかw
574:デフォルトの名無しさん
08/11/15 17:45:43
>>573
玄人がSetDlgItemInt使わない理由とかあるの?
575:デフォルトの名無しさん
08/11/15 19:25:39
ダイアログを操作したいわけじゃないのに
ダイアログに委託しているところ
576:デフォルトの名無しさん
08/11/15 23:01:11
素人・玄人の話ではなくて、
今回の場合、ワーカースレッド側からだとSetDlgItemIntを使いようが無いってだけだな。
コントロール変数とかで持っていても、値をテキストとして設定したい時は、
地味に便利なメソッドだったりする。
577:デフォルトの名無しさん
08/11/16 01:34:50
また変なのがわいてきたな
ひっこんでろタコ
578:デフォルトの名無しさん
08/11/16 01:59:29
>>576
素人さんですかw
579:576
08/11/16 14:52:37
>>577 タコでさ〜せんwwww
>>578 素人さんですかの人、こんにちはだお
580:デフォルトの名無しさん
08/11/17 02:50:44
CWnd::SetWindowText()も、CWnd::SetDlgItemText()も、CWnd::SetDlg
ItemInt()も、単純にAPIのラッパだし、ワーカスレッドからでもなんら
問題なく呼べるだろ。
ダイアログのポインタが嫌なら、ハンドルとAPI直接呼び出し使え。
::SetDlgItemText(this->m_hWnd,IDC_EDIT1,...);
::SetDlgItemInt(this->m_hWnd,IDC_EDIT1,...);
581:デフォルトの名無しさん
08/11/17 22:09:37
MFCスレでAPI直接呼び出し薦める奴って何なの?
582:デフォルトの名無しさん
08/11/17 22:22:44
と言われても、割と普通の事だしなあ。
というか、おまいら今回の話はUIスレッドがスレッド終了待機に入った所為で、
UIスレッドへのSendMessageがデッドロックした、っていう事完全に忘れてるだろ。
583:デフォルトの名無しさん
08/11/18 00:00:19
というより、スレッドとか、ハンドルがクラスで継承されていかないところでは、
Win32APIを直接叩く以外無いよな。
脱線すまん
584:デフォルトの名無しさん
08/11/18 00:09:04
隠ぺいしている部分は出来るだけ利用するな
でもGDIだけはベタ書きしてしまう俺
それ自体をクラス化するんだけどな
585:デフォルトの名無しさん
08/11/18 21:59:29
>>583
MSDNにはHANDLE渡して該当するFromHandleを呼び出す、とあるから
オブジェクトは渡せないけどMFCで行けるんじゃない?
個人的にはしないけどね。
586:名無し募集中。。。
08/11/18 22:07:02
都合のいい時だけMFCを使うってスタンスなのでWin32APiは普通に呼ぶ
587:デフォルトの名無しさん
08/11/19 13:37:26
モーダレスダイアログでボタンを押すと
m_cdlg = new CDlg(this);
m_cdlg->ShowWindow(SW_SHOW);
みたいな感じで表示するとボタンを押せばいくつでもダイアログが出てしまいます。
1つしか出さないにはどうしたらいいでしょうか?
あと、親クラスの関数でモーダレスダイアログを扱うことはできますか?
XP+VC.netです。
588:デフォルトの名無しさん
08/11/19 13:53:44
>>587
その2行を通るたびに new で作ってんだから、そりゃいくつでも出るでしょう。
そのボタン貼ったウィンドウの初期化部分で一回だけ作って、
ボタン押したときに ShowWindow すればいいんじゃね?
>親クラスの関数でモーダレスダイアログを扱うことはできますか?
ちょっと意味が解らんかった。
589:デフォルトの名無しさん
08/11/19 14:10:21
delete thisをモーダレス内でしているので、親ウィンドウではモーダレスの終了を検知出来ないですよね?
モーダレスが終了した後なら、もう一度ボタンを押したときはモーダレスを表示したいのですが・・・。
モーダレス上のボタンを押したときに親ウィンドウの変数や関数をいじりたいのですが。
590:デフォルトの名無しさん
08/11/19 14:18:24
クラスメンバ
private:
CUnkoDlg m_dlg;
Initidialog
m_dlg.Create( CUnkoDlg::IDD , this )
OnButton
m_dlg.ShowWindow( SW_SHOW )
591:デフォルトの名無しさん
08/11/19 14:29:49
モーダレスではなくモードレスですよ。
592:デフォルトの名無しさん
08/11/19 14:30:44
モーダルに対してなのか、モーダレスと言う人は非常に多い
593:デフォルトの名無しさん
08/11/19 16:14:06
青信号に対してなのか、赤信号で渡る人は非常に多い
594:デフォルトの名無しさん
08/11/19 16:40:22
>>589
自分でWM_NOTIFYして親に通知して、実処理は通知先で
595:名無し募集中。。。
08/11/19 17:12:27
>>589
モードレスダイアログに親のthisを渡してpublicな操作をしてもらう事はたまにやる
終了時には 『m_cdlg = new CDlg(this); 』のm_cdlgもNULLにして終わらせる
たぶんあんまり行儀が良くないと思う
596:デフォルトの名無しさん
08/11/19 17:23:38
子ダイアログで親クラスのヘッダをincludeしてもいいならそれもアリだがそこでしか使えなくなる
俺もやったことあるけど
597:デフォルトの名無しさん
08/11/19 21:07:31
モードレスダイアログなら、
一旦Createした後は、ShowとHideしかしないという作り方もある。
で、ダイアログ自体はポインタでなくメンバ変数としてそのまま持っておく、と。
598:デフォルトの名無しさん
08/11/19 21:08:33
って >>590 そのものだった。すまそ。
599:デフォルトの名無しさん
08/11/19 21:37:13
シングルトンならそれでいいな
600:デフォルトの名無しさん
08/11/20 01:28:13
>>599
はぁ?何言ってんの?
601:デフォルトの名無しさん
08/11/20 01:32:38
>>586
アプリケーションフレームワーク使ってないの?
602:デフォルトの名無しさん
08/11/20 01:38:21
>>589
delete thisってどういう挙動になるのかな?
603:デフォルトの名無しさん
08/11/20 13:47:14
delete this; // ハラキリ
604:デフォルトの名無しさん
08/11/20 17:42:17
delete this; // さようなら
なら実際に見たことがある。
605:デフォルトの名無しさん
08/11/20 20:03:19
>>600
きもw
606:デフォルトの名無しさん
08/11/20 21:05:35
俺も >>599 が何を言ってるのか解らん。
親と子ダイアログ、どっちを指してるのかも不明だが、それが
シングルトンであるかどうかが今の話にどう関係してくるってんだ。
607:デフォルトの名無しさん
08/11/20 21:44:49
> モーダレス上のボタンを押したときに親ウィンドウの変数や関数をいじりたいのですが。
ライブラリ化などして、後々まで利用するなら、親ウィンドウなり、
オーナーウィンドウに対して、ユーザー定義メッセージを投げるのが、
一番汎用性があるのでは?
WPARAM,LPARAMで、操作したい内容(処理を特定するためのボタンのID等)
を渡す。 DWORD値2個で足りなければ、他のメッセージと同様に、構造体
やクラスオブジェクトのポインタを渡す。
処理は、ユーザー定義メッセージを貰う親ウィンドウなり、オーナーウィン
ドウ側にON_MESSAGE()のハンドラとして記述することになる。
608:デフォルトの名無しさん
08/11/20 22:08:54
>>595-596
いいかどうかは別にして、自分もやるし、何度もやったことある。
>>597-598
1回だけCreateして、Show/Hideで使い回す場合、2回目以降表示する際
には、モーダレスダイアログ側のOnInitDialog()が呼ばれないことを
ちゃんと理解していれば、それで問題ないと思う。
ダイアログが、親ウィンドウが持つパラメータや状態を表示したり、変更
する機能を持つ場合、同じ実体をリサイクルしてもいいけど、親ウィン
ドウ側にはダイアログのポインタをメンバに持たせて、表示時は、newした
後でダイアログのメンバ変数をセットしてCreateを呼び、非表示時は、
DestroyWindow()してdeleteしてしまうのが良いかと。
609:デフォルトの名無しさん
08/11/20 22:14:44
要約して書くと、こんなかんじ?
ON_BN_CLICKED(IDC_BUTTONxx,OnShowHideDlg)
CxxxxWnd::CxxxxWnd() { m_pDlg=NULL; }
CxxxxWnd::~CxxxxWnd() /* virtual */
{
if(m_pDlg) // 親が死ぬとき、子も道連れに死ぬ
{
m_pDlg->DestroyWindow(); // MFCならデストラクタで呼ばれるので省略可
delete m_pDlg;
m_pDlg=NULL; // どうせ死ぬので省略可
}
}
CxxxxWnd::OnShowHideDlg()
{
if(!m_pDlg) // 非表示→表示
{
m_pDlg=new CMyDlg;
m_pDlg->m_numParam1=1;
m_pDlg->m_strEditParam=_T("テスト");
m_pDlg->Create(this); // 表示時に毎回CMyDlg::OnInitDialog()が呼ばれる
m_pDlg->ShowWindow(SW_SHOW);
}
else // 表示→非表示
{
m_pDlg->DestroyWindow(); // MFCならデストラクタで呼ばれるので省略可
delete m_pDlg;
m_pDlg=NULL;
}
}
610:デフォルトの名無しさん
08/11/21 00:21:05
CWnd::ShowWindow()で表示切替したほうが動作が軽いよ
前回開いてた状態で再表示されたほうが使い勝手も良さそう
611:デフォルトの名無しさん
08/11/21 01:20:56
まぁ、それも用途次第じゃないか
中身初期化しないならそれがベストだろし
612:デフォルトの名無しさん
08/11/21 15:07:35
ダイアログベースのMFCアプリです。(VS2005)
親ダイアログにタブコントロールを付けて、タブに更に子ダイアログがくっついている形です。
ダイアログウィンドウでOnSizeが渡されるのが、OnInitDialogより後なのは仕様ですか?
CWnd::OnInitDialogが呼び出されるよりも前にOnSizeが来てしまうので、
サイズを一緒に調整したい子ウィンドウ全てに対してGetSafeHwnd()関数でチェックしてから
サイズを変更しているのですが、もうちょっと効率的な方法はないですか?
それと、なぜかウィンドウでエンターを押すとShowWindow(SW_HIDE)が渡されるのか、
子ダイアログは消えてしまうし、親ダイアログではアプリ自体が終了してしまいます。
何か対処法はありますか?
613:名無し募集中。。。
08/11/21 15:09:41
> なぜかウィンドウでエンターを押すと
OnOKに飛んでいる
614:デフォルトの名無しさん
08/11/21 15:25:15
>>613
OnOKって自分で呼ばなくても勝手に呼び出されちゃうんですか…
てっきりIDOKボタンを押した(又はDefault Buttonに設定した上でエンターした)時だけだと思っていました。
これは自分でOnOKを空の関数にオーバーライドして、CDialog::OnOK呼ばないようにせざるを得ないと言うことですか?
615:名無し募集中。。。
08/11/21 16:40:38
> OnOKって自分で呼ばなくても勝手に
その通り
ESCを押すとOnCancelが呼ばれるのも同じ仕組み
616:デフォルトの名無しさん
08/11/21 17:13:49
>>599
617:デフォルトの名無しさん
08/11/21 17:28:43
>>614
>>376
618:612
08/11/21 17:48:04
>>617
なるほど。よくわかりました。
っていうか、このスレのレスすらも確認しなくてスンマセン。
619:デフォルトの名無しさん
08/11/21 17:57:18
>>612
ダイアログ内に子ダイアログを置くのであれば、
子ダイアログの「Control」をTrueにしておいたほうがよいですよ。
子ダイアログだけ消えるということも無くなるはず。
620:デフォルトの名無しさん
08/11/21 19:12:31
612を見てなんでCPropertySheet&Pageを使わないのかと思ってしまったが言わない方がいいのか?
621:デフォルトの名無しさん
08/11/21 19:19:05
うん。言ったら恥かくよ。
622:デフォルトの名無しさん
08/11/21 19:19:28
と思ったらトップレベルウィンドウがダイアログなのか( ´ω`) ごめんよ
623:デフォルトの名無しさん
08/11/21 21:40:45
CodeGuruかどっかのサンプルを参考に、トップレベルのダイアログに、
>>620-622
位置決め用にスタティックコントロールを置いて、そのスタティック
コントロールに重ねて、動的にプロパティシート(CPropertySheet)を
貼り付けて、そのシートに、さらにCPropertyPageをAddPage()する
というコードを実際に書いたことあるけど?
624:デフォルトの名無しさん
08/11/21 21:50:21
>>612
> ダイアログウィンドウでOnSizeが渡されるのが、OnInitDialogより後
> なのは仕様ですか?
DoModal()を呼んだ場合、OnInitDialog()より前、OnCreate()の後に
OnSize()が呼ばれていると思うけど?
ダイアログリソースに貼り付けたコントロールではなくて、自分でコント
ロールを動的にCreate()しているのなら、コントロール作成より前には
呼ばれないでしょ。 そういうことではなくて?
625:デフォルトの名無しさん
08/11/21 22:37:42
>>624
あ、いや、ダイアログリソースで貼り付けて、DDXで関連づけたコントロールをOnSizeで調整しようとしているので、
DoDataExchangeで関連づけられる前にOnSizeが呼び出されるのが気にくわなかっただけでして…
(OnInitDialogはそれよりもあと)
あれ、UpdateDataを勝手に呼び出しちゃえば問題なかったですかね? もしかして。
626:デフォルトの名無しさん
08/11/22 03:20:48
今日からVC++を使い始めたCプログラマです。
IPAddressクラスからIPv4アドレスをDWORD値で取り出したいのですが
どうすればいいのでしょう?
CString hostName = Host;
String ^strHost = gcnew String(hostName);
IPHostEntry^ ipInfo = Dns::GetHostEntry(strHost);
IPAddress^ ipAddr;
for each (ipAddr in ipInfo->AddressList)
{
if (ipAddr->AddressFamily == System::Net::Sockets::AddressFamily::InterNetwork) break;
}
if (!ipAddr) /* この判定は超怪しい */
{
/* とれなければLoopBackに強制 */
dwSvAddr = 0x7F000001UL;
}
else
{
/* dwSvaddr = *(DWORD *)ipAddr->getAddressBytes(); みたいなキャストがしたい */
627:デフォルトの名無しさん
08/11/22 08:53:01
.NETスレで聞きなさい
たぶん.NETのデータ型をアンボクシングしてからキャストすればよさそうだが
628:624
08/11/22 09:32:53
>>625
やりたいことがイマイチわからんのですが?
DoDataExchange()内のDDX_Control()で関連付けせずに、OnInitDialog()
内で、SubclassDlgItem()で動的に関連付け(サブクラス化)することも
できますが、コントロールの初期サイズはリソースで指定したサイズに
なるので、特定コントロールのみ例外扱い(リソース指定と異なるサイズ
にしたい)場合、そのコードはどこかに書く必要があると思います。
そもそも、OnSize()って、ダイアログのスタイルを「ダイアログ枠」で
なくて「サイズ変更枠」にすると、ダイアログをドラッグしてサイズ変更
したら、表示中はいつでも何回でも呼ばれる可能性がありますよ?
codeguru.comあたりの「CResizeDialog」を参考にしては?
629:デフォルトの名無しさん
08/11/22 19:11:26
みんなMFCでアプリケーションハンガリアン使うとき、どんな感じにしてるの?
630:デフォルトの名無しさん
08/11/22 22:24:08
>>628
DoDataExchangeよりも先にOnSizeが先に呼ばれてしまうから、
if (2回目以降のOnSizeだったら) {
コントロールのサイズ変更;
}
のような判定が必要になるのが気にくわないということでは?
631:デフォルトの名無しさん
08/11/23 03:30:09
>>630
本筋とそれる話で申し訳ない。
"2回目以降"でなくて、コントロールのhWndがIsWindow通るとかでいいんじゃね?
632:デフォルトの名無しさん
08/11/23 07:07:43
まぁOnSizeはwin32のWM_SIZEのままで、ddxはmfcの後付なんだからしょうがない
633:624
08/11/23 11:35:19
>>630
> DoDataExchangeよりも先にOnSizeが先に呼ばれてしまうから、
DoDataExchangeとの順番は関係なく、最小化のタイミング等でもWM_SIZEは
飛んでくるから、何らかの判定は必要だと思うけど?
codeguru.comの「CResizeDialog」だと、ダイアログにCRect型のメンバ変数
を追加して、コンストラクタでCRect::Empyt()しといて、一発目のOnSize
で、CRect::IsRectEmpty()がTRUEなら、現在のダイアログサイズを変数に
取り込み、FALSEなら、直前のOnSize()時に取り込んだダイアログサイズと、
新しいサイズの差を計算して、子コントロールのダイアログ内での移動や、
サイズ変更をやっていたかと。
OnCreate()⇔OnDestroy()のように、明らかに逆で呼ばれることはないメッ
セージを除いて、安易にフレームワークが呼び出す順番に依存するような
造りにはしない方がいいのでは?
アイコンやビットマップを貼り付けるスタティックコントロールとか、貼り
付けたイメージのサイズに合わせて、コントロールのみ単独でOnSize()が
呼び出されることもあるし。
634:デフォルトの名無しさん
08/11/23 12:28:51
>>633
なんかかみ合ってないような。
一発目のOnSizeではDDXメンバがまだ設定されていないということですよ?
そのCResizeDialogというのは、派生用のダイアログクラスなんだろうから、
内部で子コントロールのDDXメンバを持ってるわけではないでしょう?
昔のソースを掘り返してみたら、
if (IsWindow(m_buttonOK)) {
m_buttonOK.MoveWindow(〜);
}
と自分もIsWindowを使っていた。
635:624
08/11/23 12:36:46
>>634
636:624
08/11/23 12:41:26
間違ってENTER押してもうた。(w
>>634
> なんかかみ合ってないような。
そもそも、なんでサイズ変更に際して、DDX_Control()での関連付けが
必要なのか全く説明がないし、自分が設計するとしても、その必要性を
まったく感じないんですが?
637:デフォルトの名無しさん
08/11/23 20:05:24
IsWindowか 俺はGetSafeHwnd派だ( ´ω`)
638:デフォルトの名無しさん
08/11/23 20:27:16
::IsWindow()とCWnd::GetSafeHwnd()なら普通は後者を使うでしょ?
639:デフォルトの名無しさん
08/11/23 20:37:32
HWNDキャスト派は異端ですか?
640:デフォルトの名無しさん
08/11/23 21:27:30
それもCWndメンバだからいいんじゃね?
グローバルスコープなのを呼び出すなって話だろ
641:デフォルトの名無しさん
08/11/23 23:00:14
CWnd::GetSafeHwnd()って、m_hWndを返すだけであって、
そのウィンドウが存在しているかどうかはわからないのでは?
642:デフォルトの名無しさん
08/11/23 23:02:48
Create()が正常終了してないとm_hWndはNULL
CWndの実体ができる時点でウィンドウが作られてるわけじゃないぞ
643:デフォルトの名無しさん
08/11/23 23:12:18
>>642
それはどこかで明記されてたっけ?
初期化していないポインタのようにゴミが入っている可能性は常に無い?
あとそれが大丈夫だとしても、>>634のようにDDXメンバの実体に対するものには
GetSafeHwnd()ではなくm_hWndで十分だと思うけど。
644:デフォルトの名無しさん
08/11/24 00:54:26
SDKで組んだこと無いのかよ
645:デフォルトの名無しさん
08/11/24 01:32:23
m_hWndの指すウィンドウが存在しないとか言い出したら、
そのハンドルが、実は他プロセスのウィンドウを指してしまっている状態すら、
考慮しないといけなくなるんじゃないか?
646:名無し募集中。。。
08/11/24 02:08:50
俺はm_hWnd派だったんだけどGetSafeHwnd()の方が安全そうだから乗り換えるわ
でも、たぶんどっちでも良くて気分の問題
647:デフォルトの名無しさん
08/11/24 07:43:46
>>643
> それはどこかで明記されてたっけ?
> 初期化していないポインタのようにゴミが入っている可能性は常に無い?
挙動はMFCのソース見れば判るだろ。 というより、C++やクラスの本質
を理解しているのかと?
その理屈なら、CFileクラスのm_hFileメンバ変数や、CGdiObjectクラス
(CPen,CBrush等の基底クラス)のm_hObjectメンバ変数の値も信用できん
とな?(w
> あとそれが大丈夫だとしても...
『大丈夫だとしても』ぢゃなく『大丈夫でなければ』、どんな場面であって
も(m_hWndの値を返す)GetSafeHwnd()も、m_hWndの直接参照も使えない。
648:デフォルトの名無しさん
08/11/24 07:44:54
>>646
> たぶんどっちでも良くて気分の問題
んなことぁない。
直接参照する場合、thisポインタのチェックが入らないのに対して、Get
SafeHwnd()は、(CWndを指す)thisポインタが有効かどうかチェックした後
でthisポインタがNULLの時m_hWndの値を参照せずNULLを返し、thisポインタ
が有効な時のみメンバ変数m_hWndの値を返す。
クラスメンバとして実体が存在するオブジェクトに対して使う場合は、
>>643 氏の言うとおり。
問題はGetParent()などのようにCWndのポインタとしてNULLを返す可能性が
ある場合、戻り値をチェックせず、m_hWndを直接参照すると「0xXXXXXXXXが
無効なポインタを参照うんぬん」というエラーで落ちることになる。
自前のコードでチェックしてm_hWndを参照してもいいけど、どうせなら
そういう場合はGetSafeHwnd()を使った方がスマート。
同様に、CGdiObject::m_hObjectも、CGdiObject::GetSafeHandle()を
使った方がいい。
649:デフォルトの名無しさん
08/11/24 10:56:07
CWndの関数はm_hWndに対してそのままAPIを呼ぶようなものが多いから、
自分もNULLチェックではなくAPIのIsWindowに渡してチェックすることが多いな。
650:デフォルトの名無しさん
08/11/24 11:41:00
もしかして、冷蔵庫内のランプが消えたかどうか、冷蔵庫のドアを何回も
開け閉めして確認しちゃう人?
IsWindow()呼んで戻り値をチェックした後で、APIを呼び出すまでの間に
ウィンドウが消滅しているかもしれないという心配はしないの?(w
651:デフォルトの名無しさん
08/11/24 13:18:36
お取り込み中すみませんが、質問です。
ドキュメントビューアーキテクチャのSDIプログラムを作っているのですが、
メニューのハンドラってxxxDocment.cppに作成するのが良いのでしょうか?
あと、設定データとかファイル入出力のデータの実態もxxxDocment.cppに
作成した方がよいのでしょうか?
652:デフォルトの名無しさん
08/11/24 14:40:44
>>650
それは別問題では?
IsWindow()でチェックしようがm_hWnd!=NULLでチェックしようが、
その後APIを呼び出すまでの間にウィンドウが消滅しているかもしれないのは同じ。
>>651
「表示倍率を拡大」なんていうコマンドならビューやアプリケーションだろうし、
コマンドの内容に依りますよ。
653:デフォルトの名無しさん
08/11/24 16:47:20
質問です、ダイアログのタイトルとかを表示している部分の
高さなどを知る方法ってあるのでしょうか?
┌───────┐
│たいとる .│←この高さが知りたい
├───────┤
654:デフォルトの名無しさん
08/11/24 16:52:38
>>653
::GetSystemMetrics(SM_CYCAPTION);
でいけると思うが、未確認。
655:デフォルトの名無しさん
08/11/24 17:25:35
既存ソフトのバージョンアップ開発で、そういうの生値でやっててキレそうになったことあるわ
上にもあるようにGetSystemMetrics()でOK
というか、GetSystemMetrics()からとれるやつは全部こっからとらないと、ちょっとしたWindowsのデザイン設定の違いでカオスになるからな
656:名無し募集中。。。
08/11/24 17:57:06
>>651
データにまつわる事ならDoc
見せ方(表示)にまつわる事ならView
アプリ全体(データ全体)にまつわる事ならMainFrame
657:デフォルトの名無しさん
08/11/25 03:57:20
本当にMainFrameなの?
658:デフォルトの名無しさん
08/11/25 09:02:09
自分は、アプリケーション全体や、全てのドキュメントに共通の設定は、
CWinApp派生クラスのメンバに登録しているなぁ。 一応、データ本体は、
protectedで、設定をGet/Setするヘルパ関数を用意している。
あと、メッセージハンドラはともかく、ドキュメントの表示方法(例えば
色やスタイルなどの見せ方)に関する設定値は、ViewではなくDocクラスに
持たせているなぁ。
これらの一部をViewに持たせると、ファイルに保存する際にViewクラスに
アクセスしなければならないし、Viewが生成されてドキュメントに関連
付けされる前に、ファイルから初期値を読み込む時等に実装に困る。
CListViewクラスのLVS_REPORT等、ウィンドウが存在する時は、実質的に
Viewもウィンドウ属性という形でそうしたデータを持っているけど、最初
にCreate()する際に、どの初期値でスタイルを指定するという場合に困る。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4358日前に更新/186 KB
担当:undef