■MFC相談室 mfc21d.d ..
[2ch|▼Menu]
159:デフォルトの名無しさん
09/11/06 20:01:16
渡さないほうが良い
stringへのらっぱー書く方が良い

160:デフォルトの名無しさん
09/11/06 20:09:24
>>158
そのライブラリがconst char * を受け取るならそのまま渡していいと思う。
そのライブラリがstd::stringを受け取るなら、std::stringのラッバを用意した方がいい。

161:デフォルトの名無しさん
09/11/06 21:07:22
>>154 です
ありがとう。

162:デフォルトの名無しさん
09/11/07 08:11:44
>>154です。おはようございます、
ラッパークラスを意識して書いたことが無いので、勘違いをしている可能性があるので
駄目出し、及びご指導お願いします。
/**
* @brief  std::stringからCString(MFC)へ変換
* @date  2009/11/7
* @param[in] std::string str
* @return  str.c_str()
*/
class ConvertToCString {
public:
 ConvertToCString() : str_("") {}
 const CString operator()(std::string str) const {return str.c_str();}
private:
 std::string str_;
};
/**
* @brief  CString(MFC)からstd::stringへ変換
* @date  2009/11/7
* @param[in] CString cstr
* @return  static_cast<LPCTSTR>(cstr)
*/
class ConvertTostring {
 ConvertTostring() : cstr_("") {}
 const std::string operator()(CString cstr) const {return static_cast<LPCTSTR>(cstr);}
private:
 CString cstr_;
};

163:デフォルトの名無しさん
09/11/07 10:43:16
おかしいな?
std::string str = "CString_convert";
CString cstr = ConvertToCString(str);

cstr = "std;;string_convert";
str = ConvertTostring(cstr);
こうすると
error C2440: '初期化中' : 'ConvertToCString' から 'ATL::CStringT<BaseType,StringTraits>' に変換できません。
何処が悪いのでしょうか?
CString cs("Hello");
std::string s((LPCTSTR)cs);

std::string ss("Hello");
CString ccs(ss.c_str());
これは動くので、簡単にできると思ったんですが・・・・

164:デフォルトの名無しさん
09/11/07 15:08:39
>>163
一応、↓で出来るとは思うが、どうせ c_str() の呼び出しか LPCTSTR へのキャストで済むんだから、
わざわざクラスまで作る必要はないと思う。
コードを見た感じだと、Unicode文字セットを使っている訳ではないようだし。

class ConvertToCString {
public:
 ConvertToCString(std::string str) : str_(str) {}
 operator CString() const {return str_.c_str();}
private:
 std::string str_;
};

class ConvertTostring {
public:
 ConvertTostring(CString cstr) : cstr_(cstr) {}
 operator std::string() const {return static_cast<LPCTSTR>(cstr_);}
private:
 CString cstr_;
};

165:デフォルトの名無しさん
09/11/07 18:33:27
>>164
ありがとう、やっぱり勘違いしていました^^;
>わざわざクラスまで作る必要はないと思う。
そうですね、自分もそう思います、ただ一点お聞きしたいのですが
ラッパークラスのイメージといいますか、認識はこのような感じでいいのでしょうか?

166:デフォルトの名無しさん
09/11/07 23:34:49
お前は物事の一部だけを見て
すべてを分かったつもりになる香具師なのか?

167:デフォルトの名無しさん
09/11/07 23:48:47
一を聞いて十を知る、それがわたしです。

168:デフォルトの名無しさん
09/11/07 23:59:58
一を聞いて十を知ったつもりになる、の間違いでは?

169:デフォルトの名無しさん
09/11/08 00:02:11
おまえは俺の何を知っているのだ。

170:デフォルトの名無しさん
09/11/08 23:19:35
CWinAppExでレジストリを使わないようにする方法ある?

171:デフォルトの名無しさん
09/11/09 10:14:27
自動生成されるコードの該当部分を消せばいい

172:デフォルトの名無しさん
09/11/09 16:13:44
InitInstanceのあの1行さえ消せばIniファイルが使われるようになる

173:デフォルトの名無しさん
09/11/09 18:08:05
余談でCWinAppExで追加されたCleanStateメソッドってのがある。
MFC Feature Packの影響で、レジストリ情報との差異による問題とかでてきたら、
コマンドラインとかで呼び出せる様にした方がいいかもね。

(それこそ、InitInstanceのあの1行の次の行あたりで)

174:デフォルトの名無しさん
09/11/09 23:46:57
オーナードローでXPやvistaのような外観のボタンにするにはどうしたらいいでしょうか?

175:デフォルトの名無しさん
09/11/10 00:24:48
 


176:デフォルトの名無しさん
09/11/10 00:27:01
>>174
::OpenThemeData() でテーマハンドルを取得したのち、::DrawThemeBackground() でパーツを描画する。

177:デフォルトの名無しさん
09/11/10 15:19:08
VC2005でMFCで画面つくってますが
ボタンを押したときにOnButtonで呼ばれる処理を
ボタン押し続けで連続処理させるいい方法ありませんか?

178:デフォルトの名無しさん
09/11/10 15:34:31
ボタン関係のメッセージで可能

179:デフォルトの名無しさん
09/11/10 15:55:05
>>178
具体的にどんか感じですか?
ボタン押し続けだと1回しかメッセージきませんよね??
連続にできるってことですか?

180:デフォルトの名無しさん
09/11/10 15:58:53
タイマー起動して押してある間、適当なメッセージ送りつづけるとか。

181:デフォルトの名無しさん
09/11/10 16:09:22
>ボタン押し続けで連続処理させるいい方法

(1) ボタン押す→WM_LBUTTONDOWNがボタンに飛んでくる。
(2) ボタン放す→WM_LBUTTONUPがボタンに飛んでくる。

→(1) のタイミングでタイマなりを動かして、一定間隔で親にWM_COMMANDを送る。
→(2) のタイミングでタイマを切る。

ボタンを押さえたままウィンドウが非アクティブになるとWM_LBUTTONUPは飛んでこないから
それなりに工夫は必要。




182:デフォルトの名無しさん
09/11/10 16:21:20
タイマー等で自分で実装するしかないんですね
もう少しスマートな方法があるといいんですが…

183:デフォルトの名無しさん
09/11/10 16:23:31
>>177
URLリンク(www.codeproject.com)
評価は微妙だし、非アクティブ対応も甘そうだし、キーボードにも対応していなさそうだけど、
>>181の実装例。

