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

■ VisualC++(MFC限定)相談室 5■

■ このスレッドは過去ログ倉庫に格納されています
0001MFCNGNG
前スレ
■ VisualC++(MFC限定)相談室 4■
http://pc3.2ch.net/test/read.cgi/tech/1021620974/l50
0153デフォルトの名無しさんNGNG
MDIアプリを作っているのですが、メインのウインドウをデフォルトじゃなくて
イメージを貼り付けたいのですがどなたかご存知ではないですか?

メディアプレーヤーみたいにいくつもイメージを変えたいです。。
0154デフォルトの名無しさんNGNG
>>103
::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST|SHCNF_FLUSH, 0, 0);
0155150NGNG
>>152
違いますよ。
アカデミック版じゃないです。
0156デフォルトの名無しさんNGNG
ウィンドウハンドルからオブジェクトへのポインタを
取得するにはどうすればいいでしょうか?
CWnd* ????(HWND hWnd);
みたいな関数ってありませんか?
0157 NGNG
>>156
CWnd::FromHandle()
0158156NGNG
>157
最高です。
感謝します。
0159デフォルトの名無しさんNGNG
自分で作ったファイルオープンのダイアログを
フレームワークのファイルオープンのダイアログみたいに使うことはできませんか?
0160あNGNG
>159
みたいに?
代わりにじゃなくて?
0161159NGNG
ダイアログで取ったファイルのパスをOnOpenDocumentに渡したいんです。
0162デフォルトの名無しさんNGNG
基本クラスCEditViewのMFCで一行目だけ読み出すように
するには、どうしたらいいですか?
一行目だけ色を変えたいんですけど、やりかたが書いてある
参考書がないので
0163デフォルトの名無しさんNGNG
EditControlに色を変えるような高尚なことができたっけか?
0164デフォルトの名無しさんNGNG
>>159
ID_FILE_OPEN の COMMAND メッセージハンドラを CXxxApp に作る。中身は

void CXxxApp::OnFileOpen()
{
 LPCTSTR lpszFileName;
 {
   // ここで自作のファイルオープンのダイアログから得たパスを
   // lpszFileName に格納
 }
 CWinApp::OpenDocumentFile(lpszFileName);
}

見たいな感じ。
0165デフォルトの名無しさんNGNG
CWndを直接継承したウィンドウを作成しているのですが、
この際ウィンドウのスタイルを
WS_CHILD
でなおかつ、
WS_EX_CLIENTEDGE (ウィンドウの境界が3D)
にしたいと思っています。

CWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
で、
lpCreateStruct->dwExStyle
をいじくったりしていますが上手くいきません。

よい方法があれば、或いは不可能であるのならば
その旨を教えて下さい。
そもそも、CWndを直接継承してウィンドウを作って良いのか否か
も分からないのですが…。
0166デフォルトの名無しさんNGNG
PreCreateWindowを使うのだ、>>165よ。
0167165NGNG
>>166
ありがとうございます。上手くいきました。

また質問なんですが、
CWnd::OnMouseWheel()
のところが上手くいきません。
これもまた、CWndから直接継承されたウィンドウなのですが。
ほかの、OnMouseMove()などはちゃんと反応するのですが…

