トップページ⇒tech
1001コメント288KB

■MFC相談室 mfc13d.dll■

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん05/03/07 16:19:56
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■ MFC相談室 MFC12.dll■
http://pc5.2ch.net/test/read.cgi/tech/1096848771/

過去ログは >>2-5 の辺り。
0153デフォルトの名無しさん2005/04/05(火) 15:48:32
>>152
「うまく動きません」を説明するところから始めようか。
01541522005/04/05(火) 16:38:49
>>153
そうですね。
まず、LoadBitmapsをオーバーライドしてファイルのビットマップを
開くようにしています。
で、LoadImageしたハンドルをそれぞれm_bitmap、m_bitmapSel、
m_bitmapFocus、m_bitmapDisabledにアタッチします。
この時に、ついでにm_bitmapに割り当てるビットマップを使って
リージョンを作成し、SetWindowRgnしています。

DrawItemでは、CBitmapButton::DrawItem(lpDrawItemStruct)をした
後に自分で文字乗せをしています。

この状態で走らせると、ボタンの押下とかでちゃんとリージョンが
効いている事が確認出来るのですが、表示の方はリージョンで切り
取られず、元の四角いビットマップ画像が出てしまいます。

画像の描画をリージョン内に止めるにはどうすればいいのでしょう。
0155デフォルトの名無しさん2005/04/05(火) 17:09:33
>>154
WS_CLIPSIBLINGS
0156デフォルトの名無しさん2005/04/05(火) 17:14:12
>>152
この前から何度も質問しているんだから、もう少し質問の仕方巧くなろうよ…
0157デフォルトの名無しさん2005/04/05(火) 17:36:30
>>155
期待する動作を得ることができました。
ありがとうございます。

>>156
質問、初めてなんですけどねw
確かに質問の仕方は悪かったですね。
以後気を付けるようにします。
0158デフォルトの名無しさん2005/04/05(火) 21:21:08
ダイアログ内にエディットボックスを配置して、
その入力補助みたいなことをやりたいのです。

エディットボックスの変更によってEN_CHANGEが送られてきたときに、
それがユーザによるものなのか、プログラム自身によるものなのかを見分けるには
どうするのが定番なのでしょうか?
0159デフォルトの名無しさん2005/04/05(火) 21:26:44
陸、海、空オンライン、ただ今鋭意!開発中!

小規模板にある、MMO製作プロジェクトぉ

厨房こぃ!
01601582005/04/05(火) 21:30:18
ちなみに、今のところテキストボックスがフォーカスを持っているかで判定しています。
問題無ければこれで行こうと思ってるんですが。
0161デフォルトの名無しさん2005/04/05(火) 22:52:02
リストボックスを複数選択可能にして選択されているアイテムを全て取得するにはどうすればいいですか?
0162デフォルトの名無しさん2005/04/05(火) 23:42:39
>>161
MSDNを見ようよ。
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_mfc_clistbox_class_members.asp
0163デフォルトの名無しさん2005/04/06(水) 14:26:50
>>151
CMapはインチキくさいの? std::mapはつかえないんだわ。
コンテナで、mapは、Dllの引数などにつかえないらしくってさ。
http://support.microsoft.com/default.aspx?scid=kb;JA;168958
0164デフォルトの名無しさん2005/04/06(水) 16:00:28
intの値を、文字列数値としてCStringに入れるにはどうしたら良いで塚?
0165デフォルトの名無しさん2005/04/06(水) 16:07:16
>>164
CString::Format()
0166デフォルトの名無しさん2005/04/06(水) 16:07:38
>>164
see CString::Format
0167デフォルトの名無しさん2005/04/06(水) 16:21:37
int i=100;
CString str;
str.Format("%d",i);
if(str=="100")
printf("OK\n");
else
printf("ゴルア\n");
0168デフォルトの名無しさん2005/04/06(水) 16:53:15
いつからココは凄い勢いで答えるスレになりましたか
0169デフォルトの名無しさん2005/04/06(水) 18:01:25
int i=100;
char a[20];
itoa(i,a,10);
CString str=a;
if(str=="100")
printf("OK\n");
else
printf("orz\n");
0170デフォルトの名無しさん2005/04/06(水) 18:12:09
CMapおせーてよ
0171デフォルトの名無しさん2005/04/06(水) 18:15:45
>>169
20の根拠は?
0172デフォルトの名無しさん2005/04/06(水) 18:21:07
>>171
んなもん根拠ないでしょ。一例なだけで。
0173デフォルトの名無しさん2005/04/06(水) 18:36:26
実行Exeのファイルパス取れますか?
0174デフォルトの名無しさん2005/04/06(水) 18:38:15
20桁くらいのサイズなら2^32までの数字は文字列に
収まるだろう。char a[4]とかだと数字の1000000は
文字列として格納出来ない
0175デフォルトの名無しさん2005/04/06(水) 18:39:41
>>174
GetCurrentDirectory
0176デフォルトの名無しさん2005/04/06(水) 18:42:03
>>175
それって、実行時のフォルダ変えられたら変わるんでないの?
0177デフォルトの名無しさん2005/04/06(水) 18:49:25
>>176
そりゃそうだ
0178デフォルトの名無しさん2005/04/06(水) 20:20:12
GetModuleFileName
0179デフォルトの名無しさん2005/04/07(木) 00:09:33
Win32APIの質問ばかり。。。
0180デフォルトの名無しさん2005/04/07(木) 10:21:07
ちっちゃいテストアプリ作りたいんですが、
AppWizardすると巨大なファイル&コード郡が...

