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

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

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

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

Aは「知ってるつもり君」、「えらそうに解説する人」お断りと
いうことで。
0655デフォルトの名無しさんNGNG
飛んで火にいるあほう鳥。
0656デフォルトの名無しさんNGNG
>>654
同じだからCを勉強しなおせって事だろ。
0657デフォルトの名無しさんNGNG
変数の寿命について勉強しなおすべし。
サブルーチン内の変数はサブルーチンを抜けたら保証されません。
(関数だろというつっこみは禁止)
0658ツッコミNGNG
スコープだろ?
0659うーんNGNG
CStringに 0xF6 0x85 って入れると、GetLength()が
3 返すんだけど、これってバグじゃないかい?
JIS X0208に付いてる資料だと、ユーザ定義文字領域?
0660デフォルトの名無しさんNGNG
卒研で認証画面作ってるのですが、char password[maxpass]
の所でエラーが出てしまい、上手くいきません。何か代替
手段が無いでしょうか?

//パスワード設定
CString key="PASSWORD";
int maxpass = key.GetLength();

char password[ maxpass ];
m_pass.GetWindowText(password,maxpass);
0661デフォルトの名無しさんNGNG
password は静的な確保のため、maxpass が定数でないと
エラーになる。C++の場合:
char *password = new char[....];
....
delete[] password;
とすれば動的確保になるかも。
0662デフォルトの名無しさんNGNG
>>662
あとあとのことを考えるととりあえず3日だけでも卒研を中断して
C/C++の入門書で勉強したほうがいいと思われ。
0663660NGNG
>>661
>>662
どもありがとうございます。まだ本読みながら書いてる
状態なので、もうちょい勉強してから再開してみます。
0664デフォルトの名無しさんNGNG
CStdioFileで、追加書き込みモードでファイルを扱う方法はありますか?
CStdioFile file("hoge.txt", CFile::modeWrite | CFile::modeNoTruncate);
で、オープンすると、上書き書き込みモードになってしまうようです。
0665デフォルトの名無しさんNGNG
AppWizardで2ペインのウィンドウを作ったのですが、(左がCTreeView,右がCListView)
左側のCTreeViewの中にツールバーをつけたいのですがどうやったらよいでしょうか。
CTreeViewのOnCreateでCToolBarCtrlをCreateして、
OnSizeでTreeCtrlとToolBarCtrlの位置を変更してみたのですが、
Viewの中身が描画されずうまくいきませんでした。
0666664NGNG
Seek忘れでした!
0667デフォルトの名無しさんNGNG
MFC+OpenGLでポリゴンビューアを作成しているものです。
私はVisualC++で作成をしているのですが,いままでずっと
メインウィンドウのメニューやサブウィンドウのGUIの作成&設定は
VisualC++のリソースエディタを使ってこつこつ作成してきました.

ですが、最近になってツール(ポリゴンビューア)上から
インタラクティブにサブウィンドウのGUI(テキストフィールド,ボタン等)
を変更・追加・削除する機能をつけたいと思うようになりました.

具体的に似たような機能を持つMayaを例にあげて説明させてもらいます.
(Mayaをご存知でない方申し訳ないです)
MayaのAttributeEditor(サブウィンドウ)を開いてそのメニューの
”Add Attribute”でアトリビュートを追加するとAttributeEditor
に新しい項目(アトリビュート)が追加されてGUIも更新されている、
といった感じのものを作りたいと考えています。

このようなことって実現できるのでしょうか?
リソースデータ等を無理やり書き換えるプログラムを作成するのでしょうか?
それとももっとスマートな方法が存在するのでしょうか?
分かりにくい説明かもしれませんが,ご教授のほどお願いします.
0668デフォルトの名無しさんNGNG
>>667
「追加、削除」を「表示、非表示」と考えたら比較的簡単にできます。

