トップページ⇒tech
961コメント299KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
VisualC++相談室はすでにあるようですが
MFCに限ったお話をしましょう。

ルールを提案。
Qは高度なものからくだらないものまで何でもOK。

Aは「知ってるつもり君」、「えらそうに解説する人」お断りと
いうことで。
0685デフォルトの名無しさんNGNG
>>684さん
型をUINTにしてみましたが、今度は
----------------------------------------------
error C2511: 'Camera_thread' : オーバーロードされたメンバ関数が
'<Unknown>' にありません。
----------------------------------------------
というエラーが出てしまいました。

class Caaa : public CWinApp
{
public:
void Rethread(UINT);
static UINT Thread(LPVOID p);
LPVOID pParam;
};

UINT Caaa::Thread(LPVOID p)
{
//処理
return ;
}

ではいけないのでしょうか?
よろしくお願い致します。
0686smatNGNG
DocumentのSerialize時(無効なファイルの読み込みの時)に新たにウィンドウを
作りたくないのですが、どうすればよいかわかりません。誰か助けて。


void CSmatPaint2Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
CFile* pf=ar.GetFile();
CString fn=pf->GetFileName();
image=IeImg((LPCTSTR)fn);
if( !image->isValid() ){ //無効なイメージファイル
AfxGetMainWnd()->MessageBox("無効なイメージファイルです");
//ここで新しいドキュメントを作成せずに、閉じたい(アプリケーション
//は終了せず)のですが、その方法がわかりません。
}
else
{
//有効なイメージデータの処理
}
}
}
0687デフォルトの名無しさんNGNG
>>686
OnCloseDocument
0688smatNGNG
>>687さん
ありがとうございます。
でも、いきなりOnCloseDocument()を呼び出すと、
不正な処理...のDialogBox
  ↓
ハンドルされていない例外はSmatPaint2.exeにあります。:0xc0000005:Access Violation
↓
メモリウィンドウが出てくる(文字が灰色で???)

の様になってしまいます。MSDNを見る限りでは何の問題もなさそうなのですけど。
ついでに、起動時に子ウィンドウを出さない様にするにはどうすればよいのでしょうか?
 ・OnNewDocumentのインプリメントをコメントアウトしてもダメ。
 ・OnNewDocument()の中でOnCloseDocument()を呼び出ししたら氏んでしまう。
0689デフォルトの名無しさんNGNG
>>688
OnNewDocument/OnOpenDocumentが完了する前にはOnCloseDocument呼べないみたいだね。
MDI子フレームにWM_CLOSEを送ってみるってのはどうだ。
0690デフォルトの名無しさんNGNG
>>688
>起動時に子ウィンドウを出さない様にする
これは知ってます。

CxxxApp::InitInstance()の中で
CCommandLineInfo cmdInfo;
の直後に
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
を挿入。
0691smatNGNG
>>689さん
CxxxDoc::Serialize の内部で行うと氏んでしまいました。
CxxxDoc::Serialize(CArchive& ar)
{
.....
POSITION pos=GetFirstViewPosition();
while(pos != NULL){
CView* pView=GetNextView();
CWnd* pWnd=pView->GetParent();
pWnd->SendMessage(WM_CLOSE);
}
....
}
次にドキュメントがダメならCxxxViewでやっちまえと思って
OnInitialUpdate,OnDrawなどでやってみましたが、ことごとく
粉砕されてしまいましたが、

CxxxDoc::OnOpenDocument()の内部で下記の様にやるとうまくいきました。

BOOL CSmatPaint2Doc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;

// TODO: この位置に固有の作成用コードを追加してください

//拡張子によるフィルタ
CString s = lpszPathName;
if( s.Right(3).CompareNoCase("TIF") != 0 ){
AfxGetMainWnd()->MessageBox("サポートされていないファイル形式です。");
return FALSE;
}

//イメージオブジェクトをファイル名から生成
m_img = IeImg(lpszPathName);

//---イメージの有効性チェック---
// 拡張子が合っていても、いたずらにて拡張子が変更されている場合または
// ファイルが壊れている可能性があるためにこれを行う
if(!m_img.isValid()) {
AfxGetMainWnd()->MessageBox("無効なイメージファイルです。");
m_img = ieImgNull;
return FALSE;
}

return TRUE;
}

大変良い勉強になりました。感謝してます。


