トップページ⇒tech
987コメント301KB

■ MFC相談室 MFC12.dll■

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/

関連リンクは >>2-10 の辺り。
0153デフォルトの名無しさんNGNG
>>152
おまえら邪魔。
0154146NGNG
あの〜僕の質問はどうなったの?
0155デフォルトの名無しさんNGNG
>>154
ShowWindow(SW_HIDE);
0156146NGNG
>>155
思いつきいうのやめてくれませんか?試しました?
それだとウィンドウを最小化して最大化しないと消せません。
Invalidate()
なども試したけどNGでした。
0157デフォルトの名無しさんNGNG
Recalcなんちゃらとか言うの呼ぶんじゃねぇの?
0158デフォルトの名無しさんNGNG
>>156
なんでいちいちお前のために試さなきゃいけないんだ。
また思いつきでレスしてやるけど、
CFrameWnd::RecalcLayout()を試せ。
0159146NGNG
>>158
へぇ、ばかかとおもってたらやるじゃんw
0160デフォルトの名無しさんNGNG
>>159
あなたはこちらのスレの方がふさわしいですね。
http://pc5.2ch.net/test/read.cgi/tech/1097880265/
0161デフォルトの名無しさんNGNG
>>160
とっちにそっちでも暴れてますよ
0162デフォルトの名無しさんNGNG
あちきのことかしらん?
0163デフォルトの名無しさんNGNG
ツールバー、ステータスバーと同じやりかたで
表示/非表示きりかえできるぞ

0164デフォルトの名無しさんNGNG
eVcなのですが、専門のスレッドが無かったようなので
こちらに投稿させて頂きました。スレ違いだったらすいません。

開発環境:Windows2000 SP4 + eVc 3.0 + HPC-2000 SDK
端末:X86CPU互換 WindowsCE 3.0

ある文字列(SendStr)を、今現在開いているブラウザ(Internet Explorer固定)で
フォーカスの当たっているインプットボックスへ挿入する機能を実現しようとしています。
以下のようなコードを書きました(一部)。

BOOL CDlg::SendBrowser(CString SendStr)
{
CWnd* BrowseWnd;
int i;

if(SendStr.IsEmpty())
return FALSE;

BrowseWnd = FindWindow(NULL, TEXT("Yahoo! JAPAN - Microsoft Internet Explorer"));
if(BrowseWnd == NULL)
{
return FALSE;
}
BrowseWnd->SetForegroundWindow();
for(i = 0; i < SendStr.GetLength(); i++)
{
SendKey(BrowseWnd, SendStr.GetAt(i));
}
return TRUE;
}
0165デフォルトの名無しさんNGNG
int CDlg::SendKey(CWnd* ActWnd, TCHAR CharCode)
{
int vk;

vk = GetVirtualKeyCode(CharCode);

ActWnd->SendMessage(WM_KEYDOWN, vk, (long)m_Scan[0]);
ActWnd->SendMessage(WM_CHAR, CharCode, (long)m_Scan[0]);
ActWnd->SendMessage(WM_KEYUP, vk, (long)m_Scan[1]);

return 0;
}

int CDlg::GetVirtualKeyCode(TCHAR x)
{
if(x >= 'a' && x <= 'z')
x -= ('a' - 'A');
return((int)x);
}

正しく実行されれば、SendStrの内容の文字列が、
Yahoo!JAPANトップページの検索テキストボックスに挿入される筈です。

実行すると、CDlg::SendBrowserからCDlg::SendKey、CDlg::GetVirtualKeyCodeを
それぞれトレースするのですが、肝心のフォーカスが当たっているインプットボックスに
文字列がインサートされません。
WM_KEYDOWNとWM_CHAR、WM_KEYUPにより擬似的にそのキーを入力するように
しているのですが…。

現在フォーカスの当たっている部分の指定方法が違うのでしょうか?
0166デフォルトの名無しさんNGNG
SendInput使ってみたら?
0167デフォルトの名無しさんNGNG
AfxBeginThreadで開始したスレッドの終了はどのようにして
知ることができますか?
0168165NGNG
>>166さん、ありがとうございます。