0168 NGNG
perlみたいな正規表現は使えませんか
0169デフォルトの名無しさんNGNG
>168
DLLを使用してもよいなら
正規表現 DLL
で検索を、、
0170170NGNG
いくつかのCStaticが重なった時に、その表示順を変えることってできますか?
たとえばCStaticのAとBがあります。どちらもビットマップが表示されています。
AがBの上に重なっているとして、マウスでBをクリックすると、
BがAの上にくるように表示しなおすことってできますか?
もしできなければ、ほかのコントロールを使ってもいいので、
似たようなことができますか?
0171171NGNG
>>170
できるよ
0172170NGNG
>>171
どういう方法がありますか?
0173あNGNG
>170
SetWindowPos
で無理か?
0174動画無料サンプルNGNG
ブルマ・水着・セーラー服でスケベな事してる
小学生、中学生、女子高生が【無料】で見れる!!
http://www.traffimagic.com/WIPE7MMLZCA/comein/NZKYA
0175デフォルトの名無しさんNGNG
VC++6.0でMDIのプログラム作りたいんだけど
で、子ウィンドウはダイアログベースで作ったものをそのままはめ込む
ようにしたいんですが、どのような手順で作ればよいのでしょうか?
0176デフォルトの名無しさんNGNG
全ウインドウ(トップレベルウインド、チャイルドウインド)のZオーダーを取るにはどうすればいいですか?
ウインドハンドルを渡すとZオーダーを返してくれるとか、そういうのありますか?
GetNextWindow以外でお願いします。。
0177デフォルトの名無しさんNGNG
>>175
CFormViewにしとけ
0178デフォルトの名無しさんNGNG
>>176 何で GetNextWindowは不可なのか?
0179突然ですがNGNG
1000とってゴメソ>SITNAM
0180デフォルトの名無しさんNGNG
>>178
13文字で不吉だからと思わ
0181デフォルトの名無しさんNGNG
SDIでプリンターの用紙サイズを自動にA3にしようと、
C**View::OnPreparePrintingで

DEVMODE* pDev=(DEVMODE*)GlobalLock(pInfo->m_pPD->m_pd.hDevMode);

pDev->dmPaperSize=DMPAPER_A3;
pDev->dmOrientation=DMORIENT_PORTRAIT ;
pDev->dmFields= pDev->dmFields | DM_PAPERSIZE | DM_ORIENTATION ;
GlobalUnlock(pDev);

とやってるのですが、デフォルトのA4のままです。プリンタの設定の
ダイアログを使わずにどうやってA3に出来ますか?
0182デフォルトの名無しさんNGNG
>>181
わからんけどCreateDCでHDCを作り直すんじゃねーの
0183デフォルトの名無しさんNGNG
MFCでダイアログアプリ作って実行したらやたらリソース食うんだけど、
これって使ってるコントロールの数とかモロに影響します?
0184デフォルトの名無しさんNGNG
Windowsの終了間際に
不特定多数のコピーを行いその後
シャットダウンを続行したいのですが、
うまくいかなくて困ってます。

BOOL CTestDlg::OnQueryEndSession()
{
if (!CDialog::OnQueryEndSession())
return FALSE;

// TODO : ここに特定なクエリの終了セッション コードを追加してください。

CopyFiles();//不特定多数のファイルのコピー処理
  return FALSE;
}
実際書いてみると、コピー処理が長く、
応答が無いから終了しますか?みたな
プログレスバー付きのダイアログが表示されてしまいます。
これはちょっと不自然なので、どうしたらいいでしょうか?
0185184NGNG
↑書き忘れました。
環境はWinXP VC.NETです。
よろしくお願いします。
0186デフォルトの名無しさんNGNG
>>184
根本的に、終了間際に時間のかかる処理はするなってこった。

適切な対処法は知らんけどさ。とりあえず、OnQueryEndSessionで
FALSEを返しておいて、OnEndSession で CopyFiles() を読んんで処理が
終わった後、ExitWinodowsするとか。
0187デフォルトの名無しさんNGNG
これ。

BOOL exitFlag = FALSE;

BOOL CTestDlg::OnQueryEndSession()
{
  return exitFlag;
}

void CTestDlg::OnEndSession(BOOL bEnding)
{
  if(!bEnding && !exitFlag) {
    CopyFiles();
    exitFlag = TRUE;
    ::ExitWindows(0,0);
  }
}
0188184NGNG
レスありがとうございます。
この方法でいけそうです。
ありがとうございました。
0189VC初心者NGNG
処理に長い時間がかかる場合に×ボタンが利かなくなったりするのですが
VBでいうDoEvents()にあたる関数を教えていただけませんでしょうか?
0190あNGNG
>189
おいおい、俺はVB知らんから
教えてやろうにも教えてやれない。
そこで検索してみることにした。
VB DoEvent
見事にヒットした。
代わりに検索して欲しいと言う依頼ですか?
出直してきなさい。
0191VC初心者NGNG
ありますた…スミマセン

