■ VisualC++(MFC限定)相談室 MFC9.dll■

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
Microsoft Foundation Classライブラリ専用スレです。

スレタイ壊れいるけど前スレ
■ VisualC++(MFC限定)相談室 MFC8.dll■
http://pc2.2ch.net/test/read.cgi/tech/1056584836/

関連リンクは >>2-10 の辺り。
過去スレ
■ VisualC++(MFC限定)相談室 MFC8.dll■ (スレタイ壊れているけど前スレ)
http://pc2.2ch.net/test/read.cgi/tech/1056584836/
■ VisualC++(MFC限定)相談室 MFC7.dll■
http://pc2.2ch.net/test/read.cgi/tech/1047949606/l50
■ VisualC++(MFC限定)相談室 MFC6.dll■
http://pc2.2ch.net/test/read.cgi/tech/1039607377/
■ VisualC++(MFC限定)相談室 5■
http://pc3.2ch.net/tech/kako/1028/10285/1028553308.html
■ VisualC++(MFC限定)相談室 4■
http://pc3.2ch.net/tech/kako/1021/10216/1021620974.html
■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/tech/kako/1014/10140/1014057520.html
■ VisualC++(MFC限定)相談室 2■
http://pc.2ch.net/tech/kako/1008/10080/1008031675.html
■ VisualC++(MFC限定)相談室 ■
http://pc.2ch.net/tech/kako/989/989902845.html
3デフォルトの名無しさん:03/08/29 06:02
>>1よ。そのテンプレは漏れが作ったものだが
「て」が抜けてると指摘があっただろ?(;´Д`)
スレ違ひ
>■ VisualC++(MFC限定)相談室 MFC8.dll■ (スレタイ壊れているけど前スレ)
>http://pc2.2ch.net/test/read.cgi/tech/1056584836/
違法コピーソフト屋を晒すスレ
5デフォルトの名無しさん:03/08/29 11:38
VisualStudio .NET Professional 2003 にてMFCを利用してプログラムを作成しております。
有る程度プログラムが動くようになり、処理のボトルネックとなる部分をさがしていますが
プロファイラがみつかりません。
VC6には有ったような気がするのですが……。
>>5
ないもんはない
7デフォルトの名無しさん:03/08/29 12:06
んなもんねぇよヴォケ
>>4
文盲age
9デフォルトの名無しさん:03/08/29 13:57
>>4はポインタにNULLを代入してメモリを解放した気になってるタイプだな。
101:03/08/29 19:23
>>3
「てをぬくな」ってのはそういう意味だったのか・・・
>584の関連リンクの不備を指摘しての「手を抜くな」
だと勘違いした・・・(;´Д`) スマヌ
11デフォルトの名無しさん:03/08/30 01:04
CBTProcフック仕掛けておいて、別のアプリケーションを起動してそのウインドウが全く表示されないようにShowWindow(hWnd, SW_HIDE)してるのですが、
電卓とか普通のアプリだと上手く起動の隠蔽を出来るのにMFCアプリケーションは隠すことができません。
MFCで作成されたアプリケーションのウインドウって特殊なんですか?
もし方法を知っている方、情報おながいします。
どこでShowWindow()関数を呼んでる?
おそらく目に見えないフレームワーク内で再度SW_SHOWされているからだろう。
13デフォルトの名無しさん:03/08/30 01:21
>>12
直接コールバックプロシージャの中に書いてます。

LRESULT CALLBACK CBTProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HCBT_ACTIVATE || nCode == HCBT_CREATEWND)
{
::ShowWindow((HWND)wParam, SW_HIDE);
}
else
{
::CallNextHookEx(hHook, nCode, wParam, lParam);
}

return 0;
}
>>13
APIフックしてShowWindow()やSetWindowPos()を捕まえちゃえば?
15デフォルトの名無しさん:03/08/30 03:23
度々すいません
MFCのウインドウが表示される瞬間を捕まえるには何の種類のフックを監視すればよいでしょうか?
16デフォルトの名無しさん:03/08/31 15:26
自ウインドウのサイズ(縦横ピクセル)を取得するにはどうすればいいのですか?
取得してCRect構造体に代入したいのです。

CDC *dc = GetDC();
CRect rect;

rect.left = 0;
rect.top = 0;
rect.right = 〜〜〜〜; // ← 自ウインドウの横幅を入れたい。
rect.bottom = 〜〜〜〜; // ← 自ウインドウの縦幅を入れたい。

>>15
WM_PAINT ではないでしょうか?
1716:03/08/31 16:05
CWnd::GetClientRect 関数で取得できました。スレ汚しすいませんでした。
>>15
WM_SHOWWINDOW
19デフォルトの名無しさん:03/08/31 22:37
CListctrlで全のアイテムを選択状態にするため
SetItemState(-1, LVIS_SELECTED, LVIS_SELECTED);
でしていますが、アイテム数(1万アイテム)が多いと遅いのです。
いい方法はないでしょうか。
SetRedraw(FALSE);
Do();
SetRedraw(TRUE);

// (゚д゚)ウマー?
(゚д゚)ウマー
ていうか>>19の質問は初心者スレの方で最近あったばかりだね
23デフォルトの名無しさん:03/09/01 14:39
>>16 >>18
やってみました。
GetMsgProcでWM_PAINTとWM_SHOWWINDOWの両方を捕まえて
ShowWindowでSW_HIDEにして更にWM_SETREDRAWで描画停止してもダメですた。
ウインドウ出てしまいますた。。。

他に方法探してみまつ・・・。
>>23
PreCreateWindowだかでWS_VISIBLEを外すとか言う話でなく?
>>23
起動時にウィンドウを表示したく無いならまた別な話じゃない?
>>23
もしかしてダイアログベースでやってない?
ダイアログベースだと必ず一度は表示されるみたい>俺も悩まされた

解決法はDoModal()でウィンドウ作成するのではなく
Create()で作成するべし
そうする場合、ウィンドウ閉じたりするのは
もちろんEndDialog()じゃなくPostQuitMessage()などで行うと
2719です。:03/09/02 22:07
>>20 さんありがとう。でも別の原因で遅いことが分かりました。
LVN_ITEMCHANGEDで選択された後、選択されたアイテムの詳細データを取ってきて
表示するようにしています。
それで全部選択すると、ひとつずつデータを取ってきて表示しているため、
時間がかかっていました。
複数選択する場合は最初に選択されたものだけデータを表示すればよいので
後は無視できれば良いのですが、何か良い方法はありますか?
2820:03/09/03 10:12
>>27
MSDNに思いっきり書いてると思うんだが
GetFirstSelectedItemPosition();
>>27
だったら、LVN_ITEMCHANGEDで通知されてきた時のアイテムと
最初の選択アイテムが同じでなければ処理を省けばいいんでないの?
30デフォルトの名無しさん:03/09/04 05:58
STLのvalarrayを使いたいのですが

const double a[] = {1.0,2.0,3.0};
std::valarray<double> v(a,3);

のように書くと
error C2039: 'valarray' : 'std' のメンバではありません。
というエラーが出てしまいます。
なぜなのでしょうか。
使っているのはVisual C++.NETです。
>>30
ヘッダをインクルード
3230:03/09/04 11:23
>>31
#include "stdafx.h"の前に#include <valarray>
と書いていたのですがコメントアウトしてみても
同じエラーが出るので
#include "stdafx.h"の後に"include <valarray>
と書くと
error C2059: 構文エラー : ')'
error C2334: ':' の前に予期しないトークンがありました。関数の本体は無視されます
見たいなエラーが28個もでてしまいます。
ヘッダをインクルードする順序でエラーになったりならなかったりするのでしょうか
>>32
多分ちんたこすエラー。
ソースの先頭部分(ヘッダ宣言部分)を貼ってみ。
>>30
だからよう、スレ違いなんだよ。
3530:03/09/04 12:49
>>33

#include "stdafx.h"
#include <valarray>
#include "hoge.h"

#include "hogeDoc.h"
#include "hogeView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

こんなかんじです。
36のりー:03/09/04 13:49
VC++6.0 MFCを使っています。
プロジェクトを作成する際にダイアログベースで
作ろうと思っているのですが、
実行してすぐに出てくる画面(ダイアログ)に
プロパティシートを設定することができません。

プロパティシートを実行してすぐのダイアログに設定する場合、
モーダル、モードレスどちらで作成しても同じなのでしょうか?
モーダルでプロパティシートをダイアログに表示させるとボタンは
ダイアログのボタンが設定されるのでしょうか?
モーダルのボタンは消えてくれるのでしょうか?

わたしが作った結果、モーダルで実行するとプロパティシートが出てきた後、
OKボタンをクリックするとダイアログがでてきました。
DLGクラスのOnInitDialogの最後にシートのDoModal()を書いたのですが
書く場所がおかしいのでしょうか?

よろしくおねがいします
日本語がおかしい。
38デフォルトの名無しさん:03/09/04 15:43
>>26
MFCのアプリを作っているわけではなくて、
MFCで出来てるアプリを外部から操作したい、という事なのです。
(ちなみに操作側のexeとdllはC++Builderで作ってます。)

ググってみてもMFCアプリ作成時にコレとコレをこうすれば表示されないというTIPSはあったのですが、既存のMFCアプリを外部から操作する時の話はさすがに見つかりませんですた。。。
>>38
MFCでできてるかどうかってのはあんまり関係ないと思うんだが…
4019です:03/09/06 02:14
いろいろアドバイスありがとうございます。
何とか解決できました。
41デフォルトの名無しさん:03/09/06 16:40
スプリッタウィンドウ内のフォームビューの3D枠をなくすにはどうすれば良いでしょうか?
ビューやメインフレームで cs.dwExStyle &= ~WS_EX_CLIENTEDGE; とやっても無理でした。
フォームビューならWS_CHILDじゃねーの?
>>42
そりゃデフォルトでそうなってる。
スプリッタウィンドウの3D枠は内側のペインに付いてるんじゃなくて
CSplitterWndの境界線のほうに付いてるものだから。
派生クラスを作ってCSplitterWnd::OnDrawSplitter()をオーバライドするんでないか?
って、試そうとしたらクラス作成ウィザードでCSplitterWndの派生クラス作れないよ・・・。(VC++2002)
45デフォルトの名無しさん:03/09/06 22:02
小泉「しかし、あれですな。改革改革と言ってれば阿呆な国民は支持してくれるんだから楽なもんですよ」
亀井「親小泉と抵抗勢力の対決構図を煽った甲斐があったってもんだよな」
青木「そうだわな」
古賀「単純な奴らですよね」
野中「私と青木君が対立してるなんてマスコミの報道は笑っちゃうよ。あとは粛々と詰めの作業を行うだけだな」
小泉「そうですね。あともう少しですよ」
江藤「ここまで来るのに苦労したが、これで我が党は安泰だな」
橋本「我が派も安泰ですよ」
森 「どうだ小泉君、今度の選挙もいけそうか」
小泉「任せてください。今回も圧勝しますよ。俺が何言っても支持しますからね、あいつらは」
野中「君もワルよのお。小泉君」
小泉「いえいえ。野中さんほどではありませんよ。フッフッフ」
青木「だわな」
一同「フッフッフッフ。アッハッハッハッハッハッハッハッ」
>>44
ウィザード使わずに自分で書けばいいよ
47デフォルトの名無しさん:03/09/08 01:59
>>30
> ヘッダをインクルードする順序でエラーになったりならなかったりするのでしょうか

デフォルトの設定だとstdafx.hを一番最初に読み込むので、それより
前にインクルードしても無意味。

で、後にvalarrayをインクルードするのが正解なんだけど、確かに
なんかおかしなエラー出るね(VC6SP5、VC7.1)。
min, maxとかいうマクロの名前がMFCと衝突してる臭い感じなんだけど
もしそうならMFCとvalarrayの相性が悪いってことなのかなぁ?
4830:03/09/08 02:48
>>47
>min, maxとかいうマクロの名前がMFCと衝突してる臭い感じなんだけど

windef.hに
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
とあったので多分そうだと思います。
それで#undef max #undef minとするとエラーは出ないのですが
勝手にundefしても問題はないのでしょうか。
4930:03/09/08 02:54
MFCと衝突しているというよりvalarrayの
メンバ関数のmin,maxと衝突してるようですね
50:03/09/08 12:22
Buttonコントロールに対してCEdit派生クラスを動的サブクラス化した
場合、どうしてButtonコントロールの外見が描画されるんでしょうか?
私の理解では、動的サブクラス化によってウィンドウプロシージャが
Edit(の継承)のものにかわるので、Editの外見が描画されそうなんですが、、、
ご存知の方、教えてください。
51う(50):03/09/08 12:34
質問を書いた後に気づいたのですが、
もしかして、CEditとかって、コントロールに対しSendMessageするだけの
ラッパーで、派生クラスはEditコントロールの実装(ウィンドウプロシージャ)を
全く持っていない。だから、CEdit継承クラスであってもEditの外見描画機能は持っていない、
→よって、Buttonの外見が描画される
ってことなんでしょうか?
ああ、そうだよ。

でも、そんなことするな。
53デフォルトの名無しさん:03/09/08 22:20
>>49
漏れならvalarrayを自分のインクルードフォルダにコピーして
min, maxの名前をちょっと変えると思う。
valarrayはvalarrayだけで自己完結してそうだけど
MFCのヘッダいぢるといろいろめんどくさそうだし。
54デフォルトの名無しさん:03/09/10 03:31
VC&MFC初心者です。

クライアントウインドウのデバイスコンテキストを取得する方法として
CClientDCと、ON_PAINTイベントでのCPaintDCと2種類ありますが、
書籍によると、”さまざまな理由から”ON_PAINTイベントでは
CPaintDCを使います。と書かれていました。

”さまざまな理由”とはなんでしょうか?
初心者に理解できないようなことならいいですが、
簡単な事であるなら教えてください。
>>54
(1) WM_PAINTハンドラに必須なBeginPaint()/EndPaint()の実行
CClientDC -- 自分でBeginPaint()/EndPaint()を呼び出すコードを書かないとだめ。
CPaintDC -- コンストラクタ/デストラクタにカプセル化されているので書かなくていい。
(2) 描画範囲
CClientDC -- 常にクライアント領域全体を対象とする。
CPaintDC -- InvalidateRect()された範囲のみが対象なので描画が速いことがある。
>>55
ありがとうございました。理解できました。
「開く」で開いたたファイル(ファイルはひらがなや漢字のTXT)を
読み込み"1文字づつ"変数strに代入したいのですが、

void CHogeDoc::Serialize(CArchive& ar)
{
// 省略
}else{
CFile *cf;
CString FileName, str;
int FileLen, i;

cf = ar.GetFile();
FileName = cf->GetFileName();
FileLen = cf->GetLength();

for(i=0; i<FileLen; i++){
// 一文字づつstrに代入したい。 ← ここが知りたいです。
// ここにstrを使った処理を記述する予定
}
}
無駄だ
>>57
1文字なら、charではないだろうか?
なぜCStringに入れたいのだろうか?
charなら、BYTEでcastして、
 char c;
 ar >> (BYTE)cr;
で良いのではないだろうか?
 BYTE b;
 ar >> b;
でも良いけど。
一番高速なのはファイルサイズを取得して
new して fread
>>59
1文字とは半角英数でなくてひらがなや漢字の1文字という意味です。

>>60
freadですか。ありがとうございます。
>>61
fread() = cf->Read()

バッファに読んだデータからマルチバイト考慮して1文字ずつ取り出すなら
_mbsinc() かな。
あと、メモリマップトファイル使えば、いちいちバッファ読みこむ必要ない。
63デフォルトの名無しさん:03/09/11 08:27
質問です。
Win32Applicationで作ったプロジェクトから
ClassWizardを使えるようにする事って可能ですか?
>>63
VC++ 2002以降ClassWizardは廃止されますた。
6563:03/09/11 09:55
環境書き忘れました。
VC++6.0なんですけど、無理ですか?
6659:03/09/11 23:22
>>61
きっさーん、forループがFileLenで1byteずつ回してるやないかぁ?
ワナにかけやがったな。
夕陽に向かってバカヤローぉ。
67デフォルトの名無しさん:03/09/13 14:25
::PostMessageで他のアプリのウィンドウにメッセージを送って
処理しているのですが、どうもメッセージを受け取る反応が
鈍いのです。(受けアプリのWindowProcで処理)
数秒してから反応するような感じです。
瞬時にメッセージ受信できるようにする方法はないでしょうか?
どなたかご教授ください。

>>67
::SendMessage()じゃだめ?

::PostMessage()の後で、::Sleep(0)してみるとか。
69デフォルトの名無しさん:03/09/13 17:37
>>68
SendMessageでOKでした、ありがとうございます!
アラフシギ
>>70
これだけでゲラゲラワラタ(;´Д`)漏れはもうだめかもわからんね
CDocumentに複数のビューが関連付けられているアプリケーションで、
CDocument::UpdateAllViewsで各ビューのOnUpdateが呼ばれる順番を
制御するにはどうしたらいいのでしょうか
73デフォルトの名無しさん:03/09/14 04:33
VC++6使ってんだけど、MFC使うと絶対フォームが白の背景になるわな?
これ、普通のボタン表面の色に出来んの?
VBみたくならんの?
>>73
〜View::OnDraw(CDC *pDC)
{
CRect rect;
GetClientRect(&rect);
pDC->FillSolidRect(GetSysColor(COLOR_BTNFACE));
}

// (・∀・)ニヤニヤ
〜View::OnEraseBkgndだろ
なに?リソースエディタ?
76名無し@沢村:03/09/14 13:01
>>73
MFCでもFormの背景はボタンの色と同じだが。
77デフォルトの名無しさん:03/09/14 18:47
ff

>72
CDocumentでListを持っていたと思います。
ソースをのぞいて見てください。
制御したいのでしたらそれうまく利用してください。

さがしましたよ
POSITION pos = GetFirstViewPosition();
CView* pView = GetNextView(pos);
これでしょ?
CDocument::m_viewList
これだね!

ってこれで答えになってますか?
7972:03/09/15 04:22
>>78
レスありがとうございます。
確かにそれでできそうですね。
protected メンバなので派生クラスからも操作してokと
判断していいのかな・・・?
チョクでいぢることによって悪影響が出ないかちょっと心配ですが。
わざわざ探して頂き感謝です。
80デフォルトの名無しさん:03/09/15 10:13
名前:心得をよく読みましょう :03/09/15 04:15 ID:GKbg9PND
先ほどより当方の利用しているプロバイダが規制対象になってしまったので
代行をお願いしたいです。
親切に教えてくださった方にお礼を言えないのは激しく鬱なので・・・

【板名】プログラム
【スレのURL】http://pc2.2ch.net/test/read.cgi/tech/1062098350/
【名前】72
【メール欄(省略可)】sage
【本文】
>>78
レスありがとうございます。
確かにそれでできそうですね。
(省略されました・・全てを読むにはここを押してください)
ひゃひゃひゃアク禁だってよ
82デフォルトの名無しさん:03/09/15 11:04
質問がこのスレにマッチしているかわかりませんが、他に適当なスレも
ないので質問します。

ワトソン博士・gdbのようなデバッガ・ダンプツールの使い方です。
エラーが発生したときに、皆さんどこの情報を見ます?
私の場合、自分で作成したアプリなら スタック バック トレース を見て
どこでエラーが発生したのかアタリを付けるぐらいしか使わないです。

私の場合、機械語・アセンブラは概要を知っているのみでi386・nasmプログラミング
をした経験はありませんのでレジスタ値を見ても、こーゆー値が入ってるんだね、
でもオレには役に立たないなと思ってしまうのですが、機械語・インテルアーキテクチャ
バリバリの人にはあれってすっげー役に立つもんなんでしょうか?
知っててもあんまり使わない、ということであればいいんですが
ないと困る、というものであればあーゆーのを読めるようになる勉強を
したいと思っています。

そこらへんのデバッガ活用ノウハウを記述したおすすめの書籍などありましたら
ぜひご教授いただきたいのですが…。



デバッグツール使うときは、デバッグツールが使えるようなコーディングにします。
スタックをダンプなんてしません、ダンプするのはフレームメモリです。

84デフォルトの名無しさん :03/09/15 14:22
visual c++ 6.0エンタープライスエディションでvisual stdioを
インストできない人いる?インストールの前にback office を
インストールしてくださいってback officeがどこにあるか分からん
のじゃボケ。
キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
そもそもMFCって何?
MFCというよりグラフィックスツールの使い方の質問かもしれませんが、
XPのエクスプローラのボタン上の絵みたいに、背景の色にかかわらずアンチエイリアス
がかかった境界の滑らかなアイコンを作りたいのですが、参考になるサイトなんかが
あったら教えてください。おながいします。
88デフォルトの名無しさん:03/09/16 23:03
CFormViewの背景と同じ色のCOLOREFを
得たいのですがどうすればいいですか。
>>73 が戻ってきたようです。
>>89
ああ、GetSysColor(COLOR_BTNFACE)でよかったわけね
サンクスコ
まあ73ではないわけだが
>>87
英語。本家。
http://msdn.microsoft.com/library/en-us/dnwxp/html/winxpicons.asp

日本語のは知らん。"winxpicons"でぐぐれば出てきそうだが。
>>91
ありがとうございます。日本語版もありますた。
http://www.microsoft.com/japan/msdn/windows/windowsxp/winxpicons.asp
しっかしプログラマがアイコンのデザインまでやってるソフトウエア会社
ってどうなんだろねと思う今日このごろ。
↑PhotoShopが標準ツールなんだ(w
へんちくりんな訳だな。
デザイナ用のページだから? (w
95デフォルトの名無しさん:03/09/18 20:17
レポートスタイルのCListCtrlでヘッダの幅を変えたときに処理したい事があるんだけど
ClassWizardでHDN_ENDTRACKメッセージを拾うようにしても、作成した関数
に CMyView::OnEndtrackList() にお呼びがかかりません。どうすれば
呼んでもらえますか?
9695:03/09/18 23:05
VC側のバグのようですね
http://support.microsoft.com/default.aspx?scid=kb;en-us;281155
・・・しかしON_NOTIFY_REFLECTなんてどこにもないんだけど
こまったな
97デフォルトの名無しさん:03/09/19 02:10
教えてくれくれ。
CToolBarにツールチップを表示させたいのですが、
GetToolBarCtrl().SetToolTips(&m_ToolTip);
とやってもちゃんと表示されないのですが、
どうすればいいのでしょうか?
>>96
普通に定義されてるけど

#define ON_NOTIFY_REFLECT(wNotifyCode, memberFxn) \
{ WM_NOTIFY+WM_REFLECT_BASE, (WORD)(int)wNotifyCode, 0, 0, AfxSig_vNMHDRpl, \
(AFX_PMSG)(void (AFX_MSG_CALL CCmdTarget::*)(NMHDR*, LRESULT*))&memberFxn },
>>96
ClassWizard使わずに自分で書けばいい
100デフォルトの名無しさん:03/09/19 22:22
ClassWizardのスケルトン生成は、使用頻度が高いと思われる物しか、用意されてないわけだが。
>>96 の無いってのがClassWizardになら、IDEのメニューにないコマンドが実行できないみたいなもんか?
10196:03/09/19 23:03
いえ、MSのサイトに
In the CListView-derived class's message map, delete the following line:
   ON_NOTIFY_REFLECT(HDN_ENDTRACK, OnEndtrack)
ってあるんですが、ソース中にそれらしき項目がないんです。CListCtrlだから
かもしれませんが。
ポカーン
MFCでSDI形式の簡単なプログラムを組んでみました。
そこで質問です。

onDraw実行時に他のクラスに属するメンバ変数を参照します。
そのメンバ変数はCString型であり、値は既に代入済みです。
なのに、そのメンバ変数はNULLを返してきます。

なぜこうなってしまうのか。
原因と対処法をお願いします。

環境はVisualC++6.0のMFCでSDI形式のプログラムです。
MFC App Wizardの設定はすべてデフォルトのままです。
NULLになるのは、
・ほかのクラス(のインスタンスへのポインタ?) なのか
・そのメンバ変数(CString型へのポインタ?)なのか
・メンバ変数の文字列評価( CString str;としたときの(LPCSTR)str)なのか
それとも
・そのメンバ変数が空文字列(="")なのをNULLと表記したのか
いったいどれだ?
105103:03/09/20 15:35
>>104
Meiboという名のプロジェクトを組み、CStudentクラスを追加しました。
class CStudent : public CDocument
{
//(中略)
public:
CString name;
}
上のようにCStudentクラスにCString型のnameを作り、PreCreateWindowでnameに"佐藤"と代入します。
BOOL CMeiboView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを
// 修正してください。
CStudent sato;
sato.name = "佐藤ピロシ";
return CView::PreCreateWindow(cs);
}
そしてonDrawにてnameの中身を表示します。
void CMeiboView::OnDraw(CDC* pDC)
{
CKurasu2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
CStudent sato;
pDC->TextOut(100, 100, sato.name);
}
これを実行すると「佐藤ピロシ」と表示されてもいいはずなのに何も表示されないのです。
なお、pDC->TextOut(100, 100, sato.name);
でなくとも、onDrawからよそのクラスの変数を見に行こうとするとやはりうまくいきません。
どうなっちゃってるんでしょう、ピロシたん・゚・(つД`)・゚・
あんたそりゃ表示されなくて当然だよ
PreCreateWindowのsatoとOnDrawのsatoは
別物のローカル変数
>>105
ちみは、ろーかる変数といふものを分かっていないようだね。
PreCreateWindowでのsatoと、
OnDrawでのsatoは別物です。

