■MFC相談室 mfc18d.dll■

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2008/03/26(水) 23:35:50
40℃のお湯と60℃のお湯を同じ量混ぜたら
50℃になるかというと実はならないらしいね
953デフォルトの名無しさん:2008/03/26(水) 23:43:22
まあほぼ50℃にはなるよ。
混合熱とかで微妙に誤差が生じるとは思うが。
954デフォルトの名無しさん:2008/03/26(水) 23:46:10
「同じ量」の定義によるのかな。
同じ体積なら60℃の方が僅かに軽いからね。
955デフォルトの名無しさん:2008/03/27(木) 02:07:52
同じ質量
956デフォルトの名無しさん:2008/03/27(木) 15:13:08
VS2005
CListCtrlの複数削除をやろうとしていますがうまくいきません。

以下のように選択されたアイテムのインデックスを取って削除というループをしています。

POSITION pos = this->m_xcLst.GetFirstSelectedItemPosition();
while(pos != NULL)
{
    index = this->m_xcLst.GetNextSelectedItem(pos);
    index -= nDel;
    this->m_xcLst.DeleteItem(index); // アイテム削除
    nDel++;
}

しかし、3つ以上のアイテムを選択していると最後の選択アイテムのインデックスが正しく取れず他のアイテムを削除してしまったりします。
例えば、0〜6のアイテムがあったとして、"1,3,5"を選択していると"1,3,4"と返ってきてしまう。

DeleteItem()が悪いかと思い外してみると、
選択したアイテムのインデックスが正しく返ってくるのを確認しました。
(さっきの例だと"1,3,5"と返ってくる。)

インデックスを配列に取得して後ろから削除する方法も考えたのですがいまいちです。
良い解決策はありませんでしょうか。
よろしくお願いします
957デフォルトの名無しさん:2008/03/27(木) 19:06:27
単純に後ろから削除でいいだろ
958デフォルトの名無しさん:2008/03/27(木) 21:33:50
>>956
nDelの変数の意味が分からん
959デフォルトの名無しさん:2008/03/27(木) 21:53:27
やりかた忘れたけど検索したらすぐ見つかった
960デフォルトの名無しさん:2008/03/28(金) 10:12:18
>>957
>>956です
m_xcLst.GetNextItem(index, LVNI_ABOVE | LVNI_SELECTED);

として、下から選択アイテムを検索していくことで実現できました
アドバイスありがとうございました
961デフォルトの名無しさん:2008/03/28(金) 18:33:58
>>960
>>956から
    index -= nDel;
を消すだけなのに。
962デフォルトの名無しさん:2008/03/29(土) 10:43:50
>>961
ちゃんと確認した?

それだとうまくいかないよ。VC.net 2003
963デフォルトの名無しさん:2008/03/31(月) 02:04:18
VS2005でエディットコントロールを作り、
他のボタンやエディット等のコントロールの上を通った時に説明する機能を作ろうと思っています。
OnNcHitTestを各ボタンごとに設定しれやれば良いかと思ったのですが、
ボタンから作るイベントハンドラにWM_NCHITTESTが有りません。
過去にClassWizardのメッセージフィルタをウィンドウにする、という解決法が
提示されているのは見つけたのですが、
VS2005ではクラスウィザードではなくイベントハンドラウィザードで
イベントハンドラを追加しており、そこにはメッセージフィルタといった
機能は存在しないので困っています。 
VS2005でも同等のイベントハンドラの追加ができないでしょうか?
964デフォルトの名無しさん:2008/03/31(月) 02:33:35
>>963
WM_NCHITTESTはダイアログのいべんとにあんじゃね? エディットでなくてさ。
VC6(クラスウィザード)でもダイアログのイベントだし、な。
965デフォルトの名無しさん:2008/03/31(月) 08:59:56
ウィザード使い方わからなかったら自力で追加することも可能
966デフォルトの名無しさん:2008/03/31(月) 18:37:11
ツリーって特定のアイテムの入れ替えは出来ないのでしょうか?
データ自体をListCtrlなど別に格納しておいて、ツリーの全消去→再構築でも出来ないことはないですがあまり好ましくないですし・・・
967デフォルトの名無しさん:2008/03/31(月) 21:44:47
>>965
なるほど、リストコントロールのWM_NOTIFYのイベントプロシージャが
ウィザードでは1つのリストコントロールにしか割り振れないが(ClassWizardのバグ?)、
それをやれば複数のリストコントロールのWM_NOTIFYのイベントプロシージャを作成出来ると言うわけだな。
968963:2008/03/31(月) 21:47:56
確かにダイアログ側のイベントにWM_NCHITTESTは有るようです、ありがとうございます。

