1 :デフォルトの名無しさん:2009/08/22(土) 14:34:39
Microsoft Foundation Classライブラリ専用スレです。

前スレ
■MFC相談室 mfc20d.dll■
http://pc12.2ch.net/test/read.cgi/tech/1230219816/

25 :デフォルトの名無しさん:2009/08/26(水) 22:47:15
>>25
pDCを使って線とテキストで描く。
あるいはそれ用のビットマップリソースを用意して貼り付ける。

30 :デフォルトの名無しさん:2009/09/07(月) 17:57:10
すいません質問があります.
VC++のダイアログ形式でプログラムしているのですが
下記のプログラムで
myDLG.DoModal()
を行うと最初からあったOKボタンを押してもプログラムが死に切っていないようなのですが
どのようにすればいいのでしょうか.
ググったら無限ループとか永久に待機してるとかっぽかったんですが解決法が良く分かりませんでした.

プログラム開始→OKボタン 普通に終了する
プログラム開始→ボタン8→ファイル選ぶ→OKボタン ダイアログは消えるがプログラムは完全に死んでないみたい

といった状況です.

void CtestDlg::OnBnClickedButton8()
{
// TODO: ここにコントロール通知ハンドラ コードを追加します。

//ファイルダイアログを表示してファイル指定する
CFileDialog myDLG(TRUE,NULL,NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"AVIファイル(*.AVI)|*.AVI||");
if(myDLG.DoModal() != IDOK)return;
}

54 :デフォルトの名無しさん:2009/09/09(水) 18:58:50
VC++.net 2002で猫でもわかるに掲載されているサンプルコードをビルドすると
リンクエラーとなるのですがなぜでしょうか?
#include <afxwin.h>
class CMyWindow : public CFrameWnd
{
public:
CMyWindow();
};

CMyWindow::CMyWindow()
{
Create(NULL, "猫でもわかるMFC", WS_OVERLAPPEDWINDOW);
}

class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};

BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMyWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CMyApp MyApp;
エラー
error LNK2019: 未解決の外部シンボル __endthreadex が関数 "void __stdcall AfxEndThread(unsigned int,int)" (?AfxEndThread@@YGXIH@Z) で参照されました。
error LNK2019: 未解決の外部シンボル __beginthreadex が関数 "public: int __thiscall CWinThread::CreateThread(unsigned long,unsigned int,struct _SECURITY_ATTRIBUTES *)" (?CreateThread@CWinThread@@QAEHKIPAU_SECURITY_ATTRIBUTES@@@Z) で参照されました。


57 :54:2009/09/09(水) 21:38:46
、「ファイル」「新規作成」「プロジェクト」で 「Win32 Application」を選択して
アプリケーションの設定でWindowsアプリケーション、空のプロジェクトで設定しているのですが
どこが間違いなのでしょうか?

72 :デフォルトの名無しさん:2009/09/10(木) 00:48:48
結局はモジュール間で決めとけば、どうでも良い
俺はくみこみ知らんが、ポインタ投げて終了の仕組みも作る時もある
こっちはもう使わないのに相手の顔色見ながら、返却待ちのタイミングを
伺うなんてアホらしい

以上、終了


74 :デフォルトの名無しさん:2009/09/10(木) 06:35:29
>>72
>こっちはもう使わないのに
かどうかはわからないよね?
もし、使いたくなっとしても使わないんじゃなくて使えない状態じゃん
しかも、それがわかるのは組んだ自分だけだろ?
下手糞実装ってことは認識して使えよ

85 :デフォルトの名無しさん:2009/09/16(水) 17:04:34
Visual Studio 2005 Pro/Visual C++/MFCで開発をしています。

IPアドレスコントロール(CIPAddressCtrl)の背景色を変更したいのですが、
CIPAddressCtrlのサブクラスとしてCMyIPAddrCtrlを作成し、
以下のようにコンストラクタとOnCtlColorをオーバーライドしても、
背景の一部の色しか変更できません(リンク先の画像を参照ください)。

CMyIPAddrCtrl::CMyIPAddrCtrl()
{
m_Brush.CreateSolidBrush(RGB(255, 0, 0)); // m_Brushはヘッダーで「CBrush m_Brush;」と宣言済み
}