MFCなんか使う前にCをべんきょうしなたい。
108103:03/09/20 16:10
>>106
>>107
そうなんでつか?
PreCreateWindowでもOnDrawでも、
    CStudent sato;
    sato.name
で同じCStudentのnameを参照しにいってると思うんだけど。
どう対処したらいいんだろう?

あと、105見づらくてスマソ
>>108
CMeiboViewクラスにCStudent型のメンバ変数を持たせて
そのメンバ変数に代入、表示させる。
>>105
C++の基本&MFCのDoc-View構造を理解しておいた方がいいかと

>> class CStudent : public CDocument
↑にも突っ込みいれたいとこだけど

111103:03/09/20 16:55
ありがとう!わかりました。
CMeiboViewクラス内で、
(PreCreateWindowやOnDrawなどの)CMeiboViewメンバ関数外
のどこかで
    CStudent sato;
を宣言してやればよかったんですな。

どうやら自分は
「メンバ変数はグローバル変数でもある」
と間違った思い込みをしていたようで、

class CStudent : public CDocument
{
//(中略)
public:
    CString name;
}

という宣言だけでnameはグローバル変数であると思い込んでいました。
どうもありがとやんす
112デフォルトの名無しさん:03/09/20 17:13
アプリを作っていて、他のウィンドウの背面にあるウィンドウを手前に
出したくて、普通ならForegroundWindowで問題ないはずなのですが、
なぜか、手前に出てきてくれません。SetWindowPosで最前面にする方法だと
手前に出てくるのですが、これだと、永久にフローティング状態に
なってしまいます。
これって原因わかりますか?または解決方法ありましたらご教授ください
>>111
全然わかってねえ。
>>111
おいおい、とりあえずはそれで動くだろう。
でも、それはトンでもない勘違いだよ。

>> class CStudent : public CDocument
↑を見る限りMFCのDoc-View構造を使ってんだろ。
おそらくAppWizardの吐いたコードを使ってんだろうけど。
ここで詳しくは説明できないが、
あんたのViewクラス内に書いた「CStudent sato;」とは
全く別のCStudentクラスのインスタンスが作られてんだよ。
とにかく、落ち着いてMFCのDoc-View構造を調べるべし。
Doc-View構造以前の問題だなこりゃ。
116(;´Д`)y─┛~~:03/09/20 18:01
LINK : fatal error LNK1104: ファイル "kernel32.lib" を開けません。
っていうエラーがでたときどうすればいいですか?おしえてください
ちなみにvisual c++ 6.0を使用しています
MFCとは関係ないなこりゃ。
え、なに?
まだ夏厨残ってたの?
119103:03/09/20 21:39
>>114
つまりGetDocumentを使ったりして
ドキュメントクラスからアクセスしてみろってこと?

もう少し修行してから出直してきます…
>>119
そもそもCStudentをDocumentから派生させてるところに問題がある。
CStudentは、単なるstructくらいで作れるんじゃないだろか。
CStudentのインスタンスは、たぶん複数人いるんだろうから、
CMeiboDoc(CDocumentの派生クラス)の中に、CStudentを複数持てるように、
メンバー変数として、CStudentの配列かリストで持たせる。
Viewからは、GetDocumentで、そのメンバー変数にアクセスする。
sato君を初期化するなら、CMeiboDocの中でね。
タスクトレイアイコンを表示したいのですが
CMainFrame::OnCreate{
・・・
・・・
Shell_NotifyIcon(NIM_ADD, &m_nid);

}

と書いてもアイコンの上にマウスカーソルを乗せるとアイコンが消えてしまいます。

Win32の方で
case WM_CREATE
に同じようなコードを書くと上手くいくのですが何故でしょうか。

環境はWInXP+VS.net2003です
>>121
m_nid.hWndを設定しないとタスクトレイアイコンが消えるな。他の原因は知らない。
123デフォルトの名無しさん:03/09/22 23:48
>>73だ。
ちょっとレス遅くなってしまってすまない。

>>74
答えてくれたコード書いたけど、エラー出るぞ。
教えてくれるならちゃんと教えてくれよ。
>>123
普通は白くならないから誰も答えてくれないよ。
12573:03/09/23 03:43
あ、ダイアログベースにすればよいのか・・・。
でもSDIとかMDI選んだらなるだろう?
こういうときどうすんの?
>>125
基本クラスにCFormView
127デフォルトの名無しさん:03/09/23 11:00
いつの間にか眠っちまった。
何かのクラスを変えればいいわけだな。
もうちょっと詳しく、と言いたいところだが、自分で考えながらやれるからこれでもいいか。
Viewが付いてるからCTestViewを変えればいいんだろうけど、どうやって変えればいいんだ?
ソース見たところTESTVIEW_Hってヘッダがすでにあるみたいだけど。
>>127
基本クラスってわかるか?
ベースクラスとか、派生元クラスとか、スーパークラスとかいわれる奴だ。
それを変更するんだ。
129デフォルトの名無しさん:03/09/23 11:39
ふむふむ、派生元のクラスね。
でも1つのファイルを書き換えればいいの?
複数ファイルの更新になるんか?
ちょっとVCさわったぐらいだから構造全然分かってないんだけどな・・・。

CTestViewはCViewクラスから派生してるようだから、これをCFormViewに変えたらいいんだよな?
でもpublic CViewってところを変えればいいだけなのか?
130デフォルトの名無しさん:03/09/23 11:50
ちなみにpublic CViewをpublic CFormViewに変えて実行したら
'CFormView' : クラス、構造体、共用体にデフォルト コンストラクタがありません。
ってエラーが出やがった。
コンストラクタが無いクラスなどあるのか?
ハハハハ
お笑いスレですか?
TestView.h と TestView.cpp の全ての CView を変更しましょうね(w
132デフォルトの名無しさん:03/09/23 12:06
お笑いじゃないんだよ。
こっちは知らないから真剣に聞いてるのが分からないのか?
でも、まだ教えてくれたから許してやる。
こういう嫌みを何で言うんだろうね。
133デフォルトの名無しさん:03/09/23 12:15
TestView.h と TestView.cpp の全ての CView をCFormViewに変更したが、
まだコンストラクタが無いってエラーになるぞ。
なんかCTestView::CTestView()に書かないとダメなんだろう?
何を書けばいいんだ?
つきあってる俺ってバカ?
> TestView.h と TestView.cpp の全ての CView をCFormViewに変更したが、
> まだコンストラクタが無いってエラーになるぞ。
なりません。
135デフォルトの名無しさん:03/09/23 12:33
バカじゃねぇぞ。
暇なのか親切なのかどっちかまではわからんが、何にしてもいい奴だよ。
更新抜けがあるのかな?
それともcl.exeかシステムに異常があるのか・・・。
やっぱMSDNでリンクがされないのと関係あるんかもな。
136デフォルトの名無しさん:03/09/23 12:44
だめだ、確認したがCViewってところは無い。
と言うことは、ほんとにシステムの問題の可能性あるな。
VSとMSDNを再インストしたが治らなかったし

OSの再インストかよ・・・。
もまえらネタにしても引っ張りすぎ。
普通はプロジェクトを作るときにCViewをCFormViewに変更するだよ。
あとからソースを変更するのはちょっくら面倒。
それにしても背景色を変えたいというだけの質問が、なぜこんな方向に。
まあ、CFormViewにはデフォルトコンストラクタがないから、
デフォルトコンストラクタを呼ぼうとすると、エラーになるわけだが。
139デフォルトの名無しさん:03/09/23 13:20
なるほどね、サンクス。
さっき言ったこと変更。
いい人じゃなくて、お前最低の奴だな、市ね。
バカな奴はやっぱり自分で分かるものか。
こんな一から2chで教えてもらおうとする奴なんか放置しとけばいいのに。
最後まで低脳児っぷりを見せ付けてくれたな(w
休日だからかな
143121:03/09/23 13:45
>>122
アク禁食らってってレス遅くなりました。ごめんなさい。
m_nid.hWndはm_hWndを設定してあります。
>>143
そのm_hWndがローカルだから無くなってるとか
145121:03/09/23 17:56
>>144
m_hWndはCMainFrameのメンバ変数なのでその心配は多分ないと思います。
146デフォルトの名無しさん:03/09/23 18:17
ダイアログベースで勉強中なのですが
タイマーコントロールがありません
どうすれば出てきますか?(それともタイマーはVBの専売特許?)
>>146
タイマークラスを使ってください。
SetTimer
>>146
タイマーなんてコントロールでやるもんじゃありません
偉い人にはそれがわからんのです。
CPaletteが使えません。

サンプルのDIBLOOKとか検索して出てきたものを参考に
OnInitDialogでパレットの色数を2色を設定にして、
OnDoRealizeを作って、
 OnPaletteChanged
 OnQueryNewPalette
 OnActivateも実装し、
描画時にもSelectPaletteやRealizePaletteや('∀`)実行しているのにも
かかわらず。

グリーンが使えてしまいます。
なぜですか。ダイアログなのがいけませんか。
私は悪くありません。

きーーーーー!!!
( ´_ゝ`)フーン
153151:03/09/23 23:17
たぶん解決しました。(_ _(--;(_ _(--; ペコペコ
154デフォルトの名無しさん:03/09/24 07:23
>>149
しかし、SetTimerも自分でIDふって作るんだから
コントロールとかわらんよな。
むしろコントロールであった方がめんどくさくなくていいよ。
155デフォルトの名無しさん:03/09/24 10:08
質問させてください。


現在、mainframe内に子ウィンドウ(CFormView)を複数
表示させています。

ある子ウィンドウにショートカットキーを設定させたい
のですが、その子ウィンドウがアクティブだろうが非アクティブ
でもそのショートカットキーを有効にしたいのです。

なにか、良い方法があったら教えてください。

>>155
何もしなくても普通にコマンドルーティングされるだろ
157デフォルトの名無しさん:03/09/24 13:03
あるときMFCAPPウィザードでダイアログベースの画面作って
3回目くらいに実行ボタン押したらウントモスントモフリーズではなくて・

いわなくなったのは何が原因でしょうか?
何回もあるのでいっそうのこと手作業MFCでやったほうがいいでしょうか?
自分のバグだろ
>>158
いや、まだばぐというよりも
コントロール貼り付けただけなんだが・・・
もいちどAPPウィザードからやるよ
160デフォルトの名無しさん:03/09/24 15:30
CStringの内容をDWORDに変換したいのですが変換クラスとかないですか?
CString a;
a = "77";
DWORD b = a;
161160:03/09/24 15:58
この方法変換できてるでしょうか?すごく不安です
CString a;
unsigned long b;
a = "77";
a.Format("%lu",b);
162デフォルトの名無しさん:03/09/24 16:41
>160
CString a="77";
DWORD b;
b=(DWORD)atol(a);

ActiveXコントロールのデザインモードでサイズを変更したときに、
WM_SIZEで自分の大きさを取得したのですが、この値を
プロパティーページに追加した、カスタムプロパティーのテキストボックスに
反映する方法ないですか?
163160:03/09/24 16:58
>>162
サンクスコ!
164160:03/09/24 17:01
::PostMessage(hWnd,WM_USER99,0,0);
自作のメッセージを送ったんだけど
そのハンドラの作り方がわかりません><
MFCのダイアログベースでつくっています。
教えてクソ氏ね。
166デフォルトの名無しさん:03/09/24 17:11
cppに、メッセージマップと、実装部を書く

BEGIN_MESSAGE_MAP(CxxxDlg, CDialog)
//{{AFX_MSG_MAP(CxxxDlg)

ON_MESSAGE(WM_USER99,OnWMUser99)

//}}AFX_MSG_MAP
END_MESSAGE_MAP()


LRESULT CxxxDlg::,OnWMUser99( WPARAM wParam, LPARAM lParam )
{

}
167デフォルトの名無しさん:03/09/24 17:13
cppに、メッセージマップと、実装部を書く

BEGIN_MESSAGE_MAP(CxxxDlg, CDialog)
//{{AFX_MSG_MAP(CxxxDlg)

ON_MESSAGE(WM_USER99,OnWMUser99)

//}}AFX_MSG_MAP
END_MESSAGE_MAP()


LRESULT CxxxDlg::,OnWMUser99( WPARAM wParam, LPARAM lParam )
{
return TRUE;
}

ヘッダーに定義を書く

//{{AFX_MSG(Cxxx001Dlg)

afx_msg LRESULT OnCheckUp( WPARAM wParam, LPARAM lParam );

//}}AFX_MSG
DECLARE_MESSAGE_MAP()
168デフォルトの名無しさん:03/09/24 17:14
間違えた・・・

cppに、メッセージマップと、実装部を書く

BEGIN_MESSAGE_MAP(CxxxDlg, CDialog)
//{{AFX_MSG_MAP(CxxxDlg)

ON_MESSAGE(WM_USER99,OnWMUser99)

//}}AFX_MSG_MAP
END_MESSAGE_MAP()


LRESULT CxxxDlg::,OnWMUser99( WPARAM wParam, LPARAM lParam )
{
return TRUE;
}

ヘッダーに定義を書く

//{{AFX_MSG(Cxxx001Dlg)

afx_msg LRESULT OnWMUser99( WPARAM wParam, LPARAM lParam );

//}}AFX_MSG
DECLARE_MESSAGE_MAP()
CxxxDlg::,OnWMUser99
::の後のコンマが
170デフォルトの名無しさん:03/09/24 17:19
>169
訂正ありがと・・・

LRESULT CxxxDlg::,OnWMUser99( WPARAM wParam, LPARAM lParam )
から
LRESULT CxxxDlg::OnWMUser99( WPARAM wParam, LPARAM lParam )
に変更だ。

しかしなんでそんなところにコンマが入るかなァ・・・(藁
ON_MESSAGE(WM_USER99,OnWMUser99)
↑こんな感じのところからハンドラ名をコピペしたからと推測
172デフォルトの名無しさん:03/09/24 17:24
見事!!ずぼしです。鬱・・・
173160:03/09/24 20:04
>>165-172
ありがたや〜ありがたや
ヘッダーにも書くんですね。
174165:03/09/24 20:07
うるせえ馬鹿
175162:03/09/25 11:28
自己解決
>162
BoundPropertyChangedでした。

>173
関数の実行部(実装部)と定義(ヘッダーのやつ)は必ず対です。
そのほかにメッセージがどの関数に対応するかがメッセージマップです。
名前のとおりですな
MFC以前の問題だな・・・
177デフォルトの名無しさん:03/09/25 14:47
質問させてください。

VC++で複数の子ダイアログを表示する方法を教えてください。
子ダイアログにはそれぞれWndProcが走っている状態にしたいのです。


お願いします。
モードレスダイアログ
179デフォルトの名無しさん:03/09/26 04:25
>>178
モーダルダイアリーでしょ
180デフォルトの名無しさん:03/09/26 21:14
質問させてください。
VC++で,自作プログラムから外部プログラムへデータを
渡したいのですが,どんなふうに処理してよいか分かりません.

たとえば,数値データをエクセルに送ってグラフ化するまでを
自動化できないでしょうか?

お願いします。
181デフォルトの名無しさん:03/09/26 23:40
SDIから呼び出す自作ダイアログに、CEditコントロールが張り付けてあり、
ClassWizardでint型のメンバ変数を関連づけてあります。
ダイアログのOnInitDialog()で
  CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_LOAD);
  if(pEdit) pEdit->SetFocus();
としてあるのですが、コントロールにフォーカスが移りません。
一緒にラジオボタンを張り付けてあるのですが、そのボタンにフォーカスが
いってしまいます。どうやったらCEditコントロールにフォーカスをうつせますか?
>>181
return TRUE; の後にあるコメントを訳した奴の日本語能力を呪いながら
return FALSE; に書き換えろ。
183181:03/09/27 01:13
>>182
それ一度やってみて駄目で戻していたんですが、一度プロジェクトを
閉じてからもう一度FALSEにしてみたら出来ますた。どもです。
>>182
お、そうだったのか。解説キボン。
>>184
解説もなにもそのまんまだろ・・・
>184
何を解説して欲しいのかを書け
187184:03/09/27 23:05
いちいちウルセーんだよ
私ゃ184で187じゃありませんが・・・(汗

いやさ、return TRUE;の後ろにあるコメントって、本来どう訳すべきだったのかと思ってね。
コメントの意味が今までどうにも理解できなかったんで放置してたんですよ。
//コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
=設定するときは、戻り値は FALSE となります

でいいんじゃないの。
まあ一般論で言えば>>189の"="は必ずしも成り立つとは限らないわけだが。
一般論はどうでもよい。MSDNに明示されてるんだから。
(´-`).。oO(明示されてることでこんな大騒ぎしてるのか…)
MSDN読む前に質問する厨がいるんだろ…
194デフォルトの名無しさん:03/09/28 22:09
MFCを使用してプログラムしていますが、
WndProcを利用してメッセージを制御したい
と思っています。
WndProcはSDKだけでMFCでは利用できないのでしょうか?

教えてください。
>>194
DefWindowProcじゃダメか?
196デフォルトの名無しさん:03/09/29 09:47
>>195

それってどこで使用すればいいんですか?
また、コントロールにも使用できますか?
マルチ頑張るね
>>194-196
あなたたち、なんの話をしてるんですか?
199頭悪い ◆gGTEz68pSM :03/09/29 10:41
サブクラス化したいってことかいな。
≫180 できる。 オートメーションとかいう技術だったとおもぅ
サングラス化したい?
202サブレラスク:03/09/29 22:21
いや、サブレをラスク化したい?
おじさんつまんなーい。
しこたま傷ついた202
いや、うれしがってるぞぬ。
206デフォルトの名無しさん:03/09/30 04:35
しつもっ、

CWndの関数の、
Invalidate();

InvalidateRect(NULL);
では、何か動作に違いがありますか?
>>206
ないよ。前者は後者のたんなる省略形。afxwin2.inlに両者の定義あるから見てみ。
便乗
CWnd::RedrawWindow()
とは何か違うの?
名前からして再描画にはこれを使ってるけど大丈夫かな。
再描画の必要性を訴える処理:Invalidate
再描画の必要性があるなら描画する処理:RedrawWindow
ではないの? よくわからんけど。
210デフォルトの名無しさん:03/09/30 18:47
InvalidateRect は、API の InvalidateRect を呼び出す。
これはウィンドウのクライアント領域の一部または全体が再描画が必要と
マークして、その後ヒマが出来てメッセージ見に行くと WM_PAINT が着て
るから、そこで描画を行うという手法。本当にお急ぎの場合、メッセージ
見に行くつもりが無い場合には直後に UpdateWindow呼んでも良い。

RedrawWindow は Win32 API の RedrawWindow を呼び出す。
これはウィンドウスタイルを変更したのにフレームがうまく再描画されないとか、
まあ何かわけがあって非クライアント領域も含めて再描画したいときに使う。
これを使うのは WebBrowser コンポーネントをリサイズした後スクロールバーが
ちゃんと表示されない、とかそういうとき。普段は使わない。
>>210
特別なケース以外RedrawWindowは使うなということですね。
俺は、エディットボックス内の再描画とかこんな風に使ってるんで、
止めた方が良いみたいですね。
((CWnd*)GetDlgItem(IDC_EDIT1))->RedrawWindow();

