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

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

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

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

Aは「知ってるつもり君」、「えらそうに解説する人」お断りと
いうことで。
0756デフォルトの名無しさんNGNG
>>755
当たり前。
0757 NGNG
画面に出たウィンドウの特定のボタンを自動的に押す という
方法はどのようにするのでしょうか。
spyというやつでid(?)取得してどうこうするのでしょうか?途方にくれてます。
0758デフォルトの名無しさんNGNG
できないことないけど、なんでそんなことしたいの?

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

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

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

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

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

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

#include <afxtempl.h>

struct cell_t {
  int m_data;
};

struct map_t : public CArray< CArray< cell_t, cell_t& >, CArray< cell_t, cell_t& >& >
{
  map_t(int width = 1, int height = 1)
  {
    SetSize(height);
    for (int i = 0; i < height; i++)
      (*this)[i].SetSize(width);
  }
};

int main()
{
  map_t map(10, 10);

  map[9][9].m_data = 777;
  printf("%d\n", map[9][9].m_data);

  return 0;
}
0786デフォルトの名無しさんNGNG
なるほど、直接使うのではなくクラスを作るのですね。
>struct map_t : public CArray< CArray< cell_t, cell_t& >, CArray< cell_t, cell_t& >& >
CArrayを継承した構造体map_tを作ったみたいんですが、後ろのほうの< CArray< cell_t, cell_t& >, CArray< cell_t, cell_t& >& >
の意味がわかりませんが、もしよければ教えてもらえませんでしょうか?
あとクラスで書くときはどうなるとか、、
MFCから始めたなんちゃってプログラマで、構造体いじった事もなくてすみません(;´Д`

2次元配列ってC習う時良く使うが、実務ではあまり使わないのでしょうか?
0787初心者NGNG
質問させていただきます。
VisualC++6で
char型の配列buf[0] buf[1] buf[2]に格納した8bitデータ3つを
24bitデータにまとめたいのですがどうしたらよいでしょうか。

例********************************
buf[0]:0xAA
buf[1]:0xBB
buf[2]:0xCC
の場合
0xAABBCCにまとめる。
**********************************

int data = 0x000000;
data = (buf[2] * 0x010000) + (buf[3] * 0x000100) + buf[4];
とやってみたのですが、おかしくなります。
どなたかご教授願います。
0788デフォルトの名無しさんNGNG
キャストしろや>787
0789デフォルトの名無しさんNGNG
>787
こういうことだ
BYTE buf[4];
buf[0] = 0xcc;
buf[1] = 0xbb;
buf[2] = 0xaa;
buf[3] = 0;
DWORD data = *(DWORD*)buf;
0790初心者NGNG
int data = 0x000000;
data = ((unsigned long)buf[0] * 0x010000) + ((unsigned long)buf[1] * 0x000100) + (unsigned long)buf[2];
とも
unsigned long datasize = 0L;
datasize = (unsigned long)buf[2];
datasize += (unsigned long)buf[1] << 8;
datasize += (unsigned long)buf[0] << 16;
ともやってみたんですが、やっぱりおかしくなります。
どこが間違っているのでしょうか?
0791789NGNG
だからキャストしろって>790
0792789NGNG
それと、インディアンで検索しとけ>790
0793785NGNG
>>786
「クラスTを要素に持つCArrayの宣言」が CArray< T, T& > array; なんですね。
だから「『クラスTを要素に持つCArray』のCArray」なら、
CArray< CArray< T, T& >, CArray< T, T& > > map; となる。

785をtypedefでわかりやすく書けば、
typedef CArray< cell_t, cell_t& > array_t;
typedef CArray< array_t, array_t& > array_of_array_t;
class map_t : public array_of_array_t { ... }
となるでしょう。

785で構造体(struct)にしたのは、特に意味ないです。
structはデフォルトで全メンバがpublicなだけで、それ以外はクラス(class)と同じと思ってください。

あとmap_tをarray_of_array_tから派生させたのは、
map_t自体のコンストラクタを定義したかったからで、
2次元配列だから特に必須ってわけではないです。
0794790NGNG
>789
DWORD data = 0x000000;
data = ((BYTE)buf[0] * 0x010000) + ((BYTE)buf[1] * 0x000100) + (BYTE)buf[2];
で
できました!
ありがとうございます!
0795デフォルトの名無しさんNGNG
デカルチャ。
CArray< CArray< T, T& >, CArray< T, T& > > からクラス派生出来るのはちょっとデカルチャでした。
本当にプログラマとして仕事できるかどうか心配になってきた(大学3年)
なんとか使えそうです、ありがとうございました。
0796デフォルトの名無しさんNGNG
>>794
data = buf[0]<<16 | buf[1]<<8 | buf[2];
の方がコーディング量少ないぞ(藁
0797 NGNG
union.............
0798デフォルトの名無しさん NGNG
>>786
なぜint型の配列ではいけないのか小一時間問い詰めたい
0799デフォルトの名無しさんNGNG
メールソフトのサンプルプログラムってどこかにありませんか?
0800デフォルトの名無しさんNGNG
>798
同じマスに色んな情報を詰め込みたいので、クラスを使いたい
map[2][3].cell = 1 ,map[2][3].character = player ←みたいな使い方で、、
マップはサイズ変更可能なので、できればベクターのほうが使いやすい

もしかしたらとんでもない勘違いしたかな?小一時間教えてくださいm(_ _)m
0801デフォルトの名無しさんNGNG
template<class T>
class GikoMap {
int x_;
int y_;
T *vec_;
public:
GikoMap(int x, int y) : x_(x), y_(y), vec_(new T[x*y]) {}
~GikoMap() { delete [] vec_; }
T &get(int x, int y) const { return vec_[y * y_ + x]; }
};
0802デフォルトの名無しさんNGNG
s/get/cell/
0803777NGNG
みなさんラジオボタンを使うとき(CButtonメンバ関数を使うとき)は
どうやってるのでしょうか
0804デフォルトの名無しさんNGNG
>>803
普通に1番目だけグループスタイルをつけてグループ化して、
整数型のDDX変数にしてる。
個々のラジオボタンを操作することはほとんどないけど、
もしやるならDDX変数を解さずに直接
GetDlgItem(ID_RADIO1)->SetCheck() とか。
0805デフォルトの名無しさんNGNG
CButton* radio1 = (CButton*)GetDlgItem(ID_RADIO1);
radio1->SetCheck(1);

というようなGetDlgItemの返り値をキャストして使うのは
状況によっては動かない場合があると聞いたのですがどうなんでしょう。
入門書によく載ってますが。
0806デフォルトの名無しさんNGNG
>>805
CButtonとCWndの継承関係から考えるに、それはだめじゃないの?

CButton* radio1 = (CButton*)GetDlgItem(ID_RADIO1);
((CWnd*)radio1)->SetCheck(1);

ならよいかも。というより、すなおに

CWnd* radio1 = GetDlgItem(ID_RADIO1);
radio1->SetCheck(1);

ではないか。
0807806NGNG
あ、SetCheckってCWndのメンバにないのか。
0808デフォルトの名無しさんNGNG
>CButtonとCWndの継承関係から考えるに、それはだめじゃないの?

でもMFCはそれを動くようにしてるそうです。

>CWnd* radio1 = GetDlgItem(ID_RADIO1);
>radio1->SetCheck(1);

SetCheck()はCWndのメンバでは無いのですが良いのでしょうか?
0809デフォルトの名無しさんNGNG
>>804
>普通に1番目だけグループスタイルをつけてグループ化して、
>整数型のDDX変数にしてる。

自分、わざわざ各ボタンでGetCheck、SetCheckしてました。
0810806NGNG
>でもMFCはそれを動くようにしてるそうです。

うがー確かに。
ソースを見るとCButtonにはメンバ変数がないようなので
(CButton*)を(CWnd*)にキャストしてもポインタがずれなくて大丈夫なのかな?
0811デフォルトの名無しさんNGNG
DDX変数で

UpdateData();
int n = m_num_radio;

で選択ボタンを判定したり

m_num_radio = 3;
UpdateData(FALSE);

で4番目のボタンを選択したりというのは定石??
0812デフォルトの名無しさんNGNG
>>806>>810
おめーえらそーに嘘教えてんじゃねーよ!!
>>805はダウンキャストの危険性についての話だろが!
CButtonはCWndをpublic継承してんだから、
CButtonをキャストなしにCWndと見なすのは全然問題ねーだろが!

>>805
C++のdynamic_castやstatic_cast、reinterpret_castについて調べみ。
いろいろ出てくるから。
0813デフォルトの名無しさんNGNG
>>805
Note that it's always safer to check for the validity of the results from GetDlgItem.
0814デフォルトの名無しさんNGNG
MFC ActiveX ControlWizardで生成したプロジェクトに
ダイアログを追加して、
その上にWeb Browserコントロールを載せているのですが
そうすると元のActiveX自体をコールできなくなってしまいます。

ちなみに、ActiveXでは無くMFC AppWizard(exe)などでやると
正常に動いてくれます。

どうしたらいいのでしょうか?
0815デフォルトの名無しさんNGNG
age
0816デフォルトの名無しさんNGNG
MFCなんて覚えても技術力は一切あがらないねぇハァ・・・・
0817デフォルトの名無しさんNGNG
VBでやるよりは困難が多いので時間は掛かるが上がると思う>技術力
0818デフォルトの名無しさんNGNG
MFCのスタティックライブラリを使ってビルドすると、
AfxLoadLibrary()、AfxFreeLibrary()
が使えないんだけど、どういうわけですか?
0819デフォルトの名無しさんNGNG
ロードしたりフリーする必要がないからなのでは?
0820818NGNG
>819
じゃ、APIの LoadLibraly、FreeLibraly使って問題ないわけですね?

ロードされる DLLでは、MFCの共有 DLL使ってるんです。で、
MSDNには、「グローバルなMFC の状態を破損するのを防ぎます」と
あるのが気になるんですが。このグローバルって...
0821デフォルトの名無しさんNGNG
あんまり詳しくないのですが、
自分はMFCスタティックで、
呼び出すDLLがMFCダイナミックだとどうなるんですかね?
リンケージがうまくいかないような気もするんですが。
0822デフォルトの名無しさんNGNG
>>821
はい。いかなくなります。スマートな解決方法は多分ありません。
0823デフォルトの名無しさんNGNG
>>821
自分も DLL な MFC を使うしかないと思われ。
逆は不可。
0824超初心者NGNG
MFCを今までやっていたんですが、DirectXもやってみたくなりました。
それで少し聞きたいんですがMFCでDirectXを取り込むような形で使えますか?
使えるとしたらどんな形でどうやるんでしょうか??
0825デフォルトの名無しさんNGNG
>>823
逆は不可とは?
DLLをスタティックに出来るなら、自分がスタティックでもいいだろ?
0826デフォルトの名無しさんNGNG
質問。

Win2000でCOleDateTimeのGetCurrentTime();をやってみたんだけど
1899年12月30日になります。

なんで?
0827デフォルトの名無しさんNGNG
2000年問題と思われw
0828826NGNG
ごめんなさい。
使い方間違ってた。
COleDateTime today;
today.GetCurrentTime();ってやってたよ・・・
正しくは
today = COleDateTime::GetCurrentTime();だった。逝っとく。
0829デフォルトの名無しさんNGNG
標準のチェックボックスCCheckListBoxに対して、ビットマップパターンを
差し替えることってできますか?
ボタンだったら、CBitmapButtonでできるのですが・・・・
0830デフォルトの名無しさんNGNG
>>829
オーナードロー
0831デフォルトの名無しさんNGNG
いつもお世話になってます、また馬鹿な質問しますがあまり怒らないで下さい(;´Д`)
SDIウインドウの下に(ステータスバーの上)に、エディットボックスを追加したいけどどうすればいいんですか?
RPGらしきもの作ってますがチャット機能も追加しょうと思って、入力できる場所を用意しないといけないが、
一々ダイアログを出してはあまり美しくないので、エンターキーを押すと下のほうにエディットボックスが出てくれると
いいなーと思って、、 宜しくおねがいします。
0832ネット初心者NGNG
チャットソフトにファイル転送の機能をつけたいのですが、なにか簡単な方法ありますか?
分かりやすいサンプルあればいいんですが、、VCのサンプル分かりにくいですね。
CSocketFileとCArchive使うまでは分かったが、なかなか実装できない。なにかヒントでも、、
0833 NGNG
>832
ファイルを開いてその内容をチャットと同じ方式で転送。
0834デフォルトの名無しさんNGNG
秀丸みたいにCRichEditCtrlにハイパーリンク付けられますか?
文字のサイズや色を変える事しかわからないっす。
厨房質問でスマソ
0835デフォルトの名無しさんNGNG
>>834
秀丸などのエディタは、RichEditは使ってないよ。