void DoEvents(void){
MSG msg;
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
0192デフォルトの名無しさんNGNG
>189
DoEventsは知らないけどAfxBeginThread辺りを調べてみて。
0193VC初心者NGNG
ありがとうございます。MSDN見てみたのですが
全然わからないので無理っぽいです。(汗

とりあえず、上のDoEvents()でうまくいきました。
0194今田純NGNG
入力した数を計算したあと文字として出力したいのですが、
以下のコードではだめなんですが、どこをどうなおせばいいのか、
おしえてください。おながいします。

void CMy1Dlg::OnButton1()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CEdit* e1 = (CEdit*)GetDlgItem(IDC_EDIT1);
CListBox* l1 = (CListBox*)GetDlgItem(IDC_LIST1);
CString s1;

e1 ->GetWindowText(s1);
l1 ->InsertString(-1,s1);
}

void CMy1Dlg::OnButton2()
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CEdit* e2 = (CEdit*)GetDlgItem(IDC_EDIT1);
CListBox* l2 = (CListBox*)GetDlgItem(IDC_LIST1);
CString s2;
char buf[50];
double n1;
double n2;

e2 ->GetWindowText(s2);
n1 = atoi(s2);
n2 = n1 + 1;
sprintf(buf,"%d",n2);
l2 ->InsertString(-1,buf);
}
0195今田純NGNG
特にこの辺がだめぽいんです。
e2 ->GetWindowText(s2);
n1 = atoi(s2);
n2 = n1 + 1;
sprintf(buf,"%d",n2);
l2 ->InsertString(-1,buf);
0196あNGNG
>195
だめっぽいのはわかったけど、
どうだめっぽいの?
0197デフォルトの名無しさんNGNG
>>195
結果が表示されないとか?
0198デフォルトの名無しさんNGNG
リストボックスっていうのはUpdateDataは必要ないのかい?
0199あNGNG
>198
当たり。
自信なくてUpdateData(FALSE);
ありとなしの両方のコード書いてきたら
なしじゃ結果が表示されなくて、
UpdateDataしたらいけたよ。
よって解決。
0200今田純NGNG
194-195です。

>>196-197
結果は表示されますが、おかしいです。
数字が出力されてほすぃのに、文字が「フ0」とかでます。
>>198
UpdateData。。。なんでしょう。。あたらしい言葉だ。。
調べてきます。
sprintf(buf,"%d",n2); を
sprintf(&buf,"%d",n2); にしました。

Editboxに「1」を入力したら、Listboxに「2」とでてほすいのですが、、
「フ0」(フは半角)
と表示されますた。
editboxが空だと「0」と表示されます。
ウトゥです。
0201今田純NGNG
さそーく、やらしてもらいます。
ありがとうございました。
0202デフォルトの名無しさんNGNG
>>200
> sprintf(&buf,"%d",n2); にしました。

あほう。
0203今田純NGNG
&bufはなおしました。
「あ」さん
UPDATEDATAってコードのどこに書き込めばよいのでしょうか?
教えてください。オナガイします。
これで僕の最初のVC++プログラムが動く。。かもです。
0204デフォルトの名無しさんNGNG
atoi関数ってCStringに対応してるのか?
0205デフォルトの名無しさんNGNG
UpdateData(TRUE)でダイアログ上のコントロールの値を対応する変数に代入する
UpdateData(FALSE)で変数の内容をコントロールに表示する
普通は変数を処理する前にTRUEで処理した変数の内容を表示する場合にFALSEだから
メッセージハンドらの最初にTRUE、最後にFALSEが一般的では?
0206今田純NGNG
ありゃ?
cahrじゃないとだめですか?
教科書もチャーで書いてあるし、、
0207デフォルトの名無しさんNGNG
それと余談だけどGetDlgItem(IDC_EDIT1)の戻り値をポインタ変数を宣言して代入して