しかしCPointが与えられるだけなので、どのボタンの上をマウスが通過した、等の情報は得られないのですね…
Spy++だとボタン上にマウスがヒットしたイベントを取れているので、できないかと思ったんですが、他の方法を探すしか無いんでしょうか。
座標テーブルを作ってマウス座標に対応したメッセージを表示する…というのも(本質的には違う問題になってしまいますが)できなくはないですね。
969デフォルトの名無しさん:2008/03/31(月) 23:02:15
だからボタンから作るイベントハンドラにWM_NCHITTESTでいいんだろ
970デフォルトの名無しさん:2008/04/01(火) 08:32:18
>>966
InsertItemとDeleteItemで普通にできない?
子があるとちょっと面倒かも。(自信なし)
971デフォルトの名無しさん:2008/04/01(火) 19:01:51
VC8でダイアログにフレーム間の時間(_秒)をリアルタイムで表示するプログラムを組んでいます。
負荷を増していけば整数値で1〜60になると思ったのですが飛び飛びになります。
具体的には0、15か16、31か32、45か46、61か62と言った具合です。
1FPSでも1000msになって欲しいのですが1015msになりました。
この15ms刻みの値の意味は何なのですか?

以下のようなプログラムです(別スレッド)
DWORD BefoeTime = timeGetTime();
while(1){
 DWORD dw = timeGetTime();
 while( BefoeTime+16 >= dw )
  dw = timeGetTime();
 DWORD output = dw - BefoeTime;
 ダイアログのテキストボックスにoutputを表示
}
これだと16msと31msのどちらかが表示されて平均値が約25msになりました。
972デフォルトの名無しさん:2008/04/01(火) 19:14:12
誤爆?
MFCと何の関係が?
973デフォルトの名無しさん:2008/04/01(火) 19:22:28
>>972
あれ、CDialogとかCWndとかをつかっているのでMFCかと思っていたのですが違うのですか?
FPSの固定の方法はCと同じなので違うとすればMFCと思いまして。
974966:2008/04/01(火) 20:11:02
>>970
レスありがとうございます。
確かに少々処理が面倒でしたが無事に導入できました。
ソートがあるんだからアイテム同士の並び替えもデフォルトで実装されていればよかったのになぁ

>>971
リフレッシュレートに合わせているようにも見えますね。
そのプログラムだと16ms/fだけどDialogBoxの更新で同期が取られて31(30?)ms/fの段階で更新しているのではないでしょうか
975デフォルトの名無しさん:2008/04/01(火) 20:20:23
CDialogやCWndはMFCだが971にはMFCに関するものが出てきてないからだよ。

ちょっとよく分からないのだけど、971のコードの出力結果が1,2,・・・16に
なるのを期待してるの?
976975:2008/04/01(火) 20:23:07
ごめん。975は勘違いだ。もう少し考える。
977デフォルトの名無しさん:2008/04/01(火) 21:46:39
>>975
DirectX VC++.net(VS2005)の組み合わせで問題無いから恐らくMFCの仕様
DirectXには垂直同期を切る方法があるがMFCではどうなんだろ
974の通りウィンドウの描画で強制的に同期が行われるのであれば表示更新用スレッドをもう1つ立てることで解決しないかね
978デフォルトの名無しさん:2008/04/01(火) 22:01:50
NT系のQuantumじゃね?15msといえば。
979デフォルトの名無しさん:2008/04/01(火) 22:44:24
質問
MFCでウィンドウのタイトルの部分をダブルクリックしたら最大化するのをやめさせるのはどうやればいいのでしょうか?
980デフォルトの名無しさん:2008/04/01(火) 22:45:17
変数の命名規則を教えてください。
例えば
CRect myRect;
だったら最初小文字で単語と単語のつながりの直後の頭文字を大文字にするって感じであってます?

