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

このエントリーをはてなブックマークに追加
1MFC
前スレ
■ VisualC++(MFC限定)相談室 4■
http://pc3.2ch.net/test/read.cgi/tech/1021620974/l50
2げっとできた?
>>2
おめれと。
>>1
otu.
5デフォルトの名無しさん:02/08/06 02:33
スレ立てお疲れです。
CAsyncSoketクラスの派生クラスを使って
Chatプログラムを作りたいんですが上手くいきません。
具体的には
m_SockCreate();//ソケットの作成
if(0==m_Sock.Connect((LPCTSTR)dlg.m_strIP,46820)&&WSAEWOULDBLOCK!=m_Sock.GetLastError())
{//接続エラー
MessageBox("接続エラーが発生しました",);
return;
}
切断ボタン
{
m_Sock.Close();//ソケットの削除
}
//接続した
void CConnectSock::OnConnect(int nErrorCode)
{
m_pWnd->MessageBox("接続しました");
CAsyncSocket::OnConnect(nErrorCode);
}

//接続された
void CConnectSock::OnAccept(int nErrorCode)
{
m_pWnd->MessageBox("接続されました");
CAsyncSocket::OnAccept(nErrorCode);
}
//切断された
void CConnectSock::OnClose(int nErrorCode)
{
m_pWnd->MessageBox("切断されました");

}
この中でMessageBox("切断されました");
だけがどういじくっても表示されません。
どうやったら切断時にCConnectSock::OnCloseが呼ばれるのでしょうか?
ほんと困ってるので教えてもらえないでしょうか。
6デフォルトの名無しさん:02/08/06 02:44
 スレ立ておつかれです。
 CListCtrlで、アイテムごと、もしくはサブアイテムごとにテキストの色
変えることってできないでしょうか。ライブラリを読む限りじゃ既存の機能
では無理っぽいのはわかりましたが、もし無理に実現するとすればどんな方
法が考えられるでしょうか。どなたかレスお願いいたします。
76:02/08/06 04:48
 すんません、某ページで見つかり解決しました。
 お邪魔しました
OnCloseって、向こうがCloseしたときに呼ばれるんでなかったかいな?
95:02/08/06 08:56
>8
そのとおりです。
ですが、なぜか切断されても呼ばれなくて困っています。
クライアントのClose()関数が呼ばれたら
サーバーのOnCloseが呼ばれるって流れですよね?
呼ばれなくて困ってます。。
10デフォルトの名無しさん:02/08/06 19:16
>>9
その前に接続されてないとおもうぞ
Acceptしてねーし
CStringを元にした(・∀・)イイ!! 派生クラスの紹介キボンヌ。
>>11
まず脱げ。

>>1
(・∀・)ノスレさんも疲れ〜
13デフォルトの名無しさん:02/08/07 02:07
(´-`).。oO(「脱げ」ってどういう意味だろう・・・
14閉じ忘れちうい:02/08/07 02:20
)
(´-`).。oO(言うまでもなく脱衣げーむだろう…)
16デフォルトの名無しさん:02/08/07 11:02
LoadBitmapの反対の処理を行なう関数はありませんか?
ビットマップハンドルを名前を付けて保存したいのですが。
17デフォルトの名無しさん:02/08/07 14:21
ダイアログベースで作ってるのですが
エクスプローラみたいなTreeViewを
表示したいのですがどうやったらいいのでしょうか?
SHBrowseForFolderの画面みたいなプログラムです。
それを画面に常に表示させておいて処理の出力先を
選択できる形にしたいのですが。
解凍ツールのLhasaみたいなやつを作りたいんです。
あれは、CTreeViewを使って自前で書くべきなんでしょうか?
そう考えると、展開される瞬間にに二つ下の階層を読みに行って、
一つしたのアイテムに挿入するという形しか思い浮かびません。
これだと、重いので根本的に間違ってる気がします。
Lhasaを見てみるとカスタマイズされた
SHBrowseForFolderのようにも見えます。
こっちで考えてみると、メインウィンドウが
SW_HIDEなウィンドウの子ウィンドウで実装する
形になるのですか?
設計段階から、検討もつかず困ってます。
アドバイスいただきたいのですが。
よろしくお願いします。
18初心者 ◆jXxeRXqw :02/08/07 21:22
ダイアログ形式で
ドロップダウン形式のコンボボックスを作ったのですが
右にある「▼」を押してもドロップダウンが表示されません。
項目を選択した状態で↓ボタンを押すと
項目は切り替わるのですが・・・・
何か、ヒントだけでもお願いします。
>>18
コソボボックスの縦のサイズをもっと大きくしろよヴォケ
2017:02/08/07 21:49
>18
コンボボックスはリソースエディタで
配置&サイズを決める時ちょっと他のと違って、
まず、配置する。
これは他のと同じ。
その後、ドロップダウンが表示されている状態の配置を設定。
つまり。1:通常状態 2:開いてる状態
の二つの配置が必要。
て言っても、二つ目は一つ目のやつの高さを
ドラッグして、長くするだけなんだけど。

ってわかりにくいだろうから一生懸命書いてたけど、
>19が一言で済ましてくれたw
ちょっと悲しい。
21初心者 ◆76EfjdUc :02/08/07 22:10
>>19,20
できました。
どうもありがとうございました。
2217:02/08/07 22:18
そりゃよかった。
確かに案外分かりにくいかもしれん。
この勢いのまま、どなたか
>17にも愛の手を。。
どうぞよろしくお願いします。
23デフォルトの名無しさん:02/08/07 22:23
えっと、初めての質問なのですが、
CMenuのTrackPopupMenuを用いて別のアプリケーション上にメニューを
表示するのですが、そのアプリケーションがアクティブな場合に
メニューへキーボードからの入力できないのですが何とかならないでしょうか?
自分のウィンドウを先にアクティブにすれば一応使えるのですけれど、
閉じたあと元のアプリケーションがアクティブにならないので、できれば
アクティブ化しないで入力だけ欲しいのです。
2517:02/08/08 06:54
>24
ありがとうございます。
待ったかいがありました。
見るからに私の希望どおりのことが
書いてあると思われる内容です。
ただ、英語なんですね。。
高校当時英語20点という点数を打ち出した私の
頭じゃつらい。。
でもここで「日本語のページでないでしょうか?」
っていうのも甘えてるみたいなんでやめときます。
辞書片手にがんばってみます。
ありがとうござました。
>>25
読めなくてもソースから理解できる罠
27デフォルトの名無しさん:02/08/08 23:41
プログラム中に音を再生したいとき、どうすればいいのでしょうか?
PlaySound("SystemStart", NULL, SND_ALIAS_ID);
このように試してみても音が出ないのですが理由がわかりません。
ただwavファイルを再生したいだけなのですが、
普通はplaysound以外の他の方法を使うのでしょうか?
よろしくお願いします。
28デフォルトの名無しさん:02/08/09 00:30
ごめん、VCの操作に関してです。
英語のリソース作ったんだけど、うまくリンクできません。
何か特別な設定が必要ですか?
教えてください。
おながいします。
29デフォルトの名無しさん:02/08/09 10:48
MFC拡張DLLを作成しているのですが、
エラーが出てコンパイルできずに困っています。

CString WINAPI GetDirectoryPath();
という関数と

class AFX_EXT_CLASS CTest
{
〜〜〜〜中略〜〜〜〜〜〜〜
public:
CString GetDirectoryPath();
};

この両方の関数をエクスポートしようとするとエラーがでます。
.defファイルのGetDirectoryPath @?というのを
コメントアウトすれば大丈夫ですが
前者の関数がエクスポートされません。
両方エクスポートするにはどうすればいいのでしょうか?
名前を変えるしかないのですか?
30デフォルトの名無しさん:02/08/09 11:27
デフォルトライブラリのリスト自体の設定ってどこにありますか?
31デフォルトの名無しさん:02/08/09 13:20
AfxMessageBox
AfxGetApp

Afxっていったい何を意味するんですか?
自分で
Afx????みたいな関数作っても
おかしくないですか?
動くとか動かないとかの基準じゃなくて。
32若輩者:02/08/09 16:09
はじめまして、プログラム若輩者です。
今、画像処理用のプログラムを勉強しています。
自作の画像処理用ソースファイルとヘッダファイルを
MFCに追加して、CViewクラスから追加した自作のクラス内の
メンバ関数にアクセスしたいのです。

この時、CViewクラスから自作クラスへのポインタ、もしくは
オブジェクトを作ってアクセスしようとするとコンパイルでは
エラー0なんですが、実際に実行すると
『内部エラーが発生しました』
と出てしまい、どうしたらよいか悩んでおります。
よろしかったら先輩方のアドバイスを頂けたらと思います。
どうかよろしくお願いします。
>>32はマルチ。相手にすんなよ。
34デフォルトの名無しさん:02/08/10 05:35
リストビューで
レポート型 LVS_REPORTを指定すると普通は
一番左側の項目しかクリックできないと思いますが、
これを一行丸まるクリック可能にすることは出来ないでしょうか?