自分でWinMainして中の人にMFCクラスをnewさせた方が良いのかなぁ?
0181デフォルトの名無しさん2005/04/07(木) 10:50:35
そんなことできないよな?
01821802005/04/07(木) 11:04:10
何か、WinMainもAfxWinMainもあるわけね。
で、CWinApp派生させて処理起動すんのか。
01831802005/04/07(木) 11:19:25
テストアプリと最終的に開発するアプリと、
ダイアログ単位のファイル/クラスを共有させたいんですが、
RCファイル1個に全ダイアログ入れなきゃならないんでしょうか?
01841802005/04/07(木) 11:25:19
CWinAppはInitInstanceだけをオーバーライドして、
他はイジラナイ方が良いんだろうかね?

CWinAppに全処理入れたら、巨大な1クラスアプリになっちゃうし。
01851802005/04/07(木) 11:34:12
ダイアログ・クラス単位にライブラリ化したいんだが、
アプリのrcファイルとダイアログと切り離し可能でつか?
0186デフォルトの名無しさん2005/04/07(木) 12:11:49
可能だけどめんどくさい。
0187ほれ2005/04/07(木) 12:32:05
#include <afxwin.h>
#include "resource.h"

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    CWinApp* app = new CWinApp();
    CDialog* d = 0;
    int ret = -1;

    if (! AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nShowCmd)) {
        goto endapp;
    }

    if (! app->InitApplication()) {
        goto endapp;
    }

    d = new CDialog(IDD_MAINW);
    ret = (d->DoModal() == IDOK? 0: 1);
    delete d;

endapp:
    AfxWinTerm();
    delete app;
    return ret;
}
01881802005/04/07(木) 13:02:02
サンクスでつ>>186-187

ダイアログ単位にクラスライブラリ化する方法も教えてキボンニュ
01891802005/04/07(木) 14:18:34
なんだか、ダイアログ1枚作るにも、リソース作成、クラス作成、コンパイルエラー、
とメンドクなぁい?
0190デフォルトの名無しさん2005/04/07(木) 15:00:03
>>189
それなら、どうあればいいと思うのだ?
つーか、最期のコンパイルエラーとは何だ。
01911802005/04/07(木) 15:18:40
Docクラスのnewでエラーだったので消しますた。
もちろんDocクラスは自作しますが、IDEに作って貰う必要はナサゲ。
01921802005/04/07(木) 15:54:30
CDialogの派生なんて、C++的には数行の筈なのにイミプーなヘッダーファイルが...
01931802005/04/07(木) 16:15:02
Dlg.DoModal()しても表示されない。orz
MFCって画面に弱くない?
0194デフォルトの名無しさん2005/04/07(木) 16:19:58
CFileDialogをデフォルトで縮小表示させたいのですが、やり方知っている方いますか?
【XP/2000 VC++6.0】
0195デフォルトの名無しさん2005/04/07(木) 16:21:57
>>193
弱いのはあんたの頭。
01961802005/04/07(木) 16:28:06
確かに頭が強ければ、ダイアログ単位にクラスライブラリ化できない環境を使うべきでないな。
01971802005/04/07(木) 17:03:44
リソースのプロパティ開き直してダイアログクラスにリンクさせてやっとダイアログが開いた。
何のリンク情報が抜けてたんだろう?
0198デフォルトの名無しさん2005/04/07(木) 18:17:04
ここが >180 の日記スレになった件について
0199デフォルトの名無しさん2005/04/07(木) 23:39:00
久しぶりに香ばしいのが来たじゃないか