コントロール変数、DDX変数は
m_〜
m_ddx_〜
ってやってて統一できてます。
981デフォルトの名無しさん:2008/04/01(火) 22:49:06
個人の命名規則なんて個人の好きにすればいいさ。
982デフォルトの名無しさん:2008/04/01(火) 22:59:07
>979
それMFCがやってるわけじゃないだろ
983デフォルトの名無しさん:2008/04/01(火) 23:14:38
VCで一般的な命名規則ってないの?
984デフォルトの名無しさん:2008/04/01(火) 23:18:48
>>983,980です
自分なりに決めます
スレ汚しすみませんです・・・
985デフォルトの名無しさん:2008/04/01(火) 23:20:35
CRect rect;
これが一般的
986デフォルトの名無しさん:2008/04/02(水) 04:32:24
LPCTSTR lpszStr;
987デフォルトの名無しさん:2008/04/02(水) 07:56:45
Long Pointer to Constant Tchar STRing
988デフォルトの名無しさん:2008/04/02(水) 08:28:37
型なんて変数名に反映するのは無意味
グローバルか?メンバか?ローカルか?スタティックか?引数か?
ってわかるようにしたほうがいいと思う
989デフォルトの名無しさん:2008/04/02(水) 14:27:55
元々のハンガリー記法も、型ではなく意味を変数名に付与するものだった。
なぜか型を付与するようにねじ曲げられたが。
990デフォルトの名無しさん:2008/04/02(水) 16:01:03
秒速20kmで飛んでるロケットと逆方向に秒速30kmで飛んでるロケットをみると
正確には秒速50kmにはならないらしい
991デフォルトの名無しさん:2008/04/02(水) 18:32:57
>>990
見ている人が動いていなければ秒速0kmだしね。
992デフォルトの名無しさん:2008/04/02(水) 20:43:09
質問です。
ダイアログの上にタブコントロールとリストコントロールを重ねるような形で置いています。
リストコントロールにフォーカスがある状態で他のウインドウが重なるとリストコントロールが消えるのですが
回避方法などありますでしょうか?
タブオーダーはリストコントロールの方が後です。フォーカスがない状態ではちゃんと表示されます。
Win2000, VC++.NET(VS2002)
993デフォルトの名無しさん:2008/04/02(水) 22:44:03
>>992
今実行環境が無いので憶測ですまんが、リストコントロールのParentをタブにすれば出来ないかな。
Z値が同じであれば恐らく親(タブ)が奥で子(リスト)が手前に表示されると思う。
994デフォルトの名無しさん:2008/04/03(木) 01:23:38
見た目しか効用の無いタブコントロール使うぐらいなら
ダイアログやビューへの埋め込みプロパティシート&複数プロパティページのほうがリソース管理的にもおすすめ
親→シート→ページの関係も自動でできるしね
995デフォルトの名無しさん:2008/04/03(木) 09:07:58
>>992
当方VS2005
タブ上のダイアログにリストコントロールを置いてるとき同様の現象が起きた
リストコントロールのプロパティでTransparentをTrueにしたら直った
996デフォルトの名無しさん:2008/04/03(木) 21:04:15
CWnd::SetWindowText("1000ゲット!");
997992:2008/04/03(木) 21:16:06
>>993
>>994
レスサンクス。
SetWindowPosでwndTopに設定したらなんとか回避できました。

>>995
Transparent=Trueを試したら、こちらでもOKでした。
リソースレベルで回避できるならこちらの方がいいのかな。
その後、トラブルとかないですか?
998デフォルトの名無しさん:2008/04/03(木) 21:45:48
馬鹿すぎ
999デフォルトの名無しさん:2008/04/03(木) 22:36:10
二月(花札)
1000デフォルトの名無しさん:2008/04/03(木) 22:41:20
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。