e1 ->GetWindowText(s1);
l1 ->InsertString(-1,s1);

としなくても、戻り値がコントロールのポインタなので戻り値をそのまま利用して

GetDlgItem(IDC_EDIT1)->GetWindowText(s1);
GetDlgItem(IDC_LIST1)->InsertString(-1,s1);

これでOKだよ
この方がわかりやすいでしょ?
0208デフォルトの名無しさんNGNG
CStringはクラスですよ
0209今田純NGNG
つまり、char でないとだめだと。
文字列の中身をcharに直さないと。
ということですね。
0210今田純NGNG
あああぁぁぁぁぁ!
わかっているつもりだttが、わかってないことがわかってしまったあぁ!

歩いたら道が伸びていく感じです
0211デフォルトの名無しさんNGNG
クラスウィザードでエディットコントロールに変数を割り当てる時にCStringではなくて最初からintを割り当てればいいんじゃない?
0212今田純NGNG
>>205,207どうもです。やってみました。
>>208クラス。。クラスってなんか塊みたいなものですよね。代入不可ですか
>>211僕もとてもそうしたいですが。。
GetWindowText(s1);
InsertString(-1,s1);
とかが使えないと、ファイル入出力ができなくないですか。
テキストファイルからデータを読んで、数値計算をして、
結果をテクストファイルで出力したいんです。
0213デフォルトの名無しさんNGNG
UpdateDataは関係ねーべよ。

 e2 ->GetWindowText(s2);
 n1 = atoi(s2);
 n2 = n1 + 1;
 sprintf(buf,"%d",n2);
 l2 ->InsertString(-1,buf);

ここらへんをステップ実行して、s2,n1,n2,buf の値を調べてみれ。
どこで変数の値が化けるのか分かるから。
0214デフォルトの名無しさんNGNG
ちゅーか、

 e2 ->GetWindowText(s2);
 n1 = atoi(s2);
 n2 = n1 + 1;
 l2 ->SetWindowText( itoa( n2, buf, 10 ));

ではダメなん?
0215デフォルトの名無しさんNGNG
atoiにCString渡してもVC上では問題ないと思ったが
0216デフォルトの名無しさんNGNG
n1,n2はなんでdoubleなの?
0217デフォルトの名無しさんNGNG
このスレ最近ふわふわしてるな
0218デフォルトの名無しさんNGNG
>>215
VC上っつーか、CString::oprator LPCTSTR()があるんで、
TCHARがcharならば、C++的に問題なし。
0219デフォルトの名無しさんNGNG
>>216
カッコイイからじゃないか?
0220今田純NGNG
>>213 ステップ実行なんて高度な技を。。ついに学ぶときが来たのですね!
>>214おお!atoiがあるならitoaもあるはず!なんで気づかなかったのか!
>>215どもですー。
>>216数値計算に使いたいからですー
>>217僕が地に足の着いてない生き方だからです、すんまそん。
>>218LPCTSTR()って何の略なのかすらわかりませぬ。とりあえずNO問題?
0221デフォルトの名無しさんNGNG
>>220
> おお!atoiがあるならitoaもあるはず!なんで気づかなかったのか!