でもまんどくせ
0200デフォルトの名無しさん2005/04/07(木) 23:44:06
まんどくせ
0201デフォルトの名無しさん2005/04/08(金) 02:26:11
駄目だ。やっぱりbitmapリソースの最前面表示が出来ないorz
誰か教えてください。・゚・(ノд`)・゚・。
0202デフォルトの名無しさん2005/04/08(金) 02:28:36
お前のプログラム如きが最前面に表示される価値は無い。
0203デフォルトの名無しさん2005/04/08(金) 02:43:01
煽るならもっと面白い事書いてやれよ
0204デフォルトの名無しさん2005/04/08(金) 04:19:35
マウスクリックでフォーカスを得ると、内容が全て選択された状態になるエディットボックス、
つまり、IEのURL入力ボックスのようなものはどうやって実現するのでしょうか?

この辺を参考に、
ttp://www.snark.co.jp/soft/faq/vc_a2.htm#Q2
ttp://www.sources.ru/cpp/mfc/t6850.htm

void CSelectEdit::OnSetFocus() // WM_SETFOCUS ハンドラ
{
  PostMessage( WM_MYSELECTALL ); // カスタムメッセージを送る
}
void CSelectEdit::OnSelectAll(WPARAM wParam, LPARAM lParam) // カスタムメッセージのハンドラ
{
  SetSel( 0, -1 ); // 全て選択
}

ってことをやってみたのですが、
マウスボタンを押した直後には全て選択されるものの、
ボタンを離すまでは範囲選択状態のままのようで、
文字列の先頭から、マウスボタンを離した場所までの選択になってしまいました。
0205デフォルトの名無しさん2005/04/08(金) 14:35:26
すいません。。。
質問良いでしょうか?

CoInitializeEx(NULL, COINIT_MULTITHREADED);
↑(これがコンパイル通らないんですよ。)
error C2065: 'CoInitializeEx' : 定義されていない識別子です。
error C2065: 'COINIT_MULTITHREADED' : 定義されていない識別子です。
↑(コンパイルエラーが出てしまいます)

もちろん、objbase.hはincludeしました。

#include "stdafx.h"
#define _WIN32_DCOM
#include <objbase.h>
↑(こんな感じ)

#include "stdafx.h"
#define _WIN32_WINNT 0x400
#include <objbase.h>
↑(これでも駄目でした)

MFCだと駄目で、MFCを使用しないと通ります。。。
どうやれば良いのでしょうか?
もう、2日悩んでます。。。
02062052005/04/08(金) 14:38:57
すいません。
環境忘れてました。
・Win2000
・VC6
・Win32 Console Application
0207デフォルトの名無しさん2005/04/08(金) 15:43:23
>>205
stdafx.hの後にマクロ定義してもダメ。
プロジェクトの設定のマクロのところで定義するか
stdafx.h内でwindows.hやafx〜.hをincludeする前に定義する。
02082052005/04/08(金) 16:13:30
>>207
返答ありがとうございます。

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

順番でしたか、、、
こんなので悩むのは私だけでしょうが、解決したソースを記述しておきます。

[ atdafx.h ]
--------------------------------------------------------------------------

#define_WIN32_DCOM
#defineVC_EXTRALEAN // Windows ヘッダーから殆ど使用されないスタッフを除外します

#include <afx.h>
#include <afxwin.h> // MFC のコアおよび標準コンポーネント
#include <afxext.h> // MFC の拡張部分
#include <afxdtctl.h> // MFC の Internet Explorer 4 コモン コントロール サポート
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC の Windows コモン コントロール サポート
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <iostream>

// TODO: プログラムで必要なヘッダー参照を追加してください。
#include<objbase.h>

--------------------------------------------------------------------------
0209デフォルトの名無しさん2005/04/08(金) 16:28:22
プリプロセッサがどう処理してるか考えれば一目瞭然なんだけどな
0210デフォルトの名無しさん2005/04/08(金) 18:09:28
ここでいいかどうか微妙だけど質問

今、MFCを使わないでコンソール用のプログラムを作ってる。
構造体の名前でCButtonとかCDialogといったMFCのクラスと同じ名前を使うと
構造体のメンバ補完の場面で自作構造体のメンバが候補に出てこないで
MFCのメンバが候補に出てくるんだが、これを正しい候補が出るようにするには
どうしたらいいんだ?

VC6です。
0211デフォルトの名無しさん2005/04/08(金) 18:16:11
>>210
C〜って名前にするのをやめればいい。
0212デフォルトの名無しさん2005/04/08(金) 18:19:34
>>210
ちょっとやってみたがちゃんと自分のクラスが表示されたぞ。
まぁインテリセンスがまともに機能しないのは仕様だから諦めるしかないんじゃね?
0213デフォルトの名無しさん2005/04/09(土) 18:36:37
リストビューでカラムのサイズを変更できないようにする方法とスクロールバーを表示させない方法をおしえてください
0214デフォルトの名無しさん2005/04/09(土) 19:10:29
>>213
See MSDN.
0215デフォルトの名無しさん2005/04/09(土) 20:49:13
モーダルダイアログを出したくて、呼び出す側のヘッダーで

public:
CModDlg *m_mod;

このようにデータメンバーを追加したのですが、この行で
error C2143: 構文エラー : ';' が '*' の前に必要です。
error C2501: 'CModDlg' : 識別名を宣言するのに、型が指定されていません。
error C2501: 'm_mod' : 識別名を宣言するのに、型が指定されていません。
と、エラーが出てしまいます。
原因分かる方いらっしゃらないでしょうか?
0216デフォルトの名無しさん2005/04/09(土) 20:52:51
>>215
>識別名を宣言するのに、型が指定されていません。
の通りなんだが。
0217デフォルトの名無しさん2005/04/09(土) 21:23:41
>>215
つ【#include "ModDlg.h"】
02182042005/04/09(土) 22:34:15
すみませんー
>>204のやり方をご存知の方おられませんか?
0219デフォルトの名無しさん2005/04/10(日) 04:26:59
>>218
ためしにやってみたけど
それで問題なく動くと思うけど?
マウス押してから離すまでの間にマウス動かしたりしてない?
もしくはおまいさんのマウスがおかしくなってて動かしてないのに
ぷるぷる動いてる状態になってるとか
0220デフォルトの名無しさん2005/04/10(日) 10:19:58
>>204自身がぷるぷる震えてたりして。
02212042005/04/10(日) 18:59:58
うーむ。
どうクリックしても、クリック位置までの選択になってしまいます。
仮にマウスが動いていたとしても、IEなんかの場合、
マウスをどう動かそうと全部選択になりますよね?

テスト用に簡単なソースと実行ファイルです。
試してみてもらえないでしょうか?
ttp://www.uplo.net/www/vip4916.zip
0222デフォルトの名無しさん2005/04/10(日) 19:15:07
すんごい素早くシングルクリックすると全部選択されるな。
02232042005/04/10(日) 19:47:45
なんですと。
とりあえず正攻法じゃ無いですよねコレ
0224デフォルトの名無しさん2005/04/10(日) 21:39:36
>>221
普通にクリックしても全部選択されたよ???
VC6, Windows XP SP2
02252042005/04/10(日) 22:04:04
>>224
ありがとうございます。
環境によるのかなぁ…
ちなみにウチはVC6, Windows 2000 SP4です。
0226デフォルトの名無しさん2005/04/10(日) 22:30:23
>>225
あなたと同じ環境だけど必ずでは無いけど確かになるね。
・・・と思ったらクリックした後にちょっとマウスカーソルが
動くとなるみたいだな。光学式のマウスとか使ってない?
0227デフォルトの名無しさん2005/04/10(日) 22:31:36
あと起動した最初だけはマウスカーソルの場所までしか選択されないね。
02282042005/04/10(日) 23:39:33
>>226
ズバリ光学式です。
少なくとも画面上ではカーソルは動いてないんですけどね。
むしろ上手く選択されない方がレアケース?
とはいえ、IEのアドレスバーの方はきちんと動作してますしねー
02292242005/04/10(日) 23:41:29
>>225
WM_SETFOCUSとWM_LBUTTONUPの間に、どんなメッセージが来てるか、SPYで監視してみれば。
原因はよく分からないけど、WM_MOUSEMOVEが同時に送られているんだと思う。

当たり前だけど、左ボタンを押したまま、マウスを動かすと選択範囲がカーソルまでになる。
これはエディットボックスのデフォルトの仕様。
IEのURLボックスは、そうならないように別途処理しているはず。
ボタンが押されている間は、WM_MOUSEMOVEを無視するようにすれば、最初の問題も解決するのでは?
0230デフォルトの名無しさん2005/04/10(日) 23:56:20
>>204
あと言っておくけど
IEのバーはエディットボックスじゃなくコンボボックスだ
複数行じゃなくてもいいなら
コンボボックスにしてドロップダウンのサイズを0にして
タイプを標準にするっていうのはどうだろう?
正攻法ではないがこれで難なく望む動作が得られると思うが
02312042005/04/10(日) 23:58:37
おぉ、マウスを浮かせていてもWM_MOUSEMOVEが飛んできてました。
マウスがヘタレなんでしょうか?
WM_MOUSEMOVE無視で、めでたく全部選択されました。

どうもありがとうございました。>付き合って下さった方々
02322042005/04/11(月) 00:01:58
>>230
あ、そういえばそうですねw
単にデフォルトの動作だったのですか…
0233デフォルトの名無しさん2005/04/11(月) 16:24:43
ダイアログの中の部品をグループボックスで作っといて、
実行時にダイアログにグループボックスを貼り付けるには、
どんなコードになるんでしょうか?
02342332005/04/11(月) 16:56:02
もしかして、グループボックスでなくて、プロパティシートを使うんですか?
02352332005/04/11(月) 16:59:40
それとも、ダイアログのプロパティをチャイルドにするのかな?

教えてキボンニュ
0236デフォルトの名無しさん2005/04/11(月) 17:09:44
>>233
スマン
おまいさんの言いたいことがさっぱりわからん
02372332005/04/11(月) 17:13:57
ダイアログの中に、何枚も貼りたい部品があった場合、
その部品をクラスにするじゃないですか?

その場合、どのリソースをクラスにするんでしょ?
グループボックスなのか、ダイアログのチャイルドなのか、
また、貼るときのコード教えて下さい。
0238デフォルトの名無しさん2005/04/11(月) 17:18:19
おまいさんの言いたいことがさっぱりわからん
02392332005/04/11(月) 17:19:43
ダイアログの中に、動的に枠を複数枚貼りますよね?
わかりますか?
0240デフォルトの名無しさん2005/04/11(月) 17:37:57
>>239
俺はそんなことしないなぁ
02412332005/04/11(月) 17:40:04
データの数によって枠の数が変わるなら動的にするしか無いんです。
MFCのクラス流儀でいけば、
ダイアログクラスに実行時生成したオブジェクトをペタペタ貼るのがふつー。
0242デフォルトの名無しさん2005/04/11(月) 17:42:33
よくわかんないから図で示してくれろ。
02432332005/04/11(月) 17:48:38
┏━━━━━━
┃ダイアログクラス
┣━━━━━━
┃
┗━━━━━━

┏━━━━━━
┃ダイアログの中身クラス
┗━━━━━━

実行時に、ダイアログが中身を生成して、
┏━━━━━━
┃ダイアログ
┣━━━━━━
┃┏━━━━━
┃┃中身
┃┗━━━━━
┗━━━━━━
メデタシ。
0244デフォルトの名無しさん2005/04/11(月) 18:02:19
よくわかんないからどっか行ってくれろ
02452332005/04/11(月) 18:09:14
プロパティシートはタブコントロールだから関係ないみたいだね。

ダイアログの中にダイアログを入れる、で良いのか?
0246デフォルトの名無しさん2005/04/11(月) 18:25:41
ここはお前のスレか
自己レスとかいらないから
0247デフォルトの名無しさん2005/04/11(月) 18:29:29
>>246
>>246
>>246
>>246
>>246
>>246
0248デフォルトの名無しさん2005/04/11(月) 18:56:04
>>245
リソースエディタでダイアログ作って枠なし・CHILDにチェック入れて
クラスウィザードでCDialogと結びつけて
好きなだけCreateすればいいんじゃね?
02492332005/04/11(月) 19:01:24
サンクスデツ>>248
そのやり方でやります。

ところで、ダイアログと枠無しダイアログの位置あわせはどうやったら良いですか?

VCLだと、
ChildForm->Parent = Form1->PanelForPosition; //Form1のパネルの上にチャイルド
ChildForm->Align = alClient; //チャイルドはパネル一杯に描画
なんて書けたんですけど。
0250デフォルトの名無しさん2005/04/11(月) 19:09:09
>>249
どんな風に配置したいのか知らんが
GetClientRectとかMoveWindowとか駆使して自前で並べるとか
CSplitterWndとか
0251デフォルトの名無しさん2005/04/11(月) 19:16:39
>>249
親ダイアログの OnSize() で、自分で並べるしか。
 CRect r;
 GetClientRect(r);
 子.MoveWindow(r); // クライアント領域いっぱいに
02522332005/04/11(月) 19:17:59
リョウカイ>>250 >>251

並べた後は親に合わせてチャイルドが動いてくれるんですね。
ま、もし動かなかったら自分で動くコード入れれば良いか。
■ このスレッドは過去ログ倉庫に格納されています