>>690さん
ばっちりです。ありがとうございます。
0692ビギナーNGNG
SQLサーバからデータを読み出している際にNULLが入っていると例外でおちます。

_variant_t vString;

vString = m_pRecordset->GetCollect(_variant_t("整理"));
vString.ChangeType(VT_BSTR);
s11=vString.bstrVal;

整理がNULLの場合2行目のvString.ChangeTypeで
落ちますがどう対処すればいいのでしょうか。
0693デフォルトの名無しさんNGNG
>>692
VC++のspでの修正内容一覧でそんなのを見かけた気が、、、
spのバージョンは?
0694デフォルトの名無しさん NGNG
>>692
0695694NGNG
誤爆した。

if ( vString ) で囲んでもダメなのかい?
0696692NGNG
最新パッチあててるはずです。
ただvc起動時 VBみたいに SPなんとかと出ませんが...。

カッコでくくってみます。vbでいう on error resume next みたい
のがあるといいな
0697デフォルトの名無しさんNGNG
>>696
try {
} catch (...) {
}

__try {
} __finally {
}

TRY {
} CATCH_ALL{
} END_CATCH_ALL;
0698ビギナーNGNG
なにやらヒントが。やってみます>697
0699デフォルトの名無しさんNGNG
例外キャッチしてもいいけど、バグったバージョンの bstr とか使うと
痛い目見るかも。
0700デフォルトの名無しさんNGNG
MFCを勉強しはじめです。
CTimeとかをコンポジションしたいときって
ポインタだけにして
コンストラクタでヒープ領域にとるようにすべきなんでしょうか。
0701sageNGNG
それはコンポジションでもなんでもないが、
ポインタでもメンバ変数として持ってもどちらでもよい。
0702デフォルトの名無しさんNGNG
OO用語つかいたいなら集約にしとけ
0703デフォルトの名無しさんNGNG
集約=コンポジション?
0704700NGNG
>>701
それはCTime自身がヒープ領域を取るからですか?
0705デフォルトの名無しさんNGNG
集約=アグリゲーションじゃねえの?
0706デフォルトの名無しさんNGNG
勉強し始めの頃は、どちらで持つべきかは好きにしてよい。
0707700NGNG
>>706
了解です。簡単なスタックの方にしときます。
0708デフォルトの名無しさんNGNG
>>704
ヒープにとるぶんにはまあ問題ないでしょう。
スタックだとちょっとまずい。

たとえばCTimeがメンバ変数に大きな配列を持っていて、その実体を
メンバとするクラスAを作ったとする。
このAをプログラム中でlocal変数としてインスタンス化した場合、
大量のスタック領域が消費されることになる。

まCTimeではそんなことは無いから気にしなくてもいいんだけど。
0709700NGNG
>>708
アドバイスどうもです。
CTime,CFile,CStringとかいっぱい入れてるんで
(それをコンポジションと言うと思ってた。なんて言うのだろ)
ヒープにとることにします。
0710700NGNG
ポインタにしたら
Time = CTime::GetCurrentTime();
error C2679: 二項演算子 '=' : 型 'class CTime'
の右オペランドを扱う演算子は定義されていません。
(または変換できません)
って出てしまいました。なんですかこれ?
0711デフォルトの名無しさんNGNG
*Time = 〜
0712700NGNG
>711
ああ、そうか、あれじゃポインタの置き換えになっちゃいますね。ボケてました。
0713デフォルトの名無しさんNGNG
こうして700は一つ大人になった。
0714700NGNG
ProgressCtrlを継承して独自のプログレスバーを
作ったんですけど、
OnPaintがprotected:メンバになっていて
コンパイルエラーになります。
publicにしちゃって良いですか?
0715デフォルトの名無しさんNGNG
>>714
状況がよくわからんが…、OnPaintを外から直接呼ぶ気か?
止めとけ。InvalidateRect() か何かで間接的に使うようにすべき。
0716デフォルトの名無しさんNGNG
オレ、CTime嫌いです。
0717デフォルトの名無しさんNGNG
オレ、>>716嫌いです。
0718デフォルトの名無しさんNGNG
メインフレームのフレームウィンドウを消す方法はありますか?
0719718NGNG
透明にしたり色を変えたりでもいいのでお願いします
0720デフォルトの名無しさんNGNG
>>718
Create時かPreCreateWindowでウインドウスタイルを変える。
0721714NGNG
>>715
またひとつ賢くなりました。
0722デフォルトの名無しさんNGNG
システムモニタのようなスクロールする
折れ線グラフのクラスを作りたいんですが
CPaintDCだけじゃだめでしょうか。
0723デフォルトの名無しさんNGNG
分割ウィンドウについて質問します。
メーラのBecky!を例に挙げますが、このソフトのメール一覧ビューと
本文ビューの間には、縦サイズが固定で日時情報や複数のボタンが
表示されているビューが存在します。
このビューのように、MFCで水平に3分割したビューのうち
中央のビューの縦サイズを固定し、なおかつドラッグしても
縦サイズが保持されたまま移動するビューの実現はどのように
すれば良いのでしょうか?
参考になるソースへのポインタだけでも教えて頂けると有り難いです。
0724デフォルトの名無しさんNGNG
>>720
>Create時かPreCreateWindowでウインドウスタイルを変える。