184:デフォルトの名無しさん
09/11/10 16:32:43
>>183
見たところ、確かに非アクティブ対応は甘いね。
OnLButtonUp() では、ReleaseCapture() だけ実行すればいい。

その他の処理は WM_CAPTURECHANGED を捕まえて、そこで実行する。

185:デフォルトの名無しさん
09/11/10 16:34:46
PeekMessageを使ってWM_LBUTTONDOWNのみNOREMOVEなループの中で処理したらどうだ?
割り当て可能なすべてのアイドル時間がボタンダウンのために処理されるから
ものすごい勢いだぞ^^

186:デフォルトの名無しさん
09/11/10 17:14:52
押した時と離した時しかメッセージ発生しないから
タイマー嫌なら離したメッセージが来るまで永遠にループさせるしかないな。


187:デフォルトの名無しさん
09/11/10 17:22:44
キーみたいにリピート設定できた気がするんだが忘れ散った

188:デフォルトの名無しさん
09/11/10 17:30:10
ゲームマウスでも買って好きなように設定して使え。

189:デフォルトの名無しさん
09/11/10 17:47:58
キーボードもハードの方でタイマー使ってるようなもんだしな

190:デフォルトの名無しさん
09/11/10 18:33:10
MFCがサポートしてない機能はスレ違い

191:デフォルトの名無しさん
09/11/10 23:06:24
Win32APIスレで聞いた方が良いと思う

192:デフォルトの名無しさん
09/11/12 16:03:27
CListなどのPOSITION値って、
その値を取ったあとに追加や削除などの操作を行っても
当初の場所を指す値としてずっと有効のままなのでしょうか?

それとも、CWnd::GetDlgItem()などのように
どこかのタイミングで無効になるのでしょうか?

193:デフォルトの名無しさん
09/11/12 17:25:25
動かさなければ同じ場所に留まり続けると思うが。GetDlgItem()もまた然り。

194:デフォルトの名無しさん
09/11/13 09:34:20
> 動かさなければ同じ場所に留まり続けると思うが。

これはMSDNのどこかに明示されていますでしょうか?

「ブックマークとして使うと、リスト内の位置を保持できます」
という説明はあるのですが、要素を追加したり、
他の要素を削除をしても対象要素のPOSITION値自体は変わらないものなのか、
そのへんの記述を見つけられません。

> GetDlgItem()もまた然り。

CWnd::GetDlgItem()の説明には
「返されるポインタは、一時的なポインタです。
後で使用するために保存しておくことはできません。」
と書いてあり、実際、アイドル時だかどこかで無効になります。
ダイアログクラス内にDDXメンバとして実体があれば常に有効かもしれませんが。


195:デフォルトの名無しさん
09/11/13 10:28:18
>POSITION 型の変数はリストのキーとして使います。

だからキーが使えなくなったらキーの意味ないだろ
心配ならソースついてるんだからMFCソース読めよ

196:デフォルトの名無しさん
09/11/15 23:32:01
ダイアログベースで、ファイルを指定したフォルダにコピーするソフト
を作っています。(ウォークマンにmp3をランダムに転送するため)

SHFileOperationAを使ってコピーを行っているのですが、
ダイアログにコピー処理を書いているので、コピー中にダイアログの操作ができません。
コピーの時間が30〜60分と長いので、もどかしいです。


コピー中もダイアログの操作ができるようにするにはどうすればいいでしょうか?
(コピー用のスレッドを作って、そこでコピー処理をすればいい?

197:デフォルトの名無しさん
09/11/16 00:17:39
yes we can

198:デフォルトの名無しさん
09/11/16 12:31:39
これで君もワーカースレッド使いにレベルアップだ

199:デフォルトの名無しさん
09/11/16 13:46:35
お茶くみとコピーばかりはもう飽きた!

200:デフォルトの名無しさん
09/11/16 13:54:24
ボタンにビットマップを設定し、
ビットマップの白色に部分は透過させて表示したいので
ネットで調べた結果以下のプログラムを描いてみましたが
透過になってくれません
何か間違っていますか?正しい方法を教えてください
環境はXPのVS2005(MFC)です

COLORMAP cm;
cm.from = RGB(255,255,255);
cm.to = GetSysColor(COLOR_3DFACE);
m_bmp.LoadMappedBitmap(IDB_BITMAP, 0, &cm, 1);
m_btn.SetBitmap(m_bmp);


201:デフォルトの名無しさん
09/11/16 15:35:40
お頼み申しageます

202:デフォルトの名無しさん
09/11/16 17:18:10
自己対応メモ
VS2008でメニューのフォントが変だったので悩んだ。

URLリンク(takabosoft.com)
にて書いている人がいたが、この人の方法だとOnCreateの時点ではフォント情報が取得できず、メニューが化ける。
URLリンク(blog.csdn.net)
にて書いている方法なら正しく表示された。

MFCがBCGControlBarを使うようになったから、その対応も使えるのだな。


203:デフォルトの名無しさん
09/11/16 17:23:33
正しく表示されたコード
m_wndMenuBar.Createのあとで、

LOGFONT logfont = {0};
::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &logfont, 0);
CMFCMenuBar::SetMenuFont(&logfont);


204:デフォルトの名無しさん
09/11/16 18:55:37
>201
たまたま見つけたコードを意味もわからずいじって見たけど動きません。
だったら関わるだけ時間の無駄。

205:デフォルトの名無しさん
09/11/16 20:18:38
>>200
そのコードは、透過ではなく特定の色をボタン表面の色に変更して載せてるだけ。
透過させたかったらCButton::SetImageListを使え。
これならVista以降の徐々に色の変わるようなボタンでも正しく透過で描画される。

206:デフォルトの名無しさん
09/11/17 14:20:07
>>202
>この人の方法だとOnCreateの時点ではフォント情報が取得できず、メニューが化ける。

WINVER >= 0x0600 に設定して、そのプログラムを Vista 以前の環境で実行すると
::SystemParametersInfo( SPI_GETNONCLIENTMETRICS,,,) が失敗するというのは知ってる?

207:デフォルトの名無しさん
09/11/17 21:32:59
>>196
そのとおり、コピー用スレッドを作れば良い。

また、一個一個が小さいコピーをたくさんやっているなら、
コピーの合間にメッセージループをはさむ方法もある。

メッセージループの具体形はぐぐれば出てくる。

208:デフォルトの名無しさん
09/11/18 17:37:27
スタティックコントロールでCenterImageしてるんですが
その場合は\rつけても改行されてくれません
改行可能なCenterImageって方法ありませんか?
余白を設定できたりも考えましたが見つかりません
オーナードロー以外でなにかいい案ありましたら
お願いします