で、EM_AUTOURLDETECT
ってのがあるけど、Win2000限定かも
0836マッハNGNG
ひとつの同じコマンドボタンを一回、二回と押すごとに、線を表示させることは
できるのでしょうか?そのとき、前に表示された線はそのまま残していきたいのですが・・。
0837デフォルトの名無しさんNGNG
>>836
できるよ。
0838デフォルトの名無しさんNGNG
>>834
自分で文字列を抽出してリンク張れば出来る。
0839デフォルトの名無しさんNGNG
MFCでVBにある、Hex(number)のような、
10進数から16進数への変換関数はないでしょうか?
あるのでしたら、関数名だけでも結構ですので教えてください。
0840デフォルトの名無しさんNGNG
>>839

16進数字列にしたいの?
MFCは知らないけど、sprintf()を使えば?

str=sprintf("%X",num);

こんな感じ。
0841840NGNG
あ、numは整数値ね。
もし、10進数字列を16進数字列にしたいのなら、atoiやatolを使って数値にしておいてね。

str=sprintf("%X",atoi(dec));
  
0842デフォルトの名無しさんNGNG
>>840-841
それじゃ、コンパイルが通らない
0843840NGNG
>>842

おおっと、Perlと勘違いした(汗

sprintf(str,"%X",num);
sprintf(str,"%X",atoi(dec));

だね(汗

サンクス!!
0844844NGNG
>>845
なんとか出来そうっす。
ヒントサンクス
0845間違えた鬱だし能NGNG
間違い>835サンクス
0846デフォルトの名無しさんNGNG
839です。
>>843さん
 ありがとうございます。
 sprintfでやってみます。
0847デフォルトの名無しさんNGNG
MFCならCStringのFormat()がありますよ。

CString strResult;
strResult.Format(_T("%X"), num);
0848まいったねNGNG
こんなロジックのプログラムがあったんだが・・

MFCのダイアログベースのプログラムなんですが

1) CTestAppでTestMainという関数をスレッド使って呼び込む
2) CTestAppでCTestDlgのダイアログを表示
3) TestMainの関数内のfor(;;)で永久ループ
処理としてグローバルにある終了フラグを見続ける
TRUEならWM_CLOCEをPostして終了
4) CTestDlgのダイアログ内で終了ボタンを押したらグローバルにある終了フラグをTRUEにする