BEGIN_MESSAGE_MAP(CMyIPAddrCtrl, CIPAddressCtrl)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()

HBRUSH CMyIPAddrCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CIPAddressCtrl::OnCtlColor(pDC, pWnd, nCtlColor);
pDC->SetBkColor(RGB(0, 255, 0));
pDC->SetTextColor(RGB(0, 0, 255)); // 試しにテキスト色も変更しています
return m_Brush;
}

結果:ttp://nukkorosu.80code.com/img/nukkorosu11151.png

上記画像で白色になっている部分の色を変更するにはどうしたらよいでしょうか?

98 :デフォルトの名無しさん:2009/09/28(月) 12:34:57
SetTimer()でセットしたタイマを
残り時間を保持したまま一時停止や再開する方法はありますでしょうか。

別のダイアログをDoModal()で出して待っている最中も
WM_TIMERが発生するようなので、その間はタイマを止めておきたいのですが、
いったんKillTimer()で止めてしまうと待ち時間が戻ってしまい、
タイミングによっては延々と発生しない状態になってしまいます。

99 :デフォルトの名無しさん:2009/09/28(月) 13:02:50
>>98
もっとも簡単な方法は、DoModal() する前にある種のフラグをたててタイマー処理を回避し、
制御が戻ってくればタイマー処理を復帰させればいい。

CMyDialog dlg;
m_bDisableTimer = TRUE;
dlg.DoModal();
m_bDisableTimer = FALSE;


CxxWnd::OnTimer( ...)
{
   if ( m_bDisableTimer) return;

   // ToDo...
}


100 :98:2009/09/28(月) 15:15:03
>>99
ありがとうございます。
やっぱりそういう方法になるのですね。

この場合もダイアログ表示のタイミングによっては
ToDoのところまで行かない状態が続いてしまいますが、
タイマでやっている以上は避けられないのかな。

107 :デフォルトの名無しさん:2009/10/05(月) 20:56:34
皆様に質問です。

Visual Studio 2008 MFC FeaturePackを調査していますが、
追いきれない箇所があったので投稿します。

MFCのSDIで作成したフレームワークで
CFrameWndのメンバにm_wndMenuBar(CMFCMenuBar型)ってのがあります。

これから、m_wndMenuBar.GetHMenu()でメニューハンドルを取得し
DeleteMenu、EnableMenuItem、ModifyMenuなど
今までどおりCMenuと同等な操作をしても、
表示されているメニューバーに変化が無いのです。

何かやり忘れの処理とかあるんでしょうか?
それとも、そういうものなんでしょうか?

※たとえば、DeleteMenuの実行結果はTRUEを返し、
メニューバー[表示(V)]→[ツールバーとドッキング ウィンドウ(T)]→[カスタマイズ...]の
カスタマイズダイアログのコマンドからは消えていますが、
メニューバーの一覧からは消えないのです・・・

何か、コツがあるんでしょうか?
知っている方、情報を願います・・・

120 :デフォルトの名無しさん:2009/10/15(木) 21:02:37
ドキュメント・ビュー・アーキテクチャを使っている場合で、読み書きする
ファイルの拡張子を設定するには、どのような方法があるでしょうか?


122 :デフォルトの名無しさん:2009/10/15(木) 21:47:49
>>120

CWinApp::OnFileOpen() と CDocument::OnFileSaveAs() を
好きなようにオーバーライドすりゃいい。

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

305 :デフォルトの名無しさん:2010/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;
}

340 :デフォルトの名無しさん:2010/03/15(月) 10:03:16
include し忘れだろ

341 :デフォルトの名無しさん:2010/03/15(月) 10:12:34
>>340
ちょっと書き方が悪かったですね…

コンソールプログラムだと、以下でOKなんですが
#define _WIN32_DCOM
#include <comdef.h>

CoInitializeEx(0, COINIT_MULTITHREADED);

MFCアプリだと、この上述のコードではエラーになるんです…
何故なんでしょうか?

344 :デフォルトの名無しさん:2010/03/15(月) 10:45:22
>>341
_WIN32_DCOMをプロジェクト設定に書くかstdafx.hの上のほうに持って行く

345 :デフォルトの名無しさん:2010/03/15(月) 10:58:23
>>344
stdafx.hの上ではダメでしたが、
プロジェクト設定に書いたら見事OKでした!
ありがとうございます!助かりました!

本当にいい人だ。 うぅ (/Д`)・゜・。

365 :デフォルトの名無しさん:2010/03/16(火) 23:11:22
MDIでプログラムしているんですが、各子ウィンドウでメッセージが来ない間、
ウィンドウ別にCWinApp::OnIdleのように処理をするようにしたいのですが、
何か方法なないでしょうか?
単純に思いついた方法はCWinApp::OnIdleで各子ウィンドウを調べて一つずつ
処理させるくらいしか思いつきませんでした。
各子ウィンドウにスレッド処理させる方法も考えたのですが、案件の仕様で
ダメなので使えません。

563 :デフォルトの名無しさん:2010/09/17(金) 14:28:12
VS2005です。

ダイアログの中にリストコントロールを置いておいて、
セルをクリックするとエディットコントロールが起動するって機能を作っています。

このときのエディットコントロールはCEditを継承したもの(CMyEditとします)です。
このエディットは複数行OKであり、Enterキーにより改行させるところまでは実装しました。
改行キーが押されたときに、テキストの高さからRectを計算し、MoveWindowしています。

現状、このコントロールは、改行を増やしていっても、
親ウィンドウ(この場合はリスト)の最下部より下には表示できません。
これをなんとか、親ウィンドウ高さに関係なく、エディットコントロールの高さを決めることはできませんか?

1つだけ、試したみた方法がありますがうまくいきませんでした↓↓

CreateのときにWS_CHILDを指定していると親ウィンドウの内部にしか表示できない、
という情報を見つけたので、CreateExを使ってWS_POPUPを指示してCreateしようとしましたが、
エラーが発生しました(戻り値0)。下のように書きました。

myEdit.CreateEx(0, "EDIT", 0, WS_POPUP|ES_MULTILINE.(略), rect, parent, -1);

564 :デフォルトの名無しさん:2010/09/17(金) 15:26:13
親なしでコントロール出したことないな
別にウインドウ出してそこにコントロール貼るのが普通な気がする

565 :デフォルトの名無しさん:2010/09/17(金) 15:48:58
なんでググらないんだ? キーワードが分からんのか?
根本的な部分で、Windowsプログラミングを理解してない気がするが、
MFCとかC#とか、Win32 APIを直に使った経験がないからそうなるんだろうか。
いまどきProgramming Windowsを読めとはいいにくいが、ネット上での情報収集ぐらいできんものか。


566 :デフォルトの名無しさん:2010/09/17(金) 15:55:06
>>564
なるほど、最悪それで回避可能かもしれません

>>565
ググッたか→4時間ぐらい戦った
Win32 API→経験なし

MFC経験だったそんなにないけど、やらなきゃいけないんですよ。
CreateExのやり方調べたり、自作クラスをRegisterしてみたりもしましたよ。
でもたどり着けなかったんです。

そんなに言うならきっと経験豊富だと思うので
キーワードだけでも教えてくれるとうれしいなぁ

568 :デフォルトの名無しさん:2010/09/17(金) 16:21:41
>>566
たとえば、ツリービュー、リストビューのラベル編集。
ツールバーのサブメニューだったり、ドロップダウンリストのリスト部だったり。
イベントを受けて、領域を決めて、ウインドウを表示する。
表示内容は異なるが、やってることは全部一緒。ラベル編集はともかく、他のは親のサイズに関係なく表示できてるでしょう?
(ラベル編集でもできるけど)

571 :デフォルトの名無しさん:2010/09/17(金) 16:38:53
>>568-569
実は今回修正しているソースにリストから起動するコンボボックスがあるので見てみました。
確かに、コンボボックスは親のサイズに関係なく描画できていました。
ただ、そのコンボボックスのCreateにはWS_CHILDを使っているし、
特別なことをやっているようには見えませんでしたが…

POPUPだということなので(ありがとうございます)、さらに調べてみます。

623 :デフォルトの名無しさん:2010/10/04(月) 10:48:24
MFCを使ってファイルに高速にアクセスする方法ないでしょうか?
自分で考えたのはファイルサイズ分のメモリを動的に確保して
ファイルの内容をごそっとメモリに展開します。
そして、CMemFileか何かにメモリを割り付けて
ファイルのごとくアクセスするってやり方です。
もっと簡単に出来そうな方法ありますでしょうか?
VSは2005です

ちなみに読ませたいファイルはテキストファイルで
カンマ区切りで情報が格納されています。
したがってfgetsで1行1行読み込ませています
行が10万行とかあるので読み込むのに
20秒とかかかってしまいます。
3秒くらいでサクッと読めたら嬉しいです

640 :デフォルトの名無しさん:2010/10/04(月) 23:14:41
PCが固まるってwwwwwww

656 :デフォルトの名無しさん:2010/10/10(日) 03:14:36
別cppファイルの別クラスからIDC_EDIT1に値を入れようしています。

下記コードで▼hogehoge.cppのEditChange()を呼び出すと、
関数内で呼ばれる別クラス関数CHogeDlg::ChangeEdit1の
edit1->SetWindowText(text);
の部分でEXEが落ちてしまいます。(コンパイルは出来る)

同じCHogeDlgクラス内からChangeEdit1を呼んだ時は
問題なく値が挿入されるのですが…。

あとedit1->SetWindowText(text);の一文を消して
代わりにAfxMessageBox(text);の一文を入れてやると、
別クラスから呼んでもtextの中身がメッセージボックスで表示されるので、
別クラスからの呼び出し方に問題があるわけではなさそうです。
どなたかアドバイスいただけますでしょうか。

■hogeDlg.hのpubulicに
void ChangeEdit1(char* text);

●hogeDlg.cppに
#include "HogeDlg.h"
void CHogeDlg::ChangeEdit1(char* text){
CEdit* edit1 = (CEdit*)GetDlgItem(IDC_EDIT1);
edit1->SetWindowText(text);}

▼hogehoge.cppに
#include "HogeDlg.h"
void HogeHoge::EditChange(){
CHogeDlg cdd;
char* t="unko";
cdd.ChangeEdit1(t);}

673 :デフォルトの名無しさん:2010/11/02(火) 19:05:46
すみません、基本的な質問ですが、

CString a[10];
char b[10][256];

lstpcpy(b[0],a[0]);
でa[0]="abc"の値がb[0]にコピーされません。
何か問題ありますでしょうか?他の方法がありましたら教えていただけますようお願いします。

715 :デフォルトの名無しさん:2010/11/23(火) 08:32:30
毎回思うんだけど
MSはサンプルコード書けよな
ドキュメントなんていっくら詳しく書いたって動作がわからなきゃ意味ねーんだっつの

通常のとCEで違うコード書かなきゃいけないとか普通にやりやがるし
それ、やるんだったらサンプルコード書けと

785 :デフォルトの名無しさん:2011/02/06(日) 14:15:47
質問です。
VisualStudio2005でダイアログベースのMFCアプリケーションを作っているのですが、
同一のコードから簡略版と高級版の両方をビルドできるようにしたいと考えて、stdafx.h
の中にフラグ(#define MY_FLAG)を書いておき、切り替えの必要な場所はそのフラグの
有無でビルド時に書き換わるようにしました(#ifdef MY_FLAG??#endifでくくった)。
それはそれで機能しているんですが、以下の3つについてはこの方法で切り替える事が
できずにいます。

・生成される実行ファイルの名前(=プロジェクト名)
・生成される実行ファイルのアイコン(=IDR_MAINFRAMEで指定されているアイコン)
・生成される実行ファイルを右クリックした際の詳細情報(=VS_VERSION_INFO)

これらも同様の方法で切り替えるようにするべくresource.hや.rcファイルにも#ifdef??を
手で書き込んでみたのですが、これらは頻繁にVisualStudioによって書き換えられて
しまうため、すぐに#ifdef節が消されてしまってうまく機能させることができません。
何かよい方法は無いでしょうか。


http://hibari.2ch.net/test/read.cgi/tech/1250919279/l50人気ブログランキングへ