1 INTEL 75%
2 AMD 20%
3 VIA 5%
.
.
みたいな感じで左側にはインデックスだけついてるので
そこだけクリック可能というのではちょっと変になってしまうんです。
それともこういう場合はリストビューじゃ無い方がいいんですかね?
(数字に意味はないです。念のため(^^;)
>34
LVS_EX_FULLROWSELECT
>>31
確か Application Frameworks の略だ。
自分で Afx... は俺はちょっと違和感が。
>>27
>PlaySound("SystemStart", NULL, SND_ALIAS_ID);
うちも鳴らね.なんでだろう...?
(9xはこのフラグに対応していないと MSDNにあるが,2000でも鳴らぬ)

>>31
MFCのグローバル関数.名前がかぶらなければ自作関数にこのプレフィックス
つけてもかまわないが >>36の言うように違和感あると思う.
3834:02/08/11 04:14
>35
ありがとうございます
それで一行選択されるようになりました


しかしもう一つ質問してよろしいでしょうか?
リストビューの項目がダブルクリックされたときに
その選択されたテキストを手に入れるようにしているのですが
GetHotItem()
だとカーソル位置で判断するようなので
行が反転されていても実際には文字の上にカーソルがないと
正常にどうさしません。
リストビューじゃなくて
ListBoxのGetSelCurのような関数があればとおもったのですが・・
どうもそういうのが見当たらないです・・・
39 :02/08/11 04:58
>>38
GetNextItem()
4034:02/08/11 05:34
>39
ありがとうございます。
なんたかできました。
しかしヘルプがわかりずらいですねこの関数。
最初なにが書いてあるかわからずいろいろ試行錯誤してしまいました。
結局
GetNextItem(-1,LVI_SELECTED);
で出来たのですが。
CListCtrl::GetFirstSelectedItemPosition
があるが。
MSDN Online の『Visual C++ プログラマーズ ガイド』
(http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/vccore/vccorehm.htm)の
「コレクション トピック」
ってどこですか?

ここの説明ってすごく不親切で、リンク張ってないんです。
誰か知ってる人いたら教えてください
4339:02/08/12 02:14
>41
なるほどそれでもできそうですね。
ありがとうございます。
しかしこの場合は
戻り値がGetNextSelectedItemで使うPOSITION
のようなのでもう少し手間がかかるようです

ところでMFC(っていうかC++)でperl風の正規表現
$string =~ /</</g;
なんてのを使うときにはどうするのがベストなんでしょうか?
(速度的にも手間的にも)
Cでポインタをすすませながら一文字づつ文字列を直にいじるか
それともperlインタプリタを使ってperl関数を呼び出す・・????
vc++で質問があるれす。私、初心者れす。

プロセスの優先度を変更するためにはどうしたらよろしいのでしょう?
プロセス名までは取得できたのですが、変更はどうもうまくイカンのです。

先生方、よろしくどうぞ。
>43
正規表現ライブラリを組み込むのが面倒くさいときは、flex。
46handleないぞ:02/08/12 13:20
C++ Win32 Tips100 という本p29でダイアログで
WM_NCHITTEST
ハンドルをクラスウィザードで追加するとあったのですが
このハンドルはウィザードのどこ探しても見つかりません。
出てこないハンドルをMFCで追加できますか?
47handleないぞ:02/08/12 13:23
ハンドルつうか,メッセージマップにWM_NCHITTEST がないんですよ
なぜ手動でメッセージマップに追加しないかなぁ……
49デフォルトの名無しさん:02/08/12 14:01
>handleないぞ
クラスウィザード→クラス情報タブ→詳細設定オプション→メッセージフィルタ
が「ウィンドウ」になっていないのでは?
50handleないぞ:02/08/12 14:09
>49
どうもです。メッセジフィルタが「ダイアログ」になってて「ウィンドウ」
ってのは無いんですが(?_?)最上位フレームというのにしてみたら旨く行きました。

>48
ハンドラ手動追加もやってみました。一応動くんですが書きこみは

ソース内:BEGIN_MESSAGE_MAP
ソース内:メッセージ ハンドラ
ヘッダー内:// 生成されたメッセージ マップ関数

の3箇所でいいんですか?
グレー表示のところなんかには触っちゃいけないもんだと思ってたんで。
51デフォルトの名無しさん:02/08/12 14:43
メインAppのpublicにメンバ変数を宣言して、グローバル変数として使ってます。
  CWinApp* pApp = AfxGetApp();
  pApp->メンバ変数名
って別のクラスとかで使ってたんですが、なんか、8個以上になると、
急にわけわかんないエラーがでます。
  XXXのメモリがXXXを参照しましたがXXXのメモリがreadになることはありませんでした。
・・・とかっていうアレ。
最初エラーの原因がわかんなくて、バックアップ取っといた方で、組んでいったら、
どうも、メインAppのメンバが9個を超えると、いきなりそんなふうになるっぽいです。
でも、メンバ変数が増えるとエラーが出るなんてことあるの?
誰かおしえて〜・゚・(ノД`)・゚・。ウワアアアアアン
ヽ(`Д´)ノ
ケティィヽ(`Д´)ノクソゥもうコナィヨ!!
なんか宣言の位置変えたら治ったっぽい!
メンバ変数の宣言の順番でエラーが出たり出なかったりするなんて・・・
ふしぎだ。やさしい人なんかおしえてよ〜T_T
>>54 逐一、リビルドしてみたら?
>>55
親切なヒト発見!
しょっちゅうビルドしてるけどだめっぽいです。
なんか宣言は大丈夫でもアクセスすると例のエラーでます・・・ナゼダ?
もうネムイ・・ねよ。
ま、こういうのはソース醸せ?
58デフォルトの名無しさん:02/08/13 05:00
>>16
遅レスだが、これはどうだ?
ttp://61.127.132.232/~ToukatuTCP/vc/006.html
59nana:02/08/13 07:36
finder.FindFile("*.txt");
で拡張子がtxtのファイルを取得できるけど
拡張子がhtmlもしくはtxtみたいにして指定することは出来ないのですか?
2回Findfileを呼び出してぐるぐるさすしかないのかなーー。
60デフォルトの名無しさん:02/08/13 08:25
>>59
finder.FindFile("*.*");
if 拡張子が 'txt' 若しくわ 'html'ならってやれば
61初心者 ◆76EfjdUc :02/08/13 13:59
Perl風の正規表現が使えるBREGEXP.DLLなるものを
下のページで見つけたのですが、同ページに乗っているクラスBregPoolが
エラーを起こして使えません。

BREGEXP.DLL
http://www.hi-ho.ne.jp/babaq/bregexp.html

とても便利そうなので是非使わせていただきたいのですが・・・
どなたかご教授願えませんでしょうか?
62デフォルトの名無しさん:02/08/13 15:34
Dialog の枠引っ張って大きさ変えられるようにできます? 
プロパティにはサイズ可変とか見つかりません。
http://www.codeguru.com/dialog/index.shtml

Resizable Dialogs
を嫁。
どおおもです。読んでて気付いたんだが
>プロパティにはサイズ可変
モロにあるわけですね。僕って本当にfusianasan.
>>62
単にサイズ変更可にするだけなら、境界線をサイズ変更枠(WS_THICKFRAME)
にすれば OK。右下にハンドル(?)を表示したいとなるとやはりcodeguru
参考にするのがよいと思う。
OnDraw内で、CListCtrlクラスのオブジェクトにSetItemCountで1以上の値を与えると、
デバッグVerでは問題ないのに、リリースVerだとOnDrawの処理を抜けた後、
ソース外で撃沈、異常終了(Access Violation)しちゃうんだけど、
何がいけなさそう?
OnDrawが終わる直前にSetItemCountを使ってもダメだった。
>>66
OnDrawで描画以外のことをするなと小以下略
何か適当なメッセージをPostして、そのメッセージのハンドラで処理すれ。
68デフォルトの名無しさん:02/08/14 03:21
オーナードローメニューのOnDrawItemで、
描画しているのですが、アイコンをDrawStateと
DrawStateのプロージャ関数内でDrawIcoExを使用して描画しています。
DrawStateのフラグに、DSS_NORMALを指定したときはうまく描画されるのですが、
DSS_DISABLEDを指定した場合に、全く描画されません。
一応DrawIconExは成功しているようなのですが、
この場合どんな原因が考えられるでしょうか?
白く塗りつぶした上に描画しています。
6968:02/08/14 03:36
3日悩んでいたのに、投稿後数分で解決しました(^-^;)
DrawStateで描画する位置を指定せず(0,0)に、
プロージャ内で位置を指定していたため、位置がズレていたのが原因のようです。
しかし、なんでDSS_NORMALの場合だけ成功するんでしょうか…。
70デフォルトの名無しさん:02/08/14 09:29
非アクティブ時にメニューを表示して、そのメニューをキーボードから操作は
できませんか?
メニューにSetFocusを使おうと思ってもHWNDの取得の方法がわからなくて、、、
(それ以前にメニューってウィンドウじゃない?)
>70
はっきりいって言ってることが
よくわからんが、
>非アクティブ時に
フックについて調べるとよい。
>HWNDの取得方法が
FindWindowで間にあうならフックしなくてもいい。
>>71
レスthx.フックとか調べてみます。
ところでメニューのクラスって分かります?
73訂正:02/08/14 11:30
クラス ×
ウィンドウクラス ○
>>72
メニューはウィンドウじゃないよ。
どうしてもメニューを表示したいならシステムフック。
75初心者:02/08/14 22:46
OnPaint の dc(this) のハンドルはどうやって取得できますか?
GetSafeHdc(),では「定義されてない」
CDC::GetSafeHdc(),では
C:\Program Files\Microsoft Visual Studio\MyProjects\mc4\mc4Dlg.cpp(296) : error C2275:
'CDC' : typedef 識別子に、クラス メンバ アクセス演算子 (->) を使用しました。
怒られます
>75
質問の意図がよく分からないけど
 CPaintDC dc(this);
 HDC mpTest1 = dc.GetSafeHdc();
 HDC mpTest2 = dc.m_hDC;
とかではだめ?
77 :02/08/15 00:31
>>74
メニューはウィンドウだよ。もっとも、ウィンドウハンドルが分かっても
どうしようもないけどね。ちなみに、ウィンドウクラス名は#32768だ。
78gessi:02/08/15 02:39
>HDC mpTest1 = dc.GetSafeHdc();

ありがとう.
クラスとメンバについてわかってなかった馬鹿な私でした.
7966:02/08/15 08:36
>>67
回答ありがとう。
なるほど、OnDraw内から引っ越したら確かに異常終了はしなくなった。
が、別の症状が出るよーになってまた頭を悩ませることに……。ともかく感謝。
8079:02/08/15 22:21
解決シタ━━━(゚∀゚)━━━ !!!と思ったのは何かの間違いだったらしく、
OnDraw外に置いても相変わらず同じパターンにハマる。

ただ、ひとつわかったことがあって、仮想リストビューを使ってるんだけど、
撃沈の直前の処理はOnGetdispinfo****関数が最終のようだということ。
デバッグVerではその後_AfxDispatchCmdMsgに処理が移り、case AfxSig_vNMHDRpl:に飛ぶ。
一方、リリースVerでは次のソースにたどり着く前に力尽きる。
つまり、CListCtrlオブジェクトでSetItemCountを使ってアイテム数を増やすと
OnGetdispinfo****が呼び出され、以下撃沈、という図式の模様。
 印刷機能を作っています。マップモードを変更したときに、印刷領域を
取得する方法がわかりません。どなたか教えてもらえませんか。

 OnPrintの引数pInfoのメンバm_rectDrawが印刷領域を表してるのはわか
るのですが、デバイス単位なんですよね・・・。本に書いてあったので
OnPrepareDCのなかでSetMapModeとか呼んでみたのですがうまくいきません。
何がおかしいのでしょうか・・・
82 :02/08/16 09:16
>>81
DPtoLP
83まじめな質問者。:02/08/16 16:47
VC++6.0(MFC)、Win2000。
SDIでアプリを作ります。
モードレスダイアログを一つ表示したいのですが、
なんも考えずにあたりまえに(ヘルプに載ってるよーに)つくると
モードレスダイアログはアプリケーション内で
ZオーダTop位置固定に表示されちゃいます。
メインフレームのウィンドウがアクティブな時は
そっちを上にしたいんですけど。
どうしたらよいのでしょう?

「すれ立てるまでもない質問はここで」で誘導されちゃった。
モードレスダイアログが後ろに行くというのは、
インターフェース設計としていかがなものだろうか。
8583:02/08/16 19:29
なにか変ですか?
ほかに標準的な実装がある、とか。
CreateDialogのhWndParentをHWND_DESKTOPにするとか。
8783:02/08/16 19:45
>>86
ナイス!いけました!
ありがとうございました!!
8881:02/08/16 22:21
 >>82さん、一発解決でした。どうもです。
8981:02/08/17 22:02
 またしても印刷で悩んでしまいました。
 WYSIWYGではない印刷を行うとき、ページ数事前に調べにくいために、
OnPrepareDCでフラグを・・・といった説明をあちこちで読んだのですが、
結局印刷プレビューを正しく表示したり、印刷をするためにはどこか
でページ数を設定しなくてはなりませんよね?
 OnPrintでは必要な情報がそろっているため、ページ数を確定できる
のですがOnPrintでSetMaxPageを呼ぶと、印刷時には印刷ステータスダ
イアログのページのカウントがキャンセルするまで無限にカウントされ
てしまいます。
 まったくSetMaxPageを呼ばないとプレビューも印刷も1ページ目のみ
になってしまうし・・・。どうするのが一番よいのでしょう。どなたかア
ドバイスお願いします。
90デフォルトの名無しさん:02/08/18 15:56
他のアプリのウインドウスタイルを変更して常にトップ表示にすることは
可能ですか?
91 :02/08/18 19:25
>>90
可能です。
92デフォルトの名無しさん:02/08/18 19:55
SPY++のウインド検索はどのようになってるのでしょうね〜
だれかご存じですか?
Advanced Windowsでも読めば少しは分るんでないのか
>>90-93
おまえらスレ違い警報が発令されるぞ
95Melt-D:02/08/19 13:17
長くなると思うのですが、質問です。
ダイアログのエディットボックスから取った文字列を
リストに表示する処理を行っています。

・edit_dlgはCDialogの派生クラスのオブジェクトです。
・m_listCtrlはCListCtrlクラスの派生クラスのオブジェクトです。
・bufはchar型配列です

<<問題点>>
リストが正しく表示されません。
CListCtrl::InsertItemで設定した(LPCTSTR)edit_dlg.m_id_editは表示される。
CListCtrl::SetItemで設定した以下の文字列が表示されない。
既に設定してあるリストを編集する形でCListCtrl::SetItemTextを使った場合
更新はされる。
何か抜けているのがありましたらご指摘お願いします。

if( edit_dlg.DoModal() )
{
  LV_ITEMmyItem;
  myItem.mask = LVIF_TEXT;
  myItem.iItem = m_listCtrl.GetItemCount() + 1;
  myItem.iSubItem = 0;
  strcpy( buf, (LPCTSTR)edit_dlg.m_id_edit ); //m_id_editはCString型
  myItem.pszText = buf;
  int iItem = m_listCtrl.InsertItem(&myItem);

  myItem.iSubItem = 1;
  myItem.mask = LVIF_TEXT;
  ZeroMemory( buf, sizeof( buf ) );
  strcpy( buf, (LPCTSTR)edit_dlg.m_app_edit );m_app_editはCString型
  myItem.pszText = buf;
  m_listCtrl.SetItem(&myItem);

  myItem.iSubItem = 2;
  myItem.mask = LVIF_TEXT;
  ZeroMemory( buf, sizeof( buf ) );
  strcpy( buf, (LPCTSTR)edit_dlg.m_slocal_edit );m_slocal_editはCString型
  myItem.pszText = buf;
  m_listCtrl.SetItem(&myItem);

  myItem.iSubItem = 3;
  myItem.mask = LVIF_TEXT;
  ZeroMemory( buf, sizeof( buf ) );
  strcpy( buf, (LPCTSTR)edit_dlg.m_clocal_edit );
  myItem.pszText = buf;
  m_listCtrl.SetItem(&myItem);

  ///(途中省略・・・)///

  m_listCtrl.SetItem(&myItem);
  m_listCtrl.Update(iItem);
}
96デフォルトの名無しさん:02/08/19 13:20
MFCってVS.netで何が変わったの?
あんまり情報が見つかんなくてわからないんでけど。
誰か知ってたら教えて
>>95
> int iItem = m_listCtrl.InsertItem(&myItem);
返ってきたiItemと myItem.iItem を比べてみ。
98Melt-D:02/08/20 11:31
>>97
GetItemCount() + 1が余分だったんですね・・・。
iItemは0スタートということをすっかり忘れていました。

感謝します。
エディットボックスの中でEnterキーが押されたことをメッセージとして受け取るにはどうすれば良いでしょうか?
クラスウィザードでエディットボックスを選択するとWM_KEYDOWNメッセージが無いのですが・・・
チミはクラスウィザードに頼らな何にもできひんのかいな。
10199:02/08/20 21:51
解決しますた
やっとCTreeCtrlの使い方が少し見えてきた
先は長〜い
103デフォルトの名無しさん:02/08/21 02:32
レジストリを変更して
.lzhを自分で作ったアプリに関連付けしたのですが、
もとの関連付けに復旧した時に
画面上のアイコンは再描画されません。
レジストリ変更後、すぐにアイコンを
元に戻す(再描画する)にはどうすればいいでしょうか?
 あるコントロールで、任意の部分を選択カラーにしたいのですが、
どうすればよいのでしょうか。InvertRectだとそのまま反転してしま
うのですが、「選択色」にしたいのです。どなたかレスお願いします
105 :02/08/21 03:48
>>104
あるコントロールとは具体的にはどれだ?
とりあえずキーワードはカスタムドローとオーナードロー。
106デフォルトの名無しさん:02/08/21 09:26
VC++の例外処理の実装について詳しいサイトはないでしょうか?
自分で調べてもよく分からんのです。
2進数とか16進数の計算をする時には、どの関数を使えばいいのでしょうか?
教えて下さい。お願いします。
int i = 0x400 + 0x720; //16進数の計算?
109:02/08/21 10:14
>107
すれ違い。
110名無しのデフォルト:02/08/21 20:07
 ソケット通信を1台のPcで2EXE間で多発しているプログラムを使用しているの
ですが、(OS-XP Vc++6.0で作成)10分ぐらいたつとAEXEでSendで出したもの
に対してBEXEがOn関数で受けなくなってAEXEはSENDが成功してからRecieveを
使っているのでAEXEが止まっています。OS-NTの時にはそのような問題にはな
らなかったのでXp絡みだと思います。(ちなみにBEXEを強制的に落とすとAEXE
は動き出します。XPの基本優先度を上げると起き難くなります。)
BEXEが悪いかXPの通信が悪いかだとは思うのですがご存知の方がいたらお願い
します。通信を繰り返してるだけなので1回1回には問題なと思うのですが。
111とくめいさん:02/08/21 20:55
.NETでMDI環境の標準スケルトンを作成して
表示に独自のイベントハンドラを挿入しても実行されません。
なぜか教えてください。
VC++.NETはVC++6よりずっと使いにくくなりました。

112104:02/08/21 21:56
 >>105さん、レスどうもです。あるコントロールというのは
リストビューのことです。サブアイテムも選択可能にしたの
ですが、選択中の表示を今はカレットを使っているのですが、
点滅がなんかうざいなー、と思いまして。CDCにフォーカス矩形
の表示はあったのですが、選択中の反転(InvertRectじゃない)
もCDCでできないのかなーと思って質問したしだいです。
 オーナードローとカスタムドロー、少し調べてみます。
113デフォルトの名無しさん:02/08/21 22:24
教えてくだちい
他のウインドのリージョンを取得しようとして

HRGN hRgn = CreateRectRgn(0,0,0,0);
int rgntyp = ::GetWindowRgn(hWnd, hRgn);

とやったのですがERRORAPIがリターンされます。
どうやったら他のウインドウのリージョンがget出来るのですか?
114 :02/08/21 23:13
>>113
対象のウィンドウがリージョンを持っていれば、それで取得できる。
115デフォルトの名無しさん:02/08/21 23:23
>114
どうもです。

つまり自分や誰かがSetWindowRgnした後なら取れるって事ですか?
実は重なり合っているウインドの見えている領域と
HWNDのリストを作りたいのですが可能ですか?
116 :02/08/22 00:06
>>115
GetWindowRgnがエラーだったら、GetWindowRectしてCreateRectRgnIndirect
すればいいのでは?
117デフォルトの名無しさん:02/08/22 09:06
CControlBar上にコントロール(CTreeCtrl)があります
バーもコントロールもCMainFrameのメンバ変数になっています

OnSelchangedなどの処理をするにはどうしたらいいでしょうか

CTreeViewの宣言、関数をそのままMainFrameにコピーしてみましたが
反応無しでした
118デフォルトの名無しさん:02/08/22 21:23
MFCのコントロールを色々使った例が載ってるような書籍って無いですかね?
11929:02/08/22 21:50
>118
新VisualC++入門 シニア編
\4200
著者 林 晴比古

ただし、
>MFCのコントロールを色々使った例
の他はほとんど為にならないので注意。
辞書代わりに使える、初心者ご用達の本。
って俺は思う。

誰か俺の質問教えて。。
足りない言葉あれば補足しますので
よろしくお願いします。

120 :02/08/22 23:41
>>119
_declspec(dllexport) CString WINAPI GetDirectoryPath();
12129:02/08/23 03:09
>120
いけました。
おかげさまでやっと進めます。
その部分がわからなくて放置してたので
助かりました。
ほんと感謝してます。

このスレいまいち盛り上がらないなぁw
あんまりみんなMFCって興味ないのかなぁ。
122デフォルトの名無しさん:02/08/23 19:23
質問です。

AppWizardで作成したMDIアプリで、
メニューの ファイル→開くを選択した時
出てくるコモンダイアログのポインタを取得出来ないでしょうか?
コモンダイアログで選択中の拡張子が取得したいんです。

それと、コモンダイアログで開けるファイルの種類を増やしたい時
ストリングテーブルをどの様に編集すれば良いですか?

Bmpファイル(*.bmp)
Jpegファイル(*.jpg)
すべてのファイル

の様にしたいのです。 VC6.0です。
123デフォルトの名無しさん:02/08/23 21:58
VisualStdio.netでMFCはどう変わったのでしょうか。
知っている人がいたら教えてください。
124デフォルトの名無しさん:02/08/23 23:33
>>122
コモンダイアログのプロパティとイベントに関する部分の
ヘルプをよ〜く読め
125デフォルトの名無しさん:02/08/23 23:35
質問です

CScrollBar(というかコモンコントロールのスクロールバー)のメッセージ
WM_VSCROLL, WM_HSCROLL は CScrollBar ではなく、その親ウインドウに
送られますよね、それがいやなので次のようなクラスを作ってみました。


class CScrollBar2 : public CWnd {
CScrollBar m_sb ;
afx_msg void OnVScroll(
UINT nSBCode,
UINT nPos,
CScrollBar *pScrollBar
) ;
DECLARE_MESSAGE_MAP()
} ;
以下略(説明用ですので細かい突っ込みはなしです)...

m_sb は CScrollBar2 の子ウインドウとして作成されます。
結果、WM_VSCROLL, WM_HSCROLL は CScrollBar2 に送られます。
CScrollBar2 を普通の CScrollBar のように扱います。


で、ビュークラスにつけて、縦スクロールバーのように動作するように
してみたんですよ。
まあ、普通に動作しているように見えるんですけど、マウスのホイール
に反応しないんです。
スクロールバーの上でホイールを回すとちゃんと動作するんです。
別のウインドウになってしまったので当然ですが、これを普通
(CScrollViewとか)のようにビューの上でホイールが効くようにするには
どうしたらよいでしょうか?
126125:02/08/23 23:37
つづきです(長文スマソ)

たんにビュークラスの WM_MOUSEWHEEL メッセージをスクロールバー
(m_sb)にそのまま投げてやればよいのかと思ったのですが、Spy で見た
ところ WM_MOUSEWHEEL はビュークラスにきてませんでした。
インストールしているマウスユーティリティがホイールの動作を
WM_VSCROLL 等に変換しているのかと思い WM_VSCROLL も見てみたのです
がきてませんでした。
で、長くなるので簡単に書くと、
他のアプリで試したところ次のような結果になりました。
・スクロールバーがついているウインドウには WM_VSCROLL がくる
・ついて無いときはこない
・WM_MOUSEWHEEL は常にこない(多分マウスユーティリティのせい)

作ったビュークラスには、直接関連するスクロールバーはなかったんです
今、使用しているようなマウスユーティリティの有無にかかわらず、
ホイールが効くようにするにはどうしたらよいでしょうか?
127デフォルトの名無しさん:02/08/23 23:38
>>125
WM_MOUSEWHEELみたいなやつ
128デフォルトの名無しさん:02/08/23 23:39
かぶったー
129125:02/08/23 23:39
で、ここでしょーも無いことを思い出したんですよ。
CSplitterWnd で分割表示したときは?
2×2で分割表示した場合、左上のビューにスクロールバーはありません
・スクロールバーがついているウインドウには WM_VSCROLL がくる
・ついて無いときはこない
の法則からいけばホイールは効かないはずなんです。で、試してみました
AppWizardで適当に作って、コンポーネントギャラリーから
スプリットバーを追加して Spy で見てみました。すると、左上のビュー
にも WM_VSCROLL がきてしまってるんです。
なぞですね。
そもそも、CSplitterWnd で分割表示してないときのスクロールバーの上
または左の(分割表示するための)四角もなぞです。
CScrollView でなく CView でもスクロールバーが表示されるようになる
のもなぞです。
四角のほうは、多分あのスクロールバーはウインドウスタイルで
WS_VSCROLL を指定したものではなく、CScrollBar を使っているん
でしょうけど。
CSplitterWnd を調べればスクロールバーのないビューにも WM_VSCROLL
が来るような仕組みがわかるかもしれませんが CSplitterWnd の中なんか
知りたくもありません。

こんな話はどうでもよくて、
ホイールが効くようにするにはどうしたらよいでしょうか?
130129:02/08/23 23:46
>で、ここでしょーも無いことを思い出したんですよ
思いついたの間違いだろ、つーか文章長すぎスマソ
131デフォルトの名無しさん:02/08/23 23:55
CStringやCStringArrayを含む構造体を動的に確保したいのですが、
new,deleteでやっていいのでしょうか?
132デフォルトの名無しさん:02/08/23 23:59
>>131
何か問題ある?
133デフォルトの名無しさん:02/08/24 00:47
や、なんか配列増やそうとコピー>deleteしようとするとエラーになるので、
なんかまずいのかな、と。
134デフォルトの名無しさん:02/08/24 01:18
>116
どうもありがとうございます。っていうか遅レスですんまそ。
そうですね。でもウインドウの重なり具合で下の奴のリージョンが上の奴のせいで
欠けるとか、そう言うのを再現したかったモノで。。
例えばリージョンを重ねていって完全に隠れちゃったようなリージョンは
NULLリージョンになってくれるとかそういう便利なヤシないですかね?
135デフォルトの名無しさん:02/08/24 01:20
CStringがATLでも使えるようになったよな。
今更使わんけど。
136 :02/08/24 03:09
>>134
CombineRgn
137103:02/08/24 11:53
あのー、すみません、
ご存知の方教えてもらえないでしょうか?
Lhasaで関連付けしたら
即アイコンが変わったので
なんらか方法があるとは思うのですが。。
>>137
勘でレスするけどデスクトップはリストビューだから
そのリストビューに対して再描画を通知すればよいかも
139103:02/08/24 13:00
>138
一瞬「ハッ」としたんですが、
つまりデスクトップのウィンドウを
再描画というわけですね。
でもそれだと、
同時に別窓で開いてるエクスプローラが
更新されないですよね。
どうすれば。。
>139
便乗して勘で、
SysListView32と言うクラス名を持つウインドウ全てに
WM_PAINT送るとか、、、
141103:02/08/24 13:47
>140
正直それをぱっとテストできるスキルは
持ち合わせてないんですが、
そっちの方向で調べながらやってみます。
ありがとうござました。
なんか勘違いしてたら教えてくださいね。
142デフォルトの名無しさん:02/08/24 14:05
勘で答えるスレはここですか?
お前、ここですか?言いたいだけちゃうんかと(以下省略
144デフォルトの名無しさん:02/08/24 14:31
おまいらMFCのリファレンスで何かお勧めはありますか?
開発中はMSDNライブラリで十分だけど
寝る前とかにマターリ読みたいわけだが
エロまんがでも読んどけ
エロ漫画は参考になりますか?
147五条郎:02/08/24 15:01
DATA型とPDATA型のちがいはなんですか
なりますよ。知らないんですか?
本とか型とかスレ違いなネタでしかこのスレ延びないんかい(悲
数年前に VIsualC++6.0Pro を買いました。
今店頭に並んでいる奴には PlusPack とか
いうモノが付属しているようです。
PlusPack はあった方が便利ですか?

MS のサイトで PlusPack 単体売りしているのを
買い逃したので気になってます。
151デフォルトの名無しさん:02/08/25 11:46
めんどくせ〜、キーを打つのもめんどくせ〜
152デフォルトの名無しさん:02/08/25 11:58
>>150
アカデミックのダンピング価格で
買ったのか?
いいねー学生さんは、、、
153デフォルトの名無しさん:02/08/25 13:45
MDIアプリを作っているのですが、メインのウインドウをデフォルトじゃなくて
イメージを貼り付けたいのですがどなたかご存知ではないですか?

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

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

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

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

よい方法があれば、或いは不可能であるのならば
その旨を教えて下さい。
そもそも、CWndを直接継承してウィンドウを作って良いのか否か
も分からないのですが…。
PreCreateWindowを使うのだ、>>165よ。
167165:02/08/30 19:03
>>166
ありがとうございます。上手くいきました。

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

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

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

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

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

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

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

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

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

BOOL exitFlag = FALSE;

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

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

void DoEvents(void){
MSG msg;
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
>189
DoEventsは知らないけどAfxBeginThread辺りを調べてみて。
193VC初心者:02/09/07 03:12
ありがとうございます。MSDN見てみたのですが
全然わからないので無理っぽいです。(汗

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

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

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

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

e2 ->GetWindowText(s2);
n1 = atoi(s2);
n2 = n1 + 1;
sprintf(buf,"%d",n2);
l2 ->InsertString(-1,buf);
}
195今田純:02/09/07 10:57
特にこの辺がだめぽいんです。
e2 ->GetWindowText(s2);
n1 = atoi(s2);
n2 = n1 + 1;
sprintf(buf,"%d",n2);
l2 ->InsertString(-1,buf);
196:02/09/07 11:07
>195
だめっぽいのはわかったけど、
どうだめっぽいの?
>>195
結果が表示されないとか?
リストボックスっていうのはUpdateDataは必要ないのかい?
199:02/09/07 11:14
>198
当たり。
自信なくてUpdateData(FALSE);
ありとなしの両方のコード書いてきたら
なしじゃ結果が表示されなくて、
UpdateDataしたらいけたよ。
よって解決。
200今田純:02/09/07 11:21
194-195です。

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

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

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

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

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

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

これでOKだよ
この方がわかりやすいでしょ?
CStringはクラスですよ
209今田純:02/09/07 11:58
つまり、char でないとだめだと。
文字列の中身をcharに直さないと。
ということですね。
210今田純:02/09/07 12:00
あああぁぁぁぁぁ!
わかっているつもりだttが、わかってないことがわかってしまったあぁ!

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

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

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

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

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

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

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

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

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

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


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

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

でいいだろ。


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

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

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

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

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

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

となっとるだどもアソコでは何をしてるんだべか?
CClient型のオブジェクトmyDCを作ってるのかと思ったら
m_pictというオブジェクトもできてるように思えるんだべが。
タブコントロールでグチャグチャって。。。?
タブ分のフォーム作って選ばれたタブによってフォームをSHOW,HIDEしてやれば?
>>251
>CClient型のオブジェクトmyDCを作ってるのかと思ったら
思ったとおり、引数にCWnd*がいるからm_pictはCWnd(または派生クラス)のはず
>m_pictというオブジェクトもできてるように思えるんだべが
まちがい、m_pictはすでに存在しているウインドウのはず
254251:02/09/07 20:46
解決したべよ
.hファイルというものがあったのでそこ見てたらあったm_pictべ
.hファイルをしらなかったのでここから勉強することにするべ
いままでひとつのファイルしか使ったことなかったんで
知らなかったんだべよ
>>251
m_pictというウインドウに描画するためのCClientDCのオブジェクトを作ってます。
コンストラクタというものを勉強しましょう。
256デフォルトの名無しさん:02/09/07 20:47
0x100げっと
257251:02/09/07 20:50
>>253
書き込んでる間にお返事ありがと
.hに
CStatic m_pictとあったべよ
まだC(not ++しかーもーインタプリタ)はじめてから経験浅いのでつらいべよ
昔買ってぜんぜん使えなかったVC++をちょっと使ってみようかと思うったべよ
258251:02/09/07 20:52
>>255
オラがもってるブックにはコンストラクタは
クラス名 オブジェクト名 = new クラス名();
としか乗ってなかったから
引数とることがありえることすらわからなかっただべよ
短時間にものすごい勉強させていただいたべよ
ありがとだべよ
259デフォルトの名無しさん:02/09/07 20:55
>>251
どういたしましてだっちゃ
260251:02/09/07 20:56
ブックに載ってないnewを使わいやり方も学んだべよ
#define nyu new
>>251
>まだC(not ++しかーもーインタプリタ
「しかーもー」は昔やってたクレアラシルのCMの外人口調でよむのか?

>オラがもってるブックにはコンストラクタは
>クラス名 オブジェクト名 = new クラス名();
>としか乗ってなかったから
別の本買ったほうがいいぞ、それはポインタの場合だけだからな
263VisualC++初心者:02/09/07 21:12
>>240さん >>241さん
どうもありがとうございました。おかげで解決しました。
264デフォルトの名無しさん:02/09/07 23:19
ダイアログアプリでタスクバーにボタンを登録されたくないのですが、
非表示の親ウインドの子にしてしまう方法でダイアログアプリのやり方を教えてください。
とりあえず、
1.CWinAppの派生クラスのInitInstanceでダミーウインドを作成
2.CDialogの派生クラスのPreCreateWindowでcs.hwndParentにダミーのハンドルセット

で、だめですた。。そもそもPreCreateWindowに来ないです。。
教えてください
ところでCTreeCtrlでアイテムのイメージの抜き色を
表示しないようにするにはどうすれば?(CImageListを使ってます

なんか上手くいかなくて
(抜き色部分が黒で表示されてしまうなど
サンプルソースどこかのサイトにありませんか?

>>264
1の非表示のウインドウってどうやって作ってる?
ダイアログをDoModal()するんじゃなくて、フレームウインドウか自滅型のダイアログを
CreateしてShowWindowするほうがいい。
で、WM_CREATEで表示させるダイアログをDoModalする。
2は意味不明。
267247:02/09/08 00:35
>247での説明間違ってました。
リソースエディタ->ダイアログエディタでした。
>250
ありがとうござまいます。
今から言われたとおりにチャレンジしてきます。
また報告にきます。
>252
上で訂正しましたが、
起動画面上での話しではなく、
ダイアログエディタ上の話しでした。

268デフォルトの名無しさん:02/09/08 18:00
VC+6.0なのですが、
unsigned longよりも大きな整数を扱うにはどうすれば
よいのでしょうか?
269デフォルトの名無しさん:02/09/08 18:02
>>268
自作 or 64bitのCPUつんだパソコンが出るのを待つ
270デフォルトの名無しさん:02/09/08 18:05
>>268
__int64は?
>>269
お前は、多倍長計算と言うものを知らんのか ? 8086 のコンパイラでも、
32bit 整数をサポートしてる奴はいくらでもあるぞ。
272268:02/09/08 18:22
>>270
MSDN見てみます。ありがとうございました。
273デフォルトの名無しさん:02/09/08 19:48
VC++6.0です。
タイトルバーの領域を取得して、タイトルバー上でのマウスの操作を無効にしたいです。
↓を使ってやりたいと思います。
UINT CMainDlg::OnNcHitTest(CPoint point)
{
   return CDialog::OnNcHitTest(point);
}
CPoint pointに今のマウスの位置が入ってくるみたいなのですが、
タイトルバー上にあるかどうか判定するにはどうしたらいいのでしょうか?
と、いうより、タイトルバーの領域の求め方を教えて下さい。
>>273
GetSystemMetricsとかでなんとかならんの?
>>273
SDK ならば DefWindowProc(hwnd, WM_HITTEST, 0, MAKELONG(point.x, point.y) ); で
HTCAPTION が返ってくればそこはタイトルバーやーってことなんだけど
このセンで何とかならんっすか?
276デフォルトの名無しさん:02/09/08 22:11
>>275
ううむ、MFCでやってるのでよくわからないです。
いい加減、まともな文法覚えないといけないんですが。

よく見たらUINT OnNcHitTest(CPoint point)
の戻り値がHTCAPTIONだったらタイトルバー上ってことらしいです。
が、使い方がわかりません。
どこで使ったら(判定)したらいいでしょうか?

SystemMetricsはよくわからなかた。
UINT CxxxDlg::OnNcHitTest(CPoint point)
{
UINT nHit = CDialog::OnNcHitTest(point);
return (nHit == HTCAPTION) ? HTNOWHERE : nHit;
}

とか。
278276:02/09/09 06:41
>>277
ありがとうございます。

大丈夫みたいです。
でも、return〜の行がなにやってるかわからない(汗
?とか:とか。

三項演算子をぐぐれ
280276:02/09/09 07:43
>>279
ありがとん!
今日帰ったら調べてみるよ。
281デフォルトの名無しさん:02/09/09 14:32
リストビューのヘッダ上で右クリックしたことを知るにはどうすればよいですか?
エクスプローラではカラムのリストがコンテキストメニューとして表示されますが、
ああいうことをやりたいのです。
282デフォルトの名無しさん:02/09/10 09:28
CInternetSession や CHttpConnection 等を使ってWebサイトからファイルをダウンロードするプログラムを作ってます。
複数のスレッドを立ち上げて同じサーバからファイルを同時にダウンロードしたいのですが、
CInternetSession や CHttpConnection クラスのインスタンスは1つでいいのでしょうか?
それとも、スレッドごとに作成しなければいけませんか?
>>281
ヘッダに関してはHDN_XXXXXXメッセージを処理。
>>283
実際にやってみそ。メッセージ飛んでこないから。
>>284
あああそういえばそんな話を聞いたことがあったような。スマソ。
OnNotifyオーバーライドするしかないのか?
286285:02/09/10 12:38
てか、そもそも右クリックを処理するメッセージがないのね。
重ね重ねゴメン。
>>281は CodeGuru にありそうな典型例ですな
288VisualC++初心者:02/09/10 18:04
ゲームの効果音としてWAVファイルを再生したいのですが、いろいろ調べても
適当な方法が分かりません。
細かいところは自分で調べるので、おおまかな手順を教えてください。
お願いします。
>>281
ヘッダコントロールをサブクラス化すればできるんじゃないのかな。
Spy++でメッセージ見てみれば?

>>288
MFCにまるで関係なさげだが…

1.DirectXを使ったラッパライブラリを使う(沢山あるよ)
2.DirectXを自分で使う
3.MMsystemを使う

こんなとこかね…
290デフォルトの名無しさん:02/09/11 13:15
MFC初心者です。
Windowsのエクスプローラのようなプログラムを作ろうと思っています。
この場合、ドキュメント・ビューアーキテクチャーのサポートは
する必要があるのでしょうか?
データファイルの入出力はないので必要ないと思うのですが、どうでしょう?
>>290
ドキュメント・ビューアーキテクチャーがわかりにくかったら
こういうケースでは特に使う必要は無いと思う
まあ、普通にアップウィザードでSDI,MDIアプリをつくると
勝手にサポートしてしまうけどな
ドキュメント・ビューアーキテクチャーになったらなったで
あまり気にせず作るのもありだと思うがな
292デフォルトの名無しさん:02/09/11 14:08
> ドキュメント・ビューアーキテクチャーになったらなったで
> あまり気にせず作るのもありだと思うがな
なるほど。
実はプロジェクトの新規作成(SDI)で、分割ウィンドウを作成するには
「ドキュメント・ビューアーキテクチャーのサポート」にチェックを入れないと
駄目みたいだったので、どうしようかな〜と思って質問してみました。
ドキュメント・ビューアーキテクチャーをサポートしても、exeのサイズ
がそんなに変わらないのであれば、そうしようと思います。
293VisualC++初心者:02/09/11 19:20
>>289
3番の方法で音を鳴らすことができました。どうもありがとうございました。
294デフォルトの名無しさん:02/09/11 19:50
age
295デフォルトの名無しさん:02/09/11 19:51
CTreeViewでツリーを表示しているのですが
アイコン位置にチェックボックスを出したいのですが
どうすれば良いでしょうか?
296デフォルトの名無しさん:02/09/11 22:29
exitを使ってプログラムを終了させると落ちるのですがだめなのでしょうか。
297:02/09/12 06:27
>295
俺は自分でチェックボックスの
オンとオフのイメージを用意して
必要に応じてイメージを入れ替える、
という方法で実装できた。
でもなんか間違ってる気がするんだが。。
>>295
CTreeCtrl::SetCheck()っていうのがあるけど、使ったこと無いから知らん
タメシテレポートキボンヌ
299デフォルトの名無しさん:02/09/12 13:34
OnInitDialog()
の中でソフトの起動を止めたいときは
どうすればいいでしょうか?
PostQuitMessage(1)
にすると
一瞬メインウィンドウが表示され困ってます。
>TreeViewにチェックボックス
TVS_CHECKBOXESというスタイルがある。
(MSDNでTree-View Control Window Stylesを検索すればスタイル一覧がみつかる)

ダイアログにツリービューコントロールを貼ってプロパティで
スタイルを見ると、チェックボックスをつける項目があるので
そういうスタイルがあるんだろうなと予想できる。
300ゲットやねん。
MFCのアップウィザードで作ったダイアログベースアプリやったら
CxxxApp::InitInstance() で処理したらど〜や
 ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ (´´
    ,---..、- 、,-、        (´´
    .ivvvi:i::'.、. ヽ}      (´⌒(´
  ⊂j(゚ヮ゚j;;!⊂} }⊃≡≡≡(´⌒;;;≡≡≡
       ̄ ̄ ̄ ̄ (´⌒(´⌒;;   ズザーーーーーッ
302301:02/09/12 14:00
        ,.r''" ̄``ヽ、
          /::::;:ハ:::::::::::::::',
        l:{レム! ';i'、!;:::::::::!
       |::';‐- -‐-i:::::::|
       |:::i,! |r‐、| l,!:::::::l  300取られへんかった
          !l::i;`r'テ'i"i|::::;、:|
        il、li´''‐--,i/リ;ヾ
           / |▽▽▽! `、
303299:02/09/12 14:15
>301
それもそうですね、今書き換えてきました。
ちなみにCxxDlg::OnInitDlg()関数内部では
無理なんでしょうか?
今後の参考に。
304びひゃ〜ん ◆Ec4xpdlg :02/09/12 14:34
>>303
「OnInitDlg()をオーバーライドする場合、まず基本クラスのOnInitDlg()を呼び出す」
ってとこに答えがあるような...
305299:02/09/12 14:42
>304
なるほど、
納得できました。
ありがとうございます。
>299
InitDialog中でEndDialog
>>299
EndDialog
>>299 EndDialog
309299:02/09/12 21:43
>306-308
EndDialog
EndDiabloに見えてきた。鬱だ寝よう
MFCって時代遅れじゃないよね?
まだ使えますよね?
>>311
ユーザーに高性能なPCを買わせる(買い替えさせる)ために.NETが推奨される
 MFCのコンボボックスで、
編集・選択可能なコントロールを作成して、
aaa,bbb,ccc というアイテムを登録した状態で、
エディトボックスに"ddd"と入力します。

 この状態で、↓を下げて、"ccc"を選択すると、
WM_SELCHANGE が来るのですが、
ここで、その処理を中止したいので、
csCombo.SetWindowText( "ddd" ) と書きましたが、
コンボボックスは"ccc"になってしまいます。

 何か回避策は無い物でしょうか。
(出来ればTimer等を使用しない方向で・・)

 よろしくお願いします。
314:02/09/13 09:21
>313
なにをしたいのかよくわからんが、
dddと選択されたくない、と思ってるなら
スタイルをドロップダウンリストにすればいけるよ。
315313:02/09/13 12:30
>>314
既存で登録されている物はリストに出るんですが、
好きな名前を入れると、その名前で新規登録できるような仕組みです。
 ただ、SELCHANGEの時に、本当に変えて良いか確認するのですが、
ここで、『変えない』とされた場合に、元に戻すようにしたいのですが、
それが上手く行かないという状況です。

>>315
入れたい場合はAddStringで追加してやれば?
>>315
|ON_CBN_SELCHANGE
| このメッセージを処理するとき、コンボ ボックスのエディット コントロール
| 内のテキストを取得するには、GetLBText 関数または別の同種の関数を使いま
| す。GetWindowText 関数は使えません。
これ、大丈夫?
↑あ、関係ないか。スマソ。
>>315
CBN_SELENDOKでやったらどうか、と勘で答えてみる。
いずれにせよ、SELCHANGEだと矢印キーで移動するたびに
確認メッセージが出ることになるので良くない気がするもより。
320313:02/09/14 04:59
>>316
まだ、それは確定アイテムでは無いので、そういう訳にも。

>>319
よく考えたら、そうですね。
当方、マウスオペレーションしか考えてませんでした(^^;
とりあえず、SELENDOKの方で変えるように、これから変更してみます。
321313:02/09/14 05:57
319さんからの ご指摘の通り、SELENDOKの方に移してみましたが、元々のやり方では駄目でした。
(すべて、SELENDOKのハンドラの中で記述し、直後にreturnしてます)

(不可A) →全く無視され、変更後のセルの内容が表示されます
m_csCombo.SetWindowText( "元に戻したい文字列" );
(不可B) →DeleteString実行時に、エディト内容が心中します。
lIndex = m_csCombo.AddString( "元に戻したい文字列" );
m_csCombo.SetCurSel( lIndex );
m_csCombo.DeleteString( lIndex );
(不可C) →Spyで見たところ、WM_SETTEXT自体が来てませんでした。
::PostMessage( m_csCombo.m_hWnd, WM_SETTEXT, 0L,
 (LPARAM)"元に戻したい文字列" );

(悩み続けても生産効率が悪いので。)
PostMessage( WM_USER+77, 0, 0 );

WindowProc( ... )
{
 if( message == WM_USER+77 ){
  m_csCombo.SetWindowText( "元に戻したい文字列" );
  return 0;
 }
}

 コードが汚くなってしまったのが口惜しいのですが、
とりあえず、これで目的の動作をしてくれました。
ご助力頂き、ありがとうございました。

もし、もっと良いコードが有れば、是非教えて下さい。
322デフォルトの名無しさん:02/09/14 21:19
CListCtrl (リストビューコントロール) で、レポートビューの時に、ヘッダーと
実際の値で異なるフォーマットを指定したいんですが、できないのでしょうか ?

要は、ヘッダーに「ファイルサイズ」と表示して、各々のファイルサイズを表示
したいんです。実際のファイルサイズは数値なので当然右詰で表示するんだけど
ヘッダーは中央揃えの方が美しいと思うので...。

Explorer なんかだと、両方とも右詰で表示されているのでできないのかなぁ...。
>>322
オーナードロー
と「リストビュー」だけ見て条件反射で書き込んでみるテスト。
324322:02/09/14 23:52
>>323
う〜〜〜ん、それしかないか...。何で別々に指定できないかなぁ...。
第一、タイトルなんて常に中央揃えで良いと思うし...。

と、愚痴を言ってても始まらないので、とりあえずオーハードローでしこしこ
やってみます。ありがとう。
325デフォルトの名無しさん:02/09/15 01:15
俺もリストビューについて質問。
行の高さを動的に変更したいのですがどうすればよいでしょうか。
1行目は高さ20、2行目は高さ30、、、というふうに各行を任意の高さに
変更したいのです。
オーナードローでWM_MEASUREITEMが送られてくる時点ではまだ高さはわからず、
実行時に任意の高さに変更できるような仕様です。
>322
Header Controlに対してだけ、CustomDrawを仕掛けたら?
つか、HeaderControlにHDM_SETITEMを送れば済むかナ?
便乗気味に質問ですけど、CListCtrlってリサイズ時に凄くちらつきません?
CTreeCtrlは全然ちらつかないのに…
329デフォルトの名無しさん:02/09/16 11:56
C++.NETを買ってMFCで使ってみたのですが、ClassWizardが見つかりません。
コントロールに対応する変数を作れないのです。どうすればよいのでしょう。
お願いします。
330デフォルトの名無しさん:02/09/16 12:02
なんと!!
C++.NETってのも出たのか。
知らんかった。
331:02/09/16 12:03
>329
コントロールを右クリックして変数の追加
OFFICE XP風のメニューにするにはどのようにすればよいのでしょうか?
初心者ですが
この間VC++初めて使ってクイズプログラム作ってみたんだけど

テキストに書いてある
「はろ〜わ〜るど」のプログラムからはじめるやつっているの?
意味不明だし..
334:02/09/16 19:03
>333
テキスト??
学校のテキストか?
んなの知るかよ。
俺の初心者時代に使った本に載ってある
Hello,World!!には
Windowsの仕組みを知る上で大事な
ファーストステップだった。
書きたくなきゃ書くなよ。
335329:02/09/16 23:04
>>331
ありがとうございます。
普通のボタンなどはうまくきました。
しかし、ラジオボタンはどうしても変数が作れません。
VC6でやっていたようにグループボックスを貼り付け、
ラジオボタンをいくつか貼り付け、
一番上のラジオボタンのIDを変え、そのラジオボタンを
右クリックして「変数の追加」を選んでも、そのIDが
出てこないのです。

どうすればよいのでしょう?
教えて君ですみませんが、よろしくお願いします。
336:02/09/17 00:21
>335
グループ化したいラジオボタンの
タブオーダーの一番若いやつを
右クリック->プロパティ
Group true
にしたらいけると思うよ。
今確認したらいけたから。
337335:02/09/17 00:26
>>336
ありがとうございます。
やってみたら、できました。
#言われてみればその通りで、お恥ずかしいです。
338:02/09/17 00:37
>337
そうか、一件落着だな。
そういえばラジオボタンで思い出したけど、
俺のところではなぜか三つ以上のラジオボタンに値を割り当てることが
できない。
VC6で確かintに出来たはずなんだけどなぁ。
.NETでGroup true にしてから
タイプをValueにして手動で
BOOLからintに打ち変えても
ちゃんと動かないんだなぁ。
なんでだろ。
仕方ないのでGetDlgItemを使用した
SetRadioButton()とGetRadioButtonを自作してるよ。
みんなこうなの?便乗だけど。
339337:02/09/17 01:07
>>338
あ、ほんとですね。ラジオボタンをintにできない。ちょっと鬱。
うーん、俺はGetCheckedRadioButtonを使ってみます。
タブオーダーが実は変とか。Ctrl+Dで確認してみては如何か。
俺も便乗なんだけど、ラジオボタンの背景って灰色になっちゃうよね。
別の色にする方法ってあるのかな。
342:02/09/17 14:37
>340
アドバイスはありがたいが違うと思う。
ちなみにそのまま書くが、
俺のCtrl+D押した時のタブコントロールのタブオーダーは
5-6-7
で、5がgroup true になってる。
>VC6で確かintに出来たはず
VC6使ってるが、できるの?
というか DDXのことを言ってるのだったら、その変数は対応する1つのラジ
オボタンの状態しか反映しないので、どのラジオボタンにチェックが入って
いるかを調べるには、結局 GetCheckedRadioButton みたいなことやらないと
ダメなんじゃないの?(DDXあまり使わんので...)
344:02/09/17 15:38
>343
調べなおしてみたけど
CWnd::GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton);
選択されてるラジオボタンを調べるこんな関数もあったのね。
知らなかった。
でもDDXでintに割りあてれなかったかなぁ。
VC6使ってる人レポート求む。
>>344
VC6ではintにしかできなかった(もちろん値の場合)
単にダイアログにラジオボタンを配置しただけではクラスウィザードの
メンバー変数ページにはIDC_RADIO1は表示されなかった。
ダイアログエディタでラジオボタンのプロパティのグループにチェックを入れると
クラスウィザードで表示されるようになった
346:02/09/17 17:36
>345
レポートありがとう。

>ダイアログエディタでラジオボタンのプロパティのグループにチェックを入れると
>クラスウィザードで表示されるようになった
この状態では多分クラスウィザード内では
型はBOOLだったと思うんだけど、
ここで「int」とか選択できたり
書き返れたりはしない?
347325:02/09/17 17:43
>ラジオボタンにint割り当て
VC6。ラジオボタンの一つのグループ属性をオンにするとClassWizardで
int型メンバ変数が割り当てられる。
どのラジオボタンが選択されているかは
 UpdateData();
 int nCheck = m_int_radio; // m_int_radioはClassWizardで割り当てたint型メンバ変数
とする。nCheckに選択されているラジオボタンの0ベースのインデックスが入る。
つまり、次のようなボタンの配置の場合、
 ○ 項目1
 ○ 項目2
 ◎ 項目3
三番めの項目が選択されているのでnCheckには2が入る。

>>341
OnCtlColorで他のコントロールと同様に変更できるよ。
if(pWnd->GetDlgCtrlID() == IDC_RADIO3){ // IDC_RADIO3はラジオボタンのID
  // ここで色変更処理
}
みたいな感じで。

で、>>325なんだけど誰かリストビューの各行を別々の高さにする方法知らないかなぁ。
CodeGuruとかCodeProjectに出てるオーナードローの例は全行同じ高さのしか
無いようなんだよねぇ…
348347:02/09/17 17:44
上げ忘れたage。
 ってなに?
350345:02/09/17 17:53
>>346
>VC6ではintにしかできなかった(もちろん値の場合)
intのみ選択可能、BOOLはなかった
351:02/09/17 17:53
>347
分かりやすい解説ありがと。
結論をまとめると
VC6ではラジオボタンを
DDXでint型に設定できる、ということですね。
VC.NETではVC6のように
BOOL型に割り当てることは可能なのですが、
.NETにてラジオボタンにint型を割り当てる方法を
ご存知の型いませんか?
それとも出来なくなっちゃったのでしょうか?

>325はお力になれそうにありません。
申し訳ないです。
352343:02/09/17 17:54
>>346
スマソ。>>343はでたらめだった(;´Д`)
VC6では、確かに、ラジオボタンのグループの最初のラジオボタンに int を
割り当てられるようになっていて、
  m_radio = 2;
  UpdateData( FALSE );
とかやると、グループ3番目のラジオボタンにチェックが入るね。
353343:02/09/17 17:57
とかいって >>347と内容がモロかぶってるし...鬱だし脳
> .NETにてラジオボタンにint型を割り当てる
.NETは持ってないんだけど、手動でDoDataExchange()内に
DDX_Radio(pDX, IDC_RADIO1, m_radio_1);
と追加できないんだろうか?
355 :02/09/17 20:15
dswがあるソースはクリックしてビルドでコンパイラ
出来るけどdswがない場合は空のワークスペースを作って
ファイルを挿入するだけでよさそうに思うけどエラー0で
コンパイラ出来たためしがありません。どこが間違ってる
のでしょうか?
意味がわかりません。
357デフォルトの名無しさん:02/09/17 22:06
OfficeXP風なメニューを作りたいけどサンプルない?

http://www.codeguru.com/menu/owner_drawn_menu3.shtml

を見つけたけどほかにサンプル知ってる人いる?
358デフォルトの名無しさん:02/09/17 22:29
355じゃないけどcppとhだけのソースをvisualCで
コンパイラ(ビルド)はするにはどうやればよい?
359:02/09/17 22:36
>358
プロジェクト作ってコピペでいいんじゃないかなぁ。
360デフォルトの名無しさん:02/09/17 22:37
空のプロジェクト作ってファイルを追加。
>>358
355じゃないと書いてるけど355ちゃうんか。
"コンパイラ"したいんでしょ?
cppがひとつならダブルクリックしてビルドが早い。
あらかじめ空のフォルダに移しておかないと面倒なことになるけど。
363362:02/09/17 22:44
ダブルクリックしてVC++を立ち上げてからビルドね。
364:02/09/17 22:58
>361
ほんとだ、するどいねw

>355==>358
だね。
ふたりともコンパイラしたいのか。。
>>325
リストビューにはLVS_OWNERDRAWFIXEDしかないみたい。
リストボックスなら高さ可変にできるので、そっちで頑張るというのはいかが。
>363 355=358 ですが、355の文読み直したら
痛い文章だったので他人のふりしましたがばれましたか・・
355じゃないけどasmのファイルをVCで
アセンブリするにはどうすればよい?
え、できるの?
369367:02/09/18 00:28
え、できないの?
アセンブリは無理でもアセンブルならできると思ったんだが。
>>367 すれ違い
仕方がないのでリストビューをフォームビューに代えてListBox貼り付けるか・・・
372デフォルトの名無しさん:02/09/18 02:36
単純アプリケーションの実行画面で
横に出るスクロールバーってもっと伸ばせないんでしょうか?
実行結果が最初の方が分からないからどういう動作してるか見たいんですが。
また意味不明な質問が…
オブジェクトを直接宣言する場合と、
 CTest oObj(Hoge);
一旦ポインタの形で宣言しnewする場合は、
 CTest* pObj;
 pObj = new CTest(Hoge);
どのように使い分ければいいのでしょうか?

具体的にはMDIアプリケーションの作成のところで
下記の記述が有ったのですが、なぜnewを使うのか
よく理解できません。
 CMultiDocTemplate* pDocTemplate;
 pDocTemplate = new CMultiDocTemplate(
  IDR_TEST88TYPE,
  RUNTIME_CLASS(CTest88Doc),
  RUNTIME_CLASS(CChildFrame),
  RUNTIME_CLASS(CTest88View));
スコープを外れても残したい時はnew。
きっとここよりC++スレ向きの質問。
>375
どうも有り難う。
ややスレ違いのようなので下記に移しました。
http://pc3.2ch.net/test/read.cgi/tech/1029315669/971
377 :02/09/18 08:01
CSplitterWndを使ってプログラムを作成しようとしていま
す。
スプリットウィンドウを設定する時、

AAA.CreateView(0, 0, RUNTIME_CLASS(CBBBView),

とViewクラスで指定するわけですが、このビュークラスにメッセージを送ったり
したい場合、CBBBViewクラスのオブジェクトの実体名が指定してないわけですが、
そういう場合はどういう処理をすればいいのでしょうか?
378デフォルトの名無しさん:02/09/18 10:42
タスクトレイ
>>357さんどうも有難う。
>>377
CSplitterWnd::GetPane()でCWnd*が取得できる、CBBBView*にするには
キャストしかないと思う(RTTI,RTCIでも使ってくれ)
MFC的にはドキュメント・ビューアーキテクチャに若干依存しているクラスなので
CDocument::UpdateAllViews()やCView::OnUpdate()をオーバーライドして
使用するのが最も楽な使用方法だと思う。
381 :02/09/18 22:14
>>380
サンクス
382デフォルトの名無しさん:02/09/18 23:32
別のスレに書き込んだけどスレ違いだからこっちで質問しろといわれたのでこちらにもう一度書きます。

MFCを使ってダイアログボックスを作る。
dlgをdomodalで作成する。
dlg内でEndDialgが使われる。
制御がdlgのdomodalしたところに戻らずにexeが終了するのは仕様でしょうか?

知っている方がいたらよろしくお願いします。
>>382
{
  ・・・
  CMyDlg dlg ;
  dlg.DoModal() ;
  ・・・      <ここにブレークポイント
}

でブレークしないで終了ということで?
戻ります。
385382:02/09/19 07:41
>>383 , 384

一番最初のAppWizardでダイアログを作成したときの話です。
そのときにOnOKなどを押すとdlg.DoModal()の次の行にはいかずに終了しています。
"!"マークでデバッガ走らせてるとか、、、
ほかの場所のブレークは効きますか?
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: ダイアログが <OK> で消された時のコードを
// 記述してください。
TRACE("OK\n");  // ←ここにブレークポイントをおく
}
else if (nResponse == IDCANCEL)
{
// TODO: ダイアログが <キャンセル> で消された時のコードを
// 記述してください。
}

// ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、
// アプリケーションを終了するために FALSE を返してください。
return FALSE;
------------------
デバッガで追ってみたけど、デフォルトのソースで「次の行」に行かないのは本当みたい。
int nResponse = dlg.DoModal(); // ここへブレークポイントを置き、OKで閉じる。
if (nResponse == IDOK)   // ここへは行かない。
{
 :
 :

ただし、以下のようにすればちゃんと「次の行」へ行くことは確認できる。
int nResponse = dlg.DoModal();  // ここへブレークポイントを置き、OKで閉じる。
TRACE("break point\n"); // ここへは行く。
if (nResponse == IDOK)
{
 :
 :
if (nResponse == IDOK)
{
  //何もしない
}
だったら、ここはスキップされ、ブレークポイントが自動的に後ろに移動する。
どっちにしろ、どこかでブレークするはずだが。
>>389
デバッグすると普通はステップがif (nResponse == IDOK) に行くけどそこを飛ばして
一気にreturnまで行ってる。
って俺は>>382じゃないけど。

まぁ「DoModalの次の行が実行されてない」ってわけじゃないから気にしなくても。>382
ちょっと>>388のコメントが誤解を与えるかもしれないので訂正しておくと、
  if (nResponse == IDOK)   // ここへは行かない。
ってのは、処理が行かない(=if文が判定されない)という意味では無く、
デバッグしたときにステップの矢印がその行をを飛ばすという意味ね。

試してみると分かると思うけど、AppWizardでダイアログベースのアプリを作って
Appクラスの
int nResponse = dlg.DoModal(); //ここにブレークポイントを置いてOKで閉じる
if (nResponse == IDOK)
をデバッグしてみるとそうなる。
自分でCDialogから派生ダイアログ作ってDoModalすると
ちゃんとif文にもステップが行くんだけど。Win2000+SP3、VC6+SP5。
下記にブレークを起き、一旦止めて混合モードで表示して見て。
if、elseとも何の記述も無いので、最適化されてコードが何も無いでしょ。
だからブレークをはれない。

int nResponse = dlg.DoModal();  // ←ここにブレークポイントをおく
if (nResponse == IDOK)
{
// TODO: ダイアログが <OK> で消された時のコードを
// 記述してください。
}
else if (nResponse == IDCANCEL)
{
// TODO: ダイアログが <キャンセル> で消された時のコードを
// 記述してください。
}

// ダイアログが閉じられてからアプリケーションのメッセージ ポンプを開始するよりは、
// アプリケーションを終了するために FALSE を返してください。
return FALSE;
補足、下記みたいにすると最適化されないのでブレークはれるようになる。

int a;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
a=0;
}
else if (nResponse == IDCANCEL)
{
a=1;
}
394デフォルトの名無しさん:02/09/20 14:18
リストボックスでオーナードローし、
MeasureItem()で
lpMeasureItemStruct->itemHeight = 255;
とするとアイテムの高さが変えられますが、
この数値が256以上だと高さがおかしくなります。
具体的には256をセットすると表示されず(アイテム高さ0)、
また値を増やして行くとアイテムの高さが増えていきます。
どうやらアイテムの高さが255を超えると0にリセットされているようです。

アイテムの高さを256以上にするにはどうしたらよいのでしょうか?
>>394
>リスト ボックス、コンボ ボックス、またはメニューの各項目の高さを
>指定します。オーナー描画のリスト ボックス、コンボ ボックス、
>またはメニューのオーナーは、メッセージ処理から戻る前にこのメンバに
>値を設定しなければなりません。
>リスト ボックスの項目の最大の高さは 255 です。
ヘルプに書いてる
も  う  だ  め  ぽ
397デフォルトの名無しさん:02/09/20 23:35
CHtmlViewで文字列を選択中かどうか判断するのにはどうしたらいいでしょう?
398デフォルトの名無しさん:02/09/20 23:35
プログラマーの求人に応募して
面接したんですが、無事一時面接を通過し、
二次面接へは一時面接へ持っていったプログラムの
ソースを持ってこいと言われ、完全独学なので
明らかに変なコードを書いていないか心配です。
すみませんが業務経験者の方、ちらっと見ていただけないでしょうか?
内部的な動きとかは結構ですので、経験者として
このコードを見て「これは見るからにおかしいだろうw」
みたいなのがあれば指摘していただけませんか?
変な質問ですみません。
http://www.geocities.co.jp/SiliconValley-Oakland/1693/TestDlg.txt
http://www.geocities.co.jp/SiliconValley-Oakland/1693/TestLib.txt
ほんと流し読みくらいの感じで結構です。
「おいおいこれは。。」みたいのあれば指摘してください。
初めて人に見せるのが面接担当者というのはあまりに危険を感じてます。
よろしくお願いします。
399デフォルトの名無しさん:02/09/20 23:44
>>398
それじゃ面接の意味ないじゃん。
実力もないのにあるフリをされると会社としては困るんだよ。

ていうかスレ違い
400デフォルトの名無しさん:02/09/20 23:48
CString cs=_T("の作成に失敗しました");   <- 意味ね−じゃん
cs.Insert(0,lpSavePath);
lstrcpy((LPTSTR)lpErrorMsg,(LPCTSTR)cs);
ff.Close();
return true;

401デフォルトの名無しさん:02/09/20 23:55
>>398

指摘はしない。399の言うとおりだから。でも完全独学でこれだけ書けるんなら、
入社後「ちゃんと指導 and/or 教育してもらえれば」プログラマになれると思う。

現時点ではプログラム「らしきもの」は書けているけど、このコードのおかしな
点に気付かないならプログラマとして即戦力ではないと思う。
402デフォルトの名無しさん:02/09/21 00:02
401はヒッキーです。信じてはいけません。
403398:02/09/21 00:09
>399-401
アドバイスありがとうございました。
このスレで質問させていただいた理由は
MFCを使って書いたので他のスレだと
余計にスレ違いになると思い、ここに書かせていただきました。
スレ違いと言われるなら素直に反省します。
すみませんでした。
>399
実力のあるフリをするつもりはありませんでした。
私の間違いを指摘していただくて書き込みました。
最後の勉強としてご指摘願いたいと思っておりました。
>400さん
_T()の使い方をいまいち分かっておらず
使うべきところで使っていないより書いた方がましかと思って書いていました。
ご指摘ありがとうございます。
>401
即戦力などとは毛頭思っておりません。
現場の意見として重くとらえさせていただきます、ありがとうございました。
続く。。
404398:02/09/21 00:13
>399-401
最後に、。
スレ違いにもかかわらず丁寧な指摘、非常に参考になりました。
仕事はすぐに決まるとは思いませんが、
がんばってプログラマになりたいと思います。
なによりPC、プログラムが好きでたまらないので
これから精進していきたいと思います。
次お会いする時までによりいっそう腕を磨いておきます。
スレ違い失礼しました、
ずっと人に見てもらう機会などが無かった私には
すごくためになりました。
本当にありがとうございました。
>>404
次は回答する側で書き込めるといいね
406デフォルトの名無しさん:02/09/22 02:10
タブコントロール(CTabCtrl)のタブ位置を横&シングルラインにするとバグりませんか?
リサイズ時に縦長にするとタブが途中で消えたり、(コントロールの横幅分だけしか描画されない?)
InsertItemで追加していくとタブスクロール用のボタンが効かなかったり、
タブ位置を上→横に変更するとタブスクロール用のボタンが縦長になったり。
407デフォルトの名無しさん:02/09/22 02:27
スライダーコントロールの背景色を指定したいのですが、やり方がわかりません。
システム色ではなく、赤とかピンクとかいろいろな色で作りたいのです。
ご存知の方、教えてください。

よろしくお願いします。
>>407
マルチポストすんな
409デフォルトの名無しさん:02/09/22 03:17
LVITEM ListItem;
ListItem.mask = LVIF_TEXT;
ListItem.pszText = "てきすと";
ListItem.iItem = 0;
ListItem.iImage = 0;
m_List.InsertItem(&ListItem);
でリストにな〜んも表示されない。なんで?
>>409
>ListItem.pszText = "てきすと";
Basicじゃないんだぞ…

こっちのメンバ関数使ったら?
int InsertItem( int nItem, LPCTSTR lpszItem );
411デフォルトの名無しさん:02/09/22 03:33
CListCtrl m_List; ←ClassWizで追加したヤシ
こいつにOnInitDialogの中でInsertItemしてるがなんにも表示されない
なんで??
>>411
ListItem.iSubItem = 0;  //これが足りないよ

初期化について勉強すべし。
LVITEM ListItem;
って宣言しただけじゃ各メンバ変数の値は不定。
0になっているって保証はない。(宣言直後の値を見れば分かる)
ぐはぁ!それだ・・
どうもありがとう。。
414デフォルトの名無しさん:02/09/22 15:15
エクスプローラみたいなのを作りたいんですが
リストビューに表示するアイコンはどうやって取ってくるのですか?
>>414
教えて欲しい時は誠意を見せろ!
つーか穴を貸せ
416デフォルトの名無しさん:02/09/22 15:48
ホモ氏ね
417:02/09/22 16:20
>414
ちょっと聞き方悪い、答える方も困るよ。
アイコンはどうやって取ってくるか!
と聞かれた5ら
自分で用意しなさい、
と答えるのが普通なんだが
それを聞きたいのか?
α 自分で用意する
β SHGetFileInfo
γ 「ホモ氏ね」と書く
Σ >>418>>415を結ばせる。
Ω alt+f4
MFC使ってソフト作る時
メンバ変数追加する時
どうしてます?
private か protected か public
の判断がつきません。
privateとpublicは分かるのですが、
普通Appウィザードが作成した
クラス (CXXXDlgなど) を派生することってないですよね?
とりあえずprotectedにしとくべきでしょうか?
それともAppウィザードが作成した
クラスを派生することを派生すること自体ありえないので
publicにしても問題ないのでしょうか?
>>420
APPウィザード使うかどうかに関わりなく、
サブクラス作んないんならprotectedは不要。

> 普通Appウィザードが作成した
> クラス (CXXXDlgなど) を派生することってないですよね?

あなた自身が、なぜ「普通」と書いたのか、
その理由を考えてみるこった。
>>420
まあ、Wizardで作ったクラスでも、派生することはありえなくもないけど、
普通はアプリケーションに依存したコード書くから、最終的な派生クラスとして、
protectedを無視した決め方してもそれほど実害はないかな。

publicは、コードを少しでも減らしたいとか言う理由じゃなかったら、
セオリー通りにあまり使わないようにした方がいいかと。
publicと( protected || private )は派生するしないで分けるものじゃないし。
(そもそも、MFCもpublicメンバー使いまくりなわけだが。m_hWndとかの重要なものでさえ)
すみません、質問させていただきます。
スタティックテキストに文字色と背景色を設定する事は出来たんですが(OnCtlColorによって)
たとえば、ボタンを押して、スタティックテキストの文字色と背景色を
変更するにはどうすればいいんでしょうか
424デフォルトの名無しさん:02/09/22 19:10
エクスプローラ風のファイラーが作りたいんだってば。
ファイルをドラッグしてフォルダにドロップできたり、ダブルクリックでファイルを開いたり
外からファイルをドロップしたりをリストビューでやりたいんだけど、
わかんないことだらけだから手っ取り早くエクスプローラ風のソフトのソースの場所教えてちょ。
たのんま
HOGEみたいなソフトを作りたいけど、
面倒くさいからソースくれ?
それって「作る」うちに入るのかナ?
426デフォルトの名無しさん:02/09/22 19:39
作るに入らなくていいからソースくれ
427デフォルトの名無しさん:02/09/22 22:06
あの・・・・・・・・
VC++始めるにあたってよい参考書さがしてるんですけど、
みなさんおすすめ教えてください。

一応初心者向けのでおねがいします。
VC++も使ったことがあるにはあるんですけど、まぁ、オブジェクト指向初心者ってことで。
428:02/09/22 22:23
初心者なら
山本 信雄のプログラミング学習シリーズ
VisualC++
っていうのが全三巻ででてる。
俺はそれを使ったがなかなかお勧め。
CとC++の基本が分かってる人にはお勧めだよ。
Cとかよくわかってなかったら駄目だけど。
うぇ〜んくれくれ厨とスレ違いな質問なんてもうやだよう
>>423
InvalidateRect
431デフォルトの名無しさん:02/09/22 22:36
マスタリングTCP/IPはとてもわかりやすくてお勧めです。
>>423
staticに""でも書いてあげれ
433デフォルトの名無しさん:02/09/22 23:09
>>428 基本ってどの程度ですかね?
(分かってないこともないが、分かってるとも断言できないレベルなので)

今日探してみたのですが、あまりにも種類が多くて・・・
しかもこれ系は高いからあれもこれもとはいかないのですよ。
迷ったあげく、経験者の意見を参考にと。

434:02/09/22 23:21
>433
俺の場合は「やさしいC」みたいな本終えてから
この本始めたよ。
三巻構成で金かかるけど(1巻2800円)
その文わかりやすいと思うなぁ。
二巻は主にC++のクラスについてだから
C++がよく理解できてるなら飛ばしてもいかもしれない。
流れとしたら
SDK->オブジェクト志向(C++のクラス)->MFC
っていう構成。
逆に買って失敗した本は
作って分かる VisualC++6.0
↑なにもわからなかったよw
前述の三冊してから読んだらまぁ面白かった。
参考に。。
>>433
VisualC++6.0 プログラミング入門
桜田幸嗣/田口景介

この本は俺がVsualC++買ったときに同梱されていた本。
持ってなければこれ辺りが無難だと思う。
436デフォルトの名無しさん:02/09/23 11:16
ダイアログベースのプログラムを書いているのですが、
スケルトンとしてウィザードが作成した
メイン画面のダイアログと別に自分で
リソースを挿入、からダイアログを作成し、
クラスを割り当てました。
コマンドラインが渡された時はそちらのダイアログを
使用するよう切り替えたいのですが、
ほとんど上手くいってるのですが、
タイトルバー左隅のアイコンの表示の仕方がわかりません。
どうやったらもともと用意されてるダイアログのように
タイトルバー上にアイコンを描画できるのでしょうか?
>>436
WM_SETICONを
窓に
投げつけろ!
438 :02/09/23 17:44
>>436
OnInitDialogの中で
HICON hIcon=::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
SetIcon(hIcon,TRUE);
SetIcon(hIcon,FALSE);
でいいんじゃないの?違ってたらゴメン
439436:02/09/23 17:58
>>437-438
なんの問題もなく出来ました。
ありがとうございます。
以下のようにしてコンボボックスにA〜Jの選択肢を表示し
例えばAを選択すると num に"1"を渡すようにするには
どうすればよいでしょうか?

int i;
int num;

CString select;
CString name[]={"A","B","C"...."J"};

void C***Dlg::OnDropdownCombo()
{
m_combo.ResetContent();
for(i=0; i<=10; i++){
m_combo.InsertString(0,name[i]);
}
}

void C***Dlg::OnSelchangeCombo()
{
m_combo.GetLBText(0,select);
m_combo.SetWindowText(select);
}
441433:02/09/23 20:35
>434,435
さんくす あす本屋いってみます
>>440 num = m_combo.GetCurSel();  じゃダメなの?
それじゃダメ。
>>443
それじゃ今選ばれてるテキストを取ってきて文字列の配列と比較でもしなさい。
>>443
SetItemData & GetItemData
446443:02/09/23 23:45
俺は440じゃないんだが・・・
num = m_combo.GetCurSel() + 1;
447440:02/09/24 01:17
ありがとうございます。
num=m_combo.GetCurSel()+1; でうまくいきました。
448デフォルトの名無しさん:02/09/24 03:04
CViewクラスをカスタマイズしたビューをダイアログアプリで使うにはどうすればいいですか?
ダイアログのフォームにビューを張り付けることが出来れば最高なんですけど
ViewをActiveXコントロールにしてしまふ。(w
そういうのはCodeGuruやCodeProjectにあったはず
451440:02/09/24 11:48
GetWindowTextで受け取った数列をint型の変数に
渡すにはどうすればよいか教えてください。
int i = boost::lexical_cast<int>(s);
453440:02/09/24 13:37
どうもすいませんでした。
数列の場合、GetWindowTextなど使わずに
メンバ変数を使えばよかっただけでした。
454デフォルトの名無しさん:02/09/24 22:59
lpszHostNameが無効な場合(www.2ch.netttttとか)に例外を捕捉したいんですが。。。

CInternetSession *m_pInternetSession = new CInternetSession();
CHttpConnection *pHttp = NULL;
CHttpFile *pFile = NULL;
:
:
pHttp = m_pInternetSession->GetHttpConnection(lpszHostName, INTERNET_DEFAULT_HTTP_PORT);
if( pHttp == NULL ) return FALSE;  // ホントはもっとちゃんとエラーメッセージ書いてます
pFile = pHttp->OpenRequest("GET", (LPCTSTR)strRequestFile, lpszURL);
if( pFile == NULL ) return FALSE;  // ホントはもっとちゃんとエラーメッセージ書いてます
try
{
  pFile->SendRequest();
}
catch( CInternetException err )
{
  AfxMessageBox("エラー");
  return FALSE;
}

捕捉できない。。。
>>454
例外は発生せず、サーバーから404とかが返ってくるのみ

DWORD dwStatus = NULL;
pFile->QueryInfoStatusCode( dwStatus );
>>455
ファイルがない場合じゃなくて、サーバが見つからない場合のことなんですが。

QueryInfoStatusCodeを実行するのはSendRequestを呼び出した後でしょう?
そのSendRequestを実行中に例外が発生すると思うんです。
>456
スマン、よく見てなかった。

やって見たら数秒後に飛んだけど、
ちなみにキャッチはポインタで捕ってる。

catch ( CInternetException* e )
458454=456:02/09/24 23:35
>>457
ポインタで取ったらいけました!
ありがとう!!

…ひょっとして常識?(T-T)
459457:02/09/25 00:20
>478
俺も前に同じハマり方して、試行錯誤で
脱出した事を思い出したので。。。
常識なのかどうかはわかんないけど
それ以来 CException 系はポインタで捕るようにはしている。
詳細知っている人いたらキボンヌ。
460457:02/09/25 00:22
×>478
○>458
ExcelをOLEとして組み込んで作りたいけど、
参考になる本とかURL教えてください。

お願いします。
(プログラムに多機能なGridを使いたいだけです。)
462デフォルトの名無しさん:02/09/25 13:11
>>461
質問ならあげたほうがいい
>(プログラムに多機能なGridを使いたいだけです。)
市販のOCXとかを使ったほうがいいかもしれない
それかwww.codeguru.com
463デフォルトの名無しさん:02/09/25 14:14
知人にヘルプファイルを作成してもらったのですが
上手く呼ぶ出せなくて困っています。
Test.exeの横にファイルタイトルが同じ
Test.HLPとTest.cntを置いた状態で
F1キーを押すと
このトピックは存在しません。アプリケーションの製造元に
問い合わせて、新しいヘルプファイルを入手してください。(129)
↑このようなメッセージボックスが表示されます。
ヘルプファイルの横にTest.GIDというファイルが作成されます。
どこが間違っているのでしょうか?
また、ヘルプファイルを他の場所に置いた状態で
F1を推して見つからないと言われて自分で
場所を指定した場合にも同じように表示されます。
よろしくお願いします。
464463:02/09/25 14:43
↑の追記です。
Test.HLP自体を
ダブルクリックで起動すると
正常にヘルプが表示されます。

よろしくお願いします。
465デフォルトの名無しさん:02/09/27 04:31
CHtmlViewでマウスの右ボタンに関するイベントを処理するにはどうしたらいいでしょう?
OnRButtonDown や OnNcRButtonDown では捕捉できませんでした。
(端っこの枠の部分ではできましたが^^;)
>>465
OnContextMenu()は試してみた?
>>465
CHtmlViewってあんまり情報ないよね。
View.hに

void OnHogeRClick();

DECLARE_DISPATCH_MAP()

DECLARE_INTERFACE_MAP()

の3行をを追加して、View.cppに

BEGIN_DISPATCH_MAP(CxxxView, CHtmlView)
DISP_FUNCTION_ID(CxxxView, "oncontextmenu", DISPID_HTMLDOCUMENTEVENTS_ONCONTEXTMENU, OnHogeRClick, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

BEGIN_INTERFACE_MAP(CxxxView, CHtmlView)
INTERFACE_PART(CxxxView, DIID_HTMLDocumentEvents, Dispatch)
END_INTERFACE_MAP()

void CxxxView::OnHogeRClick()
{
// ここで右クリックしたときの処理
}

こんな感じでどうかな。もちろんCxxxViewは自分のViewに書き換えて。
468465 :02/09/27 23:34
ちと言い方がまずかったですね。すいません。
ポップアプメニュー云々ではなく、単に右ボタンのdown/upを検知したかったのです。

>>466
一応試したのですが無反応ですた

>>467
DISPID_HTMLDOCUMENTEVENTS_ONCONTEXTMENU が見つからないって言われるのはヘッダが古いからでしょうか?
かわりに DISPID_HTMLDOCUMENTEVENTS_ONMOUSEDOWN で試したのですが無反応です。。。なんでだろ。
すいません。ちょっと違うかもしれませんが
MFC42.dllを新版に差し替えたいんですが、Win2kのシステムファイル保護機能が
働いて、リブートすると戻されてしまいます

この機能の停止方法がMSページに書いてあるのですが、止まってくれません
クリーンインストール状態でも駄目なんですが何か対策ご存知の方いらっしゃいませんか?
vcインストール、vc sp5インストールと順を追ってやって見ても変化なしでした
470435:02/09/28 14:07
ずいぶん前の話で申し訳ないが、
>>428
の本を見たけど分かりやすいね。
おれは >>435 でMFCから入ったもんで思わず
第1巻買ってしまった。
471名無しさん@Meadow:02/09/29 17:18
タスクバーに表示されず タイトルバーも持たない
ウィンドウを作るにはどーしたらいいのでしょう?

今ダイアログベースで作成していてスタイルをポップアップ、
タイトルバーのチェックを外しましたがだめでした。
(タイトルバーは消えたがタスクバーに表示されている)

VBでいうBorderStyleを"0-なし"にした状態を希望してます。
472デフォルトの名無しさん:02/09/29 18:11
>>471
それはMFCではできません。
>>472
回答どうも。
そうか、できないのですか…。
474デフォルトの名無しさん:02/09/29 18:59
ダイアログベースのアプリでコード上から直接コントロールを消したり、新しく生成したりするには
どうしたらいいですか?
475デフォルトの名無しさん:02/09/29 19:32
>>474
リソースファイルを書き換えれ
>472
ウソ言うな
477デフォルトの名無しさん:02/09/30 00:38
>465
そそ、普通には取れないんだよな。
おいらはPreTranslateMessageで横取り(?)してまふ。
>476 答えてやれよ−

>471
普通のウインドウなら
ModiftyStyleEx で WS_EX_TOOLWINDOW を追加すれば良いんだが、
ダイアログでも効くのかな?試してみて。
>474

ダイアログ内のコントロールをコードで作成・破棄するのは技術的には可能だけど、
相当面倒。聞かなければ実現方法が分からないレベルだとかなり苦労すると思う。
(コントロールIDの割り付けやタブオーダーの振り直しなど)

どういう理由で作ったり消したりしたいのか分からないけど、
最初から全部リソースで作っといて、(コントロールの座標が重なっていても構わずに)
OnInitDialog で初期状態で必要無いコントロールは全て非表示にする。
後は、コードで必要に応じて表示・非表示を切り替えた方が全然楽だ。
細かい調整はリソースファイルを直接書き換えたら良い。
俺ならそうする。
480465:02/09/30 04:44
>>477
なるほど。
あんまりスマートじゃないけどそれしかないかな。
481名無しさん@Meadow:02/09/30 11:09
>>478

できました ありがとう!
OnInitDialog() に
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW, 0);
を書いたら実現できました。
482デフォルトの名無しさん:02/09/30 20:33
リストビュー(レポート)にラージアイコンを表示させることは出来ますか?
できますよ
484482:02/09/30 20:55
なにやら白抜きの□が表示され照るみたいですがこれは
アイコンを指定しているindexが悪いのですか?
485デフォルトの名無しさん:02/10/01 01:11
MFCのお勧めの本を教えてくださいm(_ _)m
486485:02/10/01 01:41
無視しなくてもいいやないですか(#゚Д゚)y-~~
>>485
ログ読め厨房
>>454 >>457 >>458 >>459
亀レススマソ、
気になって調べて見たんだけど BOOL CHttpFile::SendRequest の中に
下記の記述があり、
 if (!bRet) AfxThrowInternetException(m_dwContext);

AfxThrowInternetException の中に
 THROW(pException);
という記述がありました。
pExceptionは、CInternetException* 型なので、キャッチするとき
はポインタで受ける必要があるみたいです。
 catch ( CInternetException* e )
489デフォルトの名無しさん:02/10/03 00:45
CDialogを継承したクラスを、templateにすることって可能でしょうか?
490デフォルトの名無しさん:02/10/03 02:58

●●●●●●●●「オセロさえ納期内に作れない=OO役立たず 」祭り●●●●●●●
/|         |  |_____ΦΦΦΦΦΦΦΦΦΦΦ||ΦΦΦ
  |         |  | ̄ ̄ ̄ /|                    ||
  |         |  |   / /|TTTTTT   TTTTTTTTTT||TTTTT
  |        /\ |  /|/|/|^^^^^^ |三三| ^^^^^^^^^^^||^^^^^^^
  |      /  / |// / /|
  |   /  / |_|/|/|/|/|
  |  /  /  |文|/ // /
  |/  /.  _.| ̄|/|/|/         Λ_Λ
/|\/  / /  |/ /           (___)
/|    / /  /ヽ            /〔 非OO 〕〕つ
  |   | ̄|  | |ヽ/l            `/二二ヽ
  |   |  |/| |__|/   Λ_Λ     / /(_)
  |   |/|  |/      ( ´∀`)   (_)    Λ_Λ
  |   |  |/      // /  ^ ̄]゚        (`   )
  |   |/        ゚/ ̄ ̄_ヽ         ⊂〔〔 非OO 〕
VC+++MFCはあんまりOOじゃないから余所荒らせよ

Gatesに文句言えよ。
493初心者K:02/10/03 10:04
教えてください!!
MSVCで作ってるアプリから、spawn系関数でイメージビューワを起動していますが、
当然のことながらビューワ起動後のアクティブウィンドウはビューワになります。
ここで、起動もとのアプリを、プログラム側からの制御でアクティブウィンドウに
したいのですが、どのようにやったらいいのでしょうか?

ちなみに、ビューワ起動。。。。殺す部分は、以下のように作っています。
char CMD[]="C:\\Program Files\\Windows NT\\Accessories\\ImageVue\\kodakimg.exe";
char filename[]="C:\\WINNT\\nwelcome.bmp";
int ProcessHandle = _spawnlp(_P_NOWAIT, CMD, CMD, filename, NULL );





TerminateProcess( (void *)ProcessHandle, 0);
※ 文字列の中身は、変えています。だから、フルパス指定でpは不要だとかいじめないでね。

よろしくおねがいします。
494初心者K:02/10/03 10:58
493の続きです。
とりあえず、
this->SetActiveWindow();
this->SetForegroundWindow();
あたりが怪しいと思い、起動直後に入れてみましたが、状況は変わりませんでした。
そこで、タイマーをかまして、0.5秒後にこの二つの命令が動くようにしました。
これで、とりあえず当初の目的は達成されましたが、どうもダサい。。。。。。
もっとスマートな方法はありませんでしょうか?
495デフォルトの名無しさん:02/10/03 11:24
>>488
THROWは、newしたポインタを投げてるので、CATCH(or CATCH_ALL)
で受けてやらないと、メモリリークします。
CATCHの後には、END_CATCH(or END_CATCH_ALL)も忘れずに。

C++の例外はインスタンスで投げて、const&で受けるのが常識だけど、
VC++の例外処理がまともじゃなかった頃から、MFCで例外を使う
苦肉の策として、THROW、CATCHが作られたみたいです。

現在のVC++ならthrow CLASS、catch const CLASS&で問題ないんですが。
>>493
_spawn じゃなくて CreateProcess() 使って、STARTUPINFO で
SW_SHOWNOACTIVATE あたりを指定してみたら?
>>495
なるほど!
んじゃぁ、MFCが勝手に投げる例外はCATCHで受けたほうが無難でいいですね。
どうもですー
498初心者K:02/10/03 15:22
>>496
アドバイスありがとうございました。
CreateProcessでビューワを起動し、WaitForInputIdleで起動し終わるのを待って
this->SetActiveWindow();
this->SetForegroundWindow();
で元アプリをアクティブにして、
TerminateProcess(PROCESS_INFORMATION.hProcess)
でビューワを殺すことにしました。多少画面がチラチラしますが、
かなりスマートにできました.
STARTUPINFO.wShowWindow = SW_SHOWNOACTIVATE
を指定してみましたが、ビューワがアクティブになるだけでした。。。
このあたり、間違いがあれば、指摘していただけるとありがたいです。

499初心者K:02/10/03 16:34
さらに見てみたけど。。。
char CMD[]="C:\\Program Files\\Windows NT\\Accessories\\ImageVue\\kodakimg.exe";
char filename[]="C:\\WINNT\\nwelcome.bmp";
int ProcessHandle = _spawnlp(_P_NOWAIT, CMD, CMD, filename, NULL );
WaitForInputIdle( ProcessHandle, INFINITE );
this->SetActiveWindow();
this->SetForegroundWindow();
でも、結果は同じでした.
500496:02/10/03 17:25
>>499

STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW; ←これ
si.wShowWindow = SW_SHOWNOACTIVATE;

ちゃんと指定した? うちでは意図した通りに動いたんだけど。
501初心者K:02/10/03 18:01
>>496 様!!
ありがとうございます。そのキーワード、入れていませんでした。
おかげさまでひじょうに麗しい動きを見せてくれるようになりました。
502名無しさん@Meadow:02/10/03 20:39
ポップアップメニューのON_UPDATE_COMMAND_UIについて、
今下のようにポップアップメニューを呼び出しています。
CMenu menu;
if (menu.LoadMenu(IDR_MENU_POPUP)){
CMenu* pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this);
PostMessage(WM_NULL, 0L, 0L);
}
ダイアログベースのアプリケーションなのですが
ON_UPDATE_COMMAND_UIでメニューのEnableを制御
しようとしても、うまく呼び出されません。

# 自分としてはポップアップメニューを開いたときに
# 呼び出されて欲しいのですが、現状ではそのメニュー項目を
# クリックしたときに呼び出されているようです。

どのようにしたらよいのでしょう?
503デフォルトの名無しさん:02/10/03 22:00
お し え て く だ さ い
アクロバットリーダーのようにブラウザ上でPDFファイル
を読込もうとすると、自動起動してブラウザ内部に
アクロバットリーダーが起動しますよね。
そのようなアプリを作りたいのですがどのように作るのですか?
おねがいします。


STDでMFCの関数を使うには、なにをインクルードしたらいいのでしょうか?

だれか教えて下さい。
505デフォルトの名無しさん:02/10/03 22:20
STDって?
性病?
506504:02/10/03 22:22
>>505
知らないなら書き込まないでください。
507デフォルトの名無しさん:02/10/03 22:27
508504:02/10/03 22:32
>>507
どっかいってろ!
な ん だ か し ら ん が 5 0 4 必 死 だ な 藁
510504:02/10/03 22:49
>>509
おまえがわかんねーからってあおってんじゃねーよ!!
氏ね、あふぉ
>504
おいおい、知らない人に質問しておいて
えらそうな口聞くじゃないかw
いるんだよなぁ、お前みたいな勘違いしてるやつ。
ちなみに俺も含めてここに居る人の大抵はお前の
質問の答えくらいわかってると思うよ。
まぁもっと困って頭を冷やしなさい。
俺は分からない、、、
STDとMFCで検索かけたら
http://www.twinring.jp/motorsports/motor/experience/race/kart/schedule.html
これが出た。
>>502
ダイアログではデフォルトではON_UPDATE_COMMAND_UIは効かないので
OnInitMenuPopup内でチェックする。
別の方法としてアイドル処理でON_UPDATE_COMMAND_UIを捕まえる例が
確かCodeGuruにあった。
>>513
どうもです。
どうやらON_UPDATE_COMMAND_UIは効かないようですね。
ttp://support.microsoft.com/default.aspx?scid=KB;EN-US;Q242577&
ここにやりたいことがそのまま書いてありました。
>>488
小亀レスですが勉強になりますたありがとう
>>495
catch (CException* pE) {
//例外処理
pE->Delete() ;
}
でもいいらしい。これなら他の例外処理とまとめられる。

>>498
余計なことかもしれないけど…
TerminateProcess使うよりWM_CLOSEをポストした方がよくないかなあ。
517デフォルトの名無しさん:02/10/05 12:32
質問。
CToolBarを動的に作ったときボタンをEnableにする方法がわかりません。
リソースエディタでツールバーを作ったときは、
ビルドして動かすと最初はボタンがDISABLEになっている。
ClassWizardでハンドラを作るとEnableになる。
CToolBarを動的に作ったときはClassWizardでハンドラを
作るということができないのでどうすれば?
>>517
そういう質問何度か出てるけど、ClassWizardで作れないなら自力で書く。
519517:02/10/05 20:57
>>518
で、自力で何を書けばいいのかを聞きたいんですけど。
CToolBarを動的に作ったとき、ツールボタンをEnableにするには?
という質問です。
520517:02/10/05 20:59
CToolBarCtrlを引っ張り出してEnableButton()してみたのだが反応なし。
なので困ってます。
521アホで御免なさい:02/10/06 01:26
CWinAppクラスのソースを読みたいんですが
何処にあるのか分かりません。ヘルプ!!
522デフォルトの名無しさん:02/10/06 01:30
>>521
VCのファイルの中を検索するやつがあるだろ。
あれでCドライブで、class CWinApp をキーとして検索すれば場所がわかる。
523517:02/10/06 01:43
WM_COMMANDだけPreTranslateMessage()でとればいいや、と思っていたのだが
あらかじめメッセージマッピングしておかなきゃだめなんだろーか?
ボタンをEnableにするためだけに?
524アホで御免なさい:02/10/06 01:46
正直スマンのですが
検索しても見つからないんですよ。
よろしければファイル名を教えていただけませんか?

もしかして、(よく分からんのだが)dllってのに入ってたり!?
>524
最初からソースファイルをインストールしてなかったりしてね。
大体どこを検索してるの?
VCのインストールディレクトリの配下全部調べました?

ちょっと手元に無いので確実じゃないけど
"wincore.cpp"だったかな?
タスクトレイのみのアプリケーションを作る時ってどうするもんなのでしょう。

とりあえずSDIでView/Docを消してMainFrameのみで
やってますが皆さんどのようにやってますか?

527:02/10/06 07:42
>526
検索ワードは
タスクトレイアプリケーション
>>524
下記が無ければインストールしてないんじゃないかな?
VC98\MFC\Include\AFXWIN.H
VC98\MFC\SRC\APPCORE.CPP
529アホで御免なさい:02/10/06 10:59
>525,>528
ありがとうございます。
見つかりました。検索のし方が悪かったみたいです。
>>526
前に実験したことあるけど、MFC使うならおっしゃる通り、CMainFrame 派生が一番
いいよ。サイズ 0 で、アイコンや MENU は NULLのウィンドウクラス作ってさ。

メインウィンドウを CDialog にすると CMainFrame よりメモリ食う。

ましてや、設定ダイアログをそのまま非表示にして、メニューで「設定」が
選択されたら this->ShowWindow(SW_SHOW) なんてのはもっての外。
VBアプリじゃないんだから(w

ま軽さを突き詰めたら「MFC使うな」ってことになるんだけどさ...
531530:02/10/06 21:09
あ、CMainFrame というか CFrameWnd の派生。
532デフォルトの名無しさん:02/10/06 23:28
だれか
> CDialogを継承したクラスを、templateにすることって可能でしょうか?
おしえてくだちい・・・
templateって、
temaplte< class T> のtemplate?
あ、そうです。>>533
何を可変(template)にするのさ?
>>535
template < typename T > class CHoge : public CDialog {
private: const T * m_gehol
};

希望です。
537デフォルトの名無しさん:02/10/06 23:51
>>536
m_gehol は m_geho;
すんまそん。
どうでもいい
539デフォルトの名無しさん:02/10/07 00:09
まぁそういわずに。
>>536
別のアプローチを考えそうな気がする。普通は。
541 :02/10/07 00:28
>>532
templateクラスがメッセージマップを持たなければ可能。
メッセージマップがある場合はかなり厄介。
>>541
ですか…
メッセージマップ持ってますわぁ。あきらめます。
543 :02/10/07 00:43
>>542
親クラスにメッセージマップを持たせて、そこからtemplateクラスを
派生したらどうかな?
メッセージハンドラをvirtualにしておけば、ちゃんと動くはず。
>>543
オオゥ
やってみます。
545デフォルトの名無しさん:02/10/07 17:25
StretchDIBits()
SetDIBitsToDevice()
DitBlt()

の違いを教えてください(゚ー゚*)
547 :02/10/07 20:12
DLLからメインの関数って使える?
548 :02/10/07 21:19
>>547
メインの関数というのがいまいち意味不明だが、EXEのモジュールにある
関数という意味なら普通にexportして使えるよ。
549 :02/10/07 22:06
>>548
そうそういう意味
サンクス
550デフォルトの名無しさん:02/10/07 23:11
質問です。

時間を設定しておいて、その時間になったらアプリケーションの起動等をさせ
るプログラムを作っています。

実際に今の状態で使えているのですが、性質上、複数起動出来てしまうのが気
になっています。

何か、複数起動を禁止する方法は無いのでしょうか。
ご存じの方、教えて下さい。
>>550
Mutexを調べろ
552550:02/10/07 23:17
>>551
レス、ありがとうございます。
早速調べて試してみます。
VS.NETで新規作成、C++プロジェクト、MFCアプリケーションとやって、
SDIで基本クラスCEditViewにして、そのままビルドすると簡単な
テキストエディタになるんですが、ファイルに保存するとshift-jisでは
保存されません。どうしたらshift-jisで保存されますか?
どこかでコードページでも指定するんでしょうか。

下記の現象が起きて困っています。どのようにすればよいでしょうか?
 MFC AppliWizard(exe)を選んで新規作成。
 ダイアログベースのアプリを選択し、その他はデフォルトのまま。
 エディットボックスを追加。
 ClassWizardメンバ変数追加でIDC_EDIT1に適当な変数を割り当てる。

上記を行うと確実に下記が発生します。
 ClassViewからC***Dlgが消える。
 FileViewで***Dlg.cppを編集すると this-> とか書いてもメンバの
 補間機能が使えなくなっている。

環境
 Win2000
 VC6++SP5スタンダードエディション
>>553
VS.NET知らないけど、プロジェクトの設定で
_UNICODEとかをdefineするようになってたらそれはずせば?

>>554
本当にそれしかやってないならバグでしょう。
SP当てたタイミングでそういう現象が出るようになったって事ではない?
なんにせよMSに相談するのがいいでしょう。

とりあえず
>  ClassViewからC***Dlgが消える。
>  FileViewで***Dlg.cppを編集すると this-> とか書いてもメンバの

を復活するには 一端 ***.CLWを消してからクラスウィザード開いて
そのままOKで出来ると思うけど。
>を復活するには 一端 ***.CLWを消してからクラスウィザード開いて
>そのままOKで出来ると思うけど。
うちも ClassView からメンバ関数を削除したりすると、たまにそうなる。
***Dlg.h に変更を加えるだけで復活する。
557555:02/10/08 16:54
>>554
そういえば ウィルスチェックしてたら
そんな現象が起こりやすかったような気がしないでもないような。
558554:02/10/08 20:52
今日やっても再現しますね。
ちなみに研究室の
 WinMe+VC6CP5プロフェッショナルエディション
では再現しませんでした。

>>555
>一端 ***.CLWを消してからクラスウィザード開いて
>そのままOKで出来ると思うけど。
これではだめでした。

>>556
>***Dlg.h に変更を加えるだけで復活する。
これは上手くいきますね。今後これで対応することにします。

レスくれた方どうもありがとうございました。
559デフォルトの名無しさん:02/10/08 21:01
MFCのAfxBeginThreadに渡す制御関数は、
staticでなければならいないのでしょうか?
ご存知の方おながいします。
560556:02/10/08 21:03
>>558
VC6sp6 pro 使ってるけど、特定のクラスで、ClassView からメンバ関数を削除したり
すると ClassViewから消える。まぁ (゜ε ゜)キニシナイ ことにしています。
>>559
引数にLPVOIDを持ち、UINTを返すグローバル関数なら何でも
よいのでは?
>>560
sp6って、いつ出たの?
563560:02/10/08 23:24
>>559
「staticでないメンバ関数を渡せるか?」ということかな?
だとしたら多分無理なんじゃないかな...
thisポインタを渡さなくてはいけないので。(という自分もよく分からず)

class Hoge :
{
 main();
 static UINT Foo(LPVOID ptr);
}

Hoge::main()
{
 AfxBeginThread(Hoge::Foo, (LPVOID)this);
}

Hoge::Foo(LPVOID ptr)
{
 Hoge* a = (Hoge*)ptr;
 a->何か;
}

なら可能でしょう。
Fooを実行中にインスタンスがデストラクトされたらマズいことになるので注意。

>>562 スマソ。sp5の間違いですた。
>559
ヒープでも可
565デフォルトの名無しさん:02/10/08 23:53
VC.NET 買った。が。
Win32 プログラム+MFCというプログラムが作れない・・・・
(↑MFC ベースのプログラムではなく、Win32 プログラムで MFC を使う)

コンソール+MFCはできるのに・・・
これってどうしようもないんでしょうか??
566560:02/10/08 23:55
あ、実際は >>563 みたいなのは危険で、ASSERTで怒られるので
thisポインタを直接別スレッドに渡すのは止めたほうがよいらしい。
567デフォルトの名無しさん:02/10/08 23:57
>>565
[Windows アプリケーション]
Win32 プログラムが作成されます。
Win32 プログラムとは C または C++ で記述された実行可能アプリケーション (EXE) であり、
Win32 API を呼び出してグラフィカル ユーザー インターフェイスを作成します。
「Windows アプリケーションには MFC サポートや ATL サポートを追加できません。 」

しょぼ(w
568マスト:02/10/09 00:03
[email protected]
ウィルスをここに流し込んで見て下さい。
>>563
別に必ずしもthisを渡す必要は無いよ。
570559:02/10/09 01:09
>>561
>>560
>>569

ありがd。
グローバル関数の存在を知らず、
メンバ関数を渡そうとしてました。
this渡しと同期化でなんとかなればいいのだけど。
>>559
staticという表現をどういう意味で使用してるかよく分からない。
「宣言の前にstaticをつけなければならないの?」と言う意味なら
別に必要ない。↓こんな感じでもいい。
int gInt = 0;
BOOL gFlag = TRUE;
UINT gTempThread (void* pParam) {
  for ( ; gInt<50 ; gInt++) Sleep(100);
  gFlag = FALSE;
  return 0;
}
class CTemp {
public:
  void Func(){
    mpThreadList = AfxBeginThread(gTempThread ,(void*)0);
    while (gFlag) {
      printf("%d\n",gInt);
      Sleep(50);
    }
  }
private:
  CWinThread* mpThreadList;
};
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){
  CTemp oTemp;
  oTemp.Func();
  return 0;
}
おっと2分遅れだった。
>>570
>this渡しと同期化でなんとかなればいいのだけど。
独立スレッドのほうでメンバ変数などを使用する場合は、this
を渡せば大丈夫。
571の例では(CTemp*)pParam->とすることでメンバにアクセ
スできる。

スレッドを呼び出す部分より後ろに、もしくは別ファイルに
独立スレッドがある場合は、呼び出すところより前に
 extern UINT gTempThread (void* pParam);
などと宣言しておくこと。(スコープの外でね)
574デフォルトの名無しさん:02/10/09 01:33
市販のキーロガーやスパイウェアってタスクマネージャに表示されないように
グローバルフック仕込んでいるみたいだけど、あれってどうやるんですか?

例えば、
a.exe がフックをセットするプログラムで、
a.dll がフックプロシージャを含む dll だとします。

Windows開始時に起動される a.exe がデスクトップを表示している
explorer.exe に a.dll のフックプロシージャをセットし、
アンフックせずに終了すれば、explorer.exe 内に a.dll が常駐
した状態になるんでしょうか。
ただ試してみたところ、a.exeでアンフックせずに終了しても自動的に
アンフックされてしまったみたいでした。
Explorer側に入り込んだフックプロシージャ内で、再度自分自身に
フックをかければOKなのでしょうか。
最初にフックをセットするプログラム側では、上記処理が完了するまで
終了を待つことにすればよいかもしれませんが、イマイチ実現方法が
かりません。

どなたか実現方法をご存知のかたいらっしゃいませんか?
575 :02/10/09 02:24
>>574
作り方も分からないものを作る必要は無いだろ。
576デフォルトの名無しさん:02/10/09 03:25
>>575
>作り方も分からないものを作る必要は無い
その考えに従えば、全ての発明はなくなるなw
577デフォルトの名無しさん:02/10/09 03:30
>575
一度でも自分で何か調べながらモノを作ったことがあるならそんなことはアタマに浮かばないはずだけどな。
すくなくともプログラミングはしたことないだろ。
578IISObject:02/10/09 03:44
多分MFCの範疇じゃないと思うけどちょっと質問。
VC6.0にてWizardでActiveXサーバコンポーネントをそのまま
生成すると、ASPではServer.CreateObject("XXX.Class")
で上手くいってたのに、WinXP SP1を入れてから同様のコードで
「オブジェクトを作成できません」のエラーが出るように
なってしまいました。
皆さんはどうなっていますか?
ADODB.Recordsetなどは上手く作成されるのですが…。
因みに new ActiveXObject("XXX.Class")でも動かなくなりました。
579 :02/10/09 03:46
>>577
574がマトモなものを作るとは思えなかったもんでね。
スパイウェアの作り方教えろと言ってるようなもんだろ。
そんなものは自分で作れるようになってから作れってこった。
うぇーん。なんで範疇じゃないのに質問するんだよー。
こんなのもうヤダよー。
>>579
最初からそう書けよ。
>>575と全然内容が違うだろ。
しょーもないこと書くからこうなるんだ。
582デフォルトの名無しさん:02/10/09 03:53
>>575
>作り方も分からないものを作る必要は無い
>>575が毎日嫌々単純な肉体労働をしてるってことだな。
CMiniFrameWndって普通どんな用途で使うんでしょ?
584デフォルトの名無しさん:02/10/09 04:05
>>581
>>579がやり方知ってんならそれでもいいんだけど、知らないんだろ。

知ってんなら答えてみ。
585578:02/10/09 16:48
>>578
アクセス権がなかったことが原因でした。
無事解決しました。
どっとはれ。
>>584
ちょっと検索したら腐るほど出てきたぞ。
そのうち95%くらいは本当に腐ってるだろうがな
588デフォルトの名無しさん:02/10/10 00:22
>>586
検索エンジンと検索ワードを教えてくれ
>>588
検索エンジン:ぐぐる
検索ワード:C
590デフォルトの名無しさん:02/10/10 14:19
258,000,000万件もでてきたw
Edit Controlを使ったテキストエディタを作ってます。
行番号をつけたいんですがどうすればいいでしょうか
592デフォルトの名無しさん:02/10/15 18:40
C++.net&MFCを使っています。

二つのListBoxがあってタブキーを押すと交互に二つのListBox
のフォーカスが入れ替わるようにしたいのですが、
その下にOKボタン等もあって普通にタブオーダーを決めたのでは
二つのウインドウ間だけを行き来させることができません。
これを解決する方法はありますでしょうか?
またどちらかのListBoxにフォーカスがあるということを
よりよくわからせたい(ListBoxの周りが太字になったり浮き上がったりするような方法で)
のですがこのような方法はあるのでしょうか?
ご存知のかた
宜しくお願いいたします。
前者:OKボタンのプロパティでタブストップのチェックをはずす。
後者:GetFocusでListBoxにフォーカスがあるときにスタイルを変更したり色変えたり
    好きなように
594ひよっこプログラマー:02/10/15 23:34
VCです。
テキストファイルを読み込みたいのですが、
fp = fopen("ifile","r");
if(fp==NULL){
printf("失敗\n");
exit(1);}
として、よみこもうとしたのですが、

失敗

としか、でません。ファイルをどこに置けばいいのでしょうか?
ちなみに今はデバッグなどのファイルがある場所に置いてます。
>>594
スレ違いです。
596:02/10/15 23:45
>594
>デバッグなどのファイルがある場所
これってDebugビルドしたファイルが出力される
ディレクトリのことだよね?
/Debug/のこと。
そこでいいよ。
ただしVC上からCtrl+F5とかで起動した時は
プロジェクトファイルの置いてあるディレクトリ、
つまりDebugのひとつ上のディレクトリがカレントディレクトリと
見なされるので注意。
作ったプログラムの横において
ダブルクリックにてプログラムを起動するなら
横に置くだけでいい。
またはfopenの第一引数にファイル名のような相対パスで
指定するのではなく"C:\test\ifile"
などと絶対パスで指定したらどこから起動しようが関係ないので
取り合えずにはお勧め。
597:02/10/15 23:46
>564
>595
あ、ほんとだ、気付かなかった。
こういうミスはプログラム以前に人格を問われるので
次から気をつけてね。
598ひよっこプログラマー:02/10/15 23:48
気をつけます。
>597
こういうミスもプログラム以前に性格を問われるので
次から気をつけてね。
600デフォルトの名無しさん:02/10/16 03:26
ListBoxの見出し部分を二つみっつに切ってる場合
ウインドウサイズを変えても見出し部分のサイズは変わらないですよね。
あれをウインドウのサイズに合わせて比率で動かすようにスルにはどうしたらよいのでしょう?
>>600
ListViewコントロールの間違いだと思うけど、自分で計算してSetColumnWidthじゃないかな。
602初心者K:02/10/16 10:59
また質問に来てしまいました。

CD-ROMドライブがEドライブだとして。。。。。

struct stat fstat;
stat( Dir1, &fstat);
if( ( fstat.st_mode & _S_IWRITE ) == _S_IWRITE ) {
・・・・・
というソースで、Dir1で指定されたフォルダが書き込み可か否かを
調べようとしました。
ここで、Dir1="E:\folder1"とした場合、書き込み可のビットは立っていませんが、
Dir1="E:\"とした場合、書き込み可のフラグが立ってしまいます。
んで、仕方が無いのでE:\はCDドライブだよ(HDDじゃないよ、で充分)、
という情報を取りたいと思うのですが、どのようにしたらいいのでしょう?
ご存知の方、ご教授ください。
603デフォルトの名無しさん:02/10/16 11:04
>>602

GetDriveType とか GetVolumeInformation とかじゃないのかなー。
604初心者K:02/10/16 11:19
>>603
ありがとうございます。
GetDriveTypeで目的が果たせそうです。
感謝感謝。
605初心者:02/10/16 20:48
すんません、、、
バブルソートを行いたいのですが、2つの文字列を比較したときの
文字コードの老若を知るヒントを教えていただけないでしょうか?
606>>605の初心者:02/10/16 20:49
書き忘れました。2つの文字列はCString型です。
607605:02/10/16 21:05
Ageで書くべきでした…よろしくお願いします。
せめてMSDNでCStringのメンバ関数見ようよ
Compare
609>>605の初心者:02/10/16 21:21
>608
MSDN見てみましたが、メンバ関数がたくさんありすぎて…
どうもありがとうございました。
610デフォルトの名無しさん:02/10/17 15:13
印刷プレビュー画面をカスタマイズするには
CPreviewViewクラスの派生クラスと、自前のダイアログバーを作って
CxxxView::OnFilePrintPreview()でDoPrintPreview()を呼び出すのが
普通の方法ですか?
ほかに楽な方法とかありますか?
611デフォルトの名無しさん:02/10/20 16:14
MFC難すぃ〜んですけどいい勉強法教えてください。
オブジェクト指向は憂鬱本を読んだからたぶん
大丈夫だと思うんだけど・・・。
>>611
使いまくれ。
そして、MFCのクラス一覧表みたいのを部屋の壁に貼っとけ。
613デフォルトの名無しさん:02/10/24 16:16
助けて頂きたいのですが、エディットボックスコントロールから文字列を取得してくるコードで悩んでいます。
(m_edit1及びm_edit2はエディットボックスコントロール,m_overwriteはチェックボックスコントロールです。)

char filename_in[200];
char filename_out[200];
int ret1,ret2;
//ファイル名入力チェック
ret1=m_edit1.GetLine(0,filename_in);
ret2=m_edit2.GetLine(0,filename_out);
if(ret1==0 || (ret2==0 && !m_overwrite.GetCheck())){
return;
}
AfxMessageBox(filename_in);
AfxMessageBox(filename_out);

このコードで、DEBUGモードでビルドすると各エディットボックスに入力した文字がメッセージ表示されますが、
Releaseモードだと、文字を入力してもret1が0になってしまいます。
どなたか対処法をご教授願いたいと思います。
>>613
MSDNに
>コピーされる行には、終わりを示す NULL 文字は含まれません
とあるけど、文字列の終わりにヌル文字はある?
>>613
よく読んでないけどGetDlgItemText()じゃだめなん?
>>613
GetLineの3つ目の引数を入れる。
617613:02/10/24 17:32
>614-616
早速のご回答有り難うございます。

>614
確かにMSDNにはそう書いてありますねー
しかし実際ブレークさせてみると、ヌル文字入っているのですが..(謎

>615
GetDlgItemText()で出来ました!
有り難うございます。

>616
3つ目の引数入れると出来ました!
有り難うございます。
引数2つのGetLineプロトタイプは何なのか、
何故デバッグビルドでは動いたのかまだまだ不明点はありますが、
お陰様で動かす事が出来ました。
C サイコー!
619初心者:02/11/03 02:13
┏━━━━━━━━━━━━━━━━━┓
┣━━━━━━━━━━━━━━━━━┫
┃新・開・保・印刷                  ┃
┣━━━┳━━━━━━━━━━━━━┫
┃      ┃                    ┃
┃      ┣━━━━━━━━━━━━━┫
┃      ┃                    ┃
┗━━━┻━━━━━━━━━━━━━┛

SDI形式で↑のような分割したウインドウを作製したいのですが
どのように実装すればいいのでしょうか?

現在、まずメインフレームを CSplitterWnd で左右に分け
その右側にCFrameWndを貼り付けてそこでまた分割するように
してみたのですが、右側のペインがくぼんだように見えます。

メインフレーム:OnCreateClient
m_wndSplitter.CreateStatic(this, 1, 2);

m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(左側のビュークラス), CSize(150, 100), pContext);
m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(右側のCFrameWndクラス), CSize(100, 100), pContext);

右側のCFrameWndクラス:OnCreateClient
m_wndSplitter.CreateStatic(this, 2, 1);

m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(右上のビュークラス), CSize(150, 100), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(右下のビュークラス), CSize(100, 100), pContext);

環境は VC++6.0です。よろしくお願いします。
620デフォルトの名無しさん:02/11/03 02:14
俺最強
>>619
わざわざCFrameWnd貼る必要なんてなし。

//真中の区分け
m_wndSpCenter.CreateStatic( this, 1, 2, WS_CHILD|WS_VISIBLE, AFX_IDW_PANE_FIRST );

// 右側を上下に
m_wndSpRight.CreateStatic( &m_wndSpcenter, 2, 1, WS_CHILD|WS_VISIBLE|WS_BORBER,
m_wndSpCenter.IdFromRowCol( 0, 1) );

// 左側のビュー
m_wndSpCenter.CreateView( 0, 0, 略);

// 右上
m_wndSpRight.CreateView( 0, 0, 略 );

// 右下
m_wndSpRight.CreateView( 1, 0, 略 );
622初心者:02/11/03 03:53
>>621
できました!ありがとうございました。
623デフォルトの名無しさん:02/11/04 10:17
plug-in をつかったプログラムを作りたいのですが、
なにか、参考になるアドレスなどがあれば教えてください。
624デフォルトの名無しさん:02/11/04 20:07
Windows XPで画面テーマをXPにしていると、CFrameWnd::GetClientRect()が返すクライアント領域が小さい気がします。
そのため、クライアント領域いっぱいにコントロールを作ろうと思っても
隙間が開きます。
FrameWndのスタイルはMAXIMIZEBOX | MINIMIZEBOX | SYSMENU | THICKFRAMEを落としたものです。
回避法をご存知の方はいらっしゃませんか?
625デフォルトの名無しさん:02/11/04 20:13
VC++ 6.0です

Accept()した後のCSocketのポインタをAfxBeginThreadの引数として
渡しているのですが、そのThreadの中でCSocketをCloseすると
Closeの中のASSERTで引っかかります。

スレッドを開始する前にCloseを呼ぶと成功します。

これって何故なんでしょうか?
わかる方いらっしゃいましたら教えてください。
よろしくお願いします。

CSocketには、不可視のWindowが隠されているから。
CSocketはステ。
マルチスレッドでソケットを使う場合は

void SocketThreadInit()
{
#ifndef _AFXDLL
#define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE
#define _afxSockThreadState AfxGetModuleThreadState()

_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
if (pState->m_pmapSocketHandle == NULL)
pState->m_pmapSocketHandle = new CMapPtrToPtr;
if (pState->m_pmapDeadSockets == NULL)
pState->m_pmapDeadSockets = new CMapPtrToPtr;
if (pState->m_plistSocketNotifications == NULL)
pState->m_plistSocketNotifications = new CPtrList;
#endif
}

っていうグローバル関数を書いてCSocketインスタンスを生成する前に呼び出す
とMSのどっかのページに書いてたはず。
628625:02/11/04 21:02
>626
そうですか...。
ということはWinSockでCSocketのようなクラスを
自作しなければいけないんですね。

>627
ttp://support.microsoft.com/default.aspx?scid=kb;ja;JP193101

のことですか?
これはServicePack3で修正されたとのことです。
当方SP5ですのでおそらく関係ないかと思われます。

>>624
逆に必要なクライアント領域のサイズから必要なウィンドウの大きさをきめるのは?
CWnd::CalcWindowRect()か::AdjustWindowRectEx()とか使って。
630629:02/11/05 01:12
なんか的外れな回答したかな。でもXPは前のバージョンよりも
タイトルバーの高さとかも若干大きくなってるはずだから、今までと
同じウィンドウの大きさだと相対的にクライアント領域は小さくなるぞ。
その辺は考慮してるのか?
631624:02/11/05 02:05
>>629,630
CFrameWndいっぱいのCListBoxを作ろうと思ってGetClientRectし、その大きさで
CListBoxをCreateしていたわけです。で、今まではうまくいっていたんですが、
XPのスタイルXPだけクライアント領域いっぱいにならず、
下の方に隙間が開いてしまうわけです。ちょうどTHICKFRAMEの下の辺の幅くらい足りません。
スタイルはTHICKFRAMEを外してあります。
XPのバグなのでしょうか?
クライアントいっぱいにするならViewでGetWindowRect?
633624:02/11/05 02:42
>>632
あ、Viewは作ってないんです。Frameの下にいきなりCListBox。
Dialogにすべきなんでしょうか?オーバーライドするメソッドか何かの関係で、
CFrameWndを使わざるをえなかったような記憶が…
ListBoxならFormViewに貼り付けるかなぁ。
俺ならListView使ってるかなぁ。
どうしてもListBoxなら独自にListBoxを使ったコントロールビュー作るか。
MFCスレ的にはこの辺が定番な回答かも。

つーかXPもってないので試せま千円。
リストボックスだと、LBS_NOINTEGRALHEIGHTが付いていなかったら
項目の高さの整数倍になるように調整されてしまうわけだが。
636624:02/11/06 01:56
>>635
ソレダ!

お恥ずかしいです。今までが偶然ぴったりいっぱいにおさまってたんですね。
お騒がせしました。
637デフォルトの名無しさん:02/11/06 03:53
MFCのCHttpを使用してサーバにファイルをアップロードしたいんですけど
データ自体は転送されるのですが
サーバ側のcgiでformをうまく解析できず
ファイルの転送が完了しません
ちなみにindex.htmlでformを書いてcgiを動かせば正常に作動します

以下のデータは全て直接(CString strData, CHttpFile *pFile)
pFile->WriteString( strData )で書き込んでいます

msize= 230653
-----------------------------
Content-Disposition: form-data; name="author"

who
-----------------------------
Content-Disposition: form-data; name="fname"; filename="C:\0.ppm"
Content-Type: text/plain

P6 320 240 255
:JF:JF8LG9MH<LH<LH@LE?KDBJGBJGFKEHMGKKJKKJHMGIN
HSFDQGCPFGPIGPIEQJFRKCUJEWLGSLGSLJSLLUNOULMSJL
...続く
Content-Lengthはキチンと送っているか?
そのあたりの手を抜いているCGIは多いぞ。
639637:02/11/06 04:05
>>638

msize= 230653というのがContent-Lengthの値に対応しています
サーバ側では

u_long msize = atol(getenv("CONTENT_LENGTH"));
if( msize > MAX_MEMORY ){
printf("Too large data to recieve.\n");
exit(1);
}

で読み込んでいます
637のデータ自体は標準入力から得られたものをファイルにも書き込んでいるので
「データそのもの」は送信されています...

ちなみにこのプログラムはいまサンプルとして製作中のため

strData += "-----------------------------\r\n";
strData += "Content-Disposition: form-data; name=\"author\"\r\n\r\n";
strData += "who\r\n";
strData += "-----------------------------\r\n";
strData += "Content-Disposition: form-data; name=\"fname\"; filename=\"C:\\0.ppm\"\r\n";
strData += "Content-Type: text/plain\r\n\r\n";
strData += "P6 320 240 255";
strData += data;

としていますが,ここがまずいとかありませんか?
640637:02/11/06 04:06
>>638

ちなみにヘッダーは

const TCHAR szHeaders[] =
_T("Accept: */*\r\n User-Agent: HogeSampleCode\r\n");

です
WriteStringはWrite( pstr, lstrlen(pstr) );だけど、\0含んでたりしないか?

それでもダメなら、間にデバッグ系のプロキシ噛ませて、
何吐いているか確認したら?
642637:02/11/06 04:29
>>641

えとですね

最後に書かれているデータ

P6 320 240 255
:JF:JF8LG9MH<LH<LH@LE?KDBJGBJGFKEHMGKKJKKJHMGIN
HSFDQGCPFGPIGPIEQJFRKCUJEWLGSLGSLJSLLUNOULMSJL
...続く

の部分は画像でありまして
このデータだけをマニュアルで切り出せば
途中で切られることなく転送前の画像と全く同じになっていることから
データ長は正しいと思われます

あ,それと一応ですが
サーバ側cgiの標準出力で読んだデータは解析にかける前に
テンプデータとして別に保存しています
といっても解析されないので転送されたファイルは作成されないのですが...


643637:02/11/06 04:32
>>641

参考に正しく動いているindex.html版の結果を載せます

-----------------------------7d22972e2a70122
Content-Disposition: form-data; name="author"

who
-----------------------------7d22972e2a70122
Content-Disposition: form-data; name="fname"; filename="C:\0.ppm"
Content-Type: text/plain

P6 320 240 255
(ここには巨大なデータが改行なしで書かれています)
-----------------------------7d22972e2a70122--
Recieved [author] = [who]
Recieved file C:\0.ppm

最後の2行はサーバが解析した結果です

すみませんねレスしていただいて...
POSTについては,もう2週間以上かかってるんです...
自分では最後の大詰めだと思っているんですが甘いですかね?

>WriteStringはWrite( pstr, lstrlen(pstr) );だけど、\0含んでたりしないか?

これについての回答ですが

pFile->SendRequestEx( strData.GetLength());
pFile->WriteString( strData );

のように記述しています
Content-Type: multipart/formdata; boundary=-----------------------------
はつけてるだろうな、、、
まちがえた。boundaryに--が先行するわけだから、
Content-Type: multipart/formdata; boundary=---------------------------
だな。

そして、postの最後に-------------------------------の追加。
でよかったかな。詳しくは、MIME Multipartを。
646637:02/11/06 04:46
>>644

書いてませんでした

後,ヘッダーにですか?データの中にですか?
共に試しましたが変化はありませんでした...
とりあえずは

const TCHAR szHeaders[] =
_T("Accept: */*\r\n User-Agent: UMTPSampleCode\r\n Content-Type: multipart/formdata; boundary=-----------------------------\r\n");

で保存しました

実行時の返り値が

Status Code is 3435973836
となっています
確か200が正常終了なので...
647637:02/11/06 04:50
>>645

むむっ...
postの後にですか...

pFile = pServer->OpenRequest( CHttpConnection::HTTP_VERB_POST,
strObject, NULL, 1, NULL, NULL, dwHttpRequestFlags );

なので...後ろに追加する方法が...
実はMSDNのTEARというサンプル(サンプルはGET)を参考にしています
ざっくり説明すると、
ヘッダ部
Content-Type: multipart/formdata; boundary=<BOUNDARY>
<BOUNDARY>は任意の、ぶつからなさそうな任意の文字列とする。

ボディ部
各パートの区切り <改行> + "--" + <BOUNDARY> + <改行>
MIMEの最後 <改行> + "--" + <BOUNDARY> + "--" + <改行>
となる。
ブラウザの出力と見比べてみるよーに。

>467
POSTの後、というかPOSTするデータの末尾(最後)という意味
649637:02/11/06 04:56
>>645

あ あ あ あ あ

あ り が と う ご ざ い ま す !!

うまく動作しました

最終行に-------------------------------を追加しろということだったんですね
もうなんと言っていいのやら

本当に感謝します

ここ数週間自分で悩み続けて
今日,他人を頼ったわけですが
解決できて何よりです
650637:02/11/06 04:58
>>648

なるほど,確かに自分の送信したデータと比較すると
違いがわかります
651デフォルトの名無しさん:02/11/06 23:56
MFC超初心者です。これから勉強したいと考えているのですか、
どこ良いサイトが有りましたら教えって下さい
652デフォルトの名無しさん:02/11/08 15:42
「スタートボタン>>Windowsの終了」の時に呼び出される
ダイアログを呼び出す方法教えてくだせー
PGM形式のファイルを表示させたいのですが、可能なのでしょうか?
654デフォルトの名無しさん:02/11/08 23:32
現在、CPropertySheetとCPropertyPageを使って作成したモードレスのプロパティシートにおいて
特定ページ内に、入れ子でプロパティシートを配置しようと考えています。

これを実装する上で、参考となる情報、または情報へのポインタがありましたら教えてください。
CodeGuru、CodeProject。
ダイアログにプロパティシートを貼り付けるサンプルがあったはず。
656デフォルトの名無しさん:02/11/09 01:32
>>655
CodeGuruで見つかりました&実装できました。ありがとうです。
657デフォルトの名無しさん:02/11/09 16:16
デバッガが

例外処理 (初回) は hoge.exe (ATOK15W.IME) にあります:
0xE06D7363: Microsoft C++ Exception。

シリアライズしてるときにでてくるんですけど
やっぱり悪いのはATOKじゃなくておれですか?
658デフォルトの名無しさん:02/11/09 17:29
WinInetで、FTPでレスポンスを取得したいのですが、

pFtp->Command("SITE DEVICE 00 00 00", CFtpConnection::CmdRespNone);
だと、問題ないのですが(レスポンスは取得できません:正常)

pFtp->Command("SITE DEVICE 00 00 00", CFtpConnection::CmdRespRead);
だと、そのままフリーズしてしまいます。

どなたか、アドバイスお願いします。
MFC7.0 IE6.0SP1
659デフォルトの名無しさん:02/11/09 22:22
一度リリースモードでexeファイルを出力してから
再度ワークスペースを開いて
新しくメンバを追加しようとしたら、
「新規メンバを追加できません」というダイアログがでてできません。
もしかして一度リテールで出力したらそのクラスでは
もういじれなくなるんでしょうか?
>659
VC6.0?内部データがぶっこわれると、発生する。
ソースとプロジェクト以外の内部ファイルを全て削除すれば、復活するかも。
661デフォルトの名無しさん:02/11/10 04:41
>>652
PostMessage(FindWindow(...), WM_CLOSE, 0, 0);

FindWindowの中身は、Spyで確認してね。
>657
他のIMEではどうなるの?
>>660
*.clwとか*.ncb辺りだね。
664デフォルトの名無しさん:02/11/14 10:27
VIsualC++.net + MFCでプログラムを書いています。
IMEで入力フォーカスのある状態
(たとえば「へんかん」と入力してスペースを押す前の
下線がついている状態)
の文字列を取得したいのですが、そういう方法はありますでしょうか?
文字を入力してスペースを押す前にF11あたりを押したら
その文字列がポップアップされるみたいなイメージです。

またIMEで漢字変換の候補が出現するボックスのような
ウインドウを作るのはどのような方法がベストなのでしょうか?

どうもIME周りは情報が少なく良くわからなくて困っています。
ご存知の方ご教授をお願いします。
665デフォルトの名無しさん:02/11/14 23:55
一つ聞きたいことがあるのですが、
整数があって、特定の桁数にそろえて文字列(CString)
に代入するにはどうすればいいでしょうか?
例:
int i = 20;
CString s;
5桁にそろえるとき、
sに00020という値が欲しいわけです。
>>665
ヘルプでCStringのメンバ関数見てみ。
Format()つーのがあるから。

べつにsprintf()で整形してから代入してもええけどな。
667デフォルトの名無しさん:02/11/15 00:07
はい、見たのですが、Formatは%dなどでint変数を取り込んだりしますが、
桁数が、最小になりますよね?
5桁など指定桁数に揃えたいわけです。
668:02/11/15 00:25
>>667
format指定でどうにか出来たかな?%0.5dかな?
まあ前に"00000"を継ぎ足してRightメソッドでもいいだろうけど。
669:02/11/15 00:29
>665
Format
っていってるだろ
頭悪いのか?
マルチしね。
>>667
format文字列の桁指定くらい理解しておかないといつまでたっても初心者だぞ。
ヘルプにちゃんと載ってるだろ?
671デフォルトの名無しさん:02/11/16 00:00
あの、COLORREFというものについてなのですが、
これに格納した色データを各要素に分解する方法はあるのでしょうか?
RGB()の逆をしたいわけです。
Get[R|G|B]Value

MSDNぐらい、持ってないの?
>どうもIME周りは情報が少なく良くわからなくて困っています。
MSDN,PlatformSDK,DDKのドキュメントをまず、読みましょう。
674夢を見る人:02/11/16 10:02
CSplitterWndのCreateViewで窓を分割したんですが、
分割した小窓のハンドル(HWND)を取得するにはどうすればいいんですか?
小窓.GetSafeHwnd()
676デフォルトの名無しさん:02/11/16 13:42
CWnd* GetPane( int row, int col );
677VisualC++初心者:02/11/17 07:47
AppWizardでSDIのフレームを作りました。それで、生成されたCView派生クラスの
OnInitialUpdate関数でCComboBoxオブジェクトを建築して、Create関数で
コンボボックスを貼り付けました。貼り付けたコンボボックスは、正常に
動作するのですが、コンボボックスの文字が異常に大きくなってしまいました。
文字の大きさを指定するにはどうしたらよいのでしょうか。

おおまかな方法を教えていただければ、後は自分で調べるので、アドバイスよろしく
おねがいします。
CComboBoxオブジェクト.SetFont( )
679デフォルトの名無しさん:02/11/18 00:29
■謎の現象■
スレッドを作成し、そのスレッドプロシージャから指定ウインドのDCに描画するプログラムを書きました
ウインドはダイアログに乗っけたStaticで、そのウインドへのポインタは初期化の時に一回だけ
GetDlgItemで取得し、グローバル変数に保持させます
その後スレッド関数はそのグローバルなポインタg_pWndを使って
都度、g_pWnd->GetDC()でDCを取得し、そこに絵を描く寸法です。

しばらくはおとなしくウインドに描画するのですが突然(9990回めの呼び出し)で
ウインドでも何でもないデスクトップに描画に行ってしまうのです・・
さらにいろいろ調べると突然アクセスバイオレーションになったりすることもあるようです。
原因はGetDCしたもののm_hDCがNULLだったからでした。突然そうなるのです。
なぜこのような事が起こるのですか??
>>679
CWnd::GetDlgItem() →「返されるポインタは、一時的なポインタです」とMSDN
にある。9989回は“たまたま”エラーにならなかったということだと思われる。

Cwndオブジェクトを他のスレッドに持っていくのは危険だ、と MFCの ASSERTに怒られる
こともあるから、そんなときは CWnd* でなく、HWND をグローバルにする。
なるほど、そうでしたか。どうもありがとうございます
HWNDでトライしてみます。ではでは。
682664:02/11/18 20:16
>673
いろいろ試行錯誤したらわかってきました。
HWND hWnd = this->m_hWnd;
HIMC hImc = ImmGetContext(hWnd);
char str[256];
memset(str,'\0',256);
ImmGetCompositionString(hImc,GCS_COMPREADSTR,str,256)

でこのようにするとstrにIMEへの入力文字列が取れることがわかったのですが、
"テスト"のように半角カナなってしまいます。
これを"tesuto"として取得したいのですが、そのためには、
IMEを起動させてからのキー入力を取ったほうがよいのでしょうか?
しかしその場合バックスペース等の処理が・・
もしくは半角カナからローマ字へとも思うのですが、
C++の正規表現ってわけわかんなすぎる・・・
C++で、GUI環境の脳波分析プログラムを作ろうと思っています。
一晩中のデータを見たいのでエクセルなどでは全体を見ることができないんです。
グラフを表示させてそれをページとばしでみていけるようなプログラムを作れるでしょうか?
アドバイス等お願いします
684超初心者:02/11/18 23:31
VC.netのMFCで、ダイアログベースで、タブコントロールを用いて、タブが9つ
(上段に5タブ、下段に4タブ)というようなダイアログを作りたいのですが、
SetItemSizeを用いてすべてのタブの幅・高さを同じに設定する方法はわかったのですが、それでは
上段5段の合計幅と下段4段の合計幅が、違ってしまい、ブサイクになってしまうので、
上段の合計幅と下段の合計幅を同じにしたいので、タブ1つずつについて幅を
設定する方法を調べてみたのですがわかりませんでした。
タブごとに、幅を変える方法がわからないので知っている方がいましたら、
ご教授お願いします。
誠に初心者質問で申し訳ないです。


とりあえずマルチポストはどうかと思ふ。
686664:02/11/20 00:11
とりあえず正規表現を使って日本語を無理やり
ローマ字にすることで解決しました。
ですが、IMEの変換候補ボックス風ウインドウを作る方法がどうしてもわかりません。
IME専用のクラスなどがあるのでしょうか???・
687デフォルトの名無しさん:02/11/20 01:38
MFCでひとつのフレームにViewが複数(仮にViewA,ViewB)あったとき
あるクラスからViewBのエディットボックスのポインタを手に入れたいときなどは
どうしたらよいのでしょう?
ようするにViewBへのポインタが手に入ればそこからGetDlgItem
すればよいのかとは思うのですが。
688デフォルトの名無しさん:02/11/20 15:59
おっぱい (ρ_;)ノ
>>687
何がどうなってるのか良くわからんが、
普通フレームがViewへのポインタ持ってるだろうから、
そこからもらうんじゃないか?
691デフォルトの名無しさん:02/11/20 17:18
Viewというよりはメインフレームでは
CSplitterWnd w2;
CSplitterWnd w1;
このようにしてCSplitterWndを使って分割してそれぞれの
ウインドウに対してViewを設定しているという状態なんですね。
そうするとまったく別のクラスからどうやって
Viewのポインタを手に入れるかがわからなくて・・・
693デフォルトの名無しさん:02/11/20 20:05
Viewのポインタを取得してメンバを操作するのもよいが、
わしは、SendMessageで処理しているぞ。

任意のViewにOnInitialUpdateを追加して、

// Appのメンバにハンドルをつくり、保持する
CxxApp*pApp = (CxxApp*)AfxGetApp();
pApp->m_hxxViewWnd = GetSafeHwnd();
あとは、DocからでもMainFrameからでも
SendMessage( pApp->m_hxxViewWnd, UMSG_xx, NULL, NULL );
とする。
スプリッターウインドに対しても別々に処理できる。

694691:02/11/20 20:40

レスありがとうございます。

>692

ただGetPaneは
CSplitterWndの関数ですよね。
CMainFrameには

class CMainFrame : public CFrameWnd
{
//
CSplitterWnd w2;
CSplitterWnd w1;
このように二つのウインドウの変数があるのですが、
w1かw2のどちらかを手に入れることができません。
ただw1かw2のどちらかが手に入ればGetPaneもいらない気がしますが・・・・

>693
つまりそれはOnInitialUpdate以外で使う場合は
メッセージを自作しなければならないということですね・・・
WM_****見たいなのをちょっと難しそうですが試してみたいと思います。

ただこのような形で
CxxApp*pApp = (CxxApp*)AfxGetApp();
pApp->m_hxxViewWnd = GetSafeHwnd();
どうやって二つのCSplitterWndを区別するのでしょうか?
695デフォルトの名無しさん:02/11/20 20:59
CSplitterWnd w2;
CSplitterWnd w1
としているのは、3分割するためだと推測しまして、

w1.CreateStatic(this,1,2);
w2.CreateStatic(&w1,2,1,WS_CHILD | W・・・
w2.CreateView(0,0,RUNTIME_CLASS( CTopView)・・・
w2.CreateView(1,0,RUNTIME_CLASS( CBtmView )・・・
w1.CreateView(0, 0, RUNTIME_CLASS (CLeftView)・・・
となると思います。

で、CTopViewとCBtmViewと CLeftViewのハンドルはそれぞれで、
取得しておくと、それぞれ、Viewのメンバを操作できます。

おそらく、この手の操作は、ネット上でもっと良い方法が公開されていると思われます。


>>694
((CMainFrame*)AfxGetMainWnd())->w2.GetPane( ・・・ );
MFCの売り物はドキュメント・ビューアーキテクチャらしいのですが、
私は直接DBMSにアクセスすることが多いので、ドキュメントの方を
使ったことがありません。
なにか間違ってます?
age忘れ
>>697
問題ない。
別に必要ない物を無理に使わんでもよい。
>>697
VBでフォームにロジックとか全部書くような感じか?
701デフォルトの名無しさん:02/11/20 23:45
質問なのですが、VC++.netでタブ一つ一つを違う幅に設定することは不可能
なのでしょうか?
すべてのタブを同幅に設定するのは、SetItemSizeを使うことによってできましたが・・・
>>699 ありがとうございます。
>>700 ロジック部は別モジュールに切り分けております。

フレームワークからドキュメントを切り離す(捨てる)ことは出来るのでしょうか?
>>702
できる。
>>702
MFC AppWizardで「ドキュメントビューアーキテクチュアをサポートする」に
チェックを入れた場合のこと?その場合はできないよ。
>>701
まず、.NETは持ってないので参考まで。

MSDNのCTabCtrl::Createより
>TCS_RAGGEDRIGHT コントロールの全体幅に合わせるようにタブを伸縮しません。
>このスタイルはデフォルトです。
なのでこのスタイルをはずしてみては。

そこら中にマルチするのはどうかと思う。
706デフォルトの名無しさん:02/11/21 11:46
VC++.NETでMFCプロジェクトを新規作成。
CMainFrame::CMainFrame()を以下のように書き換える。

CMainFrame::CMainFrame()
try
{
  // TODO: メンバ初期化コードをここに追加してください。
}
catch(...)
{
}

コンパイルエラーが出まつ。なんで?
ちなみにcatchブロックの最後に ; をつけると通る。
>MFCの売り物はドキュメント・ビューアーキテクチャらしいのですが、
>なにか間違ってます?
使いたいように使うのが良いと思います。

本当の考え方的には、
ドキュメント → データの保持・操作・入出力に徹する
ビュー → ユーザインターフェース(操作など)・ドキュメントのレンダリング(ドキュメントの視覚化)に徹する
と言うのが、設計思想の様です。
708デフォルトの名無しさん:02/11/21 17:47
VC++.netでの質問です。
あるダイアログがListBoxを一つもつプログラムを作っています。
ListBox内の項目を上下キーで移動して、
項目をリターンで決定するようにするのが目的です。

そこでリターンキーが押されたことを取得するために
ListBoxのプロパティでWantKeyInputの欄をtrueにし
ダイアログの派生クラスで
OnVKeyToItem(UINT nKey, CListBox* pListBox, UINT nIndex);
をオーバーライドし

if (nKey == VK_RETURN){
//
}
としているのですが、
うまく動作していません。
変数の推移を見るとnKeyは229となっており
きちんとしたキーコードが帰ってきていないようです。
これにはどのような原因が考えられますでしょうか?
709デフォルトの名無しさん:02/11/21 18:07
>705
情報ありがとうございます。
タブの数に関わらずタブアイテムの合計幅を上段・下段ともに同じくするのは、
プロパティのstyleをright justifyにすることで解決しました。
(VC6で言えば、プロパティのスタイルの配置を「右に揃える」にするに当たる、、かな?)
これにより705さんの教えてくれた、TCS_RAGGEDRIGHTのデフォルトをはずす事に
なったのだと思います。

しかし、個々のタブ幅を設定する方法は結局わからずなので、現状では、タブに
設定する名前の前後にスペースを入れることでムチャ技で対応しようと思います。

>マルチに関して
質問した時に回答がないままに、レスが流れてしまったので3つほどのスレに
書き込み&2回書き込みしてしまいました。
以後気をつけます。
>>709
幅というか、CTabCtrl::SetMinTabWidth で、最小幅を指定してやれば
いいんじゃないかな? 試してないから分かんないけど。
711デフォルトの名無しさん:02/11/22 01:08
ビュー/ドキュメントアプリで一ちゃん最初にクラスを作って
アプリケーションが終了したときに破棄したい場合
どこに書くのが普通でしょうか?
C***Appクラスのコンストラクタ、デコンストラクタ?
712デフォルトの名無しさん:02/11/22 01:44
MFCでマウスカーソルの位置でなくて
テキスト入力用カーソルの座標を取得する方法ってないでしょうか?
EditBoxなんかでカーソル入力を行う際に
カーソルの位置(何文字目か)とかではなくて座標が
わかればコマンド入力時の
ヒントボックス見たいなものが作れて便利なのですが。

マウスカーソルのそばにヒントボックスをポップアップするのは簡単そうですが・・・・
テキストカーソルとなるとちょっと難しくて困っています。


713デフォルトの名無しさん:02/11/22 02:46
 InternetExplorerで、サイト上から特定の拡張子のファイルを
ダウンロードしたときに、InternetExplorerのクライアント窓上に
自動起動するようなアプリケーション(*.pdfに対するAcrobatReaderのような感じ)を
VisualC++6 で作成したいのですが、
どこか、良い解説(またはサンプル等がある)サイトなどは無いものでしょうか。
>>706
ま、VC++でfunction-try blockは使うなってことよ。
715706:02/11/22 10:37
ちゃんと答えろよクズども
716 :02/11/22 13:47
>>706
CMainFrame::CMainFrame(){
try{
  // TODO: メンバ初期化コードをここに追加してください。
}catch(...){
}
}
なら通ったぜ。
(´-`).。oO(functionごとtry領域に入れるにはどうすればよかったんだっけ?)
718706:02/11/22 14:36
>>716
>>714のがマシだな(プ
719708:02/11/22 15:58
結局なぜnkeyがきちんと帰ってこないかわからなかったので
プロパティじゃなく手動でLBS_WANTKEYINPUT
を指定することにしました。
そこでCListBoxクラスのOnCreate関数をオーバーライドして
cs.style |= LBS_WANTKEYINPUT
すればよいということはわかったのですが、

しかし現在
CDialogの派生クラスであるCMydlg
がCListBoxを持っているという関係にあります。
この場合
CListBoxの中の関数をオーバーライドするにはどうしたらよいのでしょうか?

CMydlgの中の関数をオーバーライドする方法はわかるのですが、
その所持するクラスを変更したい場合
CListBoxを派生したクラスを作ってそれを所持する必要があるのでしょうか?

>>719
はい。
>>719
リストボックスに Enterキーの処理をさせるんじゃなくて、ダイアログの OnOK()
とかをオーバーライドしたほうが超簡単だと思うのだが、だめ?
>>711
クラスを作る/破棄する?
デコンストラクタ?
人にわかる言葉で説明しましょう。
>>711
それでOK。
>>712
あれはキャレットと言いまつ。
GetCaretPosで座標は求められるけど、
どのウィンドウがキャレットを持っているか自分で把握してるのが条件。
725711:02/11/23 02:24
>723
どうもです
そのようにやってみます。
MFCの場合は基本的なスタイルみたいなのがわからなくて・・

>722
すみません。職業プログラマなもので
ちょっとわかりずらい書き方だったかもしれませんね。
ごめんなさい。
ポインタの指すオブジェクトをコピーしたいんだけど
いい方法ないですか?
727デフォルトの名無しさん:02/11/23 03:01
>>711
デコンストラクタじゃなくて
デストラクタ

そう言いたいだけちゃうんかと。

>>726
CHogeDoc* pDoc = (CHogeDoc*)AfxGetMainWnd()->GetActiveDocment();
CString str;
str = pDoc->m_str;
729719:02/11/23 03:56
>721
onOkのオーバーロードがうまくいかないので、
(OKボタンをもう消してしまっていたので、
関数を作れない・・・・プロパティにもWM_OKみたいなのがないので・・(^-^;)
そこでOnKeyDownをオーバーロードしてみました。
が、リストボックスのなかにフォーカスがある場合、
ダイアログにはOnKeyDownが返らないんですね・・
CListBoxを拡張するクラスを@@ClassWizardで@@つくる
CMyLstBoxをメンバ変数(コントロール同期)にする
>>729
適当にボタン作ってIDをIDOKにしてハンドラ作った後にボタンを消せばハンドラだけ有効になる
>>729
virtual void CDialog::OnOK( ) なんだから、普通に手動でヘッダに
 void OnOK();
って書いてオーバーライドできるよ。IDOKボタンが無くても、Enterを押したときは
既定で呼ばれる。
733729:02/11/23 19:10
>731,732

ありがとうございます。
その方法でできました。

734デフォルトの名無しさん:02/11/23 19:36
CEditBox内の文字列に文字を挿入し、
カーソル位置をその部分にもって行くプログラムを作りたいです。
GetWindowTextした文字列を編集して
SetWindowTextすれば
挿入はできると思うのですが、
カーソル位置を移動させることがうまくいきません。

CEdit *CE = (CEdit*)GetDlgItem(IDC_EDIT1);
CE->SetFocus();
POINT p;
p.x = 10;
p.y = 0;
CE->SetCaretPos (p);


SetCaretPosの使い方がまずいのでしょうか?

>>734
CE->SetFocus();
CE->SetSel(3, 3);
736デフォルトの名無しさん:02/11/23 21:35
ダイアログにコンボボックスAとコンボボックスBがあります。
A,Bとも最初は何も選択していない状態なので、GetCurSel() == -1となってます。
コンボAで何かを選択したときに選択した項目番号に応じて
コンボBの項目内容を決定したいとします。
Aを選択するとダイアログが以下のイベントメッセージを受け取るんで
OnSelchangeComboA()、OnSelendokComboA()
これらの関数内でBの項目を初期化しようとしたんですが
GetCurSel()すると、新しく選択された値ではなく-1のまま・・・
どうすればよいでしょうか?DDXとか使わないとだめっすか?
>>736
GetDlgItemでもDDXでもできたけど。<OnSelchangeComboA()
738736:02/11/23 21:54
ぐえっ!バグチンですた・・・
AのイベントでまずAのGetCurSel()してからBに項目入れなきゃいけないのに
BのGetCurSel()してからBに項目入れようとしてた。
そりゃ-1だわ(´・ω・`)
static でポインタ宣言するってのは有り?
グローバル変数を介してポインタのやりとりをする
のとあんまり変わらんな
741デフォルトの名無しさん:02/11/24 15:54
WINAPI WinMainのHINSTANCE hInstanceをMFCプログラムの中で取得できますか?
DialogBox()から読み込んだときに生成されるhWndは、MFCでダイアログその他を
DialogBox()を使わずにつくったときに、取得できますか?
享受ください。
CWinApp(theApp)のメンバ変数にm_hInstanceって無い?
享受・・・・
AfxGetInstanceHandle()だろう。
二番目の問はGetSafeHwnd()のことだろうか
746デフォルトの名無しさん:02/11/24 17:18
有難うございます。
ただ、GetSafeHwnd は、CWndのメンバなので、Dlgではどうすればいいでしょうか?
>>746
ダイアログもCWndじゃん。
748デフォルトの名無しさん:02/11/24 17:44
そうですね。有難うございます。
749デフォルトの名無しさん:02/11/24 18:05
エクスプローラなどのある別のウィンドウでのマウスのダブルクリックを感知して
動くようなプログラムを作りたいんですがどこかにヒントみたいなものは無いでしょうか。

SnapItでしたっけ、エクスプローラの空白部分をクリックしてフォルダを上の階層に上るような、
そういう処理がしたいんですがどうすればいいでしょうか?
750デフォルトの名無しさん:02/11/24 18:44
たびたびですが、
メンバ関数をCALLBACK関数にし、
DialogBox()のような形で呼び出せないでしょうか?
>>750
DialogBoxのような形ってのがいまいち何のことを言いたいのかわかりませぬ。
752デフォルトの名無しさん:02/11/24 18:52
>>750
CALLBACK関数にしたいメンバ関数をstaticにする。
>>751に同意だが、MessageBoxのことか?
> DialogBox()のような形で呼び出せないでしょうか?
  ↓翻訳↓
DialogBox() のようなAPI に渡す、CALLBACK関数として使えないでしょうか?
それじゃなんのためにMFC使ってるんだよ・・・
まぁCALLBACK関数は>>752のようにstaticなメンバ関数にすればよい。
755デフォルトの名無しさん:02/11/24 19:42
static にすると(ヘッダーのほうだけstatic にしたのですが)
エラーが出ます。
どのように書き換えればいいのでしょうか?
756デフォルトの名無しさん:02/11/24 19:55
>755
書き忘れました。static にすると、
メンバ変数が使用できないので困っています。
なんかHINSTANCEが欲しいとかHWNDが欲しいとかCALLBACK関数を渡すとか、
もしかしてMFCアプリでDialogBox()APIを使いたいってだけのことか?
なんでMFCアプリなのにCDialogを使いたくないのかが激しく謎なのだけど
とりあえずエラーが出たならその内容を書くなりソースを提示するなりしる。
つーか無理してMFCにこだわらずにプロシージャをグローバルに宣言して
普通のWin32APIアプリみたくしたら。
C++の勉強をする。
759デフォルトの名無しさん:02/11/24 20:25
いえ、CALLBACKで返す関数を使用したいのです。
(その関数以外は、MFCでないととうてい処理できません)
だからエラーならそのエラー内容を
761デフォルトの名無しさん:02/11/24 20:52
メンバ変数が使用できない わけです。
thisポインタ渡してコールバック関数内で
CHoge* pWnd = (CHoge*)this;
pWnd->m_hoge; // メンバ変数にアクセス
763デフォルトの名無しさん:02/11/24 21:01
掻き忘れましたので掻いてきます。
764デフォルトの名無しさん:02/11/24 21:11
静的メンバ内では、this は使えないのではないでしょうか?
だから間接的に渡すんだってば。
例えばフォント列挙でEnumfontFamiliesの第三引数にコールバック関数、
第四引数(LPARAM)にthisを渡すのと同じ。
あーそうか>>762はこうだった。

CHoge* pWnd = (CHoge*)lParam;
pWnd->m_hoge; // メンバ変数にアクセス
>>766のlParamがEnumFontFamiliesで渡したthisってことね。
ぐだぐだになってきたけど言いたいことわかるだろ!な!な!
768デフォルトの名無しさん:02/11/24 21:42
>>767
ちょっとよく分かりません。もう少し詳細お願いします。
がーん
ってかそのコールバック関数て何?自作?
770デフォルトの名無しさん:02/11/24 21:51
引数が無かったりLPVOIDが使えなかったりする
CALLBACK関数もあるからな。そのコールバック関数
の宣言晒してみぃ。
そのコールバック関数て自作?
772デフォルトの名無しさん:02/11/24 21:54
自作と言えば自作ですが、
BOOL CALLBACK CTestDlg::MainDialogProc(
HWND hwndDlg,
UINT msg,
WPARAM wParam,
LPARAM lParam)

デバッグでlParamの値が0になっていて実行中にエラーが出ることが
判明しました。
773デフォルトの名無しさん:02/11/24 21:56
CTestDlgはMFC使ってCDialogの派生か?
>>772
DialogBoxParamでちゃんとthisを渡せ。以上。
# つーか、API 呼ばずにMFCのCDialog使えってばさ。
775デフォルトの名無しさん:02/11/24 22:42
dialog を表示するのが目的でなく、CALLBACK関数を実行するのが
目的。
776デフォルトの名無しさん:02/11/24 22:46
>>774
いやだっていっているでしょ。
777 :02/11/24 22:53
>>776
thunkを間に挟めばできる。
意味がわからないなら諦めろ。
というかもう解決済みのはず。
779デフォルトの名無しさん:02/11/24 23:46
ViewクラスのPreTranslateMessageを使用して
以下のようにしてスペースキーの入力を得ています。

BOOL MyView::PreTranslateMessage(MSG* pMsg)
{// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください

if (pMsg->message == WM_KEYDOWN){
    case VK_SPACE:
//ここで処理
return TRUE;
break;

このときIMEがONならば別の処理をするようにしたいのですが、
たしかにその処理はできるのですが、
同時にIMEにもスペースキーの入力が伝わってしまって
変換ウインドウが出てしまいます。
これをIMEがONのときもスペースキーの入力がIMEにいかないようにしたいのですが、
そのようにする方法ってありますでしょうか?
780デフォルトの名無しさん:02/11/25 00:51
bmp、jpeg等のヘッダ情報を取得する方法を教えて下さい。
サンプルソース等載せていただけると助かります。
よろしくお願いします。
>>780
ネットにごろごろ転がってるから調べてみましょう。
http://www.google.co.jp/
782780:02/11/25 01:06
探したんですが見つからないんです。。。
調べ方が悪いのでしょうか?
783デフォルトの名無しさん:02/11/25 10:31
VC++で最近使ったファイルと最近使ったワークスペースを
クリアしたいのですが、どこを削除すれば良いでしょうか?
>>779
pMsg->message = WM_NULL;
785デフォルトの名無しさん:02/11/25 11:19
ツール→オプション→ワークススペースで
最近使った一覧の項目を0で初期化する。

もしくはレジストリの
HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Recent File List
をいじる。モノによっては\DevStudio\6.0は違うかも。
786785:02/11/25 11:19
787デフォルトの名無しさん:02/11/25 15:34
┏━━━┳━━━━━━━━┓
┃ ツ  ┃ リストビュー    ┃
┃ リ  ┣━━━━━━━━┫
┃ |  ┃            ┃
┃ ビ  ┃ HTMLビュー    ┃
┃ ュ  ┃            ┃
┃ |  ┃            ┃
┗━━━┻━━━━━━━━┛
MFCでこういうWindowを作りたいのですが、
どうすればいいのでしょうか?
そーいうのはdelphiが楽
>>787
スプリッタウィンドウ(CSplitterWnd)を入れ子にする。
定番だからサンプルはWEBで探せばいくらでもあると思われ。
>>787

>619-621
辺りを嫁
791779:02/11/25 19:26
>784
ありがとうございます。
しかし試してみたのですが、だめなようでした。

おそらくPreTranslateMessage(MSG* pMsg)
よりも先にIMEにキー情報が行ってしまっているような気がします。
>>791
WM_IME_XXX系のメッセージでなんとかなるかも。
WM_IME_KEYDOWNとかね。
はずしてたらゴメン。
793791:02/11/27 06:50
>792

ヒントどうもありがとうございます。
WM_IME_****には気づきませんでした
それでちょっと試行錯誤してみます。
794デフォルトの名無しさん:02/11/27 12:26
CのAPIが要求するコールバック関数に
C++のクラスメソッドを登録できますがこれは合法ですか?
またこれはポータブルですか?

#include <windows.h>
typedef void (CALLBACK MyCallback)(const char *message);
void callcallback(MyCallback callback){
 if(callback != 0) callback("hello,world\n");
}

class CallbackTest
{
private:
 static void CALLBACK Callback(const char *message)
 { OutputDebugString("CallbackCaller:"); }
public:
 void Execute() { callcallback(Callback); }
};

int main()
{
 CallbackTest ct;
 ct.Execute();
 return 0;
}
795 :02/11/27 13:55
>>794

合法でかつポータブルです。
クラスメソッドという用語はそんなにポータブルじゃないけど。
796------------------さん:02/11/27 15:55
これどうしたらいーの??文字データを数値に変換するってところでこんなのでてきた
-------------------構成: gpibsdi - Win32 Debug--------------------
コンパイル中...
gpibsdiView.cpp
C:\Windows\デスクトップ\gpibsdi\gpibsdiView.cpp(169) : error C2065: 'f' : 定義されていない識別子です。
C:\Windows\デスクトップ\gpibsdi\gpibsdiView.cpp(169) : error C2440: 'initializing' : 'int' から 'char [256]' に変換することはできません。(新しい動作 ; ヘルプを参照)
配列型への変換はありませんが、参照またはポインタから配列への変換があります。
C:\Windows\デスクトップ\gpibsdi\gpibsdiView.cpp(173) : error C2440: '=' : 'unsigned char [256]' から 'double' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換が可能なコンテキストはありません。
C:\Windows\デスクトップ\gpibsdi\gpibsdiView.cpp(174) : error C2664: 'GpCnvStrToDbl' : 1 番目の引数を 'char [256]' から 'unsigned char *' に変換できません。 (新しい機能 ; ヘルプを参照)
指示された型は関連がありません; 変換には reinterpret_cast、 C スタイル キャストまたは関数スタイルのキャストが必要です。
cl.exe の実行エラー

gpibsdi.exe - エラー 4、警告 0
>>796
fの型は?
ソース張ったら796の文より多いの?
798デフォルトの名無しさん:02/11/27 21:16
>>797
長いです・・
えっと用は文字charデータをdoubleに変換する「atof」ってやつです。
これを実行すると上記のエラーがでます。

キャストというのがわからないのですが、これが関係あるようです
799デフォルトの名無しさん:02/11/27 21:34
>>797
とりあえず、 f は宣言されているの?
「定義されていない識別子です」って言われてんじゃん
800799:02/11/27 21:35
>>797 じゃなく >>798 でした。
>>798
じゃあとりあえずatofを使ってる部分とそこで使ってる変数の宣言だけ載せればいいじゃん
802_:02/11/28 00:26
StretchBltやBitBltでちょっと大きめの画像を扱っていますが、
処理中は重くてマウスカーソルが止まったりします
(memdc→memdc、memdc→hdcどちらでも起こります)

マウスカーソルに影響を与えずに処理するにはどうしたらいいでしょうか
>>802
別スレッドで(memdc→memdc)の処理させる。
>>796
C言語を勉強しなおしたほうがいいな。
最初の2つのエラーはfが宣言されていないから。
3つ目は論外。
4つ目は型変換ミス。
'GpCnvStrToDbl' はコンテックのGPIBボードについてるライブラリか?

ソース、恥ずかしくて貼り付けられないだろうな。
たったこれだけのソースでほとんど同じエラーが出るぞ。
  char s[256] = f; /* fは宣言されていない */
  double d = s;
  GpCnvStrToDbl(s, &d);

DWORD GpCnvStrToDbl(unsigned char *str, double *dbldata); ね。ちなみに。
805デフォルトの名無しさん:02/11/28 07:38
>>804
神です!
>>804
すげぇw
初歩の初歩だな。
VB厨が書きそうなコードだ。
>>804
ディスアセンブルじゃなくてディスエラーコメントの
称号を与えよう。
正直、こんな感動の仕方をしたのは初めてだ。
809802:02/11/28 15:30
>>803
AfxBeginThread(SkipBitmap,this,THREAD_PRIORITY_IDLE);
のようにして別スレッドで呼び出していますが症状がおさまりません

上の別スレッドはさらにCxxxViewクラスのメンバ関数を呼び出し、
StretchBltは実際にはそこで使っていますが、これが関係あるでしょうか
あんまり関係ないけど
 AfxBeginThread(・・・, this
は止めといた方がいいっぽい。よく見かけるんだけど。
811------------------さん:02/11/28 17:37
謎です。文字列→数値データへの変換でつまりました。
<正しい例、これは正常に稼動しました。出力は1233.000Hz>
char *zzz="1.23300000E+003";
double s = atof(zzz);
char r[80];
sprintf( r,"※周波数→ %6.3f Hz(数値データ%f)",s);
pDC->TextOut(30,20,r,strlen(r));

<実際作ってるプログラム、外部シンボルが未解決ですエラーがでます>
<いろいろ処理をしてGPIBというオシロスコープから取り込んだ文字データzzzが文字列形式で%sでとりあえず見ると>
<上の正しい例にある1.233E003という数値です。これを数値で表せレない。>
double s = atof(zzz); 
char r[80];
sprintf( r,"※周波数→ %6.3f Hz(数値データ%f)",s);
pDC->TextOut(30,20,r,strlen(r));
812------------------さん:02/11/28 17:39
×上の正しい例にある1.233E003という数値です。
○上の正しい例にある1.233E003という文字列です。
813------------------さん:02/11/28 17:45
そしてこれがエラー内容。バカですいません。新説なひと教えてください
リンク中...
gpibsdiView.obj : error LNK2001: 外部シンボル ""double __cdecl atof(unsigned char const *)" (?atof@@YANPBE@Z)" は未解決です
Debug/gpibsdi.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
>>810
理由は?
>?atof@@YANPBE@Z
なんでatofが型修飾されてるんだ?
きちんとstdlib.hをincludeしたか?
name mangling
キタ━━━(゚∀゚)━━━!!
>>814
http://www.google.com/search?q=CWnd+%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89+%E3%83%91%E3%83%BC%E3%83%9E%E3%83%8D%E3%83%B3%E3%83%88%E3%83%9E%E3%83%83%E3%83%97&hl=ja&lr=&ie=UTF-8&oe=utf-8&filter=0

>一時オブジェクトを別のスレッドに渡すときは、必ずネイティブな HANDLE 型と
>して渡します。C++ のラップ オブジェクトを別のスレッドに渡すと、予想外の
>結果 になることが少なくありません。

thisを渡して、「予想外の結果」になった経験何回か有り。それで昔調べた。
>>811
激しくMFCと関係ない悪寒(;;;゜Д゚) ガタガタブルブル
>>817
なんか、もっと重大な問題があるのかと、思っちまったぜ。
「仕組みを理解した上で、thisを渡せ」って前提が抜けてるな。
820803:02/11/28 18:55
>>809
(memdc→memdc)で処理の重いStretchBltなどを
使う。最終的にmemdc→hdcして実際に表示する時は
WM_PAINT(OnDraw)を呼び出すメソッドをスレッドから
呼び出す。
memdc→hdcするときに画像サイズの違いで、BitBltが
デフォルトで呼び出すStretchBltが起きてないか注意する。
 (memdc→memdc)だけさせるスレッドでも重いか
テストしてみる。
821817:02/11/28 19:08
>>819
そうだね。

worker_thread(LPVOID ptr)
{
 CHogeWnd* pHoge = (CHogeWnd*)ptr;

とやって
 HWND hHoge = pHoge->m_hWnd;
とか
 int result = pHoge->HogeMethod();
とかやってると、アクセス違反で落ちたり変な値が帰ってきたり...
それが、いつも再現するとは限らず 100回に1回現れるとかで、今うまく
いってるからといって油断してると痛い目にあう。
スレッド越しのウィンドウやCOMやActiveXの操作は鬼門だけど、

>HWND hHoge = pHoge->m_hWnd;
>int result = pHoge->HogeMethod();

これは、いくらなんでも問題ないじゃない?(関数の方の、実際の処理内容は除く)
本当にNGなら、ポインタやInterfaceがすべて破綻してまう。
>>822
スレッドがまだ動いている間に
スレッドが使っている領域を開放しちゃって落ちる

ってのをよくやっちゃうんですが・・・
わしが迂闊なだけか・・・鬱
824802:02/11/28 20:10
>>820
何度もありがとうございます

>(memdc→memdc)で処理の重いStretchBltなどを使う。
(memdc→hdc)にStretchBltを使わないよう書き換えました

>最終的にmemdc→hdcして実際に表示する時は
>WM_PAINT(OnDraw)を呼び出すメソッドをスレッドから 呼び出す。
Invalidate() を使って OnPaint() を呼び出すようにしました
この部分では症状がでなくなったようです

>memdc→hdcするときに画像サイズの違いで、BitBltが
>デフォルトで呼び出すStretchBltが起きてないか注意する。
すみません、よくわかりません
しかし、BitBltではもう症状は出なくなりました

>(memdc→memdc)だけさせるスレッドでも重いかテストしてみる。
やはりStretchBltでは重いようです
画面には何も表示されませんが、
処理をした瞬間にマウスカーソルが何かにひっかかるような感じです
>823
スレッドが動いてるときに、呼び出したウインドウ閉じちゃったりして
死ぬってことかな?
それは this を渡すのが悪いんじゃなくて実装の仕方が悪いような、、、
俺もよくやるけど。
826820:02/11/28 21:01
>>824
>すみません、よくわかりません
CDC::BitBltの解説
「GDI は、・・・・」を参照されたし。
プラットフォームSDKのヘルプには無い解説
なので注意。
827821:02/11/28 21:01
>>822
CWndの場合は、それがヤヴァイというようなことが、どっかの ASSERTに
載ってた。例えば

worker_thread(LPVOID ptr)
{
 CHogeWnd* pHoge = (CHogeWnd*)ptr;
 ・・・
 int result = pHoge->HogeMethod();
 ・・・
}

int CHogeWnd::HogeMethod()
{
 return this->m_data;
}
とやるとおかしな値が返ってくるので、試しに HogeMethodで Breakしたら、
thisの値が、スレッドに渡した this(pHoge)とは違っていた

ってのではまった。
828デフォルトの名無しさん:02/11/28 21:07
教えてください。
VCでインデントがされていないソースをきちんと揃えるにはどうすればいいのでしょうか?
829820:02/11/28 21:12
>>824
>やはりStretchBltでは重いようです
スレッドのプライオリティを下げてみるとか。
それでも解決しなさそうだけど。
>>827
OnInitialUpdate、OnInitialDialog
以降でスレッド起動しても駄目かな?
俺の記憶だとOnCreateでハマッタ覚えがある。
>>802
大きめの画像を扱っている(フィルタとか?)というあたりに適度に
Sleep(0)とか入れてみると言うのはどお?
見当違いならスマソ
結局、AfxBeginThreadでthisを渡さないほうがいいって言うのはどうなの?
俺は今まで問題らしい問題は無かったんだけど、あまり他人に薦めないほ
うがいいのかな。
833810:02/11/28 23:20
>>832
俺も分かったような分かんないような状態なんだけど、実害を経験してるのと
CWnd::AssertValid() のソースにそれらしいことが書いてあるので、ちょっと
つっかかってみた。
あの、、このスレでVC++6.0のエロ画像がもらえると伺ったのですが、どこにエロ画像があるのでしょうか?
http://vip.bbspink.com/test/read.cgi/erodoujin/1038492534/
>>832,833
要するにWindowsの世界ではスレッド毎にハンドルをくるむCWnd型を持ってて、
それを共有したりすると「うちのスレッドでこのCWnd使ってる人いないね?
じゃ捨てるよ?」とか言って他のスレッドのCWnd破棄したりとか、
(他のスレッドが触ることを考慮してないから)ロックかけずに操作したりとか、
あらゆるやばいことが起きるってことなんじゃ?
漏れは今までそう理解してた。それっぽいバグも経験したし。
というわけでスレッド間で渡していいのはハンドルのみ。
あ、あと自分がMFCと関係なく定義したオブジェクトは当然渡して問題なし。
>AfxBeginThreadでthisを渡さないほうがいいって言うのはどうなの?
手法的には、正しい。

ただ、OSの構造的にスレッドを跨げない機構があるので、要注意。問題が微妙に違う。
CSocketなんかもそうだよね。(←ウィンドウが絡んでる)
vtableを信じる物は、救われる。(足下を?)
837デフォルトの名無しさん:02/11/29 00:03
>>832
わしも、特定できたバクは無かったけど、thisにしてしまうと、誰がからかワカランように
なるのと、***Docでそれをやると、デバックモードで動かなくなる事があった。
スレッドが原因じゃないかもしれんが調べてない
835に同意、多少手間だけど、AppのメンバにViewのハンドルを作って、メッセージで処理しとるよ。
>835
さすがに、他のスレッドが触ることを考慮してないクラスがthisを渡すはまずそうですね。
>>838
それは、スレッドセーフになっていないってこと?事情もないのに、手抜きでそーゆー事するのがおかしい。
そーゆー意味では、ウィンドウ関係は非スレッドセーフ。
たとえば、SendMessage()のロック問題とかあるでしょ?
840832:02/11/29 00:40
あまり詳しいわけではなく、スレッドセーフの意味が良く分からなかったので、検索して
調べました。意味を取り違えていたらすいません。

下記のように理解しましたがOK?

AfxBeginThreadでthisを渡さないほうがいい。
理由
 本来スレッドセーフで設計するべきだが、Windows関係の処理には一部スレッドセーフで
 無い部分があるので、他のスレッドから直接触るべきではない。
 またスレッドセーフで設計されていたとしても、それを期待してthisを渡すのも、安全面
 からやめたほうがいかも?
>>840
こーゆー事は、あんまり言いたくないのだが...「アホか?」。
いいかげん、ブチ切れた。なんべん、言えば理解できるのか?
「ウィンドウズは、構造的にスレッドを跨げない、場所・機能・使い方がある」ってのがこの問題の本質だ。
スレッドにthis渡してはいけないなんてのは、関係ない。thisじゃなくても、グローバルインスタンスだって、スレッドを跨いだらNGな場合だってある。
「スレッドを跨いでやってはいけない事がある」ってのが正解だ。それを防止する意味でthis渡しを禁止するのは勝手だが、誰も相手にしてくれなくなるぞ
842 :02/11/29 01:47
>>841
まぁ、落ち着きなされ。thisを渡して慎重にコーディングしてウマー
なプログラムなら飯の種になるでよ。そうでなければそれなりに
というわけで、あんたは何も損しないんだから。
>>840
うーん、thisにこだわってるのでどうも理解度が怪しく見えてしまうよ。
AfxBeginThreadに渡す、渡さないはあんまり関係ない。
とにかく、AfxBeginThreadで作ったスレッドから、こちら側のオブジェクトを触るときは、
スレッドセーフな(複数のスレッドから同時に呼び出しても大丈夫なように作られた)処理がなければダメ、ということ。

MFCのオブジェクトのうち、少なくともCWndを継承しているものはスレッドセーフではない。
だから、thisに限らず、CWndの類ならそれを別スレッドから使うのはダメ。
自分でMFCと関係ないオブジェクトをスレッドセーフに定義して、それを使うのは許される。
ということ。
スレッドにCWnd*なんて怖くて渡せねーよ…。
いつもm_hWnd渡してる。

>>840
それのどこが「理解」やねん…
845841:02/11/29 02:02
CreateThread使ってないだけ、マシか...
スレッドと例外処理は、薬と一緒。シロートが下手に手をだすと、周りが迷惑する。
(特に、仕事ではね)

>>842 THX
正直、すまんかった
847デフォルトの名無しさん:02/11/29 15:17
入手したソースをビルドしたいんですが
どうやら shlobj.h の内容が古いようでコンパイルできないんですが
最新のインクルードファイルやライブラリはどこで入手できるんでしょうか?
(MSのページ見てもたどり着けなかったので・・・)
本当に、見たのかと小一時間
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
849質問:02/11/29 18:51
VC++6でMFCアプリ作成して
以下のクラス(シリアライズ機能をつけた)を作ったんだけど

----Line.h----

class CLine : public CObject
{
DECLARE_SERIAL(CLine)

protected:
int m_fr;
int m_to;
public:
CLine(){};
void set(int f,int t);
void Serialize(CArchive& ar);
};
850質問:02/11/29 18:52
----Line.cpp----

#include "Line.h"

IMPLEMENT_SERIAL(CLine,CObject,1)

void CLine::set(int f,int t){
m_fr = f;
m_to = t;
}

void CLine::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_fr << m_to;
else
ar >> m_fr >> m_to;
}

これでコンパイルすると
「プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。」
っていわれちゃうんですけど・・・どうしてですか?
#include "stdafx.h"

ねーから。
852デフォルトの名無しさん:02/11/29 18:57
C言語を勉強しようと思い
VisualC++ standard pack を導入したのですが、
下のようなプログラムが実行できません。
stdlib がないプログラムはきちんとコンパイルも実行もできていたの
ですが。
初歩的な質問申し訳ありません。

/* ch07-17.c */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int i;
double d;
long l;

i = atoi(argv[1]);
l = atol(argv[2]);
d = atof(argv[3]);

printf("%d %ld %f", i, l, d);

return 0;
}
ありますよ。
854質問:02/11/29 19:06
>>851 神!ありがとう!
>>852
実行できないとはどういう状態なの?

実は実行時に引数渡してないだけとか・・・

ch07-17.exe 10 20 30

こんな感じで実行してみ
その前にMFCじゃないだろう。
857デフォルトの名無しさん:02/11/29 21:04
>>855
設定から引数渡して実行したらできました。ありがとうございます。
ところで、
プロンプトからexeを実行するにはどうすればいいんでしょうか。
最初引数の渡し方がわからなくてプロンプトから実行しようとしたんですが、できませんでした。
>>857
プロンプトで
ch07-17.exe 10 20 30
だって。
だからスレ違いなのよね。
859デフォルトの名無しさん:02/11/29 22:52
そういや、MFC 使ってると stdafx.h とか afxMessageBox とか
やたら afx が出てくるけど、この afx って何の意味?
誰か解説キボン。
Application Framework X

この X ってのは数学で使う変数 X と一緒。
自作でスクリプト言語を作成したいのですが
お勧めのHPとかありますか?
864デフォルトの名無しさん:02/12/02 17:48
各種2ちゃんねるブラウザのように、各ペインを表示したり非表示にしたりするのは
どうやれば良いのですか?
CSplitterWndでやっているのですが、上手く実装できません。
865デフォルトの名無しさん:02/12/02 18:23
いきなりですけど、\rってどんなコードですかね?
こーど?
867デフォルトの名無しさん:02/12/02 23:10
少し悩んでることが…。
ファイルからデータを読み込んで表をSDIに描画しなければならないのですが、
今ひとつ上手く文字と罫線が描画できません。
表の中に表を組み込んだり複雑な描画をしたいのですが、…。
ブラウザみたいに上手くいくといいのですが…。
(ブラウザは使いたくない…というかデータファイルの性格上使えないのでこまってます)
アルゴリズムか何かご存知でしょうか?
868デフォルトの名無しさん:02/12/03 00:19
>>864
ShowWindow
>>865
CR
>>867
どううまく表示できねんだよ。
すみませんが、助けてやってください!

数字が書いてあるファイルを読み込んで、
データを配列に格納するプログラムの勉強をしています。
配列に格納したデータは後で別の処理に使う予定です。
データの量は二次元配列で[1000][1000]くらいです。

そこでダイアログベースにしてボタンを配置しました。
ボタンでファイルを開いてデータを配列に格納したいのですが、
配列の宣言の仕方がわかりません。
たとえば配列a[1000][1000]というのはどこに書けばよいのでしょう?
OnButton1というメンバ関数?の中で宣言すると、その後その配列を外から
使うことはできないですよね?

そこで、aaadialog.hという所(ヘッダファイル?)に書いてみた所、
外からも使える配列を上手く宣言できました。
ところが、今度は二次元配列をa[1000][1000]という大きな値を使いたいのですが、
スタックオーバーフローをいうエラーが出てしまいます。
malloc関数を使えばよいのかと思ったのですが、
ヘッダファイル?の中ではエラーが出てしまいます。

長文ごめんなさい。質問をまとめますと、
1.プログラム中で共通に使える配列を宣言するのはどこでやるのでしょう?
2.もしヘッダファイル内で宣言する場合、大きなサイズa[1000][1000]というような
配列の宣言の仕方を教えてください。
だからスレ違い〜。
>>868
ShowWindowだと、スプリットした各ペインを消したり表示したりできないんですよ。
>>871
google で 「分割ウィンドウ 静的 動的」で検索してみぃ
873デフォルトの名無しさん:02/12/03 13:18
AfxBeginThreadで便乗質問。
スレッド生成元とは別のクラス関数を、複数起動したいんだけどどうやればいいんでしょ?

{
CHoge* HogeA = new CHoge();
CHoge* HogeB = new CHoge();

WorkerA = AfxBeginThread((AFX_THREADPROC)HogeA->Entry, NULL);
WorkerB = AfxBeginThread((AFX_THREADPROC)HogeB->Entry, NULL);
}

最初のAfxBeginThreadで「キャスト出来ん」と出ますです・・・
874デフォルトの名無しさん:02/12/03 15:07
>>870,>>869
スタックサイズに関してはあながちスレ違いでもなかったり。
プロジェクトの設定、リンクタブのアウトプットカテゴリに、
スタックアロケーションってーのがある。
詳しくはヘルプ見れ。
で、それが現実的でないとか言うんだったら、コンストラクなりなんなり、
C++的に適切な場所で初期化すれ。
875デフォルトの名無しさん:02/12/03 15:11
シリアライズにてファイル保存の際にスキーマ番号を設定しておき、ファ
イルを開く際のバージョンチェックに使用しようと思い、新規にMFCア
プリケーションをプロジェクトウィザードで作成し、ドキュメントクラス
に次の変更を加えました。

・*.h 内にある、DECLARE_DYNCREATEマクロをDECLARE_SERIALマクロに変更。
・*.cpp 内にある、IMPLEMENT_DYNCREATEマクロをIMPLEMENT_SERIALマクロ
 に変更。(スキームの値には [ VERSIONABLE_SCHEMA|1 ]を指定)

保存したファイルを開いて、Serialize関数の中で、GetObjectSchema()を使
用してチェックをしてみるものの「-1」と返ってくるのです。どうすれば、
スキーマ番号の設定・取得ができるのでしょうか?
>>873
staticじゃないから。
##################
#  #         #
#  ##############
#  #         #
#  ##############
#  #         #
##################
#            #
##################

スプリットウィンドウを使って上記のように5つに分割するにはどうすれば良いですか?
878デフォルトの名無しさん:02/12/03 16:33
>>868
どうしても、罫線と文字が重なったり、表を入れ子にすると
重なったり…。
>>877
上下に分割
上側を左右に分割
上側の右側を縦三つに分割
880デフォルトの名無しさん:02/12/03 22:32
基本的なところでスマソ。

VC++6でMFC app wizard使うと,
Test.h:
class CMyTestApp : public CWinApp

Test.cpp:
// CMyTestApp クラスの初期化
BOOL CMyTestApp::InitInstance()
{
......................
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyTestDoc),
RUNTIME_CLASS(CMainFrame), // メイン SDI フレーム ウィンドウ
RUNTIME_CLASS(CMyTestView));
AddDocTemplate(pDocTemplate);
.........................
}

みたいな感じになるよね。
ここの,RUNTIME_CLASS(....)で指定した各classのinstanceを参照する方法。
この方法やこの項目に関連したMSDN内のURLを教えていただけませんか?
ここでの質問では無いかも知れませんが、
知人に
「Visual Studio.NETのMFCを使って、ゲームを作りたい」
と言ったら、
「作りにくいから、辞めておけ」
と、言われました。
事実、そうなのですか?
>>878
それはMFCとは全く関係ない気がするんだが?
あんたのプログラムの仕方がまずいだけだろ。
>>880
コンストラクタでthisを保存。
884デフォルトの名無しさん:02/12/04 02:54
>>875
Serialize関数のあたまで基底クラスのSerialize()を呼び出すんじゃなかったかね。
スキーマ番号そのものをシリアライズしないと読めないので。
>>881
作るゲームとスキルによる。
貴方、アホですか?
>881
ていうか作る前にここに質問に来るのは根本的に間違ってると思う
24ビットのフルカラービットマップ用の構造体
struct BITMAP24{
unsigned char RED;
unsigned char BLUE;
unsigned char GREEN;
}
がありまして・・・
それようのポインタ
struct BITMAP24 *Img;
を宣言しました。

で、これのビットマップサイズ分(つまり,ビットマップのイメージサイズ分height*width)のメモリを全部0で初期化したいんです・・・.
で、
memset(Img->RED, 0, height * width);
としたところ、エラーで1 番目の引数を 'unsigned char' から 'void *' に変換できません。といわれてしまいました。
memsetを使うやり方がまちがっているのでしょうか?
是非ともご教授いただきたく存じますm(_ _)m
>>887
そのままじゃん。
Img->REDはunsgigned char 1個だぞ。ポインタじゃないだろ。
>>888
ありがとうございました(TT)
おかげで解決しましたm(_ _)m
恥ずかしすぎるシツモンだったと・・・恐縮です。
なんつーかスレ違い質問が多すぎだよな。
単に開発にMFC使ってるってだけで、質問の内容自体はC、C++、Win32APIの話だったり。
本当にMFCに関する質問なのかどうか自分を問い詰めてから
適切なスレで質問した方が回答もより速くより正確に得られるだろうに。
891デフォルトの名無しさん:02/12/05 00:08
CFormViewに貼り付けたダイアログのサイズをコード上で変えるにはどうすればいいのでしょうか?
MoveWindow
893891:02/12/05 00:30
ありがとうございます。

すいませんがもう一つ。
そのCFormViewから派生して作成したViewに関連付けてある、
ダイアログのサイズの変更ををViewがサイズ変更(OnSize)した時に、
行いたい場合はどのようにすればいいのでしょうか?
色々やってもASSERTエラーがでてしまいます。
その色々何をやったのか言わんかい。

こういう場合は、初回のOnSize時にはまだダイアログが存在しないから
ダイアログのm_hWndが無効でアサートしてるのが定番。
OnSizeの中で

// m_dlgがダイアログだとして
if(m_dlg){
  // ここでダイアログのサイズを変更
}

とかするとウマー
>>894
遅ればせながらありがとうございます。
なんとかできそうです。
896デフォルトの名無しさん:02/12/05 19:22
Winsockでプログラミングしているのですが、
Iriaのように環境変数を指定するにはどうすればいいのですか?
教えてください。
好きなだけHTTPヘッダ付ければいいだろ。
898デフォルトの名無しさん:02/12/05 19:45
すんません・・・。
以下はMFC AppwizardのSDIで書いたコードなんだけど・・・

// TODO: この場所にネイティブ データ用の描画コードを追加します。
int n;
int j=0;
for (n=0;n<=100;n++){
if (n%2==0){
pDC->TextOut(0,10*j,n);
j=j+1;
}
}

}

エラーが出ずに起動するんだが、文字化けするんだよね・・・。
VC++始めて一日目です。教えてくれろ〜
899899:02/12/05 19:47
えーと、ファイルは***View.cppです。
CString str;
str.Format("%d", n );
pDC->TextOut(0,10*j, str );
901899:02/12/05 19:58
>>900
ありがとございやす!
一日目からこのスレかよ。先にもっと見るべき本なりサイトなりあるだろうに・・・
903880:02/12/05 20:34
結局のところ

CFrameWnd::GetActiveDocument
CFrameWnd::GetActiveFrame
CFrameWnd::GetActiveView
CView::GetDocument
CWnd::GetParentFrame

その他諸々で自己解決。

>>883
コンストラクタでどうやるんだ?
漏れにはGlobalVariable使う頭悪い方法しか思いつかん。

>>902
漏れもVC++一日目だったYO!
おかげで,900のCStringなんて知らず,_snprintf使って似たような事を…
904デフォルトの名無しさん:02/12/05 20:36
>>897
…ダウンローダー側の環境変数を送りたいのです。
InternetExplorerとか、Mozira とか。
905899:02/12/05 20:38
すんません・・・。
甘えついでにもう一つ・・・。
>>899のコードを実行すると偶数がズラズラ縦に書きつねられますが、
縦にスクロールしてくれないんです・・・。
解決方法は?・・・・。厨ですまそ。
>>904
だから自分でヘッダ送れってば。
>904
WinSockで、HTTPをしゃべるアプリを作っているのではないのか?
そこで出てくる「ダウンローダ側の環境変数」と自分で送った
HTTPヘッダのことではないのか?
Mozillaの偽装をしたいなら、Mozillaと同じヘッダを送ればいい。

環境変数という言い方からも、HTTPを分かってなさそうなことは
よく分かるのだが。RFC2616を読んだことはあるか?
訂正
>」と自分
>」とは自分
RFC2616読まなくてもHTTP ヘッダ ソケット とかでググればすぐ出てくるよ。
perlとかJavaのサンプルでも送る文字列自体は同じだからすぐわかる。はず。
俺はそうやったもの。
>>905
TextOut(10*j,0,str);
911910:02/12/05 20:51
あ。何でない。
WinInetならUA文字列そのものずばりを指定する引数があるんだけどな。
>>905
CScrollView使いなよ。使い方まで質問しないでね。
914899:02/12/05 20:56
>>913
ありがとございますw
915デフォルトの名無しさん:02/12/05 21:05
>>907
どうやって指定すればいいのですか?
>>915
ソケットで"HTTP/1.0\r\nContent-Length: 1024\r\nUser-Agent: モジラ\r\n・・・・・"
みたいな文字列を送る。つーか検索する単語でてるんだから検索しなさい。
917デフォルトの名無しさん:02/12/05 21:20
>>915
はい。
有難うございます。
918デフォルトの名無しさん:02/12/05 21:22
MainFrameにあるProtectedメンバ変数(コントローラーのハンドル)
を他のクラスで取得しようとpublicでGetXXXというメンバ関数を作成して
戻り値にハンドルを返そうそうとしたのですが、
コンパイル時に

class 'CSplitterWnd' : コピー コンストラクタが定義されていません。

となります。コピーコンストラクタを定義するにはどうすればいいのでしょうか?
>>918
コントローラー?コントロールバーじゃなくて?
とりあえずそのGetXXXという関数を晒してみよう。
920デフォルトの名無しさん:02/12/05 21:31
>>919
すいません、分割ウインドウのハンドル(?)だからコントローラじゃないかも・・
また間違ったこと書きそうなのでソース晒します。

[MainFrm.h]
// アトリビュート
protected:
CSplitterWnd m_wndSplitter;

// インプリメンテーション
public:
virtual CSplitterWnd GetSplitterWnd();


[MainFrm.cpp]
CSplitterWnd CMainFrame::GetSplitterWnd()
{
return m_wndSplitter;
}
>>920
ハンドルを取得したいならHWNDだから、Get〜の戻り値はHWNDにして
return m_wndSplitter.m_hWnd;
だと思う。

CSplitterWndのインスタンスを取得したいならポインタを返すのが普通じゃなかなぁ。
Get〜の戻り値をCSplitterWnd* にして
return &m_wndSplitter;
みたく。
参照を返した方がいい気もする
俺はいつもm_wndSplitterをpublicにしちゃってるわけだが・・・
>>923
そんなアバウトな君が好き
925918:02/12/05 22:08
できました!本当にありがとうございます!
ポインタを返さないとあのエラーが出るということでいいんですか?
これで、かなり進みました・・・
926880:02/12/05 23:00
また,よろしくお願いします。
クラスウィザードって,「メッセージを受け取るメソッドを自動的に作成し,そのメソッドを人間に記入させる」というコンセプトですよね。
逆に,「予め人間様が作成したメソッドをメッセージと関連付ける」という方法はできませんか?

「メッセージ先にありき」っつーのはやっぱ性に合わない…

>>918
それC++の基本的なところ。
インスタンスを引数,返り値にすると,その実体のコピーが作られる。
copy=new CSplitterWnd(&m_wndSplitter);
と等価なコードで返り値が代入されます。
自分のC++教本読み返しとけぇ!

スレ違い内容スマソ。
昔々、BorlandにDDVTという技術があったと云う。
virtual OnTimer() = WM_TIMER;
というような構文だったらしい。詳しいことは知らんが
>「予め人間様が作成したメソッドをメッセージと関連付ける」
手動でおながいします。
もしくはメッセージを受け取るメソッドで人間様が作成したメソッドを呼べばいいだけだと思うが。
929デフォルトの名無しさん:02/12/05 23:12
>927
おー,なんか関数ポインタ代入してるみたいで(・∀・)イイ!
順番逆だけどさ…
930880:02/12/05 23:17
ありゃ,妙な時間差が…

>928
>メッセージを受け取るメソッドで人間様が作成したメソッドを呼べばいいだけだと思うが。
現在は仕方なく,このようにしております…(;_;
メッセージマップの関係がGUIで直に確認できたら(・∀・)イイ!のになぁ,ってね。
>メッセージマップの関係がGUIで
Ctrl+Wでクラスウィザード起動すれば見れると思うけど、どうよ?
932デフォルトの名無しさん:02/12/05 23:47
グローバル変数をウォッチしても値が更新されない。なぜ?
一度ウォッチの窓を消して、再度出すと更新されているのだが。
6.0 Professional MFC
>>932
常に最新の実行時の値が表示されてるわけじゃないぞ。
934932:02/12/05 23:58
>>933
素早いフォローサンクス。
じゃあ、刻々と変化していく変数の値を知りたい場合、コードに埋め込む以外は
方法はないと言うことでしょうか?

>>934
TRACE( ... )マクロ便利だよ。
printfと同じ構文で使えて、デバッグウィンドウに文字を表示する。
ASSERTと同じくDebug版のみで動作し、Release版ではなにもしない。

TRACE("%d\n", i);

でiの値がアウトプットウィンドウに逐一出力される。
936880:02/12/06 00:26
ソースコード眺めてたら,
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
.....
END_MESSAGE_MAP()
てな部分でメッセージマップ定義しているを発見。

>931
こっちを書き換えてやると,確かにクラスウィザード上で確認できました。
今までは,クラスウィザード作るメソッドをラッパーとして使っていたもので(^^;;

# んー,NeXT DevelopersはこのあたりのGUIの出来がよかったなぁ…
モードレスダイアログ上に貼り付けた CListCtrl(仮想リストビュー)上での
ドラッグの開始/終了時に送られてくるメッセージは HDN_BEGINDRAG/HDN_ENDDRAG でOK?
Class Wizardでメッセージハンドラを実装させてみたけどちっとも呼ばれない。
念のため LVN_BEGINDRAG も試してみたけどやはりダメ。
他の HDN_〜 はちゃんと動作するのになあ。

環境はWinXP、VC++6.0っす。
938あだ名はG。:02/12/07 20:05
すいません。基本的な質問をします。

MFCでCTest1ダイアログをつくりました。
ダイアログ内にはエディットボックス(IDがIDC_EDIT1、変数名がm_edit1)を作りました。

で、ソース内で、
CString str("2ch");
m_edit1=str;

と、エディットボックスにstrを代入したのですが、
ダイアログ内のエディットボックスには、さっき代入した「2ch」が表示されません。

エディットボックス内のメンバーに文字列を代入した際、その代入をダイアログ内に反映(表示)させるのはどうすればいいのでしょうか?
939あだ名はG。:02/12/07 21:03
>>938
解決。
(CWnd->UpdateData(BOOL))
>>937
LVN_BEGINDRAGでふつーに取れるけど…。
ダイアログにリストビューコントロールはりつけてOnInitDialogでアイテム一個追加して
クラスウィザードでLVN_BEGINDRAGのハンドラ作ってブレークポイント置いただけ。
Win2000, VC++6.0SP5

HDN_はヘッダ用だよ
OnNotifyで強引に捕らえる方法があったような。
942937:02/12/07 23:24
>>940 >>941
回答ありがとう。

「ドラッグ」の意味を勘違いしてた。
GoogleやMSDNで調べているうちに今やっと気づいたんだけど、
アイテムをまさに「引きずる」のがドラッグだったのね。
自分がやりたかったのはマウスでの矩形選択(複数のアイテム)だった。
この動作のこともドラッグと呼ぶものだと長い間思ってた。

WM_LBUTTONDOWN/WM_LBUTTONUPのメッセージハンドラで様子を見てみたんだけど、
クリックして「DOWN」が送られてきたあと、ボタンを上げずに移動させると(自分的にはドラッグ)、
矩形選択の開始を知らせるメッセージがWinから送られてきている模様。
でもそのメッセージの名称がわからないから、
どうやって捕まえればいいのかよくわからない。

とりあえず、「DOWN」のハンドラでフラグを立てておいて「ドラッグ」開始、
「ドラッグ」中はWM_MOUSEMOVEが送られて来ないので、
「UP」後、「MOVE」が来たときにフラグが立っていたら「ドラッグ」終了、
というやり方を考案してみた。

矩形選択開始時に送られてくるメッセージが何なのかを知ってる人がいたらよろしく。
>>942
LVN_MARQUEEBEGIN
944デフォルトの名無しさん:02/12/08 12:42
矩形って用語的には bounding box か。
>>943 >>944
回答、Thanks a lot。

そっかー、マーキーなんて名前なんだ。
ぱっと見て一瞬、HTMLのマーキーを連想して「何のネタだよ!」と内心突っ込んでた。すまん。
これ、BEGINはあってもENDはないのね。LVN_BEGINDRAGと同じで。
英語、そんなに得意じゃないんだけど、マニュアルが言ってるのは
「選択を始めたら0が、選択を終了したら0以外が (LPNMLISTVIEW) lParam に代入される」
ことで開始/終了を知ることができる、てとこかな。

勉強になるなあ。
946デフォルトの名無しさん:02/12/09 15:40
MFC で SDI のプロジェクトを作ったときにメニューって絶対作られちゃうの?
メニュー無しはダイアログベースじゃなきゃ作れないもの?
IDR_MAINFRAME のメニューが非常に邪魔なのだが。
>>946
構築後に消してる

m_pMainWnd->SetMenu( NULL );
948946:02/12/09 15:56
>>947
> 構築後に消してる
> m_pMainWnd->SetMenu( NULL );

できますた。
ありがと。
949デフォルトの名無しさん:02/12/09 16:03
オリジナルのMassageBoxの出し方を教えてください。
>>949
他人にわかるように喋ってください。

…ダイアログ自分でつくりゃいいじゃん。
>949
つーか、マッサージボックスって何だよ(w
952デフォルトの名無しさん:02/12/09 17:43
Emacみたいなコマンドで編集するメモ帳を作りたいのですが、
CEditViewを使った方がいいのでしょうか?
それとも自分でクラス作ったほうが早いですか?
C++&MFC始めたばっかでよくわからんのです。
アドバイスください。
>>952
オリジナルのViewクラスは結構めんどいよ。
使い始めたばかりなら、まずCEditViewでドキュメントービュー構造になれたほうがよさげ。
最近故あってSDKベースからMFCにやってきますた。

operator= が使えるCStringArrayを作りたいんですが、どう書けばよろしいでしょう?
STLとかATLは使えない環境でつ。
>>954
レスありがとうございます。
了解しました。
>>953
2ヶ月くらい前にね
>>955
普通に派生クラス作って operator= をインプリメントするのはダメなんでしょーか?
959デフォルトの名無しさん:02/12/11 18:42
VC+++MFCでhttpsサーバにアクセスするクライアントを作成する場合、
どのAPI、クラスを使えばよいのでしょうか?
WinInetやそのラッパークラスにはhttpsについての記述がありませんでした。
INTERNET_FLAG_SECURE
CString に char[256]とかを
=演算子で何度も追加するのはまずいですか?
CMapWordToObでメモリリーク起こさない方法ってどうすればいいんでしょう?
deleteすると、キーを挿入しているところで大量に漏れてると言われます。
VC6.0です。
>>962
ループで回してMapの要素を一つずつdeleteする。
新スレです。

■ VisualC++(MFC限定)相談室 MFC6.dll■
http://pc3.2ch.net/test/read.cgi/tech/1039607377/
>>963
それでも結果全く同じ。
ダンプを見ると、どうもキーのメモリが開放されてないようなんですがそんなことあるんですかね?
以下、削除部のソース

{
POSITIONpos;
WORDkey;
CObject*pa;

pos = ThStack_w.GetStartPosition();
while(pos != NULL) {
ThStack_w.GetNextAssoc(pos, key, (CObject*&)pa);
ThStack_w.RemoveKey(key);
}
}
>>965
SetAt する時にオブジェクトを new してるんでしょ?
↓でどう?

pos = ThStack_w.GetStartPosition();
while(pos != NULL) {
ThStack_w.GetNextAssoc(pos, key, (CObject*&)pa);
delete pa;
ThStack_w.RemoveKey(key);
}
>>966
ダメでつ。
一発目からAccess Violationが出ます。
delete pa のとこで。

といーますかPtrじゃなくてOb系なんで、削除は保証されてるはずなんですがねー。
マニュアルまたバグってる?
>>967
newしてねーだけだろ
ちなみに、MSDNがCMapWordToObの参考にしてくれって言ってる
CMapStringToObにはこうある
>CMapStringToOb オブジェクトを削除するか要素を削除すると、
>CString オブジェクトと CObject ポインタが削除されます。
>CObject ポインタが参照しているオブジェクトは破棄されません。
Mapの要素としてのCObject*は破棄されるが、
その先のオブジェクトは破棄しないということだな。
CMapWordToObの説明は
>その要素を削除すると、対応する CObject オブジェクトが削除されます。
ってあるが。
>>968
そんなことはない。

ThStack_w[para_w] = (CObject *)new CString(temp);

>>969
そう。
どっちを信じていいか小一時間悩んで、結局deleteできないなら後者だろ、と思った。
でも漏れ漏れ。どうなってんやら。
>>970
CStringはCObjectじゃないよ。
>>972
おお、それは気が付かなかった。
CStringArrayに替えたら解決しますた。
ダンケ。
>>973
CStringArrayでええんか?
CString*を保持するCMapWordToPtrの方が良いんじゃ?
975デフォルトの名無しさん:02/12/12 19:36
MediaPlayerのActiveXコントロールで、実行時にサイズ変更する方法を教えてください。
MoveWindowするとエラー出てしまいます。
CMediaPlayer2を見てもそれらしきものが見当たらないっす。
リストビューとツリービューの混ざったような物を作りたいのですが
どうすればよいのでしょうか。
こんな風にしたいのです↓

http://www.vector.co.jp/magazine/softnews/991006/images/n99100611b.gif
978デフォルトの名無しさん:02/12/13 05:22
スプリットウィンドウで分けて複数のビューを
表示してる場合にWM_KEYDOWNメッセージを
特定のビューで受けたい場合はどうしたらいいのでしょうか
どのビューでもOnKeyDownが動いてくれません
979978:02/12/13 06:11
すいません、どのビューでも動かないとかいてしまいましたが
一番左上のビューで動きました
2列に分割して左の列を2行に分割していて
左下のビューで受け取りたいのですがSetActivePaneとかしても
アクティブになってくれません
980978:02/12/13 06:20
すいません解決しました
ボタンにフォーカスあたってたのをなくしたら
OnKeyDown動いてくれました
ボタンにフォーカス当たったままじゃ
ビューがメッセージ受け取らないとは知りませんでした
981973:02/12/13 11:13
>>974
元々スレッド間通信に使おうと思ってたから、Arrayの方が都合が良い。
故にこれでオケー。
982978:02/12/13 11:14
続けて質問させてください
入力するキーによって
受け取るビューを変えたいのですが
どうしたらいいでしょうか

たとえば数字キーなら左のビュー
エンターキーなら右のビューといった感じです
新スレへ移動してくれ。

■ VisualC++(MFC限定)相談室 MFC6.dll■
http://pc3.2ch.net/test/read.cgi/tech/1039607377/

  |■\
   | ∀`) ダレモイナイ...
   | ⊂) ワショーイスルナラ イマノウチ
   | /


    ./■\
   ∩´∀`∩ ワショーイワショーイ
    ヽ   丿
    ( ヽノ
   し(_)



    /■\
   (´∀`∩) ワワワワワショーイ
   (つ  丿
   ( ヽノ
   し(_)
age
新スレ

■ VisualC++(MFC限定)相談室 6■
http://pc3.2ch.net/test/read.cgi/tech/1039854032/
真の新スレ

■ VisualC++(MFC限定)相談室 MFC6.dll■
http://pc3.2ch.net/test/read.cgi/tech/1039607377/
>>986
いい加減にそういう冬厨丸出しなことはやめてくれ
冬坊丸出し上げ
どっちが冬厨だか(藁
d
a
r
e
m
o
1000
torannoka
YO!
jyaorega1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。