BOOL CDlg::SendBrowser(CString SendStr)
{
CWnd* BrowseWnd;
int i;
if(SendStr.IsEmpty())
return FALSE;
BrowseWnd = FindWindow(NULL, TEXT("Yahoo! JAPAN - Microsoft Internet Explorer"));
if(BrowseWnd == NULL){
return FALSE;
}
BrowseWnd->SetForegroundWindow();
INPUT srINP[3];
srINP[0].type = INPUT_KEYBOARD;
srINP[0].ki.wVk = '0';
srINP[0].ki.dwFlags = 0;
srINP[1].type = INPUT_KEYBOARD;
srINP[1].ki.wVk = '1';
srINP[1].ki.dwFlags = 0;
srINP[2].type = INPUT_KEYBOARD;
srINP[2].ki.wVk = '2';
srINP[2].ki.dwFlags = 0;
for(i = 0; i < 3; i++){
SendInput(3, &srINP[i], sizeof(srINP));
}
return TRUE;
}

上のように書いてみましたが、SendInputでも送信されないようです。
クリップボードか何かを使い、インプットボックスに文字列の値が
一括して挿入できれば最良なのですが…。
0169デフォルトの名無しさんNGNG
>>167
CREATE_SUSPENDEDでAfxBeginThread
CWinThread::m_bAutoDeleteをFALSEに
CWinThread::m_hThreadがシグナル状態になるまでWaitForSingleObjectで待つ
スレッドオブジェクトをdeleteする
0170デフォルトの名無しさんNGNG
>>169
謝謝
0171165NGNG
>>166さん
SendInputを利用して書き換えました。

  INPUT srINP[16];
  for(i = 0; i < 16; i++){
    srINP[i].type = INPUT_KEYBOARD;
    srINP[i].ki.wVk = WORD(SendStr.GetAt(i));
    srINP[i].ki.dwFlags = 0;
    srINP[i].ki.time = 0;
    SendInput(1, &srINP[i], sizeof(srINP));
  }

このようにして、CString型のSendStrに格納された文字列を
一文字ずつSendInputにて出力するように記述したところ、成功しました。

…成功したのですが、1回目と2回目ではなぜか値が異なります。

  SendStrの値
  1254002369000541

  一回目
  1254002369000541 (問題なし)

  二回目
  1254023690541 (0が2個以上続くと、2個目以降が表示されない)

WORD()の型変換をchar()にしたり、外してみたりしましたが、改善されませんでした。
1回目に正常な出力が行われているので、何が原因になっているのか見当がつきません。

どなたか気付いた点がございましたら、ご教授下さい。
0172165NGNG
すみません、自己解決しました。

  INPUT srINP[16];
  for(i = 0; i < 16; i++){
    //キーを押す
    srINP[i].type = INPUT_KEYBOARD;
    srINP[i].ki.wVk = WORD(SendStr.GetAt(i));
    srINP[i].ki.dwFlags = 0;
    srINP[i].ki.time = 0;
    SendInput(1, &srINP[i], sizeof(srINP));
    //キーを離す
srINP[i].ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &srINP[i], sizeof(srINP));
  }

単純に離すのを忘れていただけのようでした。
SendInputの情報がWebに殆ど載ってない…。
0173デフォルトの名無しさんNGNG
初心者なんですけど教えてくださいネ
水平スライダーコントロールの値がうまく取得できないんです。
VC++6.0でMFCでやってんすけどググって調べたとおり

OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
から
int iPos = pScrollBar->GetScrollPos();
で値取得して
switch(nSBCode) {
で条件分岐してるんだけど
case SB_PAGELEFT:
case SB_PAGERIGHT:
のとき、つまりスライダーのつまみをドラッグせずにつまみの近辺をクリック
したときにiPosに入ってくる値が無茶苦茶なんですよ。他の条件の時は
いいみたいなんですけど。
ちなみに同じことをスクロールバーコントロールでやると思ったとおりの
動きになります。
誰か教えて下さい。おながいします。
0174デフォルトの名無しさんNGNG
>>173
CScrollBar*はCSliderCtrl*にキャストしないとダメでは?
CSliderCtrl* pSliderCtrl = (CSliderCtrl*)pScrollBar;
int iPos = pSliderCtrl->GetPos();

あと、SB_**ってのはTB_** (同じ値がdefineされてるけど)
0175デフォルトの名無しさんNGNG
nPos使えば?
0176デフォルトの名無しさんNGNG
173はマルチポスト
以下スルーでよろぴく
0177デフォルトの名無しさんNGNG
マルチのなにがいけないの?
たくさんのところに助けを求めたほうが
解決が早いことに疑問を挟む余地はないじゃん

おまいらばか?
0178デフォルトの名無しさんNGNG
そういう自分のことしか考えないところが嫌われる原因じゃないかな。
0179デフォルトの名無しさんNGNG
つーか、マルチかどうかわざわざ調べて回って報告に来る香具師のほうがキモイ
調べるべき範囲は非現実的だし、途中でやめて帰ってきた報告が誰の役に立つのかも疑問だ
結局、自分の個人的な好みでじたばた喚いてるがきんちょそのまんまやん
腐ってもム板の住人が恥を知れやまったく
0180デフォルトの名無しさんNGNG
わざわざ調べてってか、例えばいつもC++系スレチェックしてたらどこ行っても同じ質問が書いてあったらうざいよな。
0181デフォルトの名無しさんNGNG
>>180
スルーしとけばいいだろ。
いちいち報告してる奴の方がウザイ。
0182デフォルトの名無しさんNGNG
>>180
だから、それはオマエ個人のブックマークだろうがよwww
0183デフォルトの名無しさんNGNG
なぜ報告するかというと、↑のようにマルチ厨のほとんどは逆ギレして暴れるから。
だから「こいつはマルチ(つまり関わるとDQNレスが返ってくる)なのでスルーしろ」と各スレの住人に報告されます。
0184デフォルトの名無しさんNGNG
>>183
マルチうさい
0185デフォルトの名無しさんNGNG
>>184
禿藁
0186デフォルトの名無しさんNGNG
マルチの指摘まではいいけど、逆切れされたらスルーしろよ・・・
0187デフォルトの名無しさんNGNG
もう5時間近くスルーされてるがな
0188デフォルトの名無しさんNGNG
>>186
逆切れと言うからには、自分が正だという前提があるらしいな。
誰がどこで何を聞こうが、それは個人の主権だぞ。
仮にあんたが科学的な統計調査を行っていてそこから得た相関係数に基づいて発言していても、
173という個人がこのあと無礼を働くと決めてかかるのはステレオタイプであり、
人格に対するそれを行う者こそ無礼者のレッテルを免れない。

と、ずいぶん買いかぶってやったが
おおかた某コミュニティの流行に乗って喜んでるだけの軽薄野郎だろw
0189デフォルトの名無しさんNGNG
>>188は自分が正しいと思っているんですか?
0190デフォルトの名無しさんNGNG
>>189
2行目は読んだか?
あと俺は173じゃないぜ
0191デフォルトの名無しさんNGNG
必死だなw
0192デフォルトの名無しさんNGNG
定型句のみに縮退いっちょあがり

・・・もともと定型句のみが骨子でハリボテが吹っ飛んだだけだが・・・
0193マイク ◆yrBrqfF1Ew NGNG
お前ら頭悪そうだね。
0194デフォルトの名無しさんNGNG
VS2002とVS2003でMFCのヴァージョンって違うの?
0195デフォルトの名無しさんNGNG
Oh, Yes !!
0196デフォルトの名無しさんNGNG
>>194
0.1違う
0197デフォルトの名無しさんNGNG
ビジュアルスタイルのラジオボタン(とチェックボックス)の文字の色を変えたいんだけど、
どうすればいいの?
クラシックだとOnCtlColor()でCTLCOLOR_STATICの時、色を変えたら変わったんだけど..
ラジオボタンの絵の部分はスタイルに連動させたいんで、オーナードローは使えないし。
0198デフォルトの名無しさんNGNG
>>197
ラジオボタンの文字を使わず、そこにStaticTextを貼り付ける。
イベント処理をどこまで真面目にやるかはお好みで。
0199デフォルトの名無しさんNGNG
オーナー描写ボタンをMDIの子ウインドウにつけたいのですが。
プロジェクトのアプリケーションウィザードで
MDI、基本クラスをCFormViewクラスにしてFormViewダイアログに
ボタンを配置して、OwnerDrawをtrueにして
CAboutDialogにプライベートメンバを追加して、
オーバーライドしたOnInitDialogで
VERIFY(m_editRec.AutoLoad(IDC_REC, this));
としたのですが、FormViewである子ウインドウに
ボタンが描写されません。
どうしたらようでしょうか?
0200デフォルトの名無しさんNGNG
>>199
オーナードローなんだから、自分で描画処理を記述する必要があるんでしょ。
0201デフォルトの名無しさんNGNG
描画処理をしても、描写はされないと思うがな。
0202デフォルトの名無しさんNGNG
すみませんでした。
オーナードローではなくて、CBitmapButtonでした。
0203デフォルトの名無しさんNGNG
解決しました。
0204デフォルトの名無しさんNGNG
http://www.codeproject.com/internet/winarpspoof/CBuildPacket.zip
を利用してパケットを自作するプログラムをMFCで作りたいのですが、
このCBuildPacketクラスを利用するためにはどのように設定すればいいでしょうか?
コンパイルがうまくできなくて困っています。
0205204NGNG
すいません。上のURLだとダウンロードできないので、
http://www.codeguru.com/dbfiles/get_file/CBuildPacket.zip?id=6861&lbl=CBUILDPACKET_ZIP&ds=20040331
0206デフォルトの名無しさんNGNG
multi kayo!!
0207デフォルトの名無しさんNGNG
>>206
だから何?
0208デフォルトの名無しさんNGNG
MDIの子ウインドウを消すときに呼び出されるAPIをオーバーライドしたいのですが。
どうしたらよいでしょうか?
0209デフォルトの名無しさんNGNG
>>208
OnDestroy()をオーバーライド
0210デフォルトの名無しさんNGNG
OnDestroyがMFCのクラスの中にみあたらないのですが。
0211デフォルトの名無しさんNGNG
>>210
気のせいです
0212デフォルトの名無しさんNGNG
もしかして、子ウインドウを消すときにバッファを解放するには、
CChildFrmのデクストラクタで解放したのでいいのでしょうか?
0213デフォルトの名無しさんNGNG
>>211
CWndの関数のようですが、
MDIの子ウインドウなのでCMDIChildWndかCFrameWndに関係した関数だと思うのですが。
どうでしょうか?
0214デフォルトの名無しさんNGNG
>>213
MFCの継承図をよく見ましょう。
つーか、これだけヒントがあればMSDNでも解説サイトでも見つかるだろうに。
0215デフォルトの名無しさんNGNG
・・・・・・・・・
プロパティウインドウからでないとオーバーライドできないと思い込んでました。
アドバイスありがとうございます。
CMDIChildWndもCFrameWndもCWndから派生しているということですね。
0216デフォルトの名無しさんNGNG
ところで、MFCでメインループのようなものを実現するには
どうすれば良いのでしょうか?
0217デフォルトの名無しさんNGNG
メインループ?
メッセージループじゃなくて?
0218デフォルトの名無しさんNGNG
>>216
コンソールか? afx.h
0219デフォルトの名無しさんNGNG
IEのダウンロード画面等の
1 プログレスバーあり
2 途中キャンセル可能
3 その間アニメーションが動く
を実現しようとしてます

12まではどうにかできたんですが、3のやり方がいまいちわかりません
参考になるサイト等を教えてもらえませんか

ちなみに1,2は進捗表示用のダイアログを作って、
時間のかかる処理を別スレッドで起動、
スレッドから進捗ダイアログに進捗状況を送るようにしています
こういうやり方でいいんですかね
0220デフォルトの名無しさんNGNG
アニメーションコントロールを貼り付けてaviファイルを
再生しているだけじゃないのか?そういうことではなくて?
0221デフォルトの名無しさんNGNG
ActiveXコントロールをダイアログベースではないプロジェクトで利用できないの?

CScrollViewから派生させたCGLChartViewをメインに使ってるのですが
やっぱり、CFormViewから派生させなきゃいけないの?
0222デフォルトの名無しさんNGNG
MFCの入門書に
0:     void CChildView::OnPaint()
1:     {
2:            CPaintDC dc(this); // 描画のデバイス コンテキスト
3:    
4:         // TODO : ここにメッセージ ハンドラ コードを追加します。
5:
6:         // 夜空を表示する
7:         CBrush NightBrush;
8:         CBrush *pOldBrush;
9:         NightBrush.CreateSolidBrush(RGB(0, 0, 128));
10:         pOldBrush = dc.SelectObject(&NightBrush);
11:         dc.Rectangle(0, 0, 400, 400);
12:         dc.SelectObject(pOldBrush);
13:         NightBrush.DeleteObject();
14:     }
というコードが載っていて、解説によるとNightBrushオブジェクトを作成し、紺色のブラシとして初期化し
10行目でNightBrushをデバイス・コンテキストの「現在のブラシ」として選択してpOldBrushに以前のブラシの
ポインタを保存して、11行目で紺色を塗り、12行目で以前のブラシに戻す。とあるのですが10行目のようにすると
紺色になってしまった状態をpOldBrushに代入してしまうのではないのでしょうか?

0223デフォルトの名無しさんNGNG
うるせぇっての、カス。自分で考えろ。
0224デフォルトの名無しさんNGNG
>>222
そういう仕様になってるから大丈夫。
喩えて言えばこんなコード。
int setValue(int newValue)
{
int oldValue = getSystemValue();
setSystemValue(newValue);
return oldValue;
}
0225デフォルトの名無しさんNGNG
>>222
本来はこんな流れ
紺.CreateSolidBrush();
白 = dc.SelectObject(紺);
紺 = dc.SelectObject(白);
紺.DeleteObject();

紺 = を省略しているから
この流れが見えにくくなっている
入門書にあるまじき怠慢なコード
0226デフォルトの名無しさんNGNG
692 名前:M.B. :04/11/06 09:49:54
カード [] deck = new カード("全部"); // 配列の中にカードを全部生成
for (int n = 0;n < (deck.length - 1);m += 1) {
  m = n 以上 deck.length 未満の乱数;
  deck[m] と deck[n] を swap; // m == n の場合も気にせず実行。
}
※ deck を class として定義して、
swap を private なメソッド化としておいて、
shaffle を呼ぶようにすると綺麗になるかも。

693 名前:M.B. :04/11/06 09:53:09
【雑談】JavaっぽいけどJVMで走らず【ぬるぽ】
……狙いすぎたか。orz
0227デフォルトの名無しさんNGNG
>>225
そんなすっとこどっこいなコードの方が問題だろ。
0228デフォルトの名無しさんNGNG
相談室にあるまじきすっとこどっこいないいがかりだな。。
0229デフォルトの名無しさんNGNG
ここのスレは役にたたんカスばっかだな。死ね。
0230デフォルトの名無しさんNGNG
マルチレス逆切れの後は荒しかよ
0231222NGNG
>224 225
ふむふむ、別にきにしなくていいんですね。ありがとうございました
0232デフォルトの名無しさんNGNG
>>230
よっぽど悔しかったんだね (プププ

まあせいぜいマルチ叩きにがんばれや
1人も逃すなよ、どうやって検出するのかは謎だがw
0233デフォルトの名無しさんNGNG
波形表示の上に小節数を表示するメジャーのようなコントロールをつけたいのですが、
そのようなコントロールをしりませんか?
0234デフォルトの名無しさんNGNG
>>233
無理矢理やるとすればCListCtrlでグリッドラインを表示するとか

波形表示とか言ってる時点で自分で描くしかないビューのような気がする
0235デフォルトの名無しさんNGNG
>無理矢理やるとすればCListCtrlでグリッドラインを表示するとか
少しきついかもしれません。

よく画像編集ソフトや波形編集そふとで画面上方にルーラーがついているのを
見るのですが、あれはActiveXコントロールなのですか?
0236デフォルトの名無しさんNGNG
違う
0237デフォルトの名無しさんNGNG
現在、MFCのCPenを使って絵を描いています
問題は描いた画面を保存(jpg,tif,bmpなど)したいのですが、、
方法をご存知の方、お教えくださいm(__)m
また複数描いて動画(aviなど)にもしたいのです。

環境はVC.net2003です
0238デフォルトの名無しさんNGNG
これってMFCの質問?
0239デフォルトの名無しさんNGNG
つーか、MFCの質問かどうか以前に、根本的に基礎が抜けている悪寒。
0240デフォルトの名無しさんNGNG
CPenを使ってるからかも知れナイチンゲール。
0241デフォルトの名無しさんNGNG
This is a pen. アライチュー。
0242デフォルトの名無しさんNGNG
MFCでダイアログ内にあるListView内のコラムのクリック検出をするのって
何か設定が必要なのでしょうか?
そのままではクリックしてもOnNotifyがコールされないのですが、
どなたか教えてください
0243デフォルトの名無しさんNGNG
>>242
ListCtrlをクラスにして、LVN_CLUMNCLICKメッセージからイベント関数を作る。
0244本田NGNG
>>237
Classes to read and write BMP, JPEG and JPEG 2000
By Tony Lin
http://www.cis.pku.edu.cn/teacher/vision/lintong/webpages/The%20Code%20Project%20-%20Classes%20to%20read%20and%20write%20BMP,%20JPEG%20and%20JPEG%202000%20-%20Bitmaps%20&%20Palettes.htm
0245デフォルトの名無しさんNGNG
MFCでCImage使えなかったっけ。
0246本田NGNG
>>237
>>245
>MFCでCImage使えなかったっけ。
使えるみたい。
CImage クラス
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/vcrefCImage.asp
0247デフォルトの名無しさんNGNG
CImageってGDI+必要じゃなかったっけ?
0248本田NGNG
>>247
GDI+は必須では無いみたい。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/vcconCImageLimitationsWithEarlierOperatingSystems.asp
0249デフォルトの名無しさんNGNG
すんまそん教えて下さい。(x_x)
OnPaint()でBitBltするためにCPaintDCを使ってるんですが、
こやつはコンストラクタでBeginPaintを呼び出し無効領域を
クリップしてしまいます。
無効領域の有無によらず常に全領域をクリップするにはどう
すればいいでしょうか?

ちなみに、CDC::IntersectClipRectではダメでした。
0250デフォルトの名無しさんNGNG
>>249
CClientDC
0251249NGNG
>>250
�d
でも、OnPaint内だとCClientDC, CWindowDCはダメなんですよ。
(WM_PAINTが再発行されてループする感じ)

どうも、this->GetDC()したらダメみたい。
ちなみに環境は
W2K+VC6で、モードレスダイアログです。
0252デフォルトの名無しさんNGNG
>>251
CPaintDCはそのままで、追加でCClientDCした?
CPaintDC(BeginPaint, EndPaint)が無効領域をクリアしてるから
消したら駄目よ。
■ このスレッドは過去ログ倉庫に格納されています