209:196
09/11/18 22:16:48
なんとか、スレッドで処理させることで、コピー中もダイアログを操作できるようにできました。
ありがとうございました。


>>198
裏で処理をさせるのをワーカースレッドっていうんですね。


>>207
コピーの時にOS標準のコピーダイアログを出したかったので
SHFileOperationAを使ってのコピーです。
コピーは全部SHFileOperationAに任せますので、メッセージループは使いませんでした。

210:デフォルトの名無しさん
09/11/19 19:13:35
MFCでも.NETアプリ動くようにしてくれればいいのにね。

211:デフォルトの名無しさん
09/11/19 19:14:42
C#の方が簡単。どの環境でも動く…

MFCで作るのがいやんなるよ…

212:デフォルトの名無しさん
09/11/25 19:14:32
リソースとして埋め込んだリッチテキストファイルをRichEditCtrlに読み込ませようとして苦戦しております
外部ファイルの読み込みに関してはEDITSTREAMのコールバック関数を設定して出来ましたが、リソースからRTF形式で読み込むのは難しいのでしょうか?


213:デフォルトの名無しさん
09/11/25 19:33:37
LockResourceしてデータを取り出せば良いんじゃね?

214:デフォルトの名無しさん
09/11/25 19:45:46
>>212

HRSRC hResInfo = ::FindResource( AfxGetInstanceHandle(), MAKEINTRESOURCE( IDF_RICHTXT), RT_HTML);
HGLOBAL hResData = ::LoadResource( AfxGetInstanceHandle(), hResInfo);
DWORD dwData = ::SizeofResource( AfxGetInstanceHandle(), hResInfo);

LPVOID lpData = ::LockResource( hResData);
CString strBuf( reinterpret_cast<TCHAR*>( lpData), dwData/sizeof(TCHAR));

m_wndRichEdit.SetWindowText( strBuf);

215:デフォルトの名無しさん
09/11/25 20:17:37
エクスプローラでファイルを詳細表示したときにファイル一覧の上に「名前」「サイズ」といった
区切りが表示され、その表示幅を自分で変更できたりしますが、この機能は標準で付いてる
ものなのでしょうか?
使ってるヴァージョンはVisual C++.net Version2003です

やりたい事はテキストファイルの一覧を表示して、その幅を自分で調整したいと考えています。
_____________________
| 名前  |  電話番号  | 住所        |
| 山田   03-xxxx     東京都xxxx

最初から表示されているダイヤログエディタのコントロールを見ても使える様な物が
見つからないので、後から追加できるものなのかそれとも自分で作らなければならない
物なのでしょうか?

216:デフォルトの名無しさん
09/11/25 20:54:40
手元にVS2008しかないからそれで説明すると、
そのコントロールは「List Control」という表記なっている。
プロパティでViewを「レポート」に変更すると、そのようなヘッダの付いた表示形式になる。
VS2003でも大体同じような感じだったと思う。
試しに張ってみて、黄・赤・緑とかのアイコンが表示されるならそれでほぼ間違いない。
そういえば、このアイコンはVC4から殆ど変わらないよなあ。

217:デフォルトの名無しさん
09/11/25 21:13:19
>>216
List Controlに欲しい機能が付いておりました。
ただ追加した時点では色のアイコンがあるだけで、それらしい機能は
持っていないと思ってしまっていました。
レポートに変更したら上の方に区切りの付いたバーが表示されました。

ありがとうございます。

218:デフォルトの名無しさん
09/11/26 19:42:26
>>213
>>214
返答が遅くなりましたが無事読み込ませることが出来ました、ありがとうございます
てっきりリッチテキストそのままだと読み込めないものだと思っていたので意外でした

219:デフォルトの名無しさん
09/11/26 21:09:36
>>62
A:「作ったよ」
B:「ありがとう。こっちで作ったのにコピーさせてもらうね」
A:「ん、じゃとりあえずBの仕事が終わるまで待ってるね」

B:「ありがとう。終わったよ〜」
A:「ん、じゃこっちの仕事も終了するねw」
B:「じゃあAの仕事が終わったらこっちで作ったものは削除するね〜」
A:「こっちはもちっと仕事があるから終わったら削除するよ〜」
B:「あれ、いつの間にやらCStringのヒープニオイタモノガコワレテr」

orz



220:219
09/11/26 21:10:39
(windows ce用アプリ)

221:デフォルトの名無しさん
09/11/26 21:14:43
A:「作ったよ」
B:「ありがとう。こっちで作ったのにコピーさせてもらうね」

A:「・・・ああん、バカ。コピーするならポインタじゃなくて実体をコピーしてよん」

222:デフォルトの名無しさん
09/11/29 10:43:51
なにそれ、エロい

223:デフォルトの名無しさん
09/11/29 16:28:22
えっ

224:デフォルトの名無しさん
09/11/29 18:00:15
えっ