ボタンなどのコントロールも結局CWnd派生ですから
GetDlgItemでコントロールのポインタを取得して
ShowWindowで表示、非表示、MoveWindowで位置を動的に
調整することができます。
また、メニュー項目の追加や削除なども動的に変更できます。
CMenuあたりのヘルプを見てください。
0669デフォルトの名無しさんNGNG
質問です
procedure Tjotai_real.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 文
end;
上の文をFormCreateで呼ぼうと思っImage1MouseDown(Sender,mbLeft,ssShift,0,0);
をしたのですが「TshiftStateとEnumerationには互換性がありません」って警告が
出ます。
どうしたら良いでしょうか?
0670669NGNG
誤爆
0671デフォルトの名無しさんNGNG
CMDIChildWndから派生させたクラスで、
WS_VSCROLLとWS_HSCROLLを指定して
生成したウィンドウをスクロールさせたいのですが、
引数で渡されるCScrollBarが死んでいる様子なので
GetScrollBarCtrlを使おうとしたら、GetScrollBarCtrlは
WS_VSCROLLで生成したスクロールバーには無効と
MSDNに書いてありました(涙)

どうやって制御したらよいのでしょうか?
本も10冊近く調べ、MSDNもしつこく調べたのですが
よくわからなくて・・
どなたか教えてください!よろしくお願い致します。
0672671NGNG
「引数で渡される」と書いた関数はOnVScrollです。
0673デフォルトの名無しさんNGNG
>>671
CScrollBar::SetScrollInfo()ではなく
CWnd::SetScrollInfo()をウィンドウ自身に対して使う。
0674671NGNG
>673
ありがとうございます!
CWnd::GetScrollInfo&SetScrollInfo&ScrollWindowでなんとなく動くようになりました。
でも、クライアント領域の再描画がうまくいきません。
調べてみます。
0675デフォルトの名無しさん NGNG
>>667
あんた、ものすごく仕事の相談してるっぽいな。
ところでGUIのボタン等はMFCでクラス化されてるんだから
動的にクラスの実体を作ればいいだけのこと。
C++から勉強し直すことをオススメするよ。
0676デフォルトの名無しさんNGNG
>>668,675さん
 貴重なアドバイスありがとうございました.
 確かにC++(オブジェクト指向)の理解が足りないと思います。。
 どうもありがとうございました。
0677デフォルトの名無しさんNGNG
age
0678デフォルトの名無しさんNGNG
mfcのMDIアプリのウィンドウメニュー(重ねて表示/並べて表示/...)
に現在開いているウィンドウが、自動的に追加表示されますが、
特定のウィンドウはメニューに表示されないようにしたいのですが、
どうしたらいいのでしょうか?
0679デフォルトの名無しさんNGNG
>>678
その表示したくないウィンドウを、Doc-Viewアーキテクチャ以外
(例えばモードレスダイアログとか、MDIフレームとは独立した
ChildFrameとか)で作る。
0680678じゃないけどNGNG
な〜る
0681デフォルトの名無しさんNGNG
>>679
それでうまくいきました。どうもありがとうございました。
0682デフォルトの名無しさんNGNG
こんばんは。
AfxBeginThreadについて質問です。
下にあるソースを実行すると、

----------------------------------------------------
error C2665: 'AfxBeginThread' : 2 のオーバーロードは
1 番目の引数を 'void (void *)' から要求の型に変換できません。
----------------------------------------------------

というエラーが出てきてしまいます。
Threadをstaticで宣言しているのになぜですか?

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

protected:
・
・
・
};


void Caaa::Rethread()
{
if (AfxBeginThread(Thread, pParam) == -1)
{
//処理
}
return ;

}

void Caaa::Thread(LPVOID p)
{
//処理
return ;
}
0683デフォルトの名無しさんNGNG
>>682
&Thread
ポインタの勉強を最初からやり直せ。
0684デフォルトの名無しさんNGNG
>>683
いやそれは別に問題なかろう。

UINT Caaa::Thread(LPVOID p)
{
//処理
return ;
}
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で処理することにしました。
■ このスレッドは過去ログ倉庫に格納されています