ある特定ファイルそ検索してて見つかったらなにか処理をするというプログラムなんですが
せっかくスレッドを作ってやってもその中で永久ループしてるので意味無しでした・・
おかげさまでCPU稼働率が常に100%な業務アプリです^^;

これって普通の作り方なんでしょうか?
違うと思いたい・・・
0849デフォルトの名無しさんNGNG
>>848
イベントオブジェクトでも使ったらちっとはマシになる?
0850デフォルトの名無しさんNGNG
その3が、終了フラグを見るためだけにループしてるなら、最悪。
マルチスレッドとか、それ以前の問題。
とっととイベントオブジェクト+WaitFor〜系API使え
0851デフォルトの名無しさんNGNG
>>848
それが普通かどうかはともかく、
ループの中に Sleep(0); を入れるだけで
一気に負荷が減ります。
0852まいったねNGNG
やっぱりforでループさせといて終了フラグを待つなんてのは
かなーりボトルネックなってますよね。
0853デフォルトの名無しさんNGNG
CPUが複数あるんならいいんでない?
どうせあまってんだろ。
HDDもどうせATAだろうし(藁
0854デフォルトの名無しさんNGNG
ついでに監視スレッドの優先度も一個下げとけ。

だが二度とそんなクソプログラムは世に出すな
0855まいったねNGNG
私に引き継がれたんだが、私で5人目だ・・・
考えてみれば私以外皆、MFC初心者か大学出の新卒が作った奴だった^^;

ループの前ではSetTimer使って、タイマー使用フラグを立ててるだけ・・
ループ中にファイル検索して見つかったらメイン処理を行う。
うーん、素直にWM_TIMER拾ったらファイル検索してメイン処理したほうがいいような・・

やっぱりC言語初心者のやつが作った物はこんなもんなんだろうか

Sleepは試しましたが駄目でしたね。

あと残念ながらCPUは一つしかつんでませんので。
HDDはATAでした。
■ このスレッドは過去ログ倉庫に格納されています