225:デフォルトの名無しさん
09/11/29 18:25:59
                    , - , -─ - 、
                   /:::::::::::::::::::::::::::::::::`‐、
                 /::::::::::::::::::::::::::::::::::::::::::::::\
                /::::::::::;:ィ::::::::';:::::::::::`ヽ::::::::::::::ヽ
                ,'::::::;':::/ l:::i::::::ヽ:::\:::::::';:::::::::::::::',
                  i:::l::::i:/  ';:::';:::::::',\::ヽ:::::::::::☆:::
                l::l::;イ__, ヽ、ト、::::ヽ、\:',ヽ〃l::::::
                  ';l l::l      ` ‐-   l:::::l::::::  こ、ここ、これ読んで下さいっ!
                 l::::l == 、    ,.ィ== l:::::l:::::::::
                 l:::::li //////////// l:::::l::::::::::
               , -ーl::::lヽ、  r....::´`ヽ /l:::;'> 、:::::
           , -ー 、'´`ヽl::::l// ` ‐-r‐ァ' ´ ,':/ー、  ';
            /  , ノ `   l::::l   li /ニく /⌒ヽ  \.i
        , └ '´  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ / ノ__  ',  ,イ:
      /     \ (⌒⌒)       ,  └ '´ /   i/
    /            ヽ / ー '       /  /,.イ
   ∠ __                    /  / /
          ̄ ̄ ̄ ̄ ̄── -------/-‐'´ /

226:デフォルトの名無しさん
09/11/29 18:52:05
      ィ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;゙t,
     彡;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ヽ
     イ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;r''ソ~ヾ:;;;;;;゙i,
     t;;;;;;;リ~`゙ヾ、;;;;;;;;;;;;;;;;;;;;ノ    i,;;;;;;!      / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     ゙i,;;;;t    ヾ-‐''"~´_,,.ィ"゙  ヾ;;f^!   / お嬢ちゃん、ここはMFCの相談室だぜ。
     ト.;;;;;》  =ニー-彡ニ''"~´,,...,,.  レ')l. <   その手紙をMFCで書いて出直しな。
     t゙ヾ;l   __,, .. ,,_   ,.テ:ro=r''"゙ !.f'l.   \_______________
      ヽ.ヽ ー=rtσフ= ;  ('"^'=''′  リノ                          
    ,,.. -‐ゝ.>、 `゙゙゙゙´ ,'  ヽ   . : :! /
 ~´ : : : : : `ヽ:.    ,rf :. . :.: j 、 . : : ト、.、
 : : : : : : : : : : ヽ、  /. .゙ー:、_,.r'゙: :ヽ. : :/ ヽ\、
  :f: r: : : : : : : : !丶  r-、=一=''チ^  ,/   !:: : :`丶、_
  : /: : : : : : : : :! ヽ、  ゙ ''' ''¨´  /   ,i: : : l!: : : : :`ヽ、
 〃: :j: : : : : : : ゙i   `ヽ、..,,__,, :ィ"::   ,ノ:: : : : : : : : : : : :\
 ノ: : : : : : : : : : :丶   : : ::::::::: : : :   /: : : MFC : : : : : : : :\


227: [―{}@{}@{}-] デフォルトの名無しさん
09/12/01 08:38:38
CPaneDialog派生させたオブジェクトをドッキングで使ってるんだが、
何故かボタンコントロールだけディスエーブルされるのは、仕様?バグ?
チェックボックスとかは全く問題ないんだが・・・・OnCreate()内でEnaqbleWindowやっても
効果無し。MFCのソース
バックグラウンドの更新も変だ・・・・ダイアログアイテムにちゃんとメッセージがポストされてない気がする。

2008で拡張されたMFCは便利だけど、どうも問題が多いし、肝心な情報が公開されてない
気がする。いい加減にM$は、開発環境ぐらいソースを全公開して欲しいよ。w

228:デフォルトの名無しさん
09/12/01 09:02:48
>>227
ダイアログバーのときは、コマンドハンドラやON_UPDATE_COMMAND_UIが無いと
ボタンは無効になってたけど、それとは関係無いですか?

229: [―{}@{}@{}-] デフォルトの名無しさん
09/12/01 09:30:00
>>228
それだ!!ありがとうございます。ボタンの件はそれでした。

230:デフォルトの名無しさん
09/12/02 14:23:20
ダイアログバーはメッセージマップがMainFrame側に実装される謎仕様とかあったな

231:デフォルトの名無しさん
09/12/04 16:51:04
リストコントロールについて質問です。
レポート形式で使用しています。(VC2005)

(1)
リスト行数100で1ページ表示5行で
現在10ページ目の1番目の項目が選択されています。
この状態で一度全ての項目を削除し再入力して
新たに10ページ目の1番目の項目を選択させたいので
SetItemStateなどで選びなおしました。
しかし、10ページ目の1番目が選択されているようですが
表示は1ページ目になっています。
これを10ページ目にしたくてSetScrollPosをしましたが
うまくいかず、表示が変になります
どうやったら10ページ目の表示にできるのでしょうか?

(2)
拡張スタイルにLVS_EX_GRIDLINESを使用していますが
スクロールしたときにグリッドラインの残像が残ってしまいます
この残像を綺麗にけすのはどうしたらいいのでしょうか?


232:デフォルトの名無しさん
09/12/04 17:01:29
>どうやったら10ページ目の表示にできるのでしょうか
CListCtrl::EnsureVisible()

>この残像を綺麗にけすのはどうしたらいいのでしょうか
ウチでは残らないけど? 何か変わったコトしてない?

233:デフォルトの名無しさん
09/12/04 19:56:54
俺も昔LVS_EX_GRIDLINESで残像が残った記憶があるな。
市販アプリでも普通に残像が残っていたので、環境依存なのかもなあ。
昔なった時は、IE3.x時代のだからMSもまともにサポートする気無いのか、
という程度に思っていたのだけど。.NETだと自前で正しく描画していたし。

234:デフォルトの名無しさん
09/12/07 09:06:09
>>231
2はOSのバグの問題と同じかも。

URLリンク(support.microsoft.com)
昔ブックマークしていた場所で、ページ自体は無くなってるけど、
このアドレスでググると同じ問題の書き込みがいくつか残ってた。

235:231
09/12/08 13:26:25
返事がおくれてすみません

1は232で解決しました
2は画面のプロパティのデザインで治りました

236:231
09/12/08 14:11:12
来客が来て途中送信してしまいました。
改めて、

返事がおくれてすみません

1は232で解決しました
2は画面のプロパティのデザインの効果の
 次のアニメーション効果をメニューとヒントに使用するのチェックを外すと
 治りました。

ありがとうございました。


237:デフォルトの名無しさん
09/12/09 15:29:32
CButton でクイックされたらそのまま凹んだまま、押しボタンのように動きにしたいのですが、
(もう一度クリックすると元に戻る) どのようなコードでできるでしょうか?


238:デフォルトの名無しさん
09/12/09 15:45:59
>>237
チェックボックスのスタイルをBS_PUSHLIKEにすればいいかも

239:237
09/12/09 18:10:21
>>238
ありがとうございます。 ためしてみますm(_ _)m

240:デフォルトの名無しさん
09/12/09 22:48:44
エラーで困っているので助けてください。

error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です。
error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です
error LNK2001: 外部シンボル ""public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ)" は未解決です。
error LNK2019: 未解決の外部シンボル "public: virtual void __thiscallCDialog::OnInitDialog(void)" (?OnInitDialog@CDialog@@UAEXXZ) が
関数"public: virtual int __thiscall CprototypeApp::InitInstance(void)"(?InitInstance@CprototypeApp@@UAEHXZ) で参照されました

とエラーが出ていますが、原因がわからず困っています。

同じソースを別の人の環境で実行すると何もエラーも出ずにコンパイル・リンカーが通ります。
私も昨日までは通っていましたが、コーディングを設定ファイル?とかがおかしくなってしまったのか、
昨日のデータを使ってもリンカーエラーが出て困っています。

環境として、
自分   VisualStadio 2008 VC++(MFC)
別の人  VisualStadio 2008 VC++(MFC)

本当に困っています。何か知っている方がいらっしゃったら力を貸してください。

241:デフォルトの名無しさん
09/12/09 23:02:46
出力ファイルを全て消してリビルドしる。
C/C++関係はそれで解決することが良くある。

242:240
09/12/10 00:07:23
>>241
出力ファイルとは、Solution内のDebugフォルダ内のことをさすのでしょうか?
昨日から勉強を始めたため、ほんとにわからないことが多くてすみません。

243:デフォルトの名無しさん
09/12/10 22:12:26
MFCにライブラリパスが通ってないんだろ。

ライブラリパスはソースではなく、コンパイラの設定だから
PCが変われば設定が違う可能性がある。

ちょっと2008が手元にないんでアレだが2005で見ると
ツール→オプション→プロジェクトおよびソリューション→VC++ディレクトリ→ライブラリファイル
で設定できる。2008も似たようなもんだろ。

その設定をコンパイルが通るやつに合わせてみろ。


244:デフォルトの名無しさん
09/12/10 22:23:09
何だマルチだったのか

245:デフォルトの名無しさん
09/12/11 10:27:42
CWnd使ってVSの入力候補みたいな小窓を表示させたいんだけど、
popupで表示して小窓がアクティブ状態になると、メインウィンドウが
非アクティブ状態になってしまいます。小窓がアクティブ状態になっても
メインウィンドウがアクティブ状態を失わないようにするにはどうしたら良いですか?

246:デフォルトの名無しさん
09/12/11 12:49:33
WS_EX_PALETTEWINDOW

247:デフォルトの名無しさん
09/12/11 16:52:41
>>246
レスありがとう。ただ、WS_EX_PALETTEWINDOW指定しても、メインウィンドウが
非アクティブになってしまいます。何か他の設定が悪いのかも?

ダイアログベースで以下のような感じ

//CtestAppの中でウィンドウ登録
WNDCLASSEX wndclass;
wndclass.lpszClassName = L"TESTWINDOW";
wndclass.cbSize = sizeof(WNDCLASSEX);
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = DefWindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = m_hInstance;
wndclass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE));
wndclass.lpszMenuName = NULL;
wndclass.hIcon = LoadIcon(IDI_APPLICATION);
wndclass.hCursor = LoadCursor(IDC_ARROW);
wndclass.hIconSm = LoadIcon(IDI_APPLICATION);
RegisterClassEx(&wndclass);

//ボタン押された時にウィンドウ表示
void CtestDlg::OnBnClickedButton1()
{
CRect cr;
GetWindowRect(&cr);
m_cwnd.CreateEx(WS_EX_PALETTEWINDOW, L"TESTWINDOW", L"", WS_VISIBLE | WS_POPUP, cr.left, cr.top, 50, 50, GetSafeHwnd(), NULL, NULL);
}

248:デフォルトの名無しさん
09/12/11 19:16:14
戻してやればいいだけの気がするけど
MFCなんだからドッキングツールバーのソースでも読んで勉強すればいいよ

249:デフォルトの名無しさん
09/12/12 01:15:06
ツールウィンドウで作るんじゃなかったっけ?

250:デフォルトの名無しさん
09/12/12 01:42:47
#define WS_EX_PALETTEWINDOW   (WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST)

251:245
09/12/12 09:54:12
とりあえずソース読んで勉強してみます。レスしてくれた人たちありがとう。

252:デフォルトの名無しさん
09/12/12 10:12:06
メインウィンドウは非アクティブでいいんじゃね?
手持ちのアプリの動作でいうと
VC6はアクティブがどうであろうとメインもツールウィンドウもアクティブになりっぱなしでおかしい
VC2008はアクティブによってメインもツールウィンドウもちゃんと切り替わる
ってなってる

俺もツールウィンドウ作ったときにメッセージのやり取りがおかしくなったときに
VC6みたいにアクティブになりっぱなしになったことあるから
VC6ってバグりっぱで放置してあるだけだと思う

253:245
09/12/12 12:39:18
>>252
確かにVS2008だとアクティブ状態が移動しますね。ただ、作りたいのがツールウィンドウではなく、
VS2008で例えると、入力候補ウィンドウみたいなヤツなんです。これポップアップで出ますが、
フォーカスが移っても、親ウィンドウのアクティブ状態は変化ないですよね。

248さんが言ってた”戻せばいい”というのをヒントに、親ウィンドウの
WM_NCACTIVATEとWM_ACTIVATEAPPで細工したら希望通りの動作になりました。

254:デフォルトの名無しさん
09/12/12 13:11:45
WS_EX_NOACTIVATEは使えないか?

255:デフォルトの名無しさん
09/12/15 15:00:48
どなたかXPでマルチモニタ環境のあるかたに試していただきたいのですが、

VS2005やVS2008でダイアログベースのプロジェクトを作り、
標準で用意される2つのダイアログ(メインとバージョン情報)に
「サイズ変更枠」と「最大化ボタン」のプロパティをセットしてビルド。

デバッグ開始し、メインダイアログを最大化。

特に問題無い。

そのままバージョン情報ダイアログを出してこっちも最大化。

セカンダリモニタにほんのちょっとウィンドウ枠がはみ出る。

という現象が発生するのですが、
他のかたの環境でも発生しますでしょうか。

256:デフォルトの名無しさん
09/12/15 19:46:45
特に問題無い

257:デフォルトの名無しさん
09/12/15 20:26:08
>>256
あれ、発生しませんか。
社内ではXPマシンすべてで発生するんです。
同じモニタだから、ハードウェア的な問題なんだろうか。
ありがとうございます。

258:デフォルトの名無しさん
09/12/16 18:28:00
画面端同士で同じ場所参照してそうな仕様だな
それだと他のウィンドウでも同じ現象が出るか

259:ぷれ
09/12/16 23:51:16
はじめまして、画像ビューアを作ろうと思っているのですが
CWinthreadにCScrollView派生クラスのハンドルを渡してスレッド側から、
CScrollViewのOnPrepareDC(&dc)をコールすると以下でエラーが発生します。

CWnd::AssertValid()
 CHandleMap* pMap = afxMapHWND();
 ASSERT(pMap != NULL);//<--ここでエラー

どうすれば問題解決するでしょうか。
よろしくお願いします。(関連するソースは以下)

CThreadxxx ::CThead(HWND hwnd)
{
m_pMainWnd = AfxGetMainWnd();
m_pView = (CScrollViewxxx*)CWnd::FromHandle(hwnd);
}

int CThreadxxx ::Run()
{
 while (WaitForSingleObject(m_hEventKill, 0) == WAIT_TIMEOUT){
  if(m_hWndView){
   CClientDC dc(m_pView);
   m_pView->OnPrepareDC(&dc);
   m_pView->Render(&dc);//計算描画処理(重い)
  }
 }
}

260:デフォルトの名無しさん
09/12/17 08:52:31
MFCのドキュメント・ビューアーキテクチャ関数はワーカースレッドから呼ぶとエラーになるものあるんだよね
ワーカースレッドからはユーザーメッセージ定義してメッセージハンドラで凌いでた
SendMessage()で渡せばメインスレッドで処理されて帰ってくる

261:ぷれ
09/12/17 09:20:35
>>269回答ありがとうございます。
メッセージで処理してみましたが遅くなってしまいました。
早くする方法はありますでしょうか?ソースは↓みたいな感じです。
int CThreadxxx ::Run()
{
 if(m_hWndView)
 {
  PostMessage(m_hWndView,WM_USER_START_RENDER, 0, 0);
  if(WaitForSingleObject(m_hEventEndRender,10000) == WAIT_TIMEOUT));
  {
   return ;
 }
}

BOOL CScrollViewxxx::PreTranslateMessage(MSG* pMsg)
{
 CDC *pDC = NULL ;
 CClientDC dc(this);
 switch (pMsg->message){
  case WM_USER_START_RENDER:
  OnPrepareDC(&dc);
  SetOrigin(&dc);
  Render(&dc);
  //m_pThreadRender:スレッド
  SetEvent(m_pThreadRender->m_hEventEndRender);
  break;
 }
}




262:デフォルトの名無しさん
09/12/17 10:25:02
Render()はワーカースレッドに置いたままでいいんじゃないのか?
こんなイメージ

int CThreadxxx::Run()
{
while(WaitForSingleObject(m_hEventEndRender,10000) == WAIT_TIMEOUT)){
if(m_hWndView){
CClientDC dc(m_pView);
m_pView->SendMessage(WM_USER_START_RENDER, 0, (LPARAM)(CDC*)&dc)) //制御待たせるためにSendMessage
  m_pView->Render(&dc);
}
}
}

LRESULT CScrollViewxxx::WindowProc(UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (pMsg->message){
  case WM_USER_START_RENDER:
{
ASSERT_KINDOF(CDC, lParam);
CDC* pDC((CDC*)lParam);
if(pDC->GetSafeHdc() != NULL) {
OnPrepareDC(pDC);
SetOrigin(pDC);
}

return 0;
}

return CView::WindowProc(msg, wParam, lParam);
}

263:ぷれ
09/12/17 11:33:51
>>262ありがとうございます。
早速試してみます。

264:ぷれ
09/12/17 12:58:42
>>262 試してみましたがまだ遅いです。メッセージ処理を改良すべきだとは思うのですが何か案はございますでしょうか?
試したソースはこんな感じです。
int CThreadxxx::Run()
{
if(m_hWndView)
{
CClientDC dc(m_pView);
m_pView->SendMessage(WM_USER_START_RENDER, 0, (LPARAM)(CDC*)&dc);
CRenderInfo renderInfo;
m_pView->Render(&dc);
SetEvent(m_hEventStop);
}
}

LRESULT CGdsView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
CDC* pDC = (CDC*)lParam;
switch (message)
{
case WM_USER_START_RENDER:
ASSERT_KINDOF(CDC, pDC);
if(pDC->GetSafeHdc() != NULL)
{
OnPrepareDC(pDC);
SetOrigin(pDC);
}
return 0;
default:
break;
}
return CScrollView::WindowProc(message, wParam, lParam);
}

265:ぷれ
09/12/17 13:01:47
↓見たいな処理をどこかに入れ込めばいいと思うのですがどのタイミングに埋め込むべきか
判断に迷ってます。
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if(msg.message == WM_USER_START_RENDER)
{
CDC* pDC = (CDC*)lParam;
ASSERT_KINDOF(CDC, pDC);
if(pDC->GetSafeHdc() != NULL)
{
OnPrepareDC(pDC);
SetOrigin(pDC);
}

}else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}

266:デフォルトの名無しさん
09/12/17 20:12:13
ワーカースレッドでDIBを作らせれば済む話じゃないの?
何か無駄に話を難しくしているように見えるぞ。

267:デフォルトの名無しさん
09/12/19 11:16:15

クラス A
CListBox m_listA

クラス B
CListBox m_listB

クラス C
fnCommon()


クラスA、クラスBの処理が共通なので、
クラスCの関数を共通処理関数としようと思っています・

クラスCの関数に、クラスAのm_listAなどのメンバを引数に渡せなくて
困っています。どうやればいいでしょうか?


クラスAの処理
{
クラスC: :fnCommon( m_listA );
}

クラスCの処理
クラスC::fnCommon( ClistBox a)
{
a.set・・・();
}

ではうまくいきませんでした、どうすれば別のクラスのメンバを引数として渡せるのでしょうか?
最近はじめたばかりでググっても解決策が見つかりません。
よろしくお願いします。

268:デフォルトの名無しさん
09/12/19 12:11:08
>>267
ポインタを渡す、もしくは、CListBoxの派生クラスを作ってそこで処理する。
ClassC::fnCommon(&m_listA);
クラスC::fnCommon(CListBox* a)
{
a->set・・・();
}

CMyListBoxクラス内にfnCommon関数を宣言・定義
クラスAの処理
CMyListBox m_listA;
m_listA.fnCommon();


269: [―{}@{}@{}-] デフォルトの名無しさん
09/12/19 21:52:40
Windowsのコントロールって複数のウィンドウで同時に共用できないんでしたっけ?
具体的にはCPropertySheetで作成したコントロールを複数のCPropertyPageに貼りつけて
共用するとか。これができると、CListCtrlやCTreeCtrlやカスタムコントロールで便利なもんで・・・・
試しにやってみたら1枚目には貼れるのですが、2枚目以降は駄目でした。(表示されない。エラー
は無し。)

270:デフォルトの名無しさん
09/12/19 22:05:05
コントロールはただのウインドウだからどこにでも張り付くし、後から移動することも可能。

271:デフォルトの名無しさん
09/12/19 22:20:50
左側のツリーで右側のプロパティページを切り替えるのはよくあるな

272: [―{}@{}@{}-] デフォルトの名無しさん
09/12/20 04:50:40
>>270 >>271
サンクス。OnSetActive()の段階でコントロールにSetParent()したらイベントが行く様に
なったんだけど、開始ページ以外のCTreeCtrlの文字が表示されない。(マウスクリックすると
表示される。)コントロールにUpdateWindow()などしても更新されないから、更新イベントが
CTreeCtrl内のコントロールに行き渡ってないみたいだ・・・・

273:268
09/12/21 00:01:39
>>267
親切にありがとうございました。
無事解決しました。

274:デフォルトの名無しさん
09/12/23 00:06:53
MFC SDI のプログラムで、このように取得したドキュメントの文字を、CString 型の変数に取得し、
配列へ格納したいのですがどうしたらできますでしょうか
CxxxDoc *pDoc = (CxxxDoc*)((CFrameWnd *)AfxGetMainWnd())->GetActiveDocument();

275:デフォルトの名無しさん
09/12/23 00:52:33
>このように取得したドキュメントの文字を

どのように取得したって?
取得できてないじゃん。

276:デフォルトの名無しさん
09/12/23 01:06:20
>>257
>>254です、
一応これでエディットビュー のドキュメント(テキスト)が
取得できるようになったのですが、このままでは256 文字がべたで配列に代入されてしまいます
一行づつ取得して、配列へ格納するにはどうしたらいいでしょうか?
CxxxDoc *pDoc = (CxxxDoc*)((CFrameWnd *)AfxGetMainWnd())->GetActiveDocument();
void* P = m_viewList.GetHead();
char buf[_MAX_PATH];
CEdit* pE;
pE = (CEdit*) P;
pE->GetWindowTextA((LPTSTR)buf,_MAX_PATH);

277:デフォルトの名無しさん
09/12/23 05:42:00
一行づつ切り分けて取得して、配列へ格納する。Enterの文字列で切り分ければ良い。


278:デフォルトの名無しさん
09/12/23 08:41:46
1行の読み込みを、
pE->GetLine(i, (LPTSTR)buf);
として、得ることにしたのですが、当然のことながら、改行コード以降にゴミが入っています
sizeof(buf); とかstrlen(buf); でサイズを得たいのですが上手く行きません
目的のデータ(文字列+改行コード)を得るコードを教えてもらえませんか?

279:デフォルトの名無しさん
09/12/23 09:11:09
CEditのメンバ一覧に目を通す時間すらないとは大変ですね。
あと、CEdit::GetLine(nIndex, lpszBuffer)は
lpszBufferの中身の先頭WORDにバッファ長が入っていることが前提だ。

280:デフォルトの名無しさん
09/12/23 09:55:09
CEditはCString と相性いいから簡単に扱えたはずだけど
わざわざ手間がかかるやり方でやってないか?
行数がとてつもなく多いとか、効率考えて普通と違う方法でやろうとしてるならいいけど

281:デフォルトの名無しさん
09/12/23 10:43:27
どうもみなさん、thxですこんな感じでできましたが、もう一息です、pE->ReplaceSel(result.c_str());で置換をしているのですが
置換後の文字列を置換前の文字列の位置に上書きしたいのですが、今のままだと、置換前、置換後の文字列両方表示されています、どこがおかしいでしょうか?
>>280
CString を使いたいのですが、<boost/regex.hpp> が使いたいので、文字列は*char かstd::string の方がベターなのです

char szBuf[256];
const int nRow = pE->GetLineCount();
for(int nIdx = 0; nIdx < nRow; ++nIdx) {
// テキストデータ取得。
const int iSize = pE->GetLine(nIdx, szBuf, sizeof(szBuf) - 1);
szBuf[iSize] = '\0';
reg_ex = "<.*?>";
result = re.RegularTagReplace(szBuf, reg_ex);// <boost/regex.hpp> でHTML タグを削除している
const int end = pE->GetWindowTextLength();
pE->SetSel(end, end); // 一番最後に持ってくる
result += "\r\n";
pE->ReplaceSel(result.c_str());
}

282:デフォルトの名無しさん
09/12/23 12:22:33
いちいち質問しないと解決しない問題とは思えないが

283:デフォルトの名無しさん
09/12/23 14:09:55
pE->SetSel(0, 0);
とかやってみるができないorz

284:デフォルトの名無しさん
09/12/23 15:18:25
全然関係ないけど、行単位でTAGを取り除く意味あるのか?
HTMLは特別な場合を除いて改行を無視するから
TAGのカッコの途中で改行が入ったりしてる場合もあるわけだが

285:デフォルトの名無しさん
09/12/23 16:37:33
>>284
行単位でタグを取り除くのには、他に目的があります、改行の必要な部分は、あとで
<br> をつけます、しかし上手くいかんな・・・


286:デフォルトの名無しさん
09/12/23 18:47:25
>>281です
他で聞いてみます。

287:デフォルトの名無しさん
09/12/27 23:43:33
質問です。

いろんなファイル形式の画像ファイル(特に48bitカラー)を読み込んで、データストリーム
(ピクセルごとのRGB情報)を取得したいと思ってます。

いまはGDI+のImageクラスで画像ファイルを開いて、Image.SaveでIStreamにデータ
ストリームをコピーした後、IStream.Writeでunsigned char[]にコピーするというコードを
試しているんですが、IStreamからunsigned char[]へのコピーがうまくいきません。
Writeの返り値はOkになってるし、コピーされたバイト数も正しいのに、配列は全て
0が入っているという状態です。

考えられる原因は何でしょうか?
あるいはもっと確実な方法があれば、お教えいただけると助かります。

288:デフォルトの名無しさん
09/12/28 00:31:42
>>287
IStream::Writeは、IStreamに書き出す、という意味だぞ。
取り出すならIStream::Read。引数の型で気付かなかったのか?

289:デフォルトの名無しさん
09/12/28 01:01:41
>>288
ありがとうございます。
明日試してみます。

290:デフォルトの名無しさん
09/12/30 01:43:31
VisualStudio2010のMFCってもう仕様変わらなそうかな。
主力は.netだろうしRCやRTMに向けてはそっちの調整だろうな。
リボンアプリの案件が来てて困ってる。2010はデザイナが付いてるし、
βで作っても問題なさそうな気がする。そう思いたいだけなんだけどね。
納期は5月だからβで作ったのを引き継げればいいのだが・・・。

291:デフォルトの名無しさん
09/12/30 01:47:52
>リボンアプリの案件

需要あんのか

292:デフォルトの名無しさん
09/12/30 02:02:55
OfficeはOffice2007、2010で始めて触りましたって人や
Win7が始めて使ったWindows(ペイントなんかがリボンアプリ)ですって人が大勢を占めるようになったら
需要としては結構出てきそう。
市販アプリでもPerfectDiskなんかは既にリボンUI採用してるね。

293:デフォルトの名無しさん
09/12/30 02:10:15
見た目の問題っぽい。客先は来年末までにWindows7にするみたいだし、
Officeも2010にもするらしいから、見た目を同じにしたいらしい。
個人的には今までのツールバーみたいに、他の処理と無関係なアイコンが
並ばなくていいという点だけは評価できる。ツールバー消したりとか
しなくていいし。機能別にタブみたいなグループでまとめちゃえばいいし。
ただ無駄に高さを取るのがどうしても馴染めない。

294:デフォルトの名無しさん
10/01/02 20:34:39
馬鹿は使うな!

以上!


295:デフォルトの名無しさん
10/01/05 08:20:54
VC6から2008に以降したら文字列でえらい苦労した。
出来上がったソフトを他のPCで動かそうとしたら起動せず、
イベントログでSideBySideエラーになっていた。
他の人に送ったらマニフェストがどうたらこうたらとか・・・
わけわかんないのでもう一台のPCでコンパイルしようとしたらエラーが出る。
そうか、ExpressにはMFCが入っていないんだね。

最近、自分が浦島太郎に思えることが多いですよ・・・

296:デフォルトの名無しさん
10/01/05 11:41:56
MFC付きの有料のを買えばいいだけですよ。

297:デフォルトの名無しさん
10/01/05 19:12:30
VC6のランタイムはXP以降ならOS標準で入っているからな。
まあ2008の場合はWinSxSへのコピーのみでマニフェストでアクセス、
という今までと違う変則的な方法だから解り難くてもしようがない。
不評だったのか、2010ではシステムフォルダにもコピーされる仕様に戻るらしい。

298:デフォルトの名無しさん
10/01/06 09:16:31
VC2008でMFCダイアログベースなどのプロジェクトを作ると、
メッセージマップのところに
//}}AFX_MSG_MAP
というものが入っているのですが(閉じるほうのみ)、
これってVC6などでClassWizardのために入っていたものですよね?
VC2008でもなにか意味のあるものなのでしょうか?
それともテンプレートの残骸?

299:デフォルトの名無しさん
10/01/06 10:02:34
ISAPIフィルタでレスポンスの内容を編集したく
OnSendRawData()ではレスポンスを返さないようにするために
pRawData->cbInData = (DWORD)0;
pRawData->cbInBuffer = (DWORD)0;
として
OnEndOfRequest()で
pfc->WriteClient()
で編集した内容を返そうとしています。
しかし、OnSendRawData()で
pRawData->cbInData = (DWORD)0;
pRawData->cbInBuffer = (DWORD)0;
を入れるとOnEndOfRequest()でWriteClient()をしてもレスポンスが
返されません。
なぜこのような結果になるのでしょうか?


300:299
10/01/06 10:11:46
わかりました。
WriteClient()を呼ぶとOnSendRawData()が発生するんですね。

301:デフォルトの名無しさん
10/01/25 14:38:28
CInternetSessionのメンバの
GetFtpConnectionとかでタイムアウトを設定できないでしょうか?



302:デフォルトの名無しさん
10/01/25 23:15:39
試したことないから知らんけど設定自体はあるね

303:デフォルトの名無しさん
10/02/03 01:38:21
ミューテックスオブジェクトについて、質問です。
環境は、VC6でMFCダイアログベースです。

2つのアプリケーションAとBを作っているのですが、
以下の処理をそれぞれ追加します。
A:ボタン押下でBをミューテックスオブジェクトを使って排他的に呼出す。
B:ミューテックスオブジェクトを保持。

@Aにあるボタン押下でBだけは呼出せたのですが、ミューテックスオブジェクトを
使って排他的な呼出し方にする方法が分かりません。
ABでミューテックスオブジェクトを保持する方法が分かりません。

自アプリケーション の2重起動禁止の場合、CreateMutexを使っていたのですが、
上記の場合、AとBをどのようにすればいいでしょうか?どなたか宜しくお願いします。

304:デフォルトの名無しさん
10/02/03 08:01:24
>>303
Aからボタン押下でBを起動、
ただし以前Aから起動した事のあるBが残っている場合は
新たに起動はしない、ってことでOK?
そういうのだったら、B起動時にそのプロセスハンドルを残しておいて、
次のボタン押下時にGetExitCodeProcessで以前起動したプロセスが終了したか確認、とか。
手動でならBを複数起動できる、という必要性がないならBの二重起動禁止で十分だけど。

305:デフォルトの名無しさん
10/02/03 10:08:47
CStringArrayのシリアライズ化で、ファイル保存はできたのですが、
これを読み込んでCStringArrayに再格納できませんでした。どのようにすればいいのでしょうか?


//シリアライズ
CStringArray aBuf;

aBuf.Add( _T("aaa") );
aBuf.Add( _T("bbb") );
aBuf.Add( _T("ccc") );

CFile f;
BOOL bRet = f.Open( _T("hoge.txt"), CFile::modeCreate | CFile::modeWrite );
if( bRet == FALSE) {
return true;
}
// アーカイブを作成
CArchive ar( &f, CArchive::store );
TRY {
aBuf.Serialize( ar );
}
CATCH_ALL(e) {
ar.Close();
f.Close();
return 0;
}

306:デフォルトの名無しさん
10/02/03 11:52:32
>>305
読み込むほうのソースを出さないと誰もわからない。

307:305
10/02/03 15:41:45
>>306

失礼しました。
サンプルをみて書いたのですが、以下のコードになります。


try{
CStringArray m_saMyArray;
CFile in(_T("hoge.txt"), CFile::modeRead);
CArchive ar(&in, CArchive::load);
CString buffer;
m_saMyArray.SetSize(0);
for(int i = 0; ar.ReadString(buffer); i++) {
m_saMyArray.Add(buffer);
}
ar.Close();
in.Close();
} catch(CFileException e)
{
AfxMessageBox(_T("Read Error !!"));
}

ar.ReadString(buffer)で bufferにすべてのデータが格納されました。
根本的に、読込み方法が間違っているのでしょうか?
ご教授おねがいしますm(_ _)m


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4332日前に更新/103 KB
担当:undef