C標準関数じゃないから。
0222デフォルトの名無しさんNGNG
>LPCTSTR()って何の略なのかすらわかりませぬ。とりあえずNO問題?
略っていうかCSTRINGのメンバ関数だよ
0223デフォルトの名無しさんNGNG
>>220
あなたが参考にしてるという教科書にはクラスに関する解説はないの?
0224デフォルトの名無しさんNGNG
まだVC初心者スレに留まっていた方が良かったのかも
0225今田純NGNG
221-222>>みなさん、CStringの中とか読んでるんですか?
223-224>>そんなこというなよ、ウワァァァンヽ(`o´)/
0226デフォルトの名無しさんNGNG
>>225
君が使ってるVC++が合法的に入手したものであればヘルプ機能が付いてるはず
VCのヘルプであるMSDNは素晴らしいツールだから是非使い方を覚えるべきだね
CStringのメンバについてもその使い方についても全て書いてあるからさ
まずエディタの中でCStringという記述を反転させて(記述がなければ記述してくれ)F1キーを押す
それから「該当するトピック」の中からCStringクラスメンバを選んでクリックする
0227デフォルトの名無しさんNGNG
>> の使い方が、ストリーム演算子みたいになってますよ(w
(それなら << か...どうでもいいや。)
0228デフォルトの名無しさんNGNG
CString hoge;
int num=12345;
hoge.Format("数値は%dですが何か?",num);

MessageBox(hoge,"test",MB_OK);
//(゚д゚)ウマー?
0229デフォルトの名無しさんNGNG
>>226
>エディタの中でCStringという記述を反転させて
カーソルを CString という文字列のどこかに置くだけで OK。
0230デフォルトの名無しさんNGNG
CString strTemp1(_T("変体ねーチャン"));
CString strTemp2 = strTemp1;

としてもほとんど処理速度に影響ないときいたのですが
どういう意味でしょうか?
0231あNGNG
あっ、偉いスレが伸びてるからびっくりしたよ。

>今田純
別に嫌味で言うわけじゃないけどさ、
はっきりいってMFCやるの早いよ。
クラスのこと分かってなかったら
MFCいじっても勉強っていうより
作った気になるだけじゃないかな。
MFCよりまずはクラスがなにか、
継承、カプセル化などについて学び、
その後SDKを学ぶことを強くオススメする。
0232今田同定NGNG
>>231
ふん、おめーよりはわかってるよ!
0233デフォルトの名無しさんNGNG
つーかMFCの方が簡単だべ。
C++の基礎とかわかんなくても何となく作れちゃうから。
0234デフォルトの名無しさんNGNG
>>230
>CString strTemp2 = strTemp1;
のときは文字列の内容自体はコピーしなくて、ポインタのコピーと参照回数++しか
しないことがいいたいんだろ

>>232
同定ageすんなよ
0235デフォルトの名無しさんNGNG
n1とかはdoubleなのにsprintfで%dつかってる。CString使うんだから
いちいち char buf[50]なんてやらんでよろし。DDXとか使わないんだったら


CEdit* e2 = (CEdit*)GetDlgItem(IDC_EDIT1);
CListBox* l2 = (CListBox*)GetDlgItem(IDC_LIST1);
CString s2;
int n1;
int n2;

e2 ->GetWindowText(s2);
n1 = atoi(s2);
n2 = n1 + 1;
s2.Format("%d",n2);
l2 ->InsertString(-1,s2);

でいいだろ。


こういう処理したかったら普通ClassWizard使ってエディットボックスの
値を反映させるメンバ変数使います。
0236デフォルトの名無しさんNGNG
>>220
>>216数値計算に使いたいからですー

すまん、doubleが使いたいのね。だったら%dじゃなくて%gとか%f。
atoiはatof使わないと少数切られるよ。
0237デフォルトの名無しさんNGNG
doubleならatofよりもstrtodの方が良いかも知れない。
0238VisualC++初心者NGNG
VisualC++初心者の者です。
アプリケーションを起動した時のみ一度だけ実行したい関数があるのですが、
その関数はCClientDCオブジェクトのアドレスを渡さなければなりません。
それでオブジェクトを作るためにCAppView::CAppView()にCClientDC DC(this)と
記述したのですが、どうも不安定になっていしまいました。(Appはプロジェクト名です)
OnDrawに同じコードを書くと問題無いようなのですが、何回も関数が呼び出されるわけには
いきません。何か方法ありませんか?
0239デフォルトの名無しさんNGNG
素直にsprintf()ではいかんの?
0240デフォルトの名無しさんNGNG
>>238
CAppView::OnInitialUpdate()に書いとけば?
0241デフォルトの名無しさんNGNG
doubleやfloatなら俺もsprinf使ってしまう罠。

>>238
フラグでも用意してやれば良いんじゃない?
0242あNGNG
>233
そりゃMFCの方が断然簡単だよ。
=SDKの知識が必要ないとは
別な気がするなぁ。
私はSDK->MFCの流れだけど、
SDKやってるからかなり分かりやすかったよ。
俺の使ってた本には、
船の操作方法はわからなくても
海を航海できるが、
最低限の舵取りなどは覚えておくべき、
みたいな例え方してたと思うけど、
ほんとその通りだと思うなぁ。
0243デフォルトの名無しさんNGNG
MFCやらSDKやら言う前の段階だろ。
単にヘルプとIDEの使い方知らない奴なんだから。
0244あNGNG
>243
確かに。
根本的なものが抜けてるね。
で、考え直したけど、つまりは
できないことじゃなくて、
できることからやってろ。
って言うのが結論ですかね。
頑張れ新人。
0245デフォルトの名無しさんNGNG
CAppView::CAppView()の時点ではまだウインドウが作られてないので、
CClientDC DC(this)なんてことしたら実行時にエラーで落ちるでしょうね。
ViewクラスにBOOL型のメンバ変数でも追加して、OnDrawで1回だけ描画
されるようにしたらいいと思いますよ。

>>240
その時点で描画しても多分描画されないと思う。
0246今田純NGNG
>>「あ」さん。読んでもわかんないから、聞きながらやります、
 なので、生あたたか〜く見守ってください
>>232いつもくるけど、道程じゃねえっていってるだろ!プンプン!
>>233-237レスさんくすこ
0247デフォルトの名無しさんNGNG
ダイアログベースのソフトで
メニュー->オプションで
オプション設定画面(ダイアログ)を表示するような
コードを書いたのですが、
もう結構進んだ段階なのですが、
オプション設定画面に置くべきコントロールが
増えてきたのでタブ式のオプション設定ダイアログに
変更したいと思ったのですが、
なにかいい方法はないでしょうか。
タブコントロールを使うのが一番早いでしょうが、
あれってリソースエディタ画面がコントロールで
ぐちゃぐちゃになりません?
必要に応じてShowWindowで切り替えるので
リソースエディタ開いたら1〜?ページぶんの
コントロールが表示されてる状態で。。
ページをタブコントロールで切り替える場合
リソースエディタの見た目入り混じって
ぐちゃぐちゃになりますが、こういうものなんでしょうか?
実際起動するとShowWindowで制御されてるので
普通に見えます。
0248デフォルトの名無しさんNGNG
>>247 そんなあなたに CPropertySheet
0249247NGNG
>248
やっぱりそうですよねぇ。
実は私もそう思ったんですが、
CDialogから派生したオプションダイアログなんですが、
これをAddPageするにはCPropertySgeetからの
派生クラスに変更しないといけないんですが、
なんか単純に public:CDialog
の部分を変更しただけだとコンパイルすら
通らない状態になってしまって。。
両方ともCDialogの派生クラスだからいけると思ったんですけどね。
なんか間違ってますか??
0250デフォルトの名無しさんNGNG
>>249
余裕で変更できる。

・ダイアログの基本クラスを、CPropertyPage(CPropertySheetではない) にする。
・ダイアログエディタで
  [無効] と [タイトル バー] プロパティにチェック
  [スタイル]→[チャイルド] 、[境界線]→[細枠]

・CPropertySheet::AddPage() , CPropertySheet::DoModal()
0251デフォルトの名無しさんNGNG
今日からVCに再挑戦してるだども、いきなりつまっただよ
CClientDC myDC(&m_pict); <====アソコ
m_pict.GetWindowRect(&pictSize);
.....
.....
myDC.SelectObject(&myRgn);

となっとるだどもアソコでは何をしてるんだべか?
CClient型のオブジェクトmyDCを作ってるのかと思ったら
m_pictというオブジェクトもできてるように思えるんだべが。
0252デフォルトの名無しさんNGNG
タブコントロールでグチャグチャって。。。?
タブ分のフォーム作って選ばれたタブによってフォームをSHOW,HIDEしてやれば?
■ このスレッドは過去ログ倉庫に格納されています