MSDN見てたらヨサゲな名前の関数あったので、それ以来ずっと使っていた・・・
212206:03/09/30 23:22
>>207
さんくすぽ。
213デフォルトの名無しさん:03/10/01 14:47
無料でMFCでの開発が出来る方法無いですか?
MinGWとかで。
214デフォルトの名無しさん:03/10/01 14:49
無料厨がMFCを使うの・・・?
俺にとっては趣味で買うにはちょっと高いもんなぁ・・・
勝手に質問を変えて、VC以外でMFCでの開発ができるツールはありますか?
できれば安い奴で。
Symantec C++ for Windows
217デフォルトの名無しさん:03/10/01 20:39
再描画の際にボタンなどのコントロール部分のちらつきが激しいのですが
対処方法ありますか?
WS_CLIPCHILDRENかな
>>218
コントロールのほうにWS_CLIPCHILDRENを指定していたようです(鬱
サンクスでした。
220デフォルトの名無しさん:03/10/01 22:34
ドラッグ中に表示させるイメージがちらちらするのを抑えることってできますか?

CListCtrlのオーナードローをやっていてます。
以下のようにOnMouseMoveでドラッグイメージを移動させているのですが、
ハイライトを描画を行うために一度ドラッグイメージを非表示にして、
最後に再表示しているのですが、これだとドラッグイメージがちらちら
してしまいます。
エクスプローラではきれいにドラッグイメージが移動しているということは
何か別に方法があるのでしょうか?

void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
...
//ドラッグイメージを移動
m_pDragImage->DragMove(point);
//ドラッグイメージを非表示
m_pDragImage->DragShowNolock(FALSE);
//前ドロップターゲットのハイライトをオフ
SetItemState (m_nDropIndex, 0, LVIS_DROPHILITED);
//再描画
RedrawItems (m_nDropIndex, m_nDropIndex);
// 新しいドロップターゲットを設定
m_nDropIndex = ((CListCtrl*)pDropWnd)->HitTest(point);
//ドロップターゲットをハイライト
SetItemState(m_nDropIndex, LVIS_DROPHILITED, LVIS_DROPHILITED);
//再描画
RedrawItems(m_nDropIndex, m_nDropIndex);
UpdateWindow();
// ドラッグイメージを表示
m_pDragImage->DragShowNolock(TRUE);
...
しつもんです。
ダイアログでスレッドを使用しています。
AfxBeginThread();に対するUINT MyControllingFunction( LPVOID pParam );を
を作ったのですが、スレッドのパラメタにクラスポインタを与えられないで困ってます

ダイアログクラスのメンバ自体がスレッドである書き方はないでしょうか?
static UINT CALLBACK MyControllingFunctionEntry( LPVOID pParam )
{
 reinterpret_cast< MyType* >( pParam )->MyControllingFunction();
}
UINT MyControllingFunction(void);
>>222
ヒント感謝だが、どう調べるかわかりません(汗
AfxBeginThread();で呼び出す関数をコールバックにして
そこから普通の関数を呼び出す?のでしょうか・・・
何かのテンプレートがヒントでしょうか・・・
reinterpret_castはtemplateだったんだよ!
な、なんだっ(ry
225221:03/10/02 10:13
目的は、スレッド内で計算した内容それぞれの表示コントロールに
数値を反映させるだけなんですが
それぞれのコントロールはダイアログのメンバで外部変数で渡す
という考えしかなかったので質問しますた
HWNDをスレッドに渡してそのHWNDに対してユーザー定義メッセージを
SendMessageするのが常道。
227221:03/10/02 11:56
>>226
すいませんスレッドの使い方を間違っていたようです
>226
そういう“常道”って何処に出てるん?
漏れはいつもスレッド作ってるクラス自身のポインタ渡してたYO!
その方が楽だし(汗
その場合のデメリットって何?
HWND&ユーザ定義メッセージ使う場合のメリットって?
教えてクンで申し訳ないけど、教えてプリーズ!
とりあえずサブスレッドでthis->UpdateData();とかするとアサートしなかったっけ。
タイマーで必要十分な事が殆どな気も…。
AfxGetApp()->m_pMainWndで済ませる私。
AfxGetMainWnd()
>>228
MSDNのMFCのテクニカルノートとかスレッドの使い方とかのあたりに出てる。
MFCのクラスの多くはスレッドセーフではない。

CStringはどうだったっけ?
>>232
別スレッドからは使えない。
235デフォルトの名無しさん:03/10/03 16:15
オンラインゲームなどでよくある簡単な個人認証を実装(MFCで)
したいのですがサンプルや情報のあるサイトか書籍を
ご存じでしたら教えてください。
よろしくお願いします

236デフォルトの名無しさん:03/10/03 18:49
>>228
Send/PostMessage を使うと、メッセージハンドラは当然受け側 Window を
作成したスレッドで実行されるわけで、そうすると色々楽できるから。

もちろんワーカスレッドの方で実行したい処理にはメッセージは使わない。
>>235
ソケットを使ってサーバとクライアントソフトウェアを作る。
238デフォルトの名無しさん:03/10/04 19:40
便乗質問。
スレッドにViewのHWNDを渡して、それをつかって
::SendMessageしてもViewにメッセージがこないんだけど
どうしてだろう???::PostMessageならくるのに。。。
239頭悪い ◆gGTEz68pSM :03/10/04 19:53
ソケットを扱うスレッドはUIスレッドにしてる?ワーカースレッドにしてる?
私はワーカスレッドでWSASetEvent()とかWSAWaitForMultipleEvents()を
使ってるんだけど。
240デフォルトの名無しさん:03/10/04 21:58
誰か235の解答してやれよ
ちょうど俺も同じ疑問があったところだしな
>>240
手法を変えてきましたかうんこマルチ
>>240
回答に辿り着くための一つのキーワード→aicrypto

>>238
私は>231のようにして得たDialogにメッセージ飛ばしてるけど。
あぁ、これかい。
http://pc2.2ch.net/test/read.cgi/tech/1059549320/969
http://pc2.2ch.net/test/read.cgi/tech/1059549320/977

自演までマルチとは、かなかなの徹底ぶりですな。
244238:03/10/05 01:49
>>242
::SendMessage(AfxGetApp()->m_pMainWnd->m_hWnd, WM_USER, 0, 0);
なんてスレッド内でやってもやっぱり来ません・・・こちらはSDIですが。
>244
それだとViewには来なくない?
GetActiveViewして、そのHWNDを渡してやんないとイケナイと思うんだが
>>244
そりゃこないだろう。つーか素直にHWND渡せばいいのに。
>>244
つーか元の質問でスレッドに渡してるって書いてるのに使ってねーじゃねーか。
248238:03/10/05 02:52
いえいえ、元々はViewクラスにある構造体のメンバにViewのハンドルをセットして、
その構造体のアドレスをスレッドに渡しているんです。

CMyView::OnBtn(){
  m_cInfo.hViewHandle=this->m_hWnd;
  AfxBeginThread(MyWorkThread, (LPVOID)&m_cInfo);
}

UINT MyWorkThread(LPVOID lParam){
  CMyInfoStruct *pInfo=(CMyInfoStruct*)lParam;
  ....
  ::SendMessage(pInfo->hViewHandle, WM_USER, 0, 0);
}

という感じです。これがPostMessageならちゃんと受け取ってくれます
CDialogで作ったモーダルダイアログの
ウィンドウクラス名 を指定したいのですが、どうすれば良いでしょう?
MFCにまかせたdefaultだと、#32770(ダイアログ)
なんていう名前になるのですが、これを変えたい。

なんで、ウィンドウクラス名を変えたいかというと、
アプリを多重起動しておいて、そいつらに一度にメッセージを送りたいので、
EnumWindowsで見つけやすくしたいという意図です。

AfxRegisterWndClassを使えばよさそうなんだけど、
呼ぶタイミングがよく分からない。
MyDlg.Create(IDD_xxx, NULL) だとクラス名渡せないし。
>>249
ダイアログリソースにクラス名を指定すれ。
もっとも、その目的のためだけにクラス名を変更するのは
いかがなものかとは思うが。
251249:03/10/05 09:24
>>250
それやるとCreate後、ダイアログのメンバーにSetWindowTextしたところで、
ASSERTで落ちてしまいます。なんでだろう?

リソースのプロパティで、「MFCのライブラリを使用」を一旦外して、
そうすると、ダイアログのクラス名が指定できるようになるから、指定して、
で、「MFCのライブラリを使用」をまたチェックつけてあります。
つーか、デフォルトのクラス名、手抜きすぎ。
253251:03/10/05 10:38
>それやるとCreate後
よくみたら、Createがエラーで返ってきてました。
Dialogのクラス名指定は、MFCライブラリを使うと出来ないってこと?
>>253
ダイアログを作る前に

WNDCLASS wc;
::GetClassInfo(NULL, "#32770", &wc);
wc.lpszClassName = "クラス名";
AfxRegisterClass(&wc);
CScrollViewクラスで、スクロールバーをドラッグしたときの移動量を制御したいのですがどうすればええですか?
SetScrollSizesでも無理っぽい・・・
256253:03/10/06 05:14
>>254
できましたぁ。ありあたした〜。

でも、よく考えると、
>>250
>もっとも、その目的のためだけにクラス名を変更するのは
のおっさる通り、
"#32770"のままでも、メッセージは送れますねぇ。
うーん、変えずに行こうかなぁ。
257デフォルトの名無しさん:03/10/06 16:23
>>256
SetProp で適当に印つけとくといいよ。
>>257
そんなAPIがあったとは知らんかったぞえ
259デフォルトの名無しさん:03/10/06 23:12
初心者スレで質問したのですが、返事をいただけなかったので、
こちらで質問させてください。

SDIアプリを作成して、クライアント領域にダイアログを
子ウィンドウとして(WS_CHILD)貼り付けました。
(↓のコードを書きました)

  ::CreateDialog( this->m_hInstance,
    MAKEINTRESOURCE( IDD_DIALOG1 ),
    this->GetMainWnd()->m_hWnd,
    (DLGPROC)DialogProc );

ところが表示はされるのですが、ボタンを押すことができません。
ダイアログをスタイルで「無効」にしているわけではありません。
Spyで調べても、WM_PAINTなどの描画メッセージは来ているのですが、
マウス関連のメッセージは来ません。
どうすればボタンを押せるようになるでしょうか?
260256:03/10/07 01:30
>>257
あ、なーるほど。誤爆の確率がかなーり減らせられるわけでつね。

結局、"#32770"とウィンドウタイトルでFindWindowして、
GetPropで、さらに念のため確認、という風にしました。
めでたしめでたし。
MFC的にはCFormView使えとしか言い様が無いな
CFormViewがどうしても使えないならCFormViewのソースを見るだけでも参考にはなると思う
レギュラーDLLのクラスのエクスポートがサパーリわからん。
何故CWinAppから派生してるのだ。
インスタンス切ったとたんにアサーションでるじゃねーかよぉ。

いい本とかサイトとかないっすかねぇ?
レギュラーDLL、MFCサンプル見てなんとなくわかった。
WinAppの派生クラスはいじっちゃいかんみたいだなぁ・・・よくわからんが。
うーむ、何かいつもと違うことやろうとする必ず詰まる罠。
264259:03/10/07 21:28
>>261
回答ありがとうございます。
グラフィックを表示している横にボタンやエディットボックスを
配置したいと思ったのですが、こういうのは無理なんですね。
残念。
>>264
寧ろダイアログ内にグラフィックを表示しちゃった方が楽じゃね?
266でつ:03/10/08 02:42
>>264
ViewのOnCreateとかに
HWND hDlg=CreateDialog((HINSTANCE)GetWindowLong(m_hWnd,GWL_HINSTANCE),
    MAKEINTRESOURCE(IDD_DIALOG1),m_hWnd,DlgProc);
    ::ShowWindow(hDlg,SW_SHOW);
DialogProcは
BOOL CALLBACK DlgProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp){
    switch(msg){
    case WM_COMMAND:
        switch(LOWORD(wp)){
            case IDOK:
                MessageBox(NULL,"IDOK","",MB_OK);
                return TRUE;
        }
    case WM_LBUTTONDOWN:
        MessageBox(NULL,"LBUTTONDOWN","",MB_OK);
        return TRUE;
    }
    return FALSE;
}
>>264
いやむしろ、質問自体がMFC的でないという点が、スレ違いっぽい。
なぜCDialogを使わないのかと。
268デフォルトの名無しさん:03/10/08 21:46
Visual C++のMFCを使って、D/Aボードに値を出力させたいんです。
>>268
ボードにライブラリが付いている(または別売)から、それ使え。
MFCかどうかは全く関係ない。
270デフォルトの名無しさん:03/10/08 22:17
>>269
ライブラリて何ですか?
マニュアルのこと?
ドライバ
>>270
まずCの勉強からしてこい
273デフォルトの名無しさん:03/10/09 19:16
お聞きしたいことがあります。
chtmlviewの自作ブラウザで、
別ウィンドウを立ち上げた時に
なぜかウィンドウが後ろに隠れてしまいます。
いろいろ自分で調べてみた結果、
http://techtips.belution.com/ja/vc/0012/
(スレッドのインプット状態を共有する方法)
のサイトにその解決法が書いてあったのですが、
それをやってみてもウィンドウが後ろになってしまいます。
他に方法はありますでしょうか

開発環境:
Windows2000 Professional
Visual C++ 6.0 SP5

ブラウザはASPの表示に使用しており、
HTMLの時には上記のサイトの方法で大丈夫なんですが、
どうもExcelファイルを開いた時になるようなのです
たまに前に来たりして挙動がおかしいです

どなたかわかる方いらっしゃいますでしょうか
274デフォルトの名無しさん:03/10/11 09:43
保守
275デフォルトの名無しさん:03/10/11 16:40
MFC限定とのことですが、適当なスレがみつからなかったので、こちらで質問させてください。
適切なスレがあるようでしたらご指摘ください。

質問なのですが、
VisualC++6.0SP5のダイアログエディタの表示がおかしくなる不具合が発生して困っています。
具体的には、ダイアログを編集しようとして開くと↓の画像のようにダイアログのタテのサイズが縮んでしまうのです。
http://revery.net/~niku/cgi/img/img20031011163317.gif
(内側の青の点線の枠がダイアログからはみ出しています)
高さを修正して保存しても、開きなおすとまたこのような表示になります。
(画像はAppWizardが作成したダイアログで一切編集はしていません。)

OSはご覧のとおりWindowsXPで、スタイルの問題かとも思い切り替えてみたんですが
http://revery.net/~niku/cgi/img/img20031011163329.gif
ズレが小さくなりはしても、やはり表示がおかしくなっています。

どなたか、この現象にお心当たりのある方はいらっしゃいませんでしょうか?

>>275
*.rc が上書き禁止になってるとか、保存に失敗してるとかでわ?
277275:03/10/12 03:36
>>276
お答え頂きありがとうございます。
ですが、それは大丈夫です。
ダイアログに対して行った修正(ボタンを追加するとか、ダイアログのサイズを変えるとか)
は保存をすればちゃんと適用されますし、ビルドも通ってきちんと動きます。
ところが、一旦ダイアログリソースを閉じて再び開きなおすと、保存した時と比べて
ダイアログの高さだけが縮んでいるんです。
*.rcをメモ帳で開いてみた限りでは、高さはちゃんとした値で保存されているようで、
リソースエディタが開くときに表示をミスしているような雰囲気です。
>>275
HKEY_CURRENT_USER\Software\Microsoft\Devstudio\6.0
を消してIDE初期化してみたらどうよ?
(VCの設定など全部消えるので必要ならレジストリ保存しといて)
279275:03/10/12 12:02
>>278 ご回答ありがとうございます。
さっそくためしてみました。
だめでした(T-T)

モノは試しで
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DevStudio\6.0
も一緒に消してみましたがダメでした。

で、さらにモノは試しで、VCアンインストール>OS上書きインストール>VCインストール
してみましたが、やっぱりダメでした。何が悪いんだかさっぱりです(;;)
こりゃOSクリーンインストールだな
281275:03/10/12 14:22
いろいろ試しているんですが、少し判ったかもしれません。
VCをいれたままにしてOS上書きインストールした直後ではきちんと表示されました。
http://revery.net/~niku/cgi/img/img20031012141249.gif
で、WindowsXPのServicePack1をWindowsUpdateで入れただけで前例
http://revery.net/~niku/cgi/img/img20031011163317.gif
のような表示になってしまいました。

といっても、条件が純粋にコレだけなら、他にも同じ症状出る人が大量にいるはずなので
私の環境のどっかがおかしいのでしょうか。

280さんの言うとおり、クリーンインストールしかないのかな(;;)
# それでもダメだったらどうしよう…
282デフォルトの名無しさん:03/10/12 18:49
MFCではなくVCの設定の質問ですが
適当なスレが見つからなかったのでよろしくお願いします
VC++6.0のプロジェクトファイル(〜.dsw)をDClickした際
常に新しいウィンドウで開くにはどうしたらいいでしょうか?
今の状態ですと、Test1.dswを編集中にTest2.dswをDClickすると
Test1.dswを編集しているウィンドウで開いてしまいます。
283デフォルトの名無しさん :03/10/12 19:17
MCF + OpenGL で、OpenGLのテクスチャは使えないのか?
どう頑張ってもテクスチャが表示されない。
>>283
まず落ち着け。
>>283
MCFとやらを使わなければ、テクスチャが表示されるのか?
287283:03/10/12 21:37
MFCだスマソ
ウインドウ領域にOpenGLコンテキストを貼っ付けてるんだが、
立体だけ表示されてテクスチャが表示されない。描画部分をOpenGLのglutDisplayFuncで
描くようにするとちゃんと表示されるのでテクスチャの扱いは問題ないはず。
ただ、MFC+OpenGL部分は既存のものをパクっただけだからじぇんじぇん理解してない。それが問題だ。
両方理解してないなら誰も相手してくれなさげ
289デフォルトの名無しさん:03/10/13 05:59
話にならんな。
291デフォルトの名無しさん:03/10/13 11:18
パソコンからでも携帯専用サイトが見れるようにしたいんだがキャリアってどうなってるかわかるか?
>>291
うせろ!
293デフォルトの名無しさん:03/10/13 14:14
OnKeyDown() の中にWinAPIの GetKeyState()を使って矢印キーでのキャラクタ移動を
しようとしてるんですが、矢印キーを押しっぱなしにすると、最初にわずかに動いて止まり、
一瞬時間を置いてからスムーズに動き出します。ちょうど、「あああああああああああああ」
と入力するときと同じ感じです。
最初からスムーズに動かしたいんですがどうすればいいんでようか。
タイマー使いなされ
>>294 どうも! 助かりました。
自作クラスにシリアル化関数を追加するとき、
自作クラスのメンバ変数として存在する構造体には、
CArchiveへの「<<」が使えないのは仕様ですか?
>>296
その構造体もクラスにしてしまえば?
298296:03/10/15 13:05
>>297
WIN32_FIND_DATA構造体とかなんですが
クラスにしてしまうと今度はメソッド内で既存の関数に
直接渡せなくなるような気がしないでもないですが、
ちょっと試行錯誤してみます
299デフォルトの名無しさん:03/10/16 00:55
CListCtrlをレポート形式で使おうとしています。
表示するデータが大量の場合、メモリが足りないと思います。
件数だけ読み込んでおいて、スクロールバーを動かして
画面に表示されるところだけ逐次ファイルから読み込む・・・
というようなことは可能でしょうか?
>>299
MSDNの「仮想リスト コントロール」を参照のこと。
301299:03/10/16 01:05
>>300
ありがとうございます!いけそうです!
302デフォルトの名無しさん:03/10/16 16:21
ちょっと質問。
通信系のCOMから上がって来る通知(コールバック)を取りたいんだけども、
COleDispatchDriverとディスパッチマップ書いただけじゃダメなの?
何事も無くイベント来ないんだけども・・・
VC6、WinXP&2kでダメでつた。
303デフォルトの名無しさん:03/10/18 01:01
CBitmapクラス、CreateCompatibleBitmapで大きめのビットマップを作成しようとしたら、FALSEが戻ってきました。
どの程度まで作成できるんでしょうか?
Win98等だと16Mって記述があるんですが、Win2k以降では制限に関する記述は見つかりませんでした。

環境はVC6++、Win2kProです。
教頭がカンニングしている学校は、
生徒もカンニングしていいって言うことだよね。
で、その教頭が2度もカンニング見つかっても首にならないって事は、
生徒がカンニングしても退学にはならないって事だよね。
>304
誤爆?
VCのアウトプットウィンドウのように、処理内容をどんどん出力していきたいのですが、
CEditクラスでは、今までの出力結果を取得→出力したい内容を追加してSetWindowText しか無いのでしょうか?
ReplaceSel

でも、エディットじゃ内容量制限ある(95系)、もしくはどんどん重くなるぞ。
>>307
おお!
ReplaceSel にこんな使い方があったとは!!
ありがとうございました。

#ちゃんとヘルプを隅々まで読まない自分も悪いけど、紛らわしい関数名つけるM$も・・・(´・ω・`)
int n(1);
char* c = "aaa";
CString s = CString(c) + CString.Format(L"%d",n);

こんなかんじに書くと
error C2275: 'CString' : typedef 識別子に、
クラス メンバ アクセス演算子 (->) を使用しました。
となってしまいます。
これのどこが間違っているのでしょうか。
環境はVC++.netです。
>>309
CString.Format
311309:03/10/22 23:58
>>310
デフォルトコンストラクタで作成したCStringオブジェクトで
Formatを呼び出しているつもりなのですが
違うのでしょうか?
312デフォルトの名無しさん:03/10/23 00:20
CStringArray ってシリアライズできませんよね。
ar >> m_strarrayData;
みたいなのはだめですよね。

普通のCString配列にしろってことでしょうか?
>>311
それなら CString().Format()。
ただし CString::Format() の戻り値は CString ではない。
>>312
CStringArray::Serialize
315309:03/10/23 00:37
>>313
勘違いしてました
ありがとうございました
316312:03/10/23 00:50
>>314 おお、恥ずかしい・・・。ありがとうございます。
MSDNのCStringArray解説のトップにちゃんと書いてました・・・

しかしやはりこれでは、ひとつのオブジェクトに対して
ひとつのファイルに書き出すしかないんですよねやぱり。
>>316
ん? 普通にこうすればいいんでは?

CStringArray a1, a2;
CFile f;
f.Open(...);
CArchive ar(&f, ...);
a1.Serialize(ar);
a2.Serialize(ar);

それとも各要素ごとに別々のファイルに書きたいという意味か?
318312:03/10/23 01:04
それとも、複数の CStringArrayをコレクションクラスに
入れて、SerializeElementsをオーバーライドしてそんなかで
CStringArray::Serialize してやればよいのかなと思いました。
319312:03/10/23 01:05
>>317
あ、そうか・・・。ありがとうございます。
初心者なんでお馬鹿なことばっか書いてすみません。
VC初心者スレから移ってきました。

ダイアログ(CFormView)、それらに貼り付けたコントロー
ル(CTabCtrlやCButton)のサイズを固定にするにはどのよ
うに行えばよいでしょうか?
画面のプロパティでシステムのフォントサイズを小さい
フォント/大きいフォントのどちらの時も同じサイズにし
たいのです。

設計自体云々の話はご勘弁を。
よろしくおねがいします。
SetWindowPos
MFCのスタティックライブラリを使って作られたプログラムを共有DLLで実行するようにしたいのですがどうしたらいいでしょうか?
今のままだとVC6.0ではコンパイルできるのにVC.NETではコンパイルできず困っています。
それから、スタティックライブラリを使ったままではファイルサイズがでかいので共有DLLを使うようにしたいです。
>322
プロジェクトのプロパティ設定でできるんじゃない?
>323
なんかうまくいかないっぽいです
VC6.0とVC.NETの互換性の問題かもしれませんけど
325322:03/10/23 23:30
VC6.0の設定を変えたら共有DLLでコンパイルできました
ただ、.NETでのコンパイルはできませんでした。
>>321
無事出来ました。
ありがとうございました。
まさかこれだけで出来るとは…全く考えられなかったです。
今までスレッド作るときは process.h の _beginthread で作ってたんですが、これを
AfxBeginThread に変えた場合、何か価値がありますか?
CWinThreadが使える
CWinThreadの利点は?
330デフォルトの名無しさん:03/10/25 22:57
MFCダイアログベースで、テキストボックスに入力した
文字列を組み合わせ、x-www-form-urlencoded形式でエンコードして
URLを生成したいんだけど、その場合2バイト文字の扱いはどうなるんでしょうか。
やっぱり文字コードとかも考慮しなければいけないんでしょうかねぇ…
×文字コード
○キャラクタセット
332デフォルトの名無しさん:03/10/26 01:08
MicroSoft Office2000などで出る「ファイルを開く」ダイアログは
ダイアログの左側にアイコンが表示されるようなヤツです。
「履歴」「My Documents」「デスクトップ」...など。

でも 自分のアプリで CFileDialog を使うと、アイコンの無い
少し小さいやつになってしまいます。上記のヤツを使うのは
MFCだけじゃムリなんですか?
>332
.NET 2003なら普通にそうなった様な気が
334332:03/10/26 01:22
>>333
すみません環境を書き忘れてました。
VC++6.0 Windows2000です。
.NET 2003ですか・・・。
336332:03/10/26 01:49
>>335 おお、ありがとうございます。
CFileDialog FileOpenDlg(/* 略 */);
FileOpenDlg.m_ofn.lStructSize = 88;
で、出てきました!
ドキュメント/ビュー を用いずにSDIを作成したいです。ドキュメントに関する部分が不要だからです。
そして、CListViewのSDIと同じ感じにしたいんです。
http://forums.belution.com/ja/vc/000/105/89.shtml
この記事などを参考にしていろいろやってるんですがどう作るのかいまいちわからなくなりました。
Viewクラスに相当するものとして CListCtrl派生クラスを利用するとして、
それはCChildViewに置き換えるのかCChildView のメンバとして持つのか。
CListCtrlはいつCreateするのかとか、MainFrameにどうやって結びつけるのかとか・・・。
参考になるサイトなどありますでしょうか。
338デフォルトの名無しさん:03/10/26 15:57
MFCで実行ファイルのアイコンにあるファイルをドラッグ&ドロップしたときに、ファイル名とパスを取得したいんでけど、どうしたらいいんですか?

コマンドラインでパスが渡されるのと同じ
340デフォルトの名無しさん:03/10/26 16:46
338です
レスありがとうございます>339さん
どのクラスの変数に格納するのですか?
MFCでダイアログを2つ作り、ダイアログ1のボタンから
子ダイアログ2が呼び出されるようなプログラムを作っています。
プログラム1にメンバ変数を作り、ダイアログ2を呼ぶ前に値を代入し
ダイアログ2が開いた後
C(ダイアログ1)Dlg dlg;
i = dlg.(メンバ変数);
としてデータをiに代入しようと思ったのですが、データが呼び出せません。
これはどのようにすれば良いのでしょうか。
>>340
__argc vc 辺りで検索を。
↑アンダースコア2つ
343341:03/10/26 20:39
静的メンバにする事で自己解決しますた。
344デフォルトの名無しさん:03/10/26 22:23
CCombpBoxで文字数を制限するにはどうすれば?
345デフォルトの名無しさん:03/10/26 22:24
combp→combo
limittextがありました。失礼…
347デフォルトの名無しさん:03/10/26 22:28
>プログラム1にメンバ変数を作り、ダイアログ2を呼ぶ前に値を代入し

値を代入したのは何処でしょうか。
コンストラクタなら、私にもわかりませんが。
≫341 それって、そういうコードでかいてあるなら
別個のダイアログ1(新たに実体)を宣言した事になるから、
新しい方には値がないってことじゃないの?
ダイアログもクラスの一種と考えれば…   とおもたYo
>>348
ModalDialogはそれに近いことできるね。
350デフォルトの名無しさん:03/10/29 01:40
VC++6.0 & MDIでの質問です。
子ウィンドウの裏画面を生成しようとおもいCChildViewのメンバ変数に
CDC memDC
CBitmap memBit
を追加したのですがどこで初期化すればいいいいかわかりません。
PreCreateWindowでやろうとstyleにWS_VISIBLEを追加したのですが
ウィンドウが表示されないためできません。
どこでやればいいのでしょう。
初期化=CreateCompatibleDC、CreateCompatibleBitmap、SelectObjectです。
コンストラクタだろ。
OnCreateで初期化するのはお勧めできない、ウィンドウが再利用されるたびに複数回呼のでOnDestroyで破棄する手間が増えるからだ。
>>350-351
おいおいPreCreateWindowで駄目なものがコンストラクタでできるわけなかろう。
DCやビットマップの初期化にウィンドウハンドルが必要なんだろう。

えーと、CFormView派生クラスならOnInitialUpdate
それ以外ならOnCreateでいいんじゃないか。
ウィンドウの再利用は考えず、毎度破棄する方がいいだろ。
再利用したいなら自分で初期化/逆初期化のメンバー関数作って直接呼ぶか。
353350:03/10/29 02:12
>>351&352
OnInitialUpdateでできました。
サンクスです。
>>352
おりはデスクトップのDCとか使う。

>>353
OnInitialUpdateはやめとき。
このメソッドはドキュメントが最初に更新されたとき、であって、ビューが初期化されたときではない。
ドキュメントが初期化されるたびに何度も呼ばれる。
いま、ネット上にあったC言語のフーリエ変換のプログラムを実行しようと
してるんですけど、読み込ませるファイルが違うらしく、エラーメッセージ
がでるんです。

「ファイルのフォーマットがP5とは異なります」とはどういうことですか?

指示どおり、「ファイル形式がPGM、バイナリ形式とする」を守ってるつも
りなんですが・・・。


エスパー様、エスパー様、355様がお待ちです。
至急MFCスレまでお越しください。
>>356
とりあえずスレ違いってことで軽くあしらってください。
>>355
>357みたいにpgmの解釈は千差万別。そのプログラムが期待しているp5形式が
あんたの読ませようとしているp5形式と噛みあわないんでないかい?
所詮、英数全角(ry
CListBoxでオーナードローで表示させてるんだけど
視覚効果で「リストボックスを滑らかにスクロールする」
を設定するとマウスホイールやPageUp,PageDownキーで
スクロールすると表示が変になってしまうんだが、回避策しらない?
「オーナードローで表示」のやり方がへっぽこなだけだろ。
>>362
MFCサンプルのCTRLTESTのListBoxも変になってるんだけど。
リストをスクロールしようとすると、一瞬リストが逆に
動く。
200×200のint型の配列があるのですが、1か-1で埋められています。
この配列をClientDCに描写したいのですが、StrechBlt以外の方法を使うなどして
描写速度を上げる方法はありませんか?
BoostのRegexで使うmatch_resultsのメンバでstrというのがありますが
これをCStringで扱えるようにするにはどのような手段がありますか?
CString str;
str.Format("HitData [ %s ]\n", results.str(0));
とやったら例外ダイアログが出てしまいます。。(もちろん正規表現検索でTRUEが返ってます)
c_str
367365:03/10/30 21:17
>>366
どもです。出来ました。
末尾に終端文字がなかったんですね。
368デフォルトの名無しさん:03/10/30 23:48
>>364
CreateDIBSection で DIB 作っておいて、StretchDIBits かなあ。
BMヘッダ作ってStretchDIBitsでいいような
370デフォルトの名無しさん:03/10/31 00:16
これって使ってみた人いますか?
Xtreme Toolkit Pro
http://www.codejock.com/
CDocManagerのDoPromptFileNameが複数の拡張子に対応してた。
ちょっと感動した。
実行した。
落ちた。
CDocTemplateのMatchDocTypeが対応してなかった。
結局自分で実装した。

・・・なんだこのうんこライブラリ・・・。
>>371
ワラタ
spy.exeののメッセージリストのように
クリックしたら他の選択を解除せずに、
クリックされた行の選択状態だけを変更するようなリストを
CListBox(またはその派生クラス)で実現したいのですが
この場合って、オーナー描画でWM_NOTIFYを拾って書き換えればいいのですよね?
この時、メッセージマップの方はどんな案配で書けば良いのでしょうか。
お手数おかけしますが御助言お願いします。
>>373
リストボックスのプロパティで選択をマルチにしれ。
Viewに持たせていたDialog(モーダレス)をMainFrameに移籍したら、
Dlg所属のオブジェクトがおかしなことになった。
なんか、1つだけアドレスが0x00000004とか変な位置に作られる。
アクセスすると当然の如く0xC0000005: Access Violation。

試しに.hファイル内での記述順序を変えてみたら
なぜか0x..04の位置に作成されるオブジェクトが代わった。
しかたがないので、これを利用して、使わないダミーのオブジェクトを用意、
それを身代わりキャラに使ってるけど根本的な解決にはなってないわな。
なんなんだよぅ、この現象は。
環境はVC++6.0 SDI MFC WinXPっす。
376375:03/11/03 22:41
モーダレスっつーか寧ろモードレス。恥…。
>>375
意味わからん、オブジェクトって具体的に何よ。
インプレイスに作成されるオブジェクトならアドレスは絶対に連続だし。
ポインタならnewしてる部分見てみたり、どこかでポインタ上書きしてないか確認すればいいし。
そうね。宣言の順序で変わるのなら、ダイアログの宣言の前後に宣言した変数を、
ポインタでいじる時に 領域を超過してアクセスしてるとかだろうね。
悩むよりも先に、該当ポインタの値の変更を条件にブレークかけるヨロシ。
0x00000004にはいつセットされるのか、ってことで。
山田うどんのホームページがつながらないよ!!
http://www.yamada-udon.com/
>>375 リビルドもよろ
381375:03/11/04 20:02
皆々さん、回答ありがとう。
いい感じで説明不足だったので、もすこし詳細に。
まず、DialogはViewのメンバだったのをMainFrameのメンバに変更。
で、ヤヴァイ位置にできるオブジェクトは.hでの定義順序によって
CArray系だったりCStatusBarCtrlクラスのだったり、色々。
0x00000004にできるのは、定義順で「さわるとデス(By SaGa2)」が
確定したオブジェクトの、CObjectの__vfptrとかいう奴。仮想関数ptr。

((*(CObject*)(&m_Array))).__vfptr
↑これでブレークポイント設定しようとしたら、無効だとか言って怒られた。

マニュアルの「[VC50] SP1:/Og により仮想基本ポインタの初期化に
問題が発生」とかは関係ないよなあ。5.0の話らしいし。
後、リビルドは既にリビルダーの称号を授かれそうな位ヤリ捲ってるよ。
382373:03/11/04 22:28
>343さん、遅くなりましたが御助言ありがとうございました!
「拡張」にしてたから駄目だったんですね。勉強になりました。
383373:03/11/04 22:29
>343さんじゃなくて>373さんだった_| ̄|○
マ板で吊ってこよう……。
.NETで、ツリービューを右クリックしたときのメニューを作ったり追加するにはどうすればよいの??
385デフォルトの名無しさん:03/11/08 17:33
あげとく。。
386デフォルトの名無しさん:03/11/08 19:09
ユーザーが100個の数値データを入力するのですが、出来るだけ簡単な方法無いでしょうか?
自分が考えたのは

@エディットボックスを100個作りそこからプログラムがデータを取得する。
Aテキスト形式である一定の規則(データとデータの間にスペースを入れる等)でユーザーが入力して
それをファイルメニューなどから読み込ませる。

ぐらいしか思いつきません。@は作る方も面倒なので今のところAが有力なんですが
何かいいアドバイス下さい。
>>386
100の質問に答えるソフトは検索の邪魔なので
止めて下さい。
>>386
なんで100個も作る必要がある?
1個で十分じゃないか。
>>386
Excelは? インプレイス編集とか、CSV形式とか、手段はいろいろ
>>389
それだ!
エクセルのようなUIにすれ
エクセルなら、百や一万のデータ入力も苦にならないでしょ?
リストボックスとかリストビューとか・・・
>>390
どんなすぐれたUIでも一万ともなるとさすがに苦だろ・・・。

データ量が増えればツールかなんかである程度自動化したいと思うユーザーもいるだろうから、ファイルからの読み込みは必須でそう。
>>390
「のような」ではないOLE2でね
394デフォルトの名無しさん:03/11/09 15:32
VisualC++ 6.0でMFCを使っているのですが
メニューバーから設定用やバージョン情報用の別のダイアログを出すには
どのようにすればいいんですか。。
>>394
//宣言
afx_msg void OnShowDialog();

//マップ
ON_COMMAND(ID_SHOWDIALOG,OnShowDialog)

//実装
void CMyFrame::OnShowDialog()
{
 CMyDialog().DoModal();
}
396386:03/11/09 16:30
>>393-393
やっぱりExcelですかぁ。
実を言うと作りたいアプリはグラフみたいなもんなんだけど、当方Cしか出来ないもんで。
Excelはあまり使えないんですよね。意地でもくVCで作ってやろうと思ったんだけど
長いものには巻かれたほうがいいですかね。
VS2003のようなドッキングバーはMFCから使えますか?
>>396
>当方Cしか出来ないもんで。

スレ違い
400386:03/11/09 22:06
>>391
数値データが10000通り以上になるので・・・
>>399
VBやVJに対してVCしか出来ないと言う意味です。
MFCで便利な物があればなぁ・・・と
>400
で、リストビュー/リストコントロールはダメなん?
402400:03/11/10 03:53
>>401
エディットボックスに直接数字をぶち込んだ方がユーザーとしては楽かな?
1万通り以上の数字の中から100個以上選ぶことになるからね。
例えば100.00〜200.00の間から100個とかね。

Excel使ってCSVで保存したファイルを読ませるのが一番良いかな。

>>402
選ぶんじゃなくて、リストビューをExcelのグリッド風に使えってことじゃないの?
>>403
そうでしたか、スキル不足ですね。勉強してきます。
405デフォルトの名無しさん:03/11/10 22:17
MFCのDialogアプリケーションでCBitmapButtonに
フォーカスがあるときにEnterを押すと終了してしまいます。
CButtonではそのボタンのOnClickイベントが上がります。
両者の違いはなんでしょうか。
>>405
Enterを押すとデフォルトボタンが押されることになっているからです。
アクティブなボタンの押し下げはスペースです。
普通のボタンは、フォーカスがあればデフォルトボタンになる(ので、
エンター押下を受け取れる)。
ビットマップボタン(オーナードローボタン)は、デフォルトボタンには
なれない(のでエンター押下を受け取れない)。
ボタンのスタイル値を見ればわかるます。
408デフォルトの名無しさん:03/11/10 22:48
今VC++6.0Proで簡単な練習用のサーバーアプリ作ってるんですけど
.NETに乗り換えた方が簡単?
それともMFCでやったほうが簡単?

実はVC++使い出して(VS6.0Proを買って今まではVB使ってました。)
まだ2週間で、どっちに手を付ければ良いか非常に迷ってます。
捕手新党が自民党に吸収されたってね。
ただのヘタレ政党じゃん。
410405:03/11/11 01:59
>406>407
ありがとう
勉強になりました。

ちなみにそういうことをやろうと思ったら
どうしたらいいでしょうか?

IDOKを拾ってそこで全部のボタンについて
FOCUSがあるかどうか調べるくらいしかない?
>>410

DM_GETDEFIDに対して、ビットマップボタンがフォーカスを持っている
場合にそれなりの応答をする。
MFC用の(もしくはMFCと使える)UnitTest用のツールの名前を教えてください。
あとは検索します。
VC6.0にて、VBから呼び出し計算結果を返すDLLを作っていますが、
1000件ほど繰り返した場合、メモリ不足になって誤動作をしてしまいます。

new で確保したメモリはreturn前に delete しているんですが、
なんだかもうハマってしまいました。

こうじゃないか、というような意見があればお聞かせ願います。
お願いします。
配列をdeleteするときに[]をつけてないとか
>>412
C++Testとか?
std::vector <std::map <std::string, std::string> >
辺りで値を上げたけど。
>>413
正確には1025件目だったりするか?
418413:03/11/12 14:42
レスありがとうございます。
>>414
いえ、再度確認しましたが配列のdelete [] も忘れてはいませんでした。
>>416
マシンによっては500件前後でも出ることを確認しました。
OSは200Proで開発とチェックを行っています。

new, deleteを全て boost::shared_ptr, boost::shared_arrayに
書き換えてみましたが、同じ状態になってしまいます。

パフォーマンスモニターで見ると
ループ中、どんどん使用可能メモリが減っていきます。

どうしたらよいのでしょう?
>>418
どうしたらってメモリリークしてる部分を探すしか・・・

new&deleteしてる関数を晒してみるとか?あんまり長いコードは見たくないけど。
というかリークしてるのはそのnewしたメモリってことで間違いないんだよね?
420デフォルトの名無しさん:03/11/12 15:44
VC++でMFCを使って
IRC鯖のDLL(外部からの呼び出しで起動)を作ろうと思ってるのですが
DLLの作成は始めて(MFCも実は経験が浅いです。)なので
どのように始めれば良いのか困っています。
初めの呼び出しはCWinTreadクラスを使えばいいのでしょうか?
421413:03/11/12 16:42
お騒がせしました。
解決しました。

パスのチェックに使っていたAPIでエラーを起こしていたようです。
違うAPIに置き換えたら誤動作は解決しました。

レス頂いた方々はありがとうございました。
422412:03/11/13 02:02
>>415
...(´З`)チュッ
423デフォルトの名無しさん:03/11/13 10:17
画面上のピクセル情報を取得したいのですが、
どうすればよいでしょうか?関数があれば教えていただきたいです。

x : 取得するピクセルの X座標
y : 取得するピクセルの Y座標
返り値 : (x, y) にあるピクセル値
>>423
GetPixel()
>>424 ありがとうございます。
426デフォルトの名無しさん:03/11/13 17:13
VS.NET のオプションのような左側にツリーがあり
ツリーを選択すると右側が切り替わるようなダイアログはどのように作ればよいでしょうか?
左側にツリーコントロールを作っておいて項目を選択すると
右側の子ダイアログを切り替える。
CodeProject!CodeGuru!
最小化したときにタスクバーの表示を消して
タスクトレイにアイコンをいれるプログラムはどうやって作るのでしょうか?
WM_SIZE見てShowWindow(SW_HIDE)してShell_NotifyIcon
>>430
ありがとうございます。できました。
仕事はやっ
433デフォルトの名無しさん:03/11/13 23:36
CStringに入っている、"Hüb123"と言う文字列に対し、
SpanExcluding("1") すると全部消えてしまうのですが、
どうしてなのでしょうか?
434433:03/11/14 00:34
ウソでした。
ごめんなさいm(_ _)m
435mochi:03/11/14 01:29
プロジェクトがMFC AppWizard(exe)で作られたプログラムなのですが、
WindowsXPやWindows2000では正常に動作するのに、Windows98SEは
アプリケーション実行中強制終了されてしまいます。
因みにビルドで以下のような警告がでます。

: warning C4653: コンパイラ オプション '最適化 (1 つ以上の /Oawp[y])' は
プリコンパイル済みヘッダーのものと一致しません;
現在のオプションを優先しプリコンパイルのオプションは無視されます。

原因がわかる方、教えてください。
>>435
警告は文字通りの意味。
プリコンパイル済みヘッダと、それ以外のソースファイルの最適化オプションが異なってる。
コンパイルオプションが全ファイル同じになってるか見直した後、リビルドしれ。
強制終了とは十中八九関係ない。
437mochi:03/11/14 01:57
警告は表示されなくなりましたがやはり強制終了されます。
…Doc.cppソースファイルの最後の処理に
AfxMessageBoxを入れているのですが、それは表示されます。
最後の最後に何が起こっているのかわかりません。
>>437
今の情報では無限の可能性がある。
439mochi:03/11/14 02:19
すみません。情報はデバックすると
例外処理は(初回)はparcor.exe(KEREL32.DLL)にあります
: 0x0000005: Access Violation。
と出ることぐらいしかわかりません。
プログラムは未熟なもので。
これで何かわかるようでしたらお願いします。
440mochi:03/11/14 02:23
付け加えます。parcorはプロジェクト名です。
>>439
そんな情報何の役にもたたん。
だいたいAccess Violation見るくらいデバッグのうちに入らん。
実行停止してコールスタックくらい見れ。
リビルドしる。
443mochi:03/11/14 02:53
すみません。始めて聞く言葉で手間取ってしまいました。

コールスタックです。
KERNEL32! bff743ee()
PARCOR! 00403918()
MFC42! 5f4023d8()
MFC42! 5f4022ae()
MFC42! 5f402c99()
MFC42! 5f402c66()
MFC42! 5f402ba2()
MFC42! 5f402976()
MFC42! 5f4029d7()
MFC42! 5f401cea()
MFC42! 5f401c73()
MFC42! 5f401bfb()
MFC42! 5f401bba()
KERNEL32! bff7363b()
KERNEL32! bff945af()
PARCOR! 00408c7a()

ちょっと自分の今の知識では勉強不足のようなので
出直してこようかなと思っているんですが・・・
これで何かわかりますか?
(;´Д`)ちゃんとデバッグモードで実行してるよね?そうすると関数名表示されるでしょ?
項目をダブルクリックすると該当するソースに飛べるから、バグがないか調べなさい。
445mochi:03/11/14 03:19
デバッグを開始しまず以下の関数で止まります。
BOOL CParcorDoc::OnNewDocument()

次にアプリケーションのツールバー内にあるコマンドをクリック
すると処理が始まりParcorDoc.cpp最後のMessageBoxまで表示します。
その後
例外処理は(初回)はparcor.exe(KEREL32.DLL)にあります
: 0x0000005: Access Violation。
と表示されOKを押すと
以下のようなものが出てきてきます。(先頭に黄色い矢印)

BFF743EE xadd dword ptr [ecx],eax
BFF743F1 dec eax
BFF743F2 ret 4
BFF743F5 add dword ptr [ecx],0
BFF743F8 push 0FFh

関数名表示されるタイミングがわかりませんし、
ここでの処理もわからないような状況です。
446mochi:03/11/14 03:31
ちょっと勘違いしてたようです。
コールスタック内の関数をクリックするということですね?


>>445
あのさ。>>436で早速言われてるけど、まず「リビルド」(コンパイルの中間ファ
イル:Debugフォルダの中身全部を消去して一からビルドしなおす)してみないと。

そうでないと空回りよ。
448mochi:03/11/14 03:47
>Debugフォルダの中身全部を消去して一からビルドしなおす
そうなんですか!?

Debugフォルダ内を全て消去してみましたが、変わりませんでした。
ちょっと知識が足りないようなので、デバッグについて
自分で勉強してみようと思います。
ありがとうございました。
449デフォルトの名無しさん:03/11/14 03:50
>>448
> Debugフォルダ内を全て消去してみましたが、

リビルド時にやってくれるから手動でやる必要はないぞ。
>>445
それ、ローカル変数オーバーラン起こしてないか?
スタックぶち壊してると良くそうなるぞ。
451デフォルトの名無しさん:03/11/14 11:22
MFCでダイアログベースのアプリケーションは作り方がわかったのですが、IRCソフトとか、よくある、クリックしたらデスクトップ上を可愛いアイコンが動き回るみたいなアプリケーションは
どうやったら作れるのでしょうか?
何で検索すればいいのかも悩んでおります
452デフォルトの名無しさん:03/11/14 11:25
451ですが、Cでできるのかということすらわかりません。
もしできるとしても、今の私では知識不足で作れないとは思うのですが
作れるようになることを目標にがんばりたいと思うのでアドバイスお願いします。
>>451
まずはどっちを作るか決めるとこから悩め。
技術的接点無きに等しいぞ、その2つ。
>>451
そのダイアログでも何でもいいからウィンドウに対してSetWindowRgn後、MoveWindowあたりで自由に動かす。
455451:03/11/14 12:17
より難しそうなのはIRCソフトですよね。
作れたらカッコイイなぁーくらいに思ってるんですがきっと無理なので、
アイコンがデスクトップ上を動き回るようなアプリを作れたらいいなぁと思います。
クリックしたらなんかイベントが起こるとか。
この文字で検索すれば参考になるページが出てくる、とかでもいいので、アドバイスお願いします。
456451:03/11/14 12:30
>>454
SetWindowRgnとMoveWindowでアイコンの動く領域を指定するんですかね?
InitDialogで指定するんでしょうか。
それをどう使えばいいのかわからないので、頭に置いてだけおきます。
ありがとうございます。
458451:03/11/14 13:14
>>457
そーいうソフトがほしいわけではなく、作りたいんです。
作り方を教えてくれるサイトなどあったら知りたいということです。
459451:03/11/14 13:15
教えてくれるというか、勉強できるですね。
ないでしょうか。
>>458
457の検索キーのお尻見てみろ!
ウンコも自分で拭けないのか!
461451:03/11/14 13:41
>>460>>457
気づきませんでした。
ちょっと調べてみます。
ありがとうございました。
462426:03/11/15 03:34
>>427 のようにやってみたいのですが
右側の子ウインドウの作り方がわかりません・・・
どこかに、サンプルのようなものはないでしょうか?
>>462
Viewを作って右側に貼ればいいのかな?
TabViewCtrlのサンプルと同じ要領だと思う。

MFCだとその辺が意外に面倒だから、一度
しっかりしたクラス作っておこうと思いつつ
毎度毎度その場凌ぎのクラスを作る罠。
464デフォルトの名無しさん:03/11/15 12:59
ドキュメント/ビュー に関してです。
実際にウィンドウに表示するビューと、印刷/印刷プレビューさせるものが
まったく違うものなんです。ウィンドウに表示するビューは
CListView 形式で、データベースのビューアみたいなイメージですが、
印刷/印刷プレビューさせたいのは、リストから選択されたデータを使って
文書として整形したものです。
このような場合も、ひとつの ビュークラスで扱うんでしょうか?
それともそれぞれ別のビュークラスを作成するんでしょうか?
465デフォルトの名無しさん:03/11/15 14:14
新Visual C++6.0入門のp.262の実行結果が出ません。
教えて下さい。
466デフォルトの名無しさん:03/11/15 14:18
>>465
ビギナー編です。
467デフォルトの名無しさん:03/11/15 14:51
エディットなどを作れるコントロールパネルはどこにありますか
は?
469デフォルトの名無しさん:03/11/15 17:11
こんばんわ〜
スレッドー処理部分の関数について教えてください。
CreateThread関数の第3引数にクラス内のメソッド関数
を渡したいのですがエラーが出て困っています。
第3引数に渡す関数は、グローバル関数でないといけないのでしょうか?

うまく処理部分をクラス内に隠蔽したいと思っています。
ご指導のほどお願いします。

////////////////////////////////////////////////////

class CThreadDlg : public CDialog{
......................
DWORD WINAPI fnThread(LPVOID lpV);//スレッドで実行したい関数。
afx_msg void OnButton();//CreateThreadを呼び出す。
......................
};
DWORD WINAPI TestThread(LPVOID lpV); //ためしに作ったグローバル関数。CThreadDlg::fnThreadと同じ処理

void CThreadDlg::OnButton(){
HWND hThread;
DWORD d;
//↓エラーが出ます。 error C2664: 'CreateThread': 3番目の引数を 'unsigned long (void *)' から 'unsigned long(__stdcall *)(void *)'に変換できません
//hThread = (HWND)CreateThread(NULL, 0, CThreadDlg::fnThread, 0, 0, &d);
//↓同じくエラーが出ます。 error C2664: 'CreateThread': 3番目の引数を 'unsigned long (void *)' から 'unsigned long(__stdcall *)(void *)'に変換できません
//hThread = (HWND)CreateThread(NULL, 0, fnThread,0,0, &d);
//コンパイル成功 & 実行可能
hThread = (HWND)CreateThread(NULL, 0, TestThread, 0, 0, &d);
}
>>469
static DWORD WINAPI fnThread(LPVOID lpV);
 ↑
SDI ドキュメントビューで、ドキュメントクラスをいっさい使わない場合
(データ及びファイル入出力は独自のクラスを使う)、
ドキュメントクラスは適当にほっとけばいいですか?
ここだけはコメントアウトしとけ、みたいなのあります?
472469:03/11/16 00:43
>>470
c2352のエラーに苦しめられましたが、
何とか回避してクラス内に閉じ込めることが出来ました。
ありがとうございます。
473mfc初心者:03/11/16 04:39
MFCのシングルドキュメントでMCIを使ってメディアプレーヤーもどき
を作りたいのですが、フレーム内に窓が出来てそこで動画の再生が
始まってしまいます。
フレーム内で再生するにはどうしたらよいでしょうか?
インスタンスメソッドを呼び出すのに何が必要か?

・該当メソッドを持つインスタンスのアドレス
・メソッド自身のアドレス

この二つを渡さないとダメ。
だったら、どうしたらいいと思う?
>>474
(該当メソッドを持つインスタンスのアドレス->*メソッド自身のアドレス)()
>>471
問題ない・・・・・・・と思う。
>>471
AppWizardにそういうオプションあるの知ってる?
478デフォルトの名無しさん:03/11/16 13:09
何でもかんでもCObjectから派生させたクラスを使いたがる香具師が居るのだが
正直どういったメリットがあるのか分かる人が居たら教えて欲しい
>>478
CObArrayを使いたがる香具師ならそれが理由だろ。
480471:03/11/16 14:44
>>476
そうですか。ありがとうです。
>>476
ドキュメントビューを使わない、という奴のことですか?
ビュークラスは使いたいのです。
481デフォルトの名無しさん:03/11/16 15:21
初めてなんですが、AppWizardの「関数の追加」で
関数に引数を入れたいときどうすればいいですか?
>>481
引数を入れて書く。
>>481
おいおい、AppWizardに[関数の追加]なんかないぞ、しっかりせい

名前がわからなければVCのバージョンと
例えばメニュー バーの[表示]からなにがし
あるいはCtrl+Wで表示されるダイアログ
のような言い方くらい工夫せい
484デフォルトの名無しさん:03/11/16 18:55
>>482
>>483
詰め込みすぎて頭ん中ごっちゃになってしまいました。
整理して出直してきます。
485デフォルトの名無しさん:03/11/17 17:14
MFCのDockの動作についてなんですが、
ツールバーをDockに入れた場合、
ツールバーって親のサイズを取得して勝手に自分のサイズを決定するので、
最小サイズを得る方法が、無いんですよね。
Dockのコンテナはどうやってツールバーのサイズを決定してるんでしょうか。

ソースを追っても実力不足で読み取れませんでした。
2行目意味不明ですね、書き直します。

MFCのDockの動作についてなんですが、
ツールバーをDockに入れた場合、
Dockのコンテナはどうやってツールバーのサイズを決定してるんでしょうか。
ツールバーって親のサイズを取得して勝手に自分のサイズを決定するので、
最小サイズを得る方法が、無いんですよね。
487デフォルトの名無しさん:03/11/20 19:11
VC++6.0 MFCAppWizard MFC(exe) SDI を使用して、最終的に
メニューバーなし、ステータスバーあり、のダイアログを作成したいのですが、
そういうことは、可能なのでしょうか?また、定番の方法があれば教えて欲しいです。
最近MFCを触り始めたばかりなので、MFCで何が出来るのかよくわからないです。
よろしくご指導お願いします。
そもそもなんで最終的にダイアログを作成したいのに始めにSDIを選ぶんだ
490デフォルトの名無しさん :03/11/20 21:27
マウスカーソルについて
クライアント領域にあるなし関係ナシに、現在選択されてる
カーソル形態を取得する関数ってありますか?
リアルタイムでカーソル画像をDIB(というかBITMAP)に書き続けるような処理を作っています
リリース版でビルドすると、CListCtrlクラスのSetItemCount(かEx版)で
1以上の値を与えてSetItemState等何か操作を行うと
Access Violationが出るんだが、なぜ?
0なら出ないが、当然コントロールに何も表示されない。(仮想リストのケース)
デバッグ版ビルドやランタイムライブラリのデバッグ版を使用したときは問題ない。
問題ないんじゃなくてたまたま動いているだけと思われ。
493デフォルトの名無しさん:03/11/20 23:09
>>490
他のプロセスも含めてですよね。
そういう API はありません。
よけいなモノが付いてきてもいいなら、BitBltがつかえるのだがなぁ。
>>494
BitBlt でもカーソルは取れないケースが多いですよ。
496491:03/11/20 23:24
>>492
そうだね。表立たなかったバグがリリース版で顕在化しただけ。訂正する。
ちなみに今回のCListCtrlは、リソースにDDXで結びつけたメンバ。
わかる人がいれば助言求む。
>>496
SetItemState()する前にSetItem()してる?
SteItemCount()だけではだめだったような気がした。
#気だけ。
>>496
InsertItemしてアイテム用の領域を作らないとダメ
499490:03/11/21 16:17
>>493,494,495
レス有難うございます。
他のやり方を検討してみます。
>>498
あ、いけね、SetItem()じゃなくてInsertItem()だったね。
んー、反射的にレスしちゃうけど、>>491は仮想リストって書いてるよな。
InsertItem() するの?
>>491
ステップ実行でデバッグモードの時だけ通る関数内の処理調べておたべ
503498:03/11/22 09:43
>>501
スマン、「仮想リスト」を見落としてた

>>496
↓の状況では?
ttp://forums.belution.com/ja/vc/000/084/54s.shtml
504デフォルトの名無しさん:03/11/22 12:50
CListCtrlで選択アイテムが変化したときにコールバックされて
かつItemDataがわたってくるようなハンドラが会ったと思うのですが
どういう奴でしたっけ。クラスウイザードでどうやると作成されますか?
お手数ですが教えてください
505496:03/11/23 00:23
レスが少し遅くなったが、いろいろ助言、回答ありがとう
ちょうど >>503 で見た話に似てる。もしかしたらその人物もこれ↓を参考にしたのかも。
ttp://homepage1.nifty.com/takuhiro/technique/programming/virtuallistctrl/

あれこれ試したんだが、結局のとこ、おとなしくMSDNのマニュアル通りに汁!てことみたい。
cf.「仮想リスト コントロール」
あれほどひどかった0xc..05の嵐がぴたりとやんだよ。ありがとう、ミナさん。
506496:03/11/23 00:50
>>504
CListCtrl絡みの話なので助力になれるかも……

それはLVN_ITEMCHANGEDを処理するメッセージハンドラではないでしょーか。
「NM_LISTVIEW」構造体でコントロールのデータをやりとりするんで、
これをキーワードに検索かければなんかわかるかもしれませぬぞ。
CWnd* hwnd= GetDlgItem(IDD_TEST_DIALOG);
CClientDC mydc(hwnd);
CClientDC *pdc;
pdc=new CClientDC(this);
初心者です。このままでもビルド出来るのですが、releaseとかdelete
するならどのように書くのが良いでしょうか?
>>507
これって一連のコードなの?意味不明。
MFC初心者というよりC++初心者?
>これって一連のコードなの?
全体のコード50行の一部分だけです。
ダイアログとウインドウのCDCの設定です。(たぶん)
リリース(解放)しなくてよいのかなと気になったので。
要するにdeleteする方法を勉強する気が無いし、
CClientDCがデストラクタでリリースするかどうか調べる気も無いと。
511デフォルトの名無しさん:03/11/25 00:50
ダイアログアプリで「ファイル(F)」見たいなメニュー付けたくなったが可能かいな?
>>511
可能です。
513デフォルトの名無しさん:03/11/25 01:45
>>512
どうやるか教えてください。お願いします。
そんな質問は初心者スレちゃうんかー
ダイアログのプロパティ見れ。
515デフォルトの名無しさん:03/11/25 06:08
shell32.dllのアイコンを吸出しそれをコントロール(CListCtrl等)に貼り付ける
ようとしてるのですが、アイコンの透過部分が黒く描画されてしまいます。
背景を透過してアイコンを描画したいのですが、どうすればいいのでしょうか?

アイコンの吸出しは↓のようにしています。

HINSTANCE hInst = LoadLibrary("shell32.dll");
int hIcon = (int)LoadImage(hInst, (LPCTSTR)25, IMAGE_ICON, 32, 32, LR_CREATEDIBSECTION);
CImageList il;
il.Create(32, 32, ILC_COLOR, 1, 1);
il.Add(hIcon);
>>515
もしやXPでは?
だとしたらビジュアルスタイルに対応してないとComctl32.dllのバージョン5
で描画が行われるので、XPの半透明アイコンがうまく描画されずにそうなる。

マニフェスト追加する必要あり。
ILC_MASKでいいのでわ。
518515:03/11/26 01:43
>>516,517

レスどうもです。
ILC_MASKもやってみて変化はしたものの背景部が黒く描画されていたものが
白くなっただけでした。

結局、コントロールのアイテムを自分で描画することで解決しました。
>>518
DIBじゃ無理な気が
LoadImageでなくてLoadIconにして、CImageList::SetBkColorなどを試せばよかったはず
520515:03/11/26 18:48
>>520
そうそう、背景がSOLIDならSetBkColorを使えばよかったのです。
後で気づきました。
521487:03/11/26 20:01
>>488-489
遅レスで申し訳ございません。
ありがとうございます。
MFCアプリを理解する突破口が見えたような気がします。
Windows2000 VisualC++6.0 SDI ドキュメント/ビュー有 印刷有 です。
印刷プレビューの際に、独自のダイアログバーを表示させたいのです。
CMainFrame::OnCreate でダイアログバーを生成して、まずは非表示に
しておきます。印刷プレビューの際、CMainFrame::OnSetPreviewModeを
オーバーライドして、bPreview == TRUEなら表示、FALSEなら非表示、
というようにやりたいのですけど、問題は上記関数のデフォルトの動作。

pState->dwStates にマスクビットを立ててやれば、既存のコントロールバーは
非表示にされないで残る、ようなんですが、どのビットを立ててやれば
よいかわかりませぬ。テクニカル ノート 30では
AFX_CONTROLBAR_MASK (AFX_IDW_MYBAR)
で、と書いてますが、MFCのソースを見る限りでは ダイアログバーの
リソースは AFX_IDW_CONTROLBAR_FIRST から +32までの範囲。

続きます
523522:03/11/28 01:44
このときAFX_CONTROLBAR_MASK (AFX_IDW_MYBAR)マクロに
渡してやる IDは、実行時に得られる模様・・・かな?
デバッガで追ってみても、そのときの他のダイアログバーや
ツールバーの位置や表示状態によって、変わるみたいですよね。

アプローチの仕方が間違ってるんでしょうか。
どうやって、印刷プレビュー時に特定のダイアログバー(コントロールバー)
を表示させることができるんでしょうか?
525デフォルトの名無しさん:03/11/28 16:53
mdbを再構成しようと思って試しに以下のコードを実行したのですがうまくいきません。
CDaoWorkspace::CompactDatabase(_T("C:\\test.mdb"),_T("C:\\_test.mdb"));
エラー内容は
データベースの形式 'C:\test.mdb'を認識できません。
という内容でした。
Access2000にて新規に作成したmdbをVC6で上記のコードを試しました。
いったいなにが原因なのでしょうか?
527525:03/11/28 17:44
>>526
まさにその通りでした。
時期からしてそうかも、とは検討がついていたのですが
調べ方が甘かった様です。
ありがとうございました。
528デフォルトの名無しさん:03/11/29 02:52
ダイアログエディタで、コントロールの配置を行った場合、座標とサイズはどこかに保持されるのでしょうか。
rcファイルにそれらしき数字が載っているのですが、その数字をMoveWindow関数の引数にしても駄目でした…。

仕方ないので、とりあえずはコントロール1個ずつGetWindowRectした結果を表示させているのですが、数が多くなってきたのでかなり大変です。
普通はどういう方法で座標、サイズを得るのでしょうか?
(タブコントロールに配置するの、結構面倒ですね…)
vector<CWnd*> m_pChild_Wnd_Array;
で伺か?
>>528
MapDialogRect
531528:03/11/29 09:28
すみません、少し言葉足らずでした。


ダイアログエディタでタブコントロールを使ってをデザインしようとしています。
タブ上に配置するコントロールを実際の位置に置いておこうとするとタブ1枚目、2枚目上の
コントロールが重なってしまい見にくくなってしまいました。
そこで、
(1) 1枚目のコントロールを実際に表示する位置に置き、GetWindowRect関数を用い
  すべてのコントロールの座標を得るソースを書き、ビルド後実行して座標を得る
(2) 1枚目のコントロールを端に寄せ、2枚目のコントロールを実際の位置に置き、.....
(3) 全コントロールの位置が求まると、最後にMoveWindow関数で実行時に意図する位置に
  コントロールを配置するようにする。
という方法を今やっています。
ただ、コントロールが多くなってきて、かなり面倒くさい作業なので、何か
動的に座標とサイズがあれば、という意味でした。


ビルドして実行してみないとわからないような情報ではないので、どうにかすれば
(rcファイルの数値を計算するなど)得られると考えているのですが、よくわかりませんでした。
コントロールの座標を得るなんて、そんな特殊なことではないので何か定石のようなものがあると思っているのですが…


>>529-530
すみません、今環境が手元に無いので試せないのですが、
現在より手間が減るのであれば大変ありがたいです。
また後ほど実行してみます。
532デフォルトの名無しさん:03/11/29 09:35
MFCで、自分が予想していない場所のメモリ破壊をしていることってありますか?
533デフォルトの名無しさん:03/11/29 09:38
Document-Viewに依存しない作り方をしたいのですが
いまいちアイデアが出でこないので質問します
いまDoc-Viewでテキストファイルを表示するプログラムがあるんですが
それを必ずしもDocクラスがないような場合にも再利用できるように変更したいのですが
どういうアイデアがありますかね

Docにテキストファイルの読み込み処理
Viewにその表示
って感じで作ってるんですが
>>531
悪いことは言わん、プロパティシートを使え
>>531
ダイアログエディタの座標系を実際の画素座標系に変換したいってことかな?
フォントが決まれば一定の法則性があるけど、動的に対処するなら
予めダイアログエディタの特定の場所((100,100)とか)にダミーの部品を置いて、
そいつをGetWindowRect()で実座標拾えば概ね変換係数が得られるっしょ。

んで、タブ上に配置する部品は、別にViewを作ってそっちで配置、タブ移動で
Viewを貼り付ければいいんでない?
一週間ほど待てるならサンプルを提示できるけど、ぐぐれば見つかると思うよ。
>>531
コントロールを載せた子ウインドウ(orダイアログ)をタブの数だけ
作って子ウインドウ自体を表示/非表示すればいいのでわ…?
>>532
てにをは間違って内科医?
とても正気には見えないぞ。
538デフォルトの名無しさん:03/11/29 16:10
VC++.NETはVC++6より開発効率は良いのですか?
何かが改善されているとかはあるでしょうか?
>>538
開発効率では
.NET 2003 >> 超えられない壁 >> VC6
でしょうな。っというかC++標準準拠度が
上がったのは大きい。
540いなむらきよし:03/11/29 18:02
キケー!
タブブラウザを作ろうとしている初心者です。
環境はWindows2000+VC++6.0+SDIです。

CTabCtrlをメンバに持つCHtmlView派生クラスで作成してます。
ビューに追加したタブに対してHTMLの内容を出力しようと思うのですが
どの様な方法で出来るのかが分かりません。

ご存知の方がいらっしゃいましたらご教授願いたいです。
なんでSDI?MDIじゃないのか。
>>542
単純に子ウインドウを使用しない方法が良かったんです。
タブで切り替えが出来る方が操作しやすいかなと。
ふつうは、Tab1つにHtmlViewを一つ割り当てる訳。
TabがいくつもあるのにHtmlViewが一つだと、タブを切り替えるたびに
HtmlViewの方はHTMLを読み込まなきゃいけないわけだけど。
>>538
STL絡みのバグが少しだけ直っている

操作性は今の漏れのマシンじゃ6より堕ちてる
Pen4のHTでRAM1G+SATA150以上でないと重いよー
Ctrl+Shif+B より F7 の方がよかった
実行のたびにいちいちリビルドするか聞いてくるし
>>544
参考になります。新たにタブクラスを用意する事にします。
(タブ)コントロールに読み込んだ内容を表示する方法はご存知でしょうか?
>>546
何というか、Windowsについての知識が
圧倒的に不足してる感じ。

TabCtrl(親ウィンドウ)
 +→ 子ウィンドウ IWebBrowser2

ってやるんでないの?オープンソースのDonutを
覗いてみるといいと思われ。
ありゃWTLだし。
つーか>>544ですでにHtmlView使うように教えられてるんだから、
リファレンスでHtmlViewを見ればいいと思うが。
>>547
度々ありがとうございます。
じっくりとDonutのソースを眺めてみる事にします。
550547:03/11/29 22:38
>>548
漏れもHtmlViewいろいろいじったことあるけど
細かいことしようとするとほとんどドキュメントがない
という罠。
Use the source.
というわけだな。Donutマンセー。(WTLだけど)
>>545
キーの割り当ては替えられないのかな。
6.0ではカスタマイズできたが、どうなんだろう。

自分もネトゲ開発したいから.NETに興味津々、ではある。
>>552
[ツール]-[オプション]-[環境]-[キーボード]
つーか.NETが手元にないならこれ言っても通じねっか
>>545
SATA150って何よ?
適当に知ってる高性能なデバイスを言ってみたかっただけ?
今はまだATA133/SATAともに帯域余りすぎで性能差は無い。
SATAのタグコマンドもサポートしてる民生用IFは最近出たが
肝心のデバイスのほうがまだでていないっつーの。
>適当に知ってる高性能なデバイスを言ってみたかっただけ?

ま、そんなとこですな。
はっきりとした損益分岐点を計算して言ったわけじゃなく
単なる感想・主観をつぶやいたに過ぎましぇんから。
そこでそんなに力みかえられてもご希望には沿えなさそうでふ。
あしからず。
漏れのWin2K、Celeron-850MHz、Mem256MB、IDEはNT系でダメダメな古目の
VIAチップという環境だと、VC6ですら時々きびしい。
.NET (2003)はVC6と共存可能だってんで入れてみたが、何をするにも
HDアクセス待ちとなって、さっぱダメだ。
VS.NETやOfficeみたいなちょっとカッコいいメニューを作る方法ってどうやるのでしょうか?
CodeProject!
>>557
あの「メニュー バー」は子ウインドウで作ったフェイクだったりする
Spy++のウインドウ検索で魚っ血してみそ
あのメニューバーはダイアログバーのようだね。
ダイアログバーってちょっと難しいよな。難しいというか、MSDNにないのな。
ツールバーみたいに縦横にサイズ変更可能(コントロール再配置?)を
やりたいのだけど、うーむ・・・
>560
IEとかのあれならRebarのことでしょ?
そうそう。ダイアログバーってMFC用語でない?
リバーにダイアログをバンドしてるだけじゃなかったか。
563デフォルトの名無しさん:03/12/02 09:09
最近MFCプログラムを始めたのですが、
MDIアプリケーションにおいて自分で新しいウィンドウを作成する方法というのはどのような方法があるのでしょうか?

MainFrameでOnDropFilesの中でドロップされたファイルを開きたいのですが、
MDI子ウィンドウを作成する命令が見当たりません。というかCreateもLoadFrameもいまいち何を渡せばよいのか…。
そこでAfxGetApp()->OpenDocumentFile();
で開いては見たのですが、どうも気分がすっきりしません。

もっと分かりやすい普通の方法があるような気がするのですが、
ウィンドウ作成のスタンダードなやり方というのはあるのでしょうか?
例えばドキュメントを開くと言った処理だけでなく、
独自のDoc/Viewウィンドウを作成したり、初期化したり、またさまざまな処理を行いたい時、
どのクラスの何を呼び出すべきなのでしょうか?

個人的にはMainFrameで構築するのが筋のように思うんですが…
DocTempalteといい内部で管理されてる所がなんとなく分からないんです。

それとも細かい所はやはりWinSDK使った方が良いんでしょうか?
>>563
>独自のDoc/Viewウィンドウを作成したり、初期化したり、またさまざまな処理を行いたい時、

この「独自」という言葉が何を指してるのかわかりませんが、
CWinApp::InitInstance()の中でAddDocTemplateして追加してあるんだろうし
AfxGetApp()->OpenDocumentFile();でいいんじゃないの?
ここからCDocManager::OpenDocumentFileを呼ばれてるので、
その辺のソースを追えばどうでしょう?
Document-Viewから外れたことをしたいのであれば別ですが。

565563:03/12/02 16:38
>>564
レスありがとうございます。
ネットで少し検索してみたらテンプレートから直接作成したり出来るみたいですね。
WinAppからテンプレートを参照して作成できれば、複数のドキュメントタイプがあっても出来そうですね。
ダイアログボックスのラジオボタンの値を取得するにはどうしたらいいですか?
クラスウィザードを起動しても変数が追加できません。
>>566
DDX_Radioは?
クラスウィザードがダメなら自分で書けばいいよ
APIのGetDlgItemIntみたいなのないですか?
何がだめなの?
void CMfctest5Dlg::OnSelectMonthcalendar1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
CString s;
CTime &t;
m_cal.GetToday(t);
s = t.Format("%A, %B %d, %Y");
m_edit.SetWindowText(s);

*pResult = 0;
}

't' : 参照が初期化されずに宣言されています。
できますた。
CString s;
CTime a;
CTime &t = a;
m_cal.GetCurSel(t);
s = t.Format("%A, %B %d, %Y");
m_edit.SetWindowText(s);
なぜか12日ずれてるんだけどなんで?
>>569-571
まずC++の勉強をやり直せ
>>570
参照にする意味無いよ。
GetCurSelがCTimeの参照を引数に取ってるってんなら
参照のこと勘違いしてるよ。
>>573
CString s;
CTime t;
m_cal.GetCurSel(t);
s = t.Format("%A, %B %d, %Y");
m_edit.SetWindowText(s);

でできますた。感動しますた。C++ってすごいぜ
でも12日ずれてるのは直らないなー(´・ω・`)ショボーン…
他のPCにexe持っていって実行したら問題ない
VC6.0と.NETの同居の問題か?
今度は年がずれてるよ。こんなコントロール使わないことにしますた。
雇い主さん、さっさとコイシを馘に。
>>576-577
バカじゃねえの?
( ・∀)人(∀・ )通報しますた!
「馘」なんて読むの?
>>579
なんでずれるかわかるの?
583デフォルトの名無しさん:03/12/03 20:19
MFC初心者です。
Docクラスで描画をしたいのですが

CDC* pDC;
pDC=GetDC();

これをViewクラスに書くとエラーは出ないのですが
Docクラスで書くと「error C2660: 'GetDC' :
関数が不正な 0 個の実引数をともなって呼び出されました。」という
エラーが出てしまいます。
対処法がありましたらよろしくお願いします。
>>583
Documentクラスなんか投げ捨てろ。
>>583
対処法は「がんがる」
先は長いぞ。まだ競技場も出ていないな。スタートラインも超えていないかも。
>>583
Docクラスで描画すんな
>>583
>Docクラスで描画をしたいのですが

MFC云々以前に設計を何とかしろ。
588デフォルトの名無しさん:03/12/03 20:57
ハーバートギルドの本を読め
CFindFile で
ファイル検索してるんですけど

"*ワード*"
みたいに、「ワード」を含むファイルの検索をしているんですが
日本語でうまく検索しない時があります

どうすれば対応できるのでしょうか?
Unicode とか関係あるのでしょうか?
>>588
どんな本ですか?
気になる。
「ハーバートギルド」で ググっても何も出ませんでした
幅と知ると、ちがう?
なんだよ 独習C かよ
>>589
"*"で検索して自分でファイル名比較すればよろし。
>>593
でけた。

というか、出来ていたのかも
検索したやつで MoveFile してたけど
なかなか移動しない
検索に引っかかってないのかなと思ったら
同名のファイルがあった。
やられた。

とりあえず、ありがとう。
モル━━━━(゚∀(  *  )━━━━!!!
CDocumentクラスの使いどころかいまいちわからない。
シリアル化でファイルに保存できるとか言ったって、
アスキーデータを書き出すだけだから使わないし、
変数とかも、DocumentよりViewやDialogなんかの、
実際にそれを使うクラスに持たせたほうが楽なような。

Document/Viewアーキテクチャの思想を全然理解せずに
MFCを使ってるから、激しいムダがあるんだろうな。
>>596
俺も最初Documentクラスいらねーんじゃん?と思うことがよくあったけど
とりあえず無理やりあてはめて作ってた。シリアライズいらなくて、
ファイル読み書きは別の方法なんだけど。
それでも無理やりDoc/Viewにあてはめてくうちに、わかってくる。
わかってくると有効に活用もできるし、逆に、自信を持って「使わない」
という判断ができるようになると思う。
よく知らないけど自信を持って使いません。
「Doc/View → データと描画ロジックは分離すべき」
ということさえ分かっていればどうにでもなります。
599デフォルトの名無しさん:03/12/04 01:33
フランク・クロケットの本を読め
600デフォルトの名無しさん:03/12/04 09:34
シリアル化したファイルを読み込むときに、古いバージョンのファイルの時に
例外をスローして欲しいのですが、全然例外を投げてくれなくて悩んでます。
IMPLEMENT_SERIALでVERSIONABLE_SCHEMAとOR設定してないと
例外を投げてくれるんですよね?
try{
 if(cArc.IsStoring()){
 }
 else {
   読み込み処理
 }
}
catch(CArchiveException E){
  古いバージョンの時の処理
}

この様な感じなんですがどこか間違っているところがあるでしょうか
ちなみに、IMPLEMENT_SERIALでVERSIONABLE_SCHEMA|14
とか設定して、同じバージョンで保存したファイルを読み込むと、
読み込み処理の最初に

UINT uiSchema=cArc.GetObjectSchema();
if(uiSchema!=14){
  古いバージョンの時の処理

}
としてもintの-1相当しか帰ってきません
602デフォルトの名無しさん:03/12/04 10:02
IMPLEMENT_SERIAL(CHoge, CObject,VERSIONABLE_SCHEMA|3 /*現バージョン*/)

if(ar.IsStoring())
{

}
else
{
UINT i = ar.GetObjectSchema()//保存されてるバージョンを得る;
//ここで ver2 ならば2が入る

}
CRecordset使ってExcel97ファイルを操作したいのですが
カーソルの移動、フィールドの読み込みと挿入はできるものの更新と削除ができません。
CRecordset::Update()を呼び出した時点で保護例外が出てしまいます。
どのようにしたら更新と削除ができるのでしょうか?

ちなみにCRecordsetメンバのCDatabaseからExecuteSQL()をつかって
クエリ文を送ってみましたが、これも保護例外が出てしまいます。
604600=601:03/12/04 10:17
>>602
601で書き込んだ部分もそのような事なんですが、
なんどやっても-1しか返ってこないんです・・・
保存するときの設定は必要ないですよね
605デフォルトの名無しさん:03/12/04 10:34
-1 が帰るのは スキーマが不明な場合です
一度そのファイルを削除してからもう一度
古いバージョンで保存してみてはどうですか。


>保存するときの設定は必要ないですよね
IMPLEMENT_SERIAL(CHoge, CObject,VERSIONABLE_SCHEMA|3 /*現バージョン*/)
があるので大丈夫です。
>>600=601=604
MFCのシリアライズについては、あまり理解せずに書かれているサイトが多い。
ウソ書いてるとまでは言わないけど...
いろいろやってみてバイナリを覗いてみるといいかも。

参考になるのは英語ですが
ttp://www.hzh.homeip.net/doc/progmfc2/ch06c.htm
ttp://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_20390089.html
あと、本家のポリモーフィックポインタのくだり
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_cobject_class.3a_.specifying_levels_of_functionality.asp
あと、日本語では
ttp://www.mtakahashi.com/old/05125.html#05111
クレー射撃のゲームを作ってくれ
608321:03/12/04 18:20
ゲームかよ
[ウインドウ]-[新規ウインドウを開く]

これが出てこない >このスレ
しくしく
スコット・メーダーズの本を読め
>>609
真の教えて君への道のりはまだまだ遠いぞ!
犬童文子の本を読め
MFCでの印刷の際、どのプリンタでも文字のサイズを一定に
するにはどうしたらいいんでしょう?罫線を引くときなんかは
CDC::SetMapMode(MM_LOMETRIC);
を指定してるので大丈夫なはず(?)ですが。
いろいろググってみてるんですが、CFont::CreatePointFont で
作成したフォントなら一定にできる・・・んでしょうか?
どのプリンタでも一定のサイズになるようにフォントを作るんだよ。
615613:03/12/04 23:00
>>614
うーん、やっぱりフォントの作り方に答えがあるんですか。
CDCに何かを設定するんではなくてですか?
616デフォルトの名無しさん:03/12/04 23:22
MSVC++6.0ってオークションしか入手方法ない?
.NET で何が不満?
618600=601:03/12/05 10:58
>>605
>>606
ご紹介いただいた
ttp://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_20390089.html
のところを見て、どうやら直接Serialize関数を呼び出していたのが原因かもしれません。
とりあえずのところ、自前でバージョン情報を保存してチェックしている状況ですが
確認できたらご報告します
619デフォルトの名無しさん:03/12/05 15:47
すみません、教えてください。
ワーカースレッド内部でmdbを最適化したくて
CDaoWorkspace::CompactDatabase(lpPath,tmpPath);
という命令を書いています。
引数には思う値がきちんと通っているのですが
なぜか二度目で落ちてしまいます。
具体的にはvoid PASCAL CDaoWorkspace::CompactDatabase内部の
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
DAO_CHECK(pDaoState->m_pDAODBEngine->CompactDatabase(V_BSTR(&varSrcName), V_BSTR(&varDestName),
COleVariant(lpszLocale, VT_BSTRT), COleVariant((long)nOptions),
lpszPassword != NULL ? (VARIANT)COleVariant(lpszPassword, VT_BSTRT) :
_afxOptionalVariant))
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
ここでAccess Violationで落ちてしまいます。
気になる点は1度目は
if (pDaoState->m_pDAODBEngine == NULL)がtrueと評価され
InitializeEngine();が実行されると言う点です。
仕方なく無理やり二度目もInitializeEngine();を実行しても同じようにエラーがでました。
なにか根本的に理解が足りていないのでしょうか?
教えていただけませんか?宜しくお願いします。
620619:03/12/05 15:53
環境はWinNT4.0(SP6a) VC6 SPなし
mdbはAccess2000形式です。
//以下の文を書き忘れていました。
//Daoのバージョンを3.6に設定する為に
AfxGetModuleState()->m_dwVersion = 0x0601;
宜しくお願いします。
622619:03/12/06 16:32
>>621
確かにスレッドセーフではないと思うのですが
今回はワーカースレッドでCompactDatabase関数を
実行しているだけで複数のスレッドから同時にCDaoクラス内のオブジェクトに
アクセスしているわけではないので大丈夫だと思っているのですが
どうでしょうか?
>>603
かなり前にも同じ質問があったような。
変更、消しができないのは仕様だったと思う
624デフォルトの名無しさん:03/12/06 21:26
初めて書き込みさせていただきます。
学校の卒業課題で印刷するプログラムを作る事になったのですが、
どうやって作ったらいいのか分かりません。
OnDrawと言うのを使うらしいのですが、どなたか参考になるサイト教えて
いただけないでしょうか。
ダイアログベースでEditに文字を打ち込んで
自分で作った印刷のボタンを押して印刷できるくらいでいいです。
使っているのはVisual C6.0でwindows98です。
よろしくお願いします。
>>624
ネタだよね?
プッシュボタン等のコントロールを操作不可(Disabled)にしたいのですが、
コントロール変数を使わずにSendMessage等で行いたいのです。
その方法を教えて欲しいです。お願いします。
GetDlgItem
EnableWindow
ModifyStyle
GetWindowLong
SetWindowLong
CToolBar..GetItemRect()とTBN_DROPDOWNで得られたNMTOOLBAR.rcButtonって結構違うのは何でだろう。
629624:03/12/07 16:22
ネタじゃないです。
本当に分かりません
4ヶ月くらい勉強すればわかるようになるよ。
CTabCtrlについてなのですが、
ビューの中にタブコントロールを貼り付けたいと思い
ビューのOnCreate時にCTabCtrlをCreateして、
タブ自体は表示されるようになりましたが切り替えができません。

MSDN Libraryにタブコントロールはメッセージ(NM_CLICKなど)
を親に送るのでOnChildNotifyでそれを処理すればよいとあったのですが
メッセージが送られていません。

何かご存知の方いらっしゃらないでしょうか?
OnChildNotifyは親から呼ばれるので、CTabCtrlの派生クラスでハンドルする。
親(ビュー)で処理したいならOnNotify
>>632
できました。ありがとうございました。
634デフォルトの名無しさん:03/12/07 23:31
質問です。
IPv6で通信を行うために、winsock2が必要なんですが、MFCがwinsock2.0
には対応してない様子ですね。この場合なにか代替手段はないでしょうか?
635634:03/12/07 23:32
すいません、書き忘れました。

MFCは必ず使うことを前提にした話です。
>>634
VC7.1を使う
637624:03/12/08 01:01
>>625
ネタだよね?
って言うってことはそんなに簡単な事なんですか?
MDIだったら印刷って言うのが最初からあるのですが、
ダイアログベースだと印刷が無くて…
漏れは印刷するアプリは作ったことないけど
http://www.google.com/search?hl=ja&lr=lang_ja&q=MFC+%88%f3%8d%fc
でこれだけ出てくれば簡単にできるんじゃね?
639624:03/12/08 01:16
>>638
ありがとうございます。
いま見たのですがホトンど本の紹介とかでした。
明日の朝までに作らなきゃいけなくて…
知ってる方がいましたら使う関数とか教えていただけないでしょうか?
お願いします
641624:03/12/08 02:05
>>640
ありがとうございます。
あと5時間くらいあるので頑張ります!
642624:03/12/08 05:23
>>640
本当にありがとうございました。
あまり凄くは無いですがいちを完成しました。
>>642
頼むから俺の会社には入るなよ。
644デフォルトの名無しさん:03/12/08 11:35
VCはじめて3ヶ月くらいの初心者なんですけど、すいませんが教えてください。
ダイアログを作成して、その上にピクチャーボックスをおいて、BMPを
表示したんですが、さらにこの上にEDITボックスを重ねて表示する方法はないでしょうか?
または、Textout関数で、改行を含んだ文字列を出力する方法はないでしょうか?

諸先輩方、よろしくお願いします<(__)>
> または、Textout関数で、改行を含んだ文字列を出力する方法はないでしょうか?

あるよ。
行ごとにTextOut
646デフォルトの名無しさん:03/12/08 11:58
>>645
1バイト文字と2バイト文字が混じってたりしてたら
644クン、泣いちゃうぞw

てか、文字列長くなると死ぬよな、その方法だと。
DrawText() でいーんじゃね?
648644:03/12/08 16:33
>>647
ありがとうございました。
CRectで縦長の四角形を指定してあげることで
縦書きにすることができました。

CRect rect5;
rect5.top = 10 ;rect5.bottom=300 ;
rect5.left = 121;rect5.right= 26 ;
pc->DrawText( buffer , rect5 , DT_WORDBREAK );
649644:03/12/08 16:35
>>648
に自レス。left=121→left=12
それは縦書きじゃなくて、毎行一文字の横書きじゃないのか?
>>648
縦書きの場合はフォントが違うはずだが。
メトリクスがまるで違うから新聞紙切り抜いた脅迫状みたいになるよ。
オマエノ娘。ハ預カッタ。
ハァハァサレタクナカッタラ、つんくヲドウニカシロ
653デフォルトの名無しさん:03/12/09 09:42
エイリアスを作る方法で

union{
struct{
int A, B, C, D;
};
int buf[4];
};
こういうやり方がありますが、例えば基底クラスに
class Base{
public:
int buf[4];
};
があったとして、その派生クラスでクラスサイズを増やさずに
A,B,C,Dの別名を付ける方法はありますか?
>>653

class Derived : public BASE
{
public:
int& A() { return buf[0]; }
int& B() { return buf[1]; }
int& C() { return buf[2]; }
int& D() { return buf[3]; }
};


Derived d;

d.A() = 1;
d.B() = d.A() + 10;
d.C()++;
>>653よ、654が言っているのはOOPの基本だぞ
「クラスサイズを増やさずに」
653のクラスサイズがインスタンスサイズに聞こえてならん
どう違うのか本人に聞いて見れれば寝られそうなんだが・・・
658653:03/12/09 22:39
>>654
なるほど。関数で呼び出す方法は気がつきませんでした。

>>655
そうなんですか?
クラスは構造体の便利版くらいにしか思っていなかったもので……

>>657
えーとインスタンスのサイズです。
同じストライドでないとアクセスに困るもので…。
クラスサイズというとどういう意味合いになるんでしょうか?
たぶん sizeof() で得られる値だろうね。
value クラスでかつメモリ上でのバイト並びに意味があるクラスなんでしょう(全て憶測)。
>>654 で良いと思う。
>>658
ここはMFCスレってことで・・・
ウインドウクラスを作るよな
ウインドウオブジェクトも作るよな
C++的に言うとstaticと非staticなわけだが
661デフォルトの名無しさん:03/12/09 23:41
__stdcallと明示的リンクについて教えてください。

DLLからエクスポートする関数は__stdcallにするっていう決まりがありますが、
__stdcallをつけると関数名が_func@2みたいな感じに修飾されてしまいますよね。
で、これをGetProcAddressするときって、
GetProcAddress(hModule, "_func@2");
って書くのが正当な方法でしょうか。
それとも_stdcall(またはWINAPIマクロ)を付けた上で、DEFファイルに、
func って書いて修飾させないようにするのが正当な方法なんでしょうか。
>>661
後者!

GetProcAddress(hModule, "_func@2");
↑こんな気持ち悪いの(´・ω・`)ヤダ
>>661
DEFファイルで別名つける。ってのはともかくとして、

>DLLからエクスポートする関数は__stdcallにするっていう決まりがありますが
そんな決まりあったっけ。。。
664デフォルトの名無しさん:03/12/10 01:05
>>662
レスありがとうございます。

DEFファイルはちゃんと使ったことがなくて、
過去の遺物という認識でしたが、この場合はほかに
選択肢がなさそうですね。メンテの仕方勉強しなくては。


665デフォルトの名無しさん:03/12/10 01:14
>>663
手元のMSDNには以下の記述がありました。

(MSDNから抜粋)
DLL から関数をエクスポートする方法には、次の 2 つがあります。

モジュール定義ファイル (.DEF) を作成して、DLL のビルド時に .DEF ファイルを使う (名前ではなく、序数で DLL 関数をエクスポートする場合)
関数の定義に __declspec(dllexport) キーワードを使う
上のどちらかの方法を使って関数をエクスポートする場合は、必ず __stdcall 呼び出し規約を使います。

>>661
__stdcallでなくても、呼び出し元と先で一致させればなんでもいいと思うけど。
user32.dllからエクスポートされてるwsprintfなんて__cdeclだし。
>661
typedef int (__stdcall * MYFUNC)(int, int);
MYFUNC lpFunc = (MYFUNC)::GetProcAddress(hModule, "_func");

>663
>665
C以外の言語からも呼び出すライブラリであるなら__stdcallにする。
Cからしか呼ばないのであれば、__cdeclでよい。
要するに利用側の言語の関数呼び出し規約による。
668デフォルトの名無しさん:03/12/11 16:09
VC6.0で、ファイルのエラー原因を得るグローバル関数を別ファイルで作ろうと思いました。
でもコンパイルしたところ、
「致命的なエラー C1010 プリコンパイル済みヘッダーの検索中に予期せぬ EOF を検出しました。

BSCMAKE: error BK1506 : コンパイラは、指定されたファイル '.\Debug\hoge.sbr'を開くことができません。:
No such file or directory 」

とか出るんです。

//////////hoge.hの内容////////////
#include "stdafx.h"
void GetErrorData(CFileException *pErr, CString *pStr);

//////////hoge.cppの内容/////////////
#include "hoge.h"
void GetErrorData(CFileException *pErr, CString *pStr)
{
 switch(pErr->m_cause){
 case 〜:
 ...
 }
}

という内容なのですが、どうしたらよいでしょうか。MSDNのC1010をみても意味が分からないです・・・
Viewクラスのcppファイルで #include "hoge.h" としてあります。
>>668
#include "stdafx.h"
>>669
cppファイルにもそれを追加したところコンパイル通りました。
ヘッダーファイルの方に stdafx.h がインクルードされているから大丈夫だと
思っていたんですが違ったんですね。どうもです
671デフォルトの名無しさん:03/12/11 22:56
CWnd派生クラスでデバイスコンテキストにフォントをSelectObjectしておきたいのですが、
デバイスコンテキストを触っても良い初期化用の仮想関数とかメッセージハンドラはなんですか?

672名無し@沢村:03/12/11 23:05
>>671
OnPaint()
673デフォルトの名無しさん:03/12/11 23:07
えええええ?!
まじですか?ネタですか?
>>673
ハンドルを良く見ろ
>>671
>デバイスコンテキストを触っても良い初期化用の仮想関数とかメッセージハンドラ

の意味がわからん。
普通は必要な時に借りてきて、使い終わったら返すものだ
>>676
あいにく借りたものは返さないタチでな。
結局、OnPaint()だな
679619:03/12/12 02:59
>>619です
未だに悩んでいます。
怪しいところとかありましたら指摘していただけませんか?
環境の問題か!と思い.NETでコンパイルしてみましたが
やはり同じ状況です。
あと.NETなので必要のない以下の一行は削除しました。
AfxGetModuleState()->m_dwVersion = 0x0601;
今の環境は.NET Access2000形式 WinXPです。
>>621でスレッドセーフじゃないと指摘されましたが
同時にCDao〜にアクセスする処理はしていません。
何故一度目では大丈夫で二度目はダメなのでしょうか?
何かしら解放する処理が必要なのでしょうか?
一度目のワーカースレッド内では何度CompactDatabaseを呼び出しても
問題はないです。
よろしくお願いします。
680デフォルトの名無しさん:03/12/12 04:39

いくつかのペインで区切られたアプリに挑戦しようかと
考えておるのですが、ペインに区切ったあとで、それぞれの
領域を CView もしくはその派生クラスに関連付けしますけど、
漏れの作りたいアプリでは 1つのペインに複数のコントロールが
同居する予定なのです。そういう場合は CView にして、
自分で個々のコントロールを配置するということになるんでしょうか?

ところで非MFCでペインを作るのは、自分で境界に線を引くことに
なるんですか? ペイン用のWin32APIなんかあるんでしょうか?
>671
借り物ならOnPaintなりその時々のハンドラ内
自分のものなら好きにすればいい

>680
ペインの内容による
あと、WindowsのGUIの大半は、MFCとは関係ない
MFCは用意されているウィンドウクラスをラップしてるだけ
>>679
DAO は「スレッドセーフじゃない」んじゃなくて、マルチスレッドに対応していない、
んじゃなかったっけ(なにかマルチスレッドで動かすとまずい実装になっている)。
ワーカプロセスを使うのが簡単では?
683デフォルトの名無しさん:03/12/12 15:04
分割ウインドウに関してなのですが、初期設定値が反映されない
みたいなのですが、どうしてなのでしょう?

OnCreateClient関数で次のように設定しています。
表示はされるのですが、横の区切りが上にひっついた
形になってしまいます。

m_SpWndA.CreateStatic(this, 2, 1);
m_SpWndB.CreateStatic(&m_SpWndA, 1, 2, WS_CHILD | WS_VISIBLE,
m_SpWndA.IdFromRowCol(0,0));

m_SpWndB.CreateView(0,0, RUNTIME_CLASS(CSampleView), CSize(100,200), pContext);
m_SpWndB.CreateView(0,1, RUNTIME_CLASS(CSampleView2), CSize(100,200), pContext);
m_SpWndA.CreateView(1,0, RUNTIME_CLASS(CSampleView3), CSize(200,100), pContext);

return TRUE;

684デフォルトの名無しさん:03/12/12 15:13
>>683
なぜか初期の段階ではぜんぜん関連付けを
していない デフォルトのCChildViewが表示
されているみたい。なんでだろう。

詳しく説明した本ないですか?
ゴールデンレター
このスレを見た人はコピペでもいいので
30分以内に7つのスレへ貼り付けてください。
そうすれば14日後好きな人から告白され、17日後に
あなたに幸せが訪れるでしょう
686619:03/12/12 19:46
>>682
なるほど。
ところでワーカープロセスってなんでしょうか?
検索してもどうもそれっぽいのにヒットしませんでした。
外部DLLかなにかでCDao〜を呼んで処理させるようにして
実行アプリケーション側ではCreateProcessでそれを立ち上げて
監視する、という風に想像したのですが
この解釈で正しいでしょうか?
>>682
これかな
ttp://www.microsoft.com/JAPAN/developer/library/vccore/_core_odbc_classes_and_threads.htm
「ただし、DAO クラスに対するマルチスレッドはサポートしないので注意してください。」
688デフォルトの名無しさん:03/12/12 22:51
質問です。
CListViewの派生クラスのビューのスタイルをLVS_REPORTにしてInsertItem
でアイテムを追加しようとしてもできません。でもLVS_REPORTを指定しない
場合はうまくいきます。また、LVS_REPORTでもカラムを作っておくと同様に
うまくいきます。

LVS_REPORTの場合にカラムなしでアイテム挿入はできないのでしょうか?
>カラムなしでアイテム挿入はできないのでしょうか?

(確か)できない。代わりにカラムを表示しない
オプションがどっかにあった(と思う)。
690デフォルトの名無しさん:03/12/13 00:04
>>683
どうやら、
(1) 上下2つに区切る (2行1列)
(2) 下の行を左右2分割(1行2列)
これだと size が正常に機能するようです。

しかし
(1) 上下2つに区切る (2行1列)
(2) 上の行を左右2分割(1行2列)
これだと、うまくいかない。(1)で作成した
境界線が一番上に張り付いたように
なってしまう。

サンプルプログラムをみても、この形式のサンプルは
みつけることができませんでした。後者の形式で
成功したサンプルのお持ちの方いらしたら教えてください。

これからでかけるので、とりあえず、ここまで
レポートしておきまふ。
691デフォルトの名無しさん:03/12/13 00:37
>>690
もうちょっと時間があったので、MSDNに収録されている
サンプルアプリのVIEWEXで、>>690の後者のように
区切り方を変更してみましたが、同じ症状でした。

FTPクライアントのように、上が2列、下が1列の
ウインドウを作るにはどうしたらいいんでしょうか?

過去ログにMoveWindowで動くというカキコがあったので
次のように試してみましたが、特に反応はありませんでした。

m_SpWndB.GetPane(0,0)->MoveWindow(0,0,100,200,TRUE);
692test:03/12/13 00:43
test
>>691
うろ覚えだけど、RecalcLayoutとかはダメ?
694619:03/12/13 04:05
>>687
ありがとうございます。
私も見つけたのですがこれはMFC4.2についての記事なので
既に解決しているのではないかと思っていました。

>>682のワーカープロセスっていうのは
>>686の解釈でいいでしょうか?
695デフォルトの名無しさん:03/12/13 12:30
>>693
debugでトレースすると、ちょうど
OnCreateClientが終了した直後にMFCのソースの中で
RecalcLayoutが実行されているようです。

作成後に上下の区切り線を移動することはできるので
どこかに何かメッセージを送ると遠隔操作できるのかも
知れないのですが。
696デフォルトの名無しさん:03/12/13 14:47
ヘッダファイルをインクルードするとき、いちいち手書きでそれを必要とする
ファイルに書き加えているんだけど、もっとスマートな方法はないですか?
697デフォルトの名無しさん:03/12/13 14:54
#include "allheader.h"
VC使って、ドライブイメージ作成アプリを作りたいんですが、
普通のファイルとは異なるため、方法がわかりません。
この関数、この方法を使え、等教えてください。
>>698
ドライブイメージとは何か?
700698:03/12/13 16:51
下記に書いてある言葉と同じような感じです
ttp://www.zdnet.co.jp/enterprise/0310/30/epn30.html
linuxなんかでドライブイメージ作成したりできますよね。
cドライブまるごとってことです。
cドライブにあるファイル全部って意味ではないです。(これなら出来るが)
MBR、FAT等含めた全部をVCで読み書きしたいと思っています。
\\.\PHYSICALDRIVExで開けばいい
まさしくそんなツールを作ろうとして、テスト時に先頭セクタ飛ばして
Windowsさえ立ちあがらなくなった私_/⌒|○
703698:03/12/13 19:50
>>701
ありがとう。おかげでサンプルを見つけました。
ttp://www.cisnet.or.jp/home/tsuneoka/win32tech/index.html
>>702
私と逆ですね。飛んだため、何が何でも復旧しなければならなくて。
で、実は作ろうとしてたソフト自体を見つけました。
無事、半復旧出来ました。
704デフォルトの名無しさん:03/12/13 20:51
>>695
一応解決しますた。
Part1スレにも書いてありましたが

m_SpWndA.CreateStatic(this, 2, 1);
m_SpWndA.SetRowInfo(0, 400, 100);

m_SpWndB.CreateStatic(&m_SpWndA, 1, 2, WS_CHILD | WS_VISIBLE,
m_SpWndA.IdFromRowCol(0,0));

というように2番目の分割をする前に、
最初の分割に対して、SetRowInfo を実行するとよいようです。

CreateViewの size は、widthに関しては有効ですが、
heightに関しては無視されてしまう模様。逆に、2番目の
分割に関してはSetColumnInfoで分割位置を指定しようと
しても失敗するようです。こちらは CreateViewのsizeを
使わないとダメらしい。

随分クセがあると感じてしまうな。
705デフォルトの名無しさん:03/12/15 20:42
ちょっと質問させて下さい。
くだらない質問で申し訳ないのですが・・・

時間のかかる処理に、「しばらくお待ち下さい」というダイアログを出して、
処理が終わったら閉じる、と言うことをしたいのです。

dlgWait.ShowWindow( SW_SHOW );
/* 処理 */
dlgWait.ShowWindow( SW_HIDE );

dlgWaitに CStaticで文字を貼り付けています。
しかし実行してみると、dlgWait に何も表示されてないまま、関数を抜けてしまいます。
これってスレッドで処理するしかないのでしょうか?
簡単な方法があれば、教えて下さい。
>>705
処理の合間にPeekMessage使ってメッセージ処理
707デフォルトの名無しさん:03/12/16 10:23
CBTProcフック関数を使って、バージョン情報コモンダイアログに
動的にエディットコントロールを生成しました。
しかし、生成したエディットコントロールに何等かのイベントが発生すると、
その親ウィンドウであるダイアログが閉じてしまいます。
これを閉じないようにする方法があれば教えて下さい。
708705:03/12/16 10:59
>>706
うまくいきました!
ありがとうございます。
>>707
しらんコントロールからの通知メッセージを受けて終了しちゃってるんだろうね。
間に一枚 static コントロールでもはさんだらどうでしょう?
710デフォルトの名無しさん:03/12/16 11:50
インクルードファイルが多すぎます・・・4つしかインクルードしてません。
なぜ?????
711707:03/12/16 14:57
>>709
上手くいきました!
どうもありがとうございます。
>>710
真の教えて君を目指す方ですか?
>>710
3つにすればいいじゃん
>>710
循環参照してない?
warning C4182: #include のネスト レベルは 363 です; 無限再帰の可能性があります
ワロタ
VC6でMFCを使用して開発しています。
動作対象OSはWindows98以降です。(Windows95、NT4.0は対象外)
この環境でもMFCの共有ライブラリは一緒に配布すべきでしょうか?
クリーンインスコでMFC42.DLLが入るのはどっから?
719デフォルトの名無しさん:03/12/18 15:19
VC6なんですが、ダイアログエディタでコンボを貼り付けて、
オーナー描画を"固定"または"可変"に設定してビルド&実行すると
"いいえ"の時よりコンボの高さがでかくなるんですけど、
これ一体何なんですかね。
回避方法がありますでしょうか。
>>719
そりゃオーナー描画だから、フォントを指定してやらないと。
デフォルトではシステムフォントの高さになってるんだyo
722デフォルトの名無しさん:03/12/18 19:57
>>720
ご意見ありがとうございます。
いやそれがですね、フォント指定してるんですよ。
で、エディット部分に表示される文字は指定フォントになっているんだけど、
枠がでかいままなんです。フォント指定した後にSetWindowPosition()とか
やってもちっこくならないし、なんだかなぁ・・・。
てか、そもそもエディットの部分はオーナー描画の対象ではなく、勝手に
描画されますよね??
>>722
ああ、

CComboBox::SetItemHeight
>nIndex を -1 にすると、コンボ ボックスのエディット コントロール部分の高さ、またはスタティック テキスト部分の高さを設定します。

これを明示的にやらないとダメだわ
>>723
ぉおー。できました。これは見落としていましたです。
ありがとうございます。助かりましたぁ。
>>722
ついでにマメ知識。

「コンボボックスを MoveWindow とか SetWindowPos してもコンボボックス自体の高さは変わらず、
指定した矩形の高さはドロップダウンリストが表示される時の最大高さになる」
726貧乏紙:03/12/20 22:17
VC++本を探していますが知りませんか?
win32apitとMFC関数が全部載っていてその使い方の解説と引数の詳細が載っている。
Cの関数辞典みたいなやつです。
727デフォルトの名無しさん:03/12/20 22:29
CArchiveを使ってCStringをファイルに出力しようと
//arはCArchive
ar << CString("hoge\n");
見たいに書くと
hogeの前に何か変な文字が出力されてしまうのですが
なぜでしょうか?
環境はVisual C++.NETです。
アプリを作っててだいぶsourceが長くなってきたんですが、
コンパイル時に下記のようなエラーがでてしまいます。
c:\program files\test\test.h(31) : error C2061: 構文エラー : 識別子 'testStack' がシンタックスエラーを起こしました。

別に間違ったコード書いてるわけじゃなさそうなんですが。
エラーの部分とか、別のところとか、ちょっと短くしてやると正常に出来るんです。
どういうところ確認すべきでしょうか。
729728:03/12/20 22:54
sorry, 見なかったことにしてください。
残念だなー女みたいに突っ込みどころ満載だったのに
>>726
MSDNを全部印刷
733デフォルトの名無しさん:03/12/21 04:10
モードレスダイアログからモーダルダイアログを呼ぶと、
後ろのモードレスダイアログの再描画が行われなくなりました。
ウェブで検索してみると
http://forums.belution.com/ja/vc/000/052/49.shtml
のような事例がありまして、モードレスダイアログでモーダルの動作をするようにすれば良い、
というようなことが書いてあるのですが
実際にはどのようにすれば良いのでしょう?

MFCではモーダルダイアログもモードレスダイアログで行ってる、みたいな記述も
いくつかのサイトで見つけて、何やら頭がこんがらがってます…
>733
ユーザー見えは以下のような違いだから
モードレスで起動して親Windowをdisableしてダイアログ終了時に
enableにすればいいんじゃない?
そうすればユーザーから見ればモーダル。

 モーダルの動作:ダイアログを閉じるまで親Windowsの操作ができない
 モードレスの動作:ダイアログを閉じなくても親Windowsの操作ができる
モーダルうぜーからやめれ
736733:03/12/21 11:24
>>734
ありがとうございます。
モードレスダイアログをSHOWする前にEnableWindow(FALSE)を呼んで、
閉じた後にTRUEにすれば良いわけですね。

手元に環境が無くすぐに試せなくて残念なのですが、
この方法で親ウィンドウ、モードレスダイアログの前後関係は保たれると考えてよろしいのでしょうか?


>>735
Windowsプログラミングの知識なんて無いのに無理やりやらされて…
私も本気でやめたいです…
>>735は何を言いたいのだ?
738735:03/12/21 12:59
>>737
「俺はモーダルの作り方を知らない」ということ
使いづらいんだよユーザとして
モーダルなんかPGのエゴだろ
面倒くさがってねえで
ちゃんとモードレスにしとけ
あと、メニュー、ボタンなどのグレー表示な
何の説明もなくユーザを締め出す
最悪なインターフェース
>>733
CWnd::RunModalLoop() でモーダル化できる

>MFCではモーダルダイアログもモードレスダイアログで行ってる、みたいな記述
CDialog::DoModal() のソース追うと分かると思うよ
>>739-740
頭おかしいんじゃないの?
おかしい人は放置しましょう。
>>742
反論がなくなったバカが一矢むくいる唯一の道=個人的な人格批判
・・・それなりの相手に言われなきゃこたえないんだけどねw
UIの話してる時点でスレ違いバカです。
コントロールってのは適材適所なんです。
アホな人にはそれがわからんのです。
744が部下だったら今までに俺が作ったアプリのモーダルダイアログを
すべてモードレスにして不都合無く動くように作り直させる。
744が上司だったら今までに俺が作ったアプリのモーダルダイアログを
すべてモードレスにして不都合無く動くように作り直させられる。
749デフォルトの名無しさん:03/12/22 23:50
23日の夜を、クリスマスイブイブって得意顔で言うおっちゃんっているよなw
>>749
イブは単に夜の意味、但し、一日の始まりが夕方という概念での夜なので
XmasEveは今の時制では前夜になる。
ってことだよね? で、それがMFCとどう関係が?
751デフォルトの名無しさん:03/12/23 05:46
モードレスのメッセージボックスはいやだな
752デフォルトの名無しさん:03/12/23 10:26
質問です。

googleツールバーみたいな、IEをツールバーを作りたいのですが、
MFCとATL、どっちの方が作りやすいでしょうか。
最初、ATLで作ろうと思っていたのですが、
ATLについて解説しているページが少なくて、
現在少し_| ̄|○気味です。

またできれば、ツールバーの作り方について
詳しく記載されているページがありましたら、
お教えいただきたいと思っております。
>>752
codeguruかcodeproject行けば
まんまのコードがあるかも
>>752
キーワードはBandObject
メッセージボックスは絶対に連続で出ない場面に限定してくれ
ブラクラみたいになってるのをよく見かける
チェックボックスかオプションボタンを使うべき場面で横着すんな
モードレス君 キタ━━━━━━(゚∀゚)━━━━━━ !!!!!
757デフォルトの名無しさん:03/12/23 17:41
>>753-754
う〜ん、ATLでCode Projectにそれらしきものは見つけたんだけど、
どうにも、追加でボタンをうまく入れられなくて・・・。

ttp://www.codeproject.com/atl/ietoolbartutorial.asp

一番下の質問にもボタンの追加方法について
触れているところもあるようだけども・・・。
単に自分の技術力がないだけなのだが・・・_| ̄|○
ほう、反論できないアホがまだ粘っていたか
反論も何も、誰もスレ違いの話題にまじめに付き合うわけないじゃん (w
まあ、そう自ら退路を断つこともあるまい
荒らしは放置
ここでするのは作る側の議論なんだから使う方の意見が聞きたいんだったらWindows板でも行けば?
>>762
誰が使う側の意見を「聞こうと」しているんだよ、おまいか?
モーダルはPGのエゴだという見地が使う側の意見なのか、おまい式には。

俺は作る側と使う側の両方の立場を併せ持つ者の意見であると主張する。
こっちで思う存分語ってきてください。

こんなUIのソフトは嫌だ!
http://pc2.2ch.net/test/read.cgi/software/1023253730/
>>764
答えになってない
それじゃ、何事も無かったかのように次の質問どぞー。
767デフォルトの名無しさん:03/12/24 00:03
メッセージボックスをモードレスで出す方法を教えて下さい
作れ
769デフォルトの名無しさん:03/12/24 11:49
C初心者です。
mallocでox0e00000x10Byteの大きさを確保したいのですが、引数のunsigned int
の大きさを超えてしまい、確保できません。
VCでは不可能ですか?
最初のoxは0xのことで、*10方は10進で、
146MBか?unsigned intは超えないが。
771769:03/12/24 11:58
わわわ
0x0e0000000の間違いでした!
>>771
もちろん無理。
確保しようとしているサイズが何バイトになるか考えれば判りそうなもんだが?
VCというかそもそも32bit Windowsの限界を超えている罠。

一体何がしたいんだ?
そのまま組んでもまともに動かん予感がするな。
3.5GBか。unsigned int は超えないけれど、mallocでは無理だな。
メモリがあるなら、AWEとか使う手があるが。
774769:03/12/24 12:47
thx!
AWEですか、初耳です。調べてみます。
あ、でもAdvancedServer以降でしか使えねーから。
776769:03/12/24 12:56
げ、昔買ったv5を今でも使ってる洩れは…
_| ̄|〇
777769:03/12/24 12:58
高速性を求められる検索をメモリ内で実施したいんです。
デスクトップマスコットを作ろうと思うんですが
MFCを使うかSDKでやるか迷ってます。
どちらが無難ですかね?
メモリマップトファイル
780デフォルトの名無しさん:03/12/24 17:45
CImageに対して
 pDC->SetROP2(R2_XORPEN);
を行い描画モードをXORに指定しているんだけど、
DrawTextはXORで書き込まれていないように見えます。
これって仕様ですか?
DrawTextをXORのモードで描画することはできますか?
MFCでソフトを作ってる奴を見ても
全然尊敬の念を覚えないのは気のせいですか?
言語やライブラリで尊敬とか言ってる時点でどうでもいいよ。
783デフォルトの名無しさん:03/12/24 18:32
>>782
ホレマシタ!ケコンシテクダサイ!!
>>781
同意。
MFCを使ったフリーソフトを公開して誇らしげにしてる奴を見ると苦笑してしまう。
難しいところを全部自動でやらして「苦労しました」なんて言われた時には涙が出てくるよw
まあ楽できるところは楽しないとな。
そのための開発環境だ。
開発者が目的の処理の開発に力を注げるようになるのは好ましいこと。
自作自演してまで・・・
>>784
>難しいところを全部自動でやらして
そんな機能MFCにあったっけ?
>>787
クラスを呼び出すだけでできるという意味だと思ふ。
この話は>>782で終了。
>>784

( ´,_ゝ`)プッ
MFC房必死すぎ( ´,_ゝ`)プッ
>>787
ワラタ

結果 == 技量 + 道具

道具に呑まれるばかりな技量の誰かさんに
苦笑されても気がつかない開発者が多勢を占める
痛PGに多いんだよね
結果 == ソフト + ハード
がわかってなくて「ハードの性能上がったから」が口癖なやつ
いーからくーきよめ
ここはMFCの良い悪いを語る場じゃないんだよ
いつまでもくどくどねちねちと
中間言語はさて置き、開発速度・バグなしが要求される。
現場では、どんなにエレガントなプログラムを書いても全く評価なし。
自己満足だろと一笑されてしまう上司が多い。

アルゴリズムを評価する場は、学会やプロコンしかないのが現実。
なんか、すっごい狭義なアルゴリズムだな
>>794
どう足掻いてもハードに足を引っ張られることならよくある。
最新のハードでも重たい処理を古いハードでできるようにしろ
と言われた時には時には・・・
これだから非コンピュータ技術者のPGは(ry
まぁ、MFCを使ってでしかまともに組めない漏れから言わせてもらえば
SDKのみでやってるのとか見るとそれなりに尊敬しますよ。

でもね

MFCを使って組んだ方が必要な機能の実装のみに専念できるんですよ。
漏れはGUI周りで苦労したかないねぇ。
運悪くこのスレにバカが降臨してしまったようだな。
SDKでは組めないというMFC技術者は例外なく無能
>>802
禿同。
頼むからプログラマの話したけりゃマ板行ってくれ。
>>804
ここで質問する奴は皆プログラマじゃないのかと小一時間(略
>>805
は?ム板に来たの初めてか?
SDKでは組みたくないというMFC技術者は?
どうでもいいけど、SDKで組めない奴がMFCを使うのは
危険だということだけは言えるよな。
WinGUIアプリの動作原理をわかってないだろ。
>>807
やろうと思えばSDKでも出来るって言うなら
それはそれでいいと思うぞ。
>>807
だから技術者の話はマ板だって。
811780:03/12/24 23:49
自作自演あらしに質問が消えていく。。。
回答マダー?
>>802-803
Windowsの概要さえわかってれば問題ないだろ。
グラフィックスで勝負してるなら分かるが。
Win32APIでGUIアプリ組める程度で
MFCでしかGUIアプリ組めないやつに
優越感持ってるやつはかなり痛いだろ

もうちとましなレベルで競えよ
Win32APIのみで組もうが、MFCで組もうが
糞なアプリは糞
>>813
MFC使っても糞なアプリを作る奴は何を使っても糞ってことだけは言える。
冬休みだな
816デフォルトの名無しさん:03/12/25 13:23

MFCに挫折してWinAPIの勉強中。
ドキュメント/ビューアーキテクチャとか
MDIとか、よく分からん。

しかしWinAPIもドキュメントが英語ばかりで
辛いわ・・・。

MFCの内部動作とか、効果的な使い方って
何で勉強しました? ダイアログベースなら
簡単なんだけど分割ウインドウとかになると
さっぱり分からん。
いろいろ作っているうちに、わかるようになるよ。
目的のアプリに近いサンプルでも見ながら、地道にやるしかない。
MDIは消えつつあるし、SDIはあまり歓迎されてないと聞いてるな。
無駄に難しいし非効率だからだろうか?
819デフォルトの名無しさん:03/12/25 15:46
>>818
MFCのプロジェクトってMDIかSDIになるんじゃないの?
普通の人はSDIのHello! Worldプロジェクトから
改良していくのかと思ってたんだけど、ちゃうんかな?
>>819
ダイアログも選べるからそこから始める奴は多いだろ。
簡単だから練習には持って来いだし。
つか、作ろうとしてるモノがドキュメントベースかどうかで
MDI/SDI かダイアログかが決められるんであって。
>>818
[ウインドウ]-[新規ウインドウ]が無駄に難しいか?
>>818は放置してもよかろう。
>>821
s/ドキュメントベース/ファイルベース系/
お前ら、WTLとか使ってますか?
826デフォルトの名無しさん:03/12/26 00:41
CImageでbitmapのget/putってできますか?
#get/putはBASICでつ
827デフォルトの名無しさん:03/12/26 00:57
>>826

似たようなことはできたと思われ。
関数名まで同じかどうかは忘れたが。

っつーかMSDN読めよ。
828デフォルトの名無しさん:03/12/26 07:01
子ダイアログのボタンをリターンキーで押せるようにしたいのですが、どうすれば良いのでしょうか?

ウェブで検索してみたところ
ttp://ptvi.hp.infoseek.co.jp/vc/p_0000089.html
こちらには

> WS_EX_CONTROLPARENTが指定されている場合、子ダイアログにあるボタンにフォーカスがある状態で、
> リターンキーを押してもそのボタンが押されません。
(略)
> 子ダイアログのPreTranslateMessageに処理を追加するいか無いようですね。

という風に書かれていたのですが、やはりこのような対処法しか無いのでしょうか。
スペースキーでは押せるのに、リターンキーは特殊なことしないといけないなんて、
なんとなく悲しいです。
Enterキーは[OK]だからだろ
こんなのを急に変えたりすると
間違いなくブーイングの嵐だよ
モードレス?
モームス?
832828:03/12/27 14:09
いえ、モーダルダイアログの上に子ダイアログを載せています。
プロパティシート?
834828:03/12/27 19:07
タブコントロールをプロパティーシート風に使用しています。
835828:03/12/27 19:07
タブコントロールをプロパティーシート風に使用しています。
CPropertySheet
CPropertyPage
AddPage
837デフォルトの名無しさん:04/01/05 00:42
IEツールバーを作っているんだけど、
ツールバーに、動的に変化するテキストを貼り付けることってできる?
(時間計測の結果を表示したい)

ボタンの貼り付けはできるんだけど、テキストだけを貼りたいんだよね。
CToolBarクラスを見ても、使えそうなメソッドがどうにも・・・。
838流れ者:04/01/05 05:52
CFile::Openや、CreateFileでファイルをオープンしようとした時に、
すでに他のプロセスで開かれ、他のアプリでのオープンを許可していない
場合に、アクセスが拒否されますが、
どのプロセスが今使用しているかの判別方法はありますでしょうか?
よろしくお願いいたします。
年賀状は、謹賀、賀正などの「賀詞」、
新年おめでとうございます、などの「祝詞」で始まります。
「賀詞」の場合、“賀正”、“迎春”、“賀春”は、
目上の人に対して失礼な言葉なるので注意しましょう。
目上の人に対しては「祝詞」を使った方が無難です。
目上の人には年賀状を出してはいけません
>>837
ステータスバー使えばいいじゃんとか言ってみる
>>837
スタティックコントロールやエディットコントロールをバンドして更新すれば?
843デフォルトの名無しさん:04/01/06 11:54
AfxMessageBoxのボタンの文字列を変更する方法を教えて
>>843
ない
>>843
メッセージ ボックス スタイル
を変更する。
自作メッセージボックス、どっかに落ちてないかなぁ。
VisualC6.0 からVisualC++.NET に切り替えたんだけど、
6.0にあった プロジェクトの設定ダイアログ -> リンカ -> オブジェクト/ライブラリモジュール
って .NET だとどこにあるかわからないんです。
848847:04/01/06 18:47
解決しました
849名無し@沢村:04/01/06 18:58
>>846
ヌヒよ、他人が作ったものは「自作」とは呼ばないんだよ
850デフォルトの名無しさん:04/01/06 20:40

(a) VC++6.0 で MFCアプリWizardを使ってCEditViewを持つアプリを生成。
(b) CEditView派生クラスで OnPaintハンドラを追加
(c) OnPaintに次のコードを書いてビルド

GetEditCtrl().SetSel(0,-1,TRUE);
GetEditCtrl().Clear();

//GetEditCtrl().SetSel(0,0,TRUE);

GetEditCtrl().ReplaceSel("テストあいうえおかきくけこ\r\n");
GetEditCtrl().ReplaceSel("テストあいうえおかきくけこ\r\n");

これでアプリが暴走するんだけど、何が問題なんでしょう?
EditCtrlのクリア方法で最初の2行でいいんですよね?
3行目は入れても入れなくてもダメだった。
851デフォルトの名無しさん:04/01/06 20:45
>>850
ついでに質問。
CEditViewクラスのOnDrawって、コード書いても
実行されないんだろうか? ダメだったから
OnPaintハンドラを追加してみたんだが。

どういう違いがあるんですっけ?
OnPaintはWM_PAINT発行時なんで分かりやすいですが、
OnDrawはどういうタイミングで呼ばれるんだろう?

852デフォルトの名無しさん:04/01/06 20:57
>>850
メニューで消去コマンドを設定して実装したら
問題なく動作しました。消去した直後に
ReplaceSelするのがよくないのかな?
よろしければ教えてください。
void CXc31_orizinaruDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
ar.WriteString("あいうえお\r\n");
ar.WriteString("あいうえお\r\n");
}
}
このプログラムはMFCで自動作成したのをar.WriteString("あいうえお\r\n");
と追加しただけのものです。
実行して、保存した場合はまったく形式がない「無題」
のファイルを保存します。
メモ帳.txt形式で保存したいのですがどのように
プログラミングしたらよいですか?
>>854 Cooool!
>>853
俺も後学のために聞きたい。
ファイルダイアログは暗黙に呼び出されているみたいだけど、
せめて独自のファイルダイアログを呼ぶことはできないのか?
そういうのは全部自分で作る。
>>857
どこのクラスにID_FILE_SAVE_ASのハンドラを
追加したらいいんですかね。Viewクラス、フレームクラスなど
色々追加してみたけど、どこにも反応がない。
Wizardで作成されたソースを検索しても
ID_FILE_SAVE_ASはヒットしない。ということは
ソース内で明示的にコマンドメッセージをハン
ドルしているわけではないみたい。

こういう場合、ハンドル関数をフックして独自の
ものを実装するにはどうすればいいんでしょう?
>>853
新しいメニューコマンドを設定して、同じような関数を実装することが
できました。

// Viewクラスへのハンドラ
void CSample2View::OnFILESAVEAS2nd()
{
// TODO: この位置にコマンド ハンドラ用のコードを追加してください
CFileDialog fd(FALSE, "txt", "無題だよん.txt",
OFN_ENABLESIZING | OFN_OVERWRITEPROMPT,
"テキスト|*.txt|ドキュメント|*.doc|すべて|*.*||",
this);
if (fd.DoModal()==IDOK) {
CFile file(fd.GetPathName(), CFile::modeWrite|CFile::modeCreate);
CArchive ar(&file, CArchive::store);

GetDocument()->Serialize(ar);

return;
} else return;

}

void CSample2View::OnUpdateFILESAVEAS2nd(CCmdUI* pCmdUI)
{
// TODO: この位置に command update UI ハンドラ用のコードを追加してください
pCmdUI->Enable();

}
>>860 続き

// ドキュメントクラス
void CSample2Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: この位置に保存用のコードを追加してください。
ar.WriteString("テストテスト\r\n");
ar.WriteString("オマエモナー\r\n");
}
else
{
// TODO: この位置に読み込み用のコードを追加してください。
}
}
ID_FILE_SAVE(_AS)でやるときは
BOOL CXXXXDoc::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
をオーバーライドすればいいんじゃないかな。
BOOL CDocument::DoSave()はvirtualついてるから。
>>859
そういうときはMFCのソースのほうをgrepしてみ。
ID_FILE_SAVE_ASからCDocument::OnFileSaveAs()のソースを見ればいい。
結は>>862さんの書いたとおり。

どーでもいい話なんですが、m_hWndとウインドクラスへの
ポインタを混同してしまうことがしばしばありまつ。
まあ、コンパイラでひっかかるからいいんだけど、
たまに「reinterpret_cast したらいいのか?」とか
やばいことを考えてしまう。(w

俺だけ?
865デフォルトの名無しさん:04/01/08 19:58

View派生クラスにCButtonを貼り付けて、そのメッセージを
受け取ろうとしています。MSDNを参考にしてシングルクリック
では成功したのですが、ダブルクリックでは反応がない。
おそらく、CS_DBLCLKSの指定がされてないのだろうと思い、
CButton の Create直後に SetWindowLong でClass Style
を変更してみました。

LONG dwClsStyle;
dwClsStyle = GetWindowLong(m_button_go.GetSafeHwnd(), GWL_STYLE);
dwClsStyle |= CS_DBLCLKS;
SetWindowLong(m_button_go.GetSafeHwnd(), GWL_STYLE, dwClsStyle);

これでダブルクリックに反応するようになったのですが、
ボタンの文字が消えてしまいました。グレイの四角が
表示されるだけです。どの辺りに問題があるのでしょうか?

ウィンドウスタイルとクラススタイルごっちゃにするなと。
867デフォルトの名無しさん:04/01/08 21:43
>>866
すいません。
GetClassLong でしたね。

しかしGetClassLongにしたら、ボタンは表示されたけど
またDouble Clickメッセージを受け取らなくなった・・・。

bResult = m_button_go.Create("逝け!",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0,0,0,0), this, 3);

LONG dwClsStyle;
dwClsStyle = GetClassLong(m_button_go.GetSafeHwnd(), GCL_STYLE);
dwClsStyle |= CS_DBLCLKS;
SetClassLong(m_button_go.GetSafeHwnd(), GCL_STYLE, dwClsStyle);

spy++では CS_DBLCLKS が指定されているのに、
親ウインドウにはシングルクリックしか送られてなかったです。

引き続きアドバイス募集しまつ。
>>867
再起動してspy++で確認してみましたが、
特に SetClassLongをしなくてもデフォルトで
CS_DBLCLKSを持っているようです。

すると別のところに要因がありそう。
BS_NOTIFYが無いとBN_DBLCLKは通知されないけど。
あと、SetClassLongは同じウィンドウクラス(この場合Buttonクラス)全てに
作用しちゃうので、普通使わない。
>>869
来ました! ありがとうございます!
BS_NOTIFY ってMSDNの CButton::Create() には
記述がありませんでした。
GWL_STYLEで置き換わるのはClass StyleじゃなくてWindow Styleですよ。

ダブルクリック受け取るには、ラジオボタンかオーナードローに
しなくちゃいけないようです。BN_DBLCLKのヘルプ参照。
872871:04/01/08 23:07
ぐはっ
レス付いてるの見えんかった
873デフォルトの名無しさん:04/01/09 17:46
SDIアプリで右側に配置したダイアログバーの上に
別のダイアログを表示させるアプリを作っているんですが
ウインドウを表示する前に正確なダイアログバーの位置情報が取れなくて困っています。

行っていることは、CMainFrame OnCreate中でDialogBarを作成
WM_SHOWWINDOWのメッセージハンドラ中に、ダイアログバーのウインドウサイズを
GetWindowRectで取得しようとしているんですがこの値がまともな値になっていません
ためしに、WM_SHOWWINDOWハンドラ中に、1秒タイマーを仕掛けて
WM_TIMERハンドラでサイズを確認してみると正確な値になっているみたいです。

ウインドウ表示前に、ダイアログバーの正確なサイズを知る方法を知っている方は教えてください
MFCは6.0です。

CBrush オブジェクトからCBrushオブジェクトを
生成することはできないんですかね?

FromHandle はどうもオブジェクトの中身を変更しないみたいなんです。
代入もサポートしてないし。

×の例
CBrush brush;
brush.FromHandle((HBRUSH) GetStockObject(GRAY_BRUSH));
CRect rect;
GetClientRect(&rect);
pDC->FillRect(&rect,&brush);

○の例
CRect rect;
GetClientRect(&rect);
pDC->FillRect(&rect,CBrush::FromHandle((HBRUSH) GetStockObject(GRAY_BRUSH)));

背景塗りつぶし処理ですが、前者の場合は白になってしまう。
漏れMFCはよく知らんのだが、前者の方はAPIで言うところのSelectObjectは必要ないのか?
>>874
MSDNでCBrush::FromHandleを見てみて下さい
それで理解できなければC++を勉強し直してください
ヒントはstatic
static CBrush* PASCAL FromHandle(HBRUSH hBrush);
だからね。インスタンスは変更できない。
質問の答えを書き忘れた
CBrushからCBrushを生成することはできません
というかそれで何がしたいのか分かりません(コピー?ハンドル共有?)

文脈から"HBRUSHハンドルからCBrushを"と読み取るとすると
CGdiObject::Attachを参考にしてください
こういう勘違いが起きないようにC#では静的メンバはクラス名からしか呼べなくなったんだな。

どもども。static のついたメンバ関数は、そのクラスから生成された
オブジェクトで共有されるという理解をしてたんですが、静的メンバ関数
はオブジェクトを変更してはいけないんですっけ?

static CBrush* PASCAL FromHandle( HBRUSH hBrush );
とあって FromHandle( ) const ではなかったから、
何かオブジェクトを変更しているのかと思った。

>>878
んー たぶんハンドルのコピーを保持させようとしていたような気がします。
どうせ GetStockObject()のハンドルを Attach() するなら
 CBrush brush;
 brush.CreateStockObject(GRAY_BRUSH);
でいけると思われる。
>>860さん、861さん
どうもありがとうございました。無事メモ帳版データで保存できました。
返事が送れて大変すいませんでした。
教えていただきありがとうございました。
>>880
そもそもstaticメンバ関数は対象オブジェクトが存在しない。
884デフォルトの名無しさん:04/01/09 23:54
>>880
ハンドルのコピーを複数クラスで保持することはポインタのコピーと同じ
問題がおきるから気をつけてくださいね(CGDIObjectは対応しているけど・・・)
うをおおお、全くのど素人からC++ドス画面から学び始めてはや一ヶ月。
やっとVC++で画面出して計算したり、色々出来るようになってきた!
かなり楽しい!
やっとこのスレにも参加出来そうです。

VC++っていじっていくとたのすぃ〜
メモ帳に保存できたことがすごくうれしかった。
私もまだまだド素人ですが、がんばっていきます。
「メモ帳に保存」という表現がどうもしっくりこない。
たぶんパソコンの仕組み自体がよく分かってないんだろうな。
そんな香具師でもその程度なら動作させれるVC++は
偉大だがある意味怖い
ソースをワードパッドで開いている人を見かけたことがある
やっぱり基本的な仕組みを理解することは大事だ
この意味で今の便利さはある意味怖い
わけもわからないまま
ソースは秀丸で開くものだと丸おぼえしてる人もいますが。
いや開くのはなんでもええやん
>>891
ほら、なんでも良いと思ってる奴ここにハケーン
893デフォルトの名無しさん:04/01/11 11:35
 SDI+Doc/Viewで、Wizard使ってできるだけシンプルな
スケルトンを作って、自分でツールバーとステータスバー
を実装しようとしているんですが、実装先はView派生クラス
にするのがセオリーでしょうか?FramWndのOnCreate
だとうまくいかないんです。(Viewでは成功してる)
>>893
「うまくいかない」を説明しろ
>>894
一般的にはどうやってんのかなと聞きたかっただけなんですが、
FrameWndの方でやると、実行時にエラーがでます。

今は良いですが、CSplitterWndを使う場合はやはりフレームウインドウに
ツールバーを貼り付けないとダメになりそう。フレームウインドウに
後から貼り付ける方法あるんでしょうか?

>>895
エラーの名前は debug assertion failed です。
ツールバーの CreateEx の部分で起こってます。
897デフォルトの名無しさん:04/01/11 13:56
ボタンの大きさを表面の文字列(キャプションというのでしょうか)
にあわせて動的に変更したいのですが
文字列の幅、高さを得るにはどのようにすればよいのでしょう?
GetCurrentFontで得られる値をどうにかすればよいと考えているのですが…
>>897
CDC::GetTextExtent
はどう?
899貧乏紙:04/01/11 15:08
VC++ 5のデベロッパースタジオ使ってんだけど、共有DLLじゃなくてstaticDLLを
使いたいが、やっぱり駄目かな?簡単な計算ソフトを知人に送りたいんだけど
MFC.DLLのライブラリー群なんて絶対に入ってないし。。。
ぐぐってみたけどビルド-アクティブな構成の設定でWin32Releaseを選択すると
動くと書いてましたが、本当でしょうか?
いい方法知りませんか?
>>899
俺、フリーウェアの公開は共有DLLでやってるけど、
ダメなんかな? 今のところ起動できないという
報告はないんだが。
>>899
そりゃデバッグ版をリリースに使っちゃまずいだろ。(デバッグ用でない普通の)MFC
のDLL自体はwin95でもなけりゃ普通はOS標準で付いてるよ。持ってなきゃ入れた方
が良いんじゃないの?

つーかAppWizardにDLLをどうするかの項目もあるはずだが。
ttp://www.runan.net/software/clwin/

まあこういうソフトもあるしな。

でもMFC42系なら普通はOS標準で持ってる。IE絡みもあるし。
MFCアプリケーションで、ウィンドウの左上隅に表示される"mfc"という小さなアイコンの
絵を書き換えたいんですけど、どこをいじればいいんでしょうか?
>>903
リソースのアイコン IDR_MAINFRAME では?
>>903
ちなみにデフォルトではIDR_MAINFRAMEに大きいアイコンと小さいアイコンの
二つが入ってるから、両方書き換えるか、小さいアイコンを削除するかしておいた
方が良い。
レスどうもです。
今確認してみましたところ、IDR_MAINFRAMEはあるのですが、
大きい方だけで小さい方がの絵が見当たりません。
恐らく小さい方が画面左上に出ているのだと思うのですが・・・
ちなみに今使用しているのは.NETに入っているVC++7.0です。
以前ステューデントパックで購入したVC++4.0はアイコンが
大小2つあったのですが・・・変だなぁ。
>>906
VCバージョンが何か書いてないので正確には言えんが、アイコンを開いて
メニューの「イメージ」に「デバイスイメージを開く」とか「イメージの種類」とか
いう項目があるだろ?あるいはツールボックスにデバイスイメージの種類に
関するコンボボックスが出てないのか?
>>908
あっ、ありました。
どうもありがとうございます。
>>892
良くない理由を求む。
>>910
ソースはともかく、扱うデータとかだと
バイナリとテキストで色々扱いが違うし、間違って
保存したりしたら改行コードが勝手に変えられたりするな。
890 名前: デフォルトの名無しさん 投稿日:04/01/11 01:57
わけもわからないまま
ソースは秀丸で開くものだと丸おぼえしてる人もいますが。

891 名前: デフォルトの名無しさん 投稿日:04/01/11 01:59
いや開くのはなんでもええやん

892 名前: デフォルトの名無しさん 投稿日:04/01/11 10:59
>>891
ほら、なんでも良いと思ってる奴ここにハケーン
---
という流れで、「ソースはともかく」って・…・
ソースを開く話とちゃうんかいな。
913貧乏紙:04/01/11 23:58
>>ビルド-アクティブな構成の設定でWin32Releaseを選択すると
>>動くと書いてましたが、本当でしょうか?
>>いい方法知りませんか?
駄目でした。
>>901つーかAppWizardにDLLをどうするかの項目もあるはずだが。
普通のは6/5あたりのあるのですが、デベロッパースタジオでは抜けてます。
やっぱり学習用だからかな?
>>913
そういや、Learning はMFCをスタティックリンクか、DLLか、
どちらかしか使えなかったような。
どっちだったかは忘れたけど。
たしかDLLだけ。
スタティックリンクと普通のとどう違うのかはっきりわかりません。
友達に出来たexeあげたらdllが三つ足りなかったから
自分でルートにおいて使ったそうです。
MFCのDLL持ってないようなWindows環境のヤシっているの?
いるかもしれないとは思うけどすごく不便じゃない?
ちなみにMFC42(VC5〜6対応)環境は
・win98以降なら標準
・win95でもIE4のインストールでOK

MFC40(VC4対応)環境は
・win95でもIE3.02インストールでOK
>>917
持ってるやつでもDLLが無いですって言われるみたいです
だからそいつはシステムフォルダからわざわざExeのルートに
DLLをコピーしてやってくれたみたいです。

思うに、スタティックリンクにすればWin本体のDllを使うのですか?
>>919
DLLの意味を調べ、100回くらい音読せよ。
DLLはスタティックリンクできない。
まとめ。
Learningは共有DLLしか使えない。
MFC7で作ったプログラムはWin95では動かない。(たとえMFCのDLLをWin95にコピーしても)
>>921
Win95はサポート終了、つまりM$製品としての扱いをされなくなっているし、
Win98ももうじきサポート終了(あと4日だっけ?)。

てなことを言っているメーカーのライブラリを使う以上は期待しちゃいかんことだろ。
>>922
動かないことに文句など言ってないが。
いまどきwin95なんか使ってるヤシのサポートなんて考えなくていいだろ・・・
つーかそういうヤシは自分で環境作れ
職業で必要のあるなしと、意味があるなしは別の話しだからね
誤爆した
ところでMFC70ってwinXPなら標準で付いてるの?
食生活で顎の発達が阻害されて歯の生える場所がないからだが、
場所自体が無いのに矯正だけで直るものなの?
やっぱり場所確保のために歯を何本か抜いちゃうの?
>>927
そんなこと心配するくらいならスタティックリンクしろや
回答の鉄則:Yes/Noで答えられる質問にはまずYes/Noで答えるべし。
>>929
そういう問題じゃないだろ・・・
932あっき:04/01/12 16:54
はじめまして
今、VC+6.0でActiveXを組み込んでダイアログを作成しています。
プログラム上からActiveXのプロパティを変更したいのですができません
ActiveXコントローラにメンバ変数を設定して、ビルドすると動作しなくなります。
メンバ変数を読み取り専用にすれば動くのですが・・・・
ActiveXってプログラム上からのプロパティの変更はできないのでしょうか?
Win32ApplicationでのプログラムをMFCで使いたいのですが方法がよくわかりません。
ヘッダー2つとWinMainのあるファイルと関数と定義等のあるファイル1つの
合計4つなのですがどなたか指南してください。よろしくお願いします。

プロジェクトに追加するだけだとプリコンパイル済み〜予期せぬEOF〜
とのエラーがでてしまって・・・。
>>933
Win32App Project ではなく、ソースだけ?
>>933
新しいプロジェクトをMFCを使用する設定で作ってソース見れ。
それでもわからんかったら、そうやって作った新しいプロジェクトにソース移せ。
>>933
俺も今別スレのコードをコピペして
コンパイルしたら予期せぬEOFが出ちゃって
何かと思ったら、 int main() { } の終わりの
大カッコがないのが原因だった。

意外とその辺に原因があるのでは?
ついでにエラーコードもここに書くといいかも。
937デフォルトの名無しさん:04/01/12 22:46
>>927
ん?今最新のMFCって7なの?
938デフォルトの名無しさん:04/01/12 22:47
>>933
拡張子を.cppに。
939933:04/01/12 23:51
レスありがとうございます。遅くなりました。
>>934
Win32Applicationで実行可能なソースがありまして、その機能をMFCで
使いたいのです。当方、MFCで少しGUIと機能を作ってしまったので
それに付け加えたかったのです。
>>935
少しやってみました。Win32Applicationで作ったものをMFCにする感じのことが
できそうなので、そちらも少しやってみます。
>>936
fatal error C1010というかんじです。括弧等は考えましたが、すでに実行可能な
ソースですし、違うかもしれません。
>>938
やってみます。また報告します。

皆様ありがとうございます。
940933:04/01/13 00:02
>>938
.cppにしたところ、同様のエラーが出てしまいました。

933であるようにヘッダー2つは問題ないようでしたが、関数と定義等のあるファイルを
追加すると出るエラーです。WinMain()のあるほうはそのまま使うわけではないのでまだ
追加していません。
>>939
MSDNでエラーコード検索してみた?
なんか検索されるけど。
俺は意味ワカラン。(w
942933:04/01/13 00:19
>>941
MSDNはいってないのです・・・。
>>933
それって単に stdafx.h をインクルードしてないだけでは?
944933:04/01/13 00:26
>>933
うお、そうでした…。
ありがとうございました、これからがんばってみます。

皆様ありがとうございました。とても助かりました。






AfxMessageBoxで変数を表示するにはどうすればいいですか?
947933:04/01/13 07:54
たびたびすみません。
あれからまた問題がありまして、

error C2197: 'int (__stdcall *)(void)' : 実引数が多すぎます。

と、いうエラーが追加したファイルにあった関数すべてに出てしまいました。
Win32Applicationの時には出なく、MFCのときにでたので引数とかポインタとかが
間違っているというよりは根本的に何かおかしい原因があるのではないかと思って
いろいろ調べていますが見つかりません。
どなたか助言いただけないでしょうか・・?
>>933
なんだかプロジェクトとソースの取り扱いに関して誤解しているような気がする。
プロジェクトの設定やstdafx.hの取り扱いをよく確認してみたら?
949933:04/01/13 15:54
アドバイスありがとうございます。
お察しのとおり当方まだ未熟すぎてとてもためになります。
そのあたりを調べてみます。ありがとうございました。
>>946
int hoge を表示したかったら
CString msg;
msg.Format("%d", hoge);
AfxMessageBox(msg);

っていうか、こんな質問するぐらいだから、デバッガ使いこなしてないっしょ?
俺もデバガの使い方よーわからん
TRACEくらいしか使ってないw
デバガメとかけて虫取りと解く。
その心は?
>>951
ASSERT, VERIFYでトラップ張っとくと、原因究明が楽になるよ。
Assert解説コード通りにつけたは良いけど意味分かりませんが何か?
955デフォルトの名無しさん:04/01/14 01:16
ボタンをクリックしたときのメッセージってボタンを押してから
離したときに出ますよね。ボタンが押された瞬間に処理を
開始したいんですけどどうしたらいいんでしょうか。
すんまそん、
誰か、独学で煮詰まってきた漏れに教授してやってください。

入力をCStringで受けたとします。
ファイルからにせよ、入力からにせよ。
そうするとそれを数値とがcharに変換できなくてあぼーんします、
charで受けても、結局CStringに表示の際に変換しなきゃいけなくて
そんときにもあたまこんがらがってあぼーんです。

クラス間で変数使えなくて、関数の返り値でCString使って
クラス間移動したりすると、やっぱり数値とかcharに変換出来なくてあぼーんです。

こんな漏れ、でもがんばって少しずつ少しずつプログラムが出来つつありますが、
こんな段階でのぞくべきサイトや書籍等、教えてくださったら感謝感激します。

ああ、ポインタ、わかんない、ああ、ああ、頭がー
pDC->の時に分かったと思ったら。

文字列の頭のアドレスだけ持ってきたって、結局それ以下\0が出るまで
コピーなりしてくれる奴とそうで無い奴覚えなきゃいけないじゃないですか。
覚えてないし、調べてコード書いてたら、何種類も書いて
ああ、機能一つつけるのに、もう二時間、四時間。

一つだけ教えてください、この苦しみが報われる日がいつかくるでしょうか。
957956 :04/01/14 01:21
>>955
OnDown
かなんか、マウス押した瞬間に反応するイベントがあらあよ。
>>956
うざいから二度と書き込まないで
>>853
シリアライズがらみの、この件だけどドキュメントテンプレートの
IDで指定したIDコードのリソース文字列で設定できるみたい。
デフォルトではIDR_MAINFRAME。

書式はシルトの標準講座MFC6.0のp487に書いてあるけど
転載が面倒なんで、がんばってどこかで調べてちゃぶ台。
どうしても分からなければ書きますが、MSDNあたりに
ないんかな。

そのへんは全部MSDNに書いてあるっつーの・・・
char str[] = "abcdefg222";
CString cstr = str;
char *sss = cstr.GetBuffer(80);
TRACE( "%s", sss );

>>956
ゆってる意味が分けわからん
CStringへの変換と、charへの変換したが、これでいいのか?
あと、ポインタとchar型配列は見かけ上同じように扱えるが?
>>961
技術的な質問してないんだから答える必要はないと思われ。
ああ、ほんとだ。
スマネ
そろそろ次スレだね
965デフォルトの名無しさん:04/01/14 08:42
アプリ中の別スレッドで、FormViewのエディットコントロールからリストコントロールへ
フォーカスを移すにはどうしたらよいですか。
m_List.SetFocus();
としてもフォーカスが移らないので
UpdateData(FALSE);
としたらアサートが起きました。コールスタックを辿っていくとコメントの記述で
CWnd::FromHandle()を使うらしいことがわかったのですが、
CWnd *pWnd=FromHandle(g_hListHWnd);//グローバル変数でリストのハンドルをあらかじめ確保しておく
pWnd->SetFocus();
としてもフォーカスは移りませんでした。
>>965
メッセージを投げて、メインスレッド側でSetFocusかな。
>>965
>SetFocus
>ウィンドウは、呼び出し側スレッドのメッセージキューにアタッチされているもの
>でなければなりません
これがあるので、例え ::SetFocus(g_hListHWnd) としても無理だ罠
最近大学の授業で使用することとなりVCを使い始めたのですが、
どうも自分の力量では理解できませんでしたので・・・

ある山の上にあるタンクから100個のボール(Bitmap)が左右の山の嶺を、乱数
を用いて方向を決めて転がっていくというプログラムを作っています。
描画には下の関数を使用しています。

void BitDisp(CWnd* h1,int bmp,int x,int y,int w,int h)
{
CDC pM;
CBitmap pB,*pold;
CDC* pDC=h1->GetDC();
pB.LoadBitmap(bmp);
pM.CreateCompatibleDC(pDC);
pold=pM.SelectObject(&pB);
pDC->BitBlt(x,y,w,h,&pM,0,0,SRCCOPY);
pM.SelectObject(pold);
}

ボールを転がっているように見せるのにはBitmapを描画して消す、というの
を繰り返すという手順でやりたかったのですが、それが分からなかったので
背景と同じ色のビットマップを作ってそれを上書きするという方法をとって
みました。プログラムを動かすとだんだん動作が遅くなり、そのうち止まっ
てしまいます。おそらくメモリ(RAM)が解放されずにどんどん消費されてい
ってるのではと思います。
他のサイトでDCの解放というものを見たのですが、使い方がいまいち分からず
結局状況を改善することが出来ませんでした。
どなたかどうか助言をお願いします。
既出だったらすいません、その時は言ってください。
Flashでやれ
とりあえずReleaseDCが見当たらないね
971965:04/01/15 01:36
>>966
>>967
かかれたとおり
::PostMessage(g_hListHWnd, WM_USER+31, 0, 0);
で出来ました。感謝です。
>>968
void Bitisp( ) の最後で
h1->ReleaseDC(pDC);
を入れてみたら、どうだろ?
>>972
>h1-ReleaseDC(pDC);

やってみましたが、画像が消えずに残ってしまいました。
うーん、これってビットマップの代わりに円の描画とか
でやるしかないのかな・・・
974968:04/01/15 02:44
973=968でした。

訂正:h1-ReleaseDC(pDC);
でプログラムが遅くなったり止まったりというのは解消できていました。
その後ネットで調べながら何度か試したら出来ました。
どうやら、

h1->Invalidate(TRUE);
h1->ReleaseDC(pDC);

という記述をしたら画像も消えてさくさく動くようになりました。
970,972さんどうもありがとうございました。
次スレです。
http://pc2.2ch.net/test/read.cgi/tech/1074104008/

ルートパス内にあるファイルを取得する方法ってどうすればいいですか?
>>975
CFileFind
977975:04/01/15 20:50
>>976
どうもありがとうございます。CFileFindをMSDNで調べると

CFileFind finder;
BOOL bWorking = finder.FindFile("*.*");
while (bWorking)
{
bWorking = finder.FindNextFile();
cout << (LPCTSTR) finder.GetFileName() << endl;
}
これでフォルダ内にあるファイルを列挙することが出来たんですが
ワークスペース内のファイルとフォルダしか表示することが出来ませんでした。
パスの指定はどうやるのでしょうか?
>>977
finder.FileFind(_T("B:\\*.*"));
979975:04/01/15 23:24
>>978
レスありがとうございます。
bWorking = finder.FindFile(_T("C:\\*.*"));
こうやるとCドライブのファイル、フォルダが表示されるようになりました(いくつか謎のファイルも表示されましたが・・・)。
でもこれって一定のフォルダしか表示されませんよね?
CStringのオブジェクトszPathに入っているパスのフォルダにあるファイルを表示したいのですが・・・。
何回もすいません。
脳みそ無いのか。
szPath += _T("\\*.*");
Finder.FindFile(szPath);
981975:04/01/15 23:50
>>980
お恥ずかしい・・・。出来ました。ありがとうございます。
VC6でグラフの描画プログラムを作っています。
スクロールバーでスクロールしているときにグラフの再描画が発生して
その処理をさせているのですが、スクロールのマウスイベントが
終了していない状態でポップアップがでて再描画しているため、
再描画処理が終るとスクロール処理が走り、そこで再描画が発生してループになってしまいます。
マウスイベントを破棄する関数とかないでしょうか?
教えてください。