ありがとうございます。が、PreCreateWindowだとアサートされてしまうので
Create時に試してみたところ、
ModifyStyleEx(0, ~WS_EX_WINDOWEDGE);
ではまたもにクリックできないようになり、
ModifyStyleEx(0, WS_EX_TRANSPARENT);
では期待した効果が得られませんでした。具体的にはどうすればいいのでしょうか。
0725デフォルトの名無しさんNGNG
>722
http://www.codeguru.com/bitmap/Graph.html
ほれ
From CodeGuru
0726725NGNG
リンク間違えた
>>722
http://www.codeguru.com/bitmap/Graph.html
0727デフォルトの名無しさんNGNG
>>725神
このサイトいいですね。
0728smatNGNG
たびたび、お世話になります。
ショートカットの上にドラッグ&ドロップしたときにファイル名又はフォルダ名を
をGETするにはどうすればよいのでしょうか?
::DragQueryFile(...)のまねをしたいのです。
0729デフォルトの名無しさんNGNG
>>728
GetCommandLine
0730デフォルトの名無しさんNGNG
>>725
これって端っこまで行った時、画面からはみ出てしまいます。
自動的にスクロールするようなやつ、ないですか?
0731デフォルトの名無しさんNGNG
>>730
プログラマだろ?
自分でカスタマイズしろよ
0732725NGNG
>>730
http://www.codeguru.com/controls/oscope.shtml
http://www.codeguru.com/controls/histogram_control.shtml
こんなのもあるぞ
0733デフォルトの名無しさんNGNG
>>732
付き合いすぎ。
自作自演?
0734725NGNG
>>733
いやなんとなく親切したい心理状態
昨日ペイフォワードみたからな
0735smatNGNG
>>729さん
Quick Responseありがとうございます。
早速やってみました。
GetCommandLine()で大概はOKなのですが、問題があります。
その問題とは、ファイル名がMS-DOSファイル名(8.3形式)にされてしまうのと、
ファイルを複数ドロップしたときに、ファイル名がスペース区切りにされてし
まうことです。::FindFirstFile()等でMS-DOSファイル名で検索し、
WIN32_FIND_DATA構造体の中にLong file nameで格納されていれば問題なし
なのですが、まだそこまで確認できていません。
MS-DOSファイル名→Long file name変換の関数があれば何の問題もないのですが。
0736デフォルトの名無しさんNGNG
GetLongPathName()
0737デフォルトの名無しさんNGNG
自分で全部作ったから
ゴルァしようかと来て見たら
732のような天使がいて心洗われました。
0738smatNGNG
>>736さん
ばっちりです。ありがとうございました。WIN32 APIを打ち込みするのに
::をいれたら__argcと__argvが出てきたのを偶然発見したので、もしかしたら
と思って、使ったらうまくいきました。
以下動作確認部分のコードです。

...
int arg_cnt = ::__argc;
CString s="";
char buff[MAX_PATH+1];
for(int i=1; i<arg_cnt; i++){
::GetLongPathName(::__argv[i],buff,MAX_PATH+1);
s += buff;
if(i != arg_cnt-1 ){
s += "\n";
}
}
MessageBox(s);
...
0739デフォルトの名無しさんNGNG
OnInit内でのエラー処理ってどうやるんでしょう?
returnしただけだとウィンドウが残ったままです。
WM_DESTROYするとアプリケーションエラーになります。
0740デフォルトの名無しさんNGNG
VC++相談スレにも書いたのですが・・・。
二重書き込み申し訳ないです。

COleDataSource::OnRenderGlobalData
COleDataObject
の、サンプルコードがあるところを教えてください。
達人の方々、簡単なサンプルコードをいただけると幸いです。
サパーリわからなくて困り果てています。うう(泣
0741739NGNG
OnInit内でレジストリ判定とか入れてエラー処理を入れるのは
だめなんですか?
どのサイトみてもそういうサンプルがないので。
0742デフォルトの名無しさんNGNG
>>741
OnInitって何よ?
.NETの話ならスレ違い。
0743デフォルトの名無しさんNGNG
たぶんOnInitDialogだが
問題点すら明確に伝達できないやつに教えるのはばかばかしいので
さらしage
0744デフォルトの名無しさんNGNG
>>743
>returnしただけだとウィンドウが残ったままです。
>WM_DESTROYするとアプリケーションエラーになります。
ゆーてるやろもうええわ!っち。
0745デフォルトの名無しさんNGNG
起動時のエラーチェックはアプリケーションクラスでやれ馬鹿
0746デフォルトの名無しさんNGNG
>>745
>>744は元VB厨だからForm_Loadでエラーチェックするのが作法なんだよ、きっと。
0747デフォルトの名無しさんNGNG
CWinAppとCDialogの派生クラスが切り離されている意味がよく分かってないんだね。

なんとか入門の本を読んでも、その辺の構造について解説してないもんな。
0748デフォルトの名無しさんNGNG
おーい>>739どこいった?
0749デフォルトの名無しさんNGNG
>>744
MFCのフレームワークにはOnInitなんてハンドラはないんだけど。
0750739NGNG
>>745
ほんとにありがとう!
>>746
VBはやったことないです。元DOSプログラマ。
>>747
基礎がなってないのは自覚してます。
>>748
来ました
>>749
OnInitDialogでした。
0751EBINGNG
6.0で画像を90度回転させるのってどうやるの??
0752デフォルトの名無しさんNGNG
>>751
画像の回転には5.0でも4.0でも
バージョンは関係ない。

ちなみに
pDC->StretchBlt(xDest, yDest, bm.bmWidth, bm.bmHeight, &memDC,
bm.bmWidth-1, 0, -bm.bmWidth, bm.bmHeight, SRCCOPY);
このsrcの値を変えれば回転する。
0753デフォルトの名無しさんNGNG
よく見たらアプリケーションクラスにデストラクタがありません!
なんでですか?
0754jhonNGNG
>>753
デストラクタは基本クラスにあるだろ
オーバーライドしてないだけだろ
0755753NGNG
>>754
ExitInstanceで処理することにしました。
0756デフォルトの名無しさんNGNG
>>755
当たり前。
0757 NGNG
画面に出たウィンドウの特定のボタンを自動的に押す という
方法はどのようにするのでしょうか。
spyというやつでid(?)取得してどうこうするのでしょうか?途方にくれてます。
0758デフォルトの名無しさんNGNG
できないことないけど、なんでそんなことしたいの?

rocket mouse買う方が簡単でやすくつくよ
0759757NGNG
ユーザにどうしても押されたくないボタンがあるんです。
だからウィンドウがでたらキャンセルを自動的に押して
キャンセルしたいんです。
ほかの方法でもいいんですが...
0760デフォルトの名無しさんNGNG
(´-`).。oO(自爆ボタンかな?)
0761デフォルトの名無しさんNGNG
>759
WM_CREATEをフックして送られてきたハンドルからボタンのハンドルをゲットしてMESSAGE送る。
0762デフォルトの名無しさんNGNG
すなおにdisableしとけよ
0763759NGNG
その押されたくないボタンのプログラムはexeしかないんです。
0764デフォルトの名無しさんNGNG
>759
フックしなくてもよかった。
普通にWM_CREATEでSendMessage送れヴぁ?
0765759NGNG
ふーむ。なんせMFC初めて間もないので方法すら分からないのでした。
0766デフォルトの名無しさんNGNG
>>763
押されたくないボタンのあるアプリなんか使わせなければいい。
0767デフォルトの名無しさんNGNG
何のボタンなのかすげー気になる
0768757NGNG
ふむむ。努力してみます。ちなみに押されたくないボタンは顧客情報を
エクスポートするボタン。
フリーでも画面に出た特定ボタン押すというソフトあるれどこれじゃその
ソフト終了されたらおしまいだし。だから自分で偽装したやつ作る必要が
ある訳でした。
多分rocket mouseも簡単に終了できんるですよね。これいいと思ったんですが。
0769757NGNG
さげ忘れたごめんなさい。
0770デフォルトの名無しさんNGNG
VisualStudioでEXEをリソース形式で開けば
ダイアログのボタンとか削除とか、disableにできるよ。

ダイアログじゃないとか、
動的にコントロールを制御してるようだと、
駄目だけどね。
0771デフォルトの名無しさんNGNG
>>770
他人のプログラムに改変を加えて再配布というのはいろいろ問題がないか?
0772757NGNG
再配布はしません。改造したexeを内部で使うだけです。
ただ改造すら禁止しているケースもありますが。
というか、誰でもエクスポートできるように作るなと言いたい。
0773デフォルトの名無しさんNGNG
ファイルをダイアログベースのソフトに
ドラッグ&ドロップしてファイル名とパスを
取得したいんですが、よくわかりません。
どなたか、教えていただけないでしょうか。
おねがいします。
0774デフォルトの名無しさんNGNG
WM_DROPFILESのハンドラを作る。
ただしClassWizardはデフォルトではCDialog派生クラスにWM_DROPFILESを表示しないので
クラスのメッセージフィルタを"Dialog"から"Window"に変更する。
0775デフォルトの名無しさんNGNG
>>774
ありがとうございます。
まだファイル名がうまく取れませんが、ドロップは認識しました。
0776757NGNG
なんとかできそうです。ありがとうございます。
それにしてもVC(MFC)は奥が深いです。
0777 NGNG
ラジオボタンを使用するためにDoDataExchange()で
DDX_Control(pDX, IDC_RADIO1, m_radio1)
としているんですがこれって問題ありますか?
0778デフォルトの名無しさんNGNG
>>777
afxdd_hを見たところDDX_Control関数の3番目の引数が参照になってるね。
m_radio1はポインタなの?
0779777NGNG
ヘッダファイルで
CButton m_radio1;
としています。

他のコントロールならばClassWizardで追加するのですが、
グループスタイルの無いラジオボタンなので手作業で追加しました。
0780デフォルトの名無しさんNGNG
>>779
あーなるほど。グループスタイルを付けないと
ClassWizardじゃDDX変数を作れないんだ。
しかしなんでグループスタイル付けないんですか?
0781777NGNG
>>780
全部のラジオボタンにグループスタイルつけるとラジオボタンのON/OFFが
各ボタンでばらばらになってしまうからです。
例えば、

○ラジオボタン1
○ラジオボタン2

上のように二つのボタンがあったとき、1だけにグループスタイルをつけると
1をONにしたときに2が自動的にOFFになり、またその逆も可能です。
ところが両方のボタンにグループスタイルを設定してしまうと、
2は1のON/OFFとは関係無しに独立して動作します。
0782デフォルトの名無しさんNGNG
>>781
分かった。「1だけグループスタイルあり」でグループ化したとき、
グループスタイルを持たないラジオボタン2以降にも、
手作業でコントロール型のDDX変数を割り当てたいつー話?

たしかに問題ありそうな無さそうな微妙なところですな。
これはMFCのソースを見るしか。
0783デフォルトの名無しさんNGNG
RPGらしきもの作ってて、マップ情報を保存する時にクラスを2次元配列(というかvector)にしたいだが、
CArrayで2次元配列作る方法、操作などがわかりません(;´Д`)
参考してる本はSTL使ってるが良く分からないし、、
どなたか、教えていただけないでしょうか。
おねがいします。
0784デフォルトの名無しさんNGNG
class nijigenhairetsu {
int x_;
int y_;
int *vec_;
public:
nijigenhaitetsu(int x, y) : x_(x), y_(y), vec_(new int[x*y]) { std::fill(vec_, vec_+x_*y_, 0); }
~nijigenhaitetsu() { delete [] vec_; }
int &get(int x, int y) const { return vec_[y * y_ + x]; }
};
■ このスレッドは過去ログ倉庫に格納されています