4 :
デフォルトの名無しさん:04/06/25 00:48
まえすれ
>>972 Thanks!
これでOKザウンス!
5 :
デフォルトの名無しさん:04/06/25 01:42
捕手しときます
MFCってもうすぐなくなるそうですが、本当ですか?
8 :
デフォルトの名無しさん:04/06/25 20:55
MFC42.DLL
シニ
で命運尽きたと見るべきだろう
MFCは永久に不滅です
最初からMSの提唱プログラミング技術は信用していない。
「の」の位置が変になった。
最初からMS提唱のプログラミング技術は信用していない。
12 :
デフォルトの名無しさん:04/06/25 22:44
CP/Mのパクリ
UNIXのパクり
CORBAのパクリ
SmallTalkのパクリ
Javaのパクリ
オリジナルは??
無い。
COMは何のパクリ?
15 :
デフォルトの名無しさん:04/06/25 23:33
MS-DOS
話の流れ断ち切るようですみませんが質問させてください
.NETの開発環境やブラウザのSleipnirとかで使ってる
アイコンの背景の変わるツールバーってどうやって実装するんでしょう?
スタイル設定とかで駄目なん?
18 :
デフォルトの名無しさん:04/06/26 11:59
ダイアログを使ってて、気になることがひとつあるのですが、
×ボタンでアプリケーションを終了させると、
「コード 20 (0x14) で終了しました。」
で、終了して、タスクバーから終了させると、
「コード 61536 (0xF060) で終了しました。」
と、表示されます。
0で終了していないので、どこかにエラーが潜んでいるのかと思うのですが、
どうやって調べたらよいでしょうか?
検索してもそれらしい情報がなくて、
ヘルプでも、0でなければエラーがあるって事しか書いてないので、
どうやったらいいのかと。。。
どなたか知ってる方お願いします。
>>18 Escキーで終了すると0x1bで、Enterキーで終了すると0x0dになるはずですが。
これはちっともエラーではございません。
>COMは何のパクリ?
CORBA
クライアントがインプロセスサーバーの関数を直接呼べるのはCOMだけなのでは?
22 :
デフォルトの名無しさん:04/06/27 13:12
こんにちは
初歩的な質問ですが、
VisualC++で新しいMFCプロジェクトとしてMDIを作るとき、
初期状態のコードで下記の部分がありますが、
>myappli.cpp
BEGIN_MESSAGE_MAP(CmyappliApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// 標準のファイル基本ドキュメント コマンド
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// 標準の印刷セットアップ コマンド
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)のコマンド(メニュー)を選ぶと自動的にMDIウィンドウが作成されますが、
このMDIウィンドウを作成するコード(ソース)がどこにも記述されてないのに、どうしてMDIウィンドウが作成されるのでしょうか?
また、ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)も同じく、ファイルを開くDialogが出てきますが、
このコモンダイアログを表示するという記述がされている部分がありません。
これらのコード(ソース)は、どこに記述されてるのでしょうか?
>>22 VCをインストールしたディレクトリ下のMFCってとこにソースがある。
その中をgrepしてみれば?
24 :
デフォルトの名無しさん:04/06/27 14:03
Attachってどういうものなんでしょう?
>>22 CWinAppの初期化コードの中
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
とするとでてこない。この辺が関係してる。
26 :
デフォルトの名無しさん:04/06/27 15:29
質問:
プロジェクトの新規作成でMFCのMDIを作ったのですが、
そのMDIをSDIに変更したいと思いして、
部分部分を修正したんですが、
どうしてもエラーダイアログ「空のドキュメント作成に失敗しました。」と表示されて、
MainFrameが作成されず、アプリケーションが終了してしまいます。
何故でしょうか?
修正箇所は、
CMDIFrameWnd → CFrameWnd
MultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_system_mfcTYPE,
RUNTIME_CLASS(Csystem_mfcDoc),
RUNTIME_CLASS(CChildFrame), // カスタム MDI 子フレーム
RUNTIME_CLASS(Csystem_mfcView));
↓
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(Csystem_mfcDoc),
RUNTIME_CLASS(CMainFrame), // メイン SDI フレーム ウィンドウ
RUNTIME_CLASS(Csystem_mfcView));
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
↓
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
819 名前:デフォルトの名無しさん[sage] 投稿日:04/06/27(日) 14:46
MFCを使ったダイアログを
スタティックライブラリで実現できるんでしょうか?
DLLで出来るのはわかってるんですが。
820 名前:デフォルトの名無しさん[sage] 投稿日:04/06/27(日) 14:50
>>819 Prof 以上ならできる。
821 名前:デフォルトの名無しさん[sage] 投稿日:04/06/27(日) 15:21
>>820 リソースは
リンクするメイン側に置くのですか?
>>26 気になったのでちょっと調べてみたよ
Error: Trying to create object which is not DECLARE_DYNCREATE
アウトプットに以下のメッセージが出て失敗してたので
mainfrm.hのDECLARE_DYNAMICをDECLARE_DYNCREATEに
mainfrm.cppのIMPLEMENT_DYNAMICをIMPLEMENT_DYNCREATEに
それぞれ変えればOKだったよ
つーか、新規に作ったSDIと見比べればOKかと・・・・
29 :
デフォルトの名無しさん:04/06/27 16:50
int argc, char *argv[]
のように、外部ファイルドロップで起動した時、
ドロップしたファイル名を取得するにはどうすれば良いですか?
>>29 Wizardが吐いたソースならCHogeApp::InitInsatance()の中に
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
ってコードあるでしょ。そのあたりで調べてみれば?
あと、__argcと__argvとか。
>>29 文字列で受けるなら
CString cmdstr = GetCommandLine();
__argc変数を使うなら
for(int i = 1; i < __argc; i++){
CString cmdstr = __argv[i];
}
どちらかというと後者の方が扱いやすいね
33 :
デフォルトの名無しさん:04/06/28 00:06
ツールバーを作ろうとしているのですが、
//Buttonの作成
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150);
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
img.Create(IDB_HOTBUTTON, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
img.Detach();
→img.Create(IDB_COLDBUTTON, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
img.Detach();
矢印部分でデバッグエラーが出てしまいます。
なぜなのかがわかりません。
Createの戻り値を見ても、「1」と出てるのでエラーはないと思われますが。
Createの戻り値が見れると言うことは、
そこではエラーが出ていないのでは?
>>34 すいません。
今、どうにか解決できました。
大変申し訳ございませんでした。
CEditでJaneDoeのDoe部分みたいに
文字に色つけたりフォント変えたりリンク踏めるようにするのはどうすればいいんですか?
今はリッチエディットでやってるけど98とXPだとdllのバージョンが違うし
微妙に重かったり、選択の文字色反転がイヤだったりで、改造したいんですよ。
無理
>>36 codeguruとかにヒントになるソースがあったはず
39 :
デフォルトの名無しさん:04/06/28 17:07
CComboBoxでCBS_SORTを動的につけたり外したりって無理でしょうか?
SetWindowLongでできなかったんですが…
40 :
デフォルトの名無しさん:04/06/28 17:09
MFCで作ったアプリは、MFCのDLLを添付しないと
実行することはできないのでしょうか?
自分が作ったExeのみで配布することはできないでしょうか?
>>39 1. ResetContent
2. スタイル付け替え
3. AddString
でもダメ?
すでにあるアイテムのソート/非ソートをスタイル変更で
切り替えてくれるような器用な造りにはなっていないと思う。
けど、これはAPIスレ用の話題だな。
>>40 MFCをスタティックリンクすれば。
>>40 VC6以前のVCでビルドしたものならDLLの心配はしなくていい
ほとんどのwin32環境でDLL持ってるのが当たり前になってるから
VC7以降なら注釈を付けてDLLのインストールが必要なことを書いておくか
同梱するかした方がいい
>>40 MFCのスタティックライブラリを使用にする
>>41 駄目でしたorz
APIスレに移動してみようと思います。ありがとうございました。
>>40 スタティック ライブラリで MFC を使用する
46 :
デフォルトの名無しさん:04/06/28 21:59
ダイアログベースでボタンをつくってそのボタンをクリックすると
メニューの開くと同じ動作させるにはどうすればいいでしょうか?
>>46 「開く」のメニュー項目と同じIDのボタンを
49 :
デフォルトの名無しさん:04/06/28 23:18
>>47 48
できました
ダイアログに開くからえたビットマップをダイアログのピクチャーボックス
に表示するにはどうすればいいのでしょう?
・ダイアログから得たのでないビットマップをピクチャーボックスに表示する方法を調べる
・それをダイアログから得たビットマップファイルの場合に応用する
51 :
デフォルトの名無しさん:04/06/29 00:10
>>41 >>42 >>43 >>45 ありがとうございます。
スタティックは知っていたのですが、
結局Exe以外にも添付しなきゃならないとか何とか・・・・
ってどこかのHPで書いてあって、
結局駄目なのか?と思ってたので。。
一応、どのWindowsでも動かないとまずいって言うので、
(95は除外してもよさそうなのですが)
困ってたんです。
環境はVC6なので、大丈夫かと思うのですが。
ちなみにVC.NETスタティックリンクで
作ったexeを検証したところ
Win98 WinME Win2000 WinXP (by VirtualPC)
で動いてます
>>52 ついでにランタイムライブラリもスタティックリンクにしとけよ
54 :
デフォルトの名無しさん:04/06/29 04:27
Formベースで作ったプログラムを作って、出来たクラスがCXXXView、CXXXDoc、(その他)とした時
CXXXView.h 内で CXXXDoc.h を
CXXXDoc.h 内で CXXXView.h を
それぞれインクルードするとコンパイル出来ないのですが、そう言うものなのでしょうか?
インクルードする順番も一応変えてみたりしたのですが、無理でした。
この方法が無理ならば、DocとViewで相互に呼び出したいときはどうしたらいいのでしょうか?
>>54 CView::GetDocument()
CDocument::GetFirstViewPosition()
CDocument::GetNextView()
DocからViewは普通はポインタを使って直接呼び出すのではなく
CDocument::UpdateAllViews()でドキュメントの変更を通知する。
あとはCView::OnUpdate()で。
ていうか、相互に呼び出したいだけなら.hでインクルードする必要ない
57 :
デフォルトの名無しさん:04/06/29 11:21
ダイアログにラジオボタンを付けて
それにコントロール変数を追加したいんですが
VC6の時は、グループ先頭を「グループ」にチェック入れて
int変数を追加できたんだけど
VC7.1だと先頭のGroupをtrueに設定して
コントロール変数を追加しようとすると
BOOLしか追加できないみたいなんです
intで追加できないんでしょうか?
>>54 ちょい工夫すれば容易にできる話だが・・・
だが、そーゆーPGはやめておけ。
59 :
デフォルトの名無しさん:04/06/29 23:38
予め決められたハングル文字を表示したいのですが、
ソースにハードコーディングしたら駄目らしく、
かといってストリングテーブルにいれたら???となってしまいます・・・
文字セットはUnicode文字セットを使用しているので、
エディットボックス間のコピー等は上手く行くのですが・・・
どなたかお知恵を貸して下さい
つかおまいの環境、ハングル入ってるのか?
>>60 WinXPなんで、言語のあたりをいじると、ハングルIMEが使えます。
けど、OCNの翻訳サイトで単語訳してコピペする予定です
最新のでも開発環境そのものはUNICODE対応していないんだっけ?
>>62 やっぱVC++じゃ駄目ですかね・・・・orz
何故かVBとVC#はすんなり出来てくれたんですが、
どーしてもネイティブじゃないと嫌なもんで・・・
>>59 今AppWizard見てみたのだが、リソースに使用する
言語ってコンボがあるが、それには日本語、英語しか
ないからOSもVCもハングル版買わないといかんのでは?
wchar_t a[] = L"\uac00\uac01\uac02\uac03";
MessageBox(NULL, a, L"韓国語", MB_OK);
少なくともこういうのは通るし動くんで、
・ソースはUTF-8とかでハングルで直接書く
・プリプロセッサとして、UTF-8なソースをShift_JISなソースに書き換える
(リテラルのユニバーサルキャラクタへの置き換え)物を作る
でなんとかなるんじゃ。リソースはどうにもなんないかもだけど。
>>64 そこには「韓国語」っていうのもあるんですが、
コード生成時に何やらエラーが出て止まります。
やはり環境が揃ってないと無理なんでしょうかね・・・
レスくれた方、どうもありがとです。
もうちっとVC++で粘ってみます。
と、リロードしてみたら!
>>65 これは、素晴しい!
なんとかなりそうです。感激!
>>67 サンクス!
国際化対応のサンプルがいろいろ参考になりました!
一度リソースファイルを外部エディタでUnicode保存すると、
VC.NETのリソースエディタから編集がきかなくなる事が分かりました。
(VC.NETのリソースエディタがUnicode未対応の為)
#define KOREAN_1 L"\uD55C\uAD6D\uC5B4" //韓国語
#define JAPANEASE_1 L"\u65E5\u672C\u8A9E" //日本語
#define ENGLISH_1 "ENGLISH"
CString ss;
ss = KOREAN_1;
の様に使う事で、多言語対応する事ができました。
MessageBoxを使うとプログラムが停止します。原因がわかりません、、、
どなたか教えてください。
//App.cpp
#include <afxwin.h>
#include "App.h"
CMainWin::CMainWin()
{
Create(NULL, "sample");
}
afx_msg void CMainWin::OnPaint()
{
//CPaintDC dc(this);
}
afx_msg void CMainWin::OnLButtonDown(UINT nFlags, CPoint point)
{
MessageBox("abcde");//ここで停止(応答なし)
}
BEGIN_MESSAGE_MAP(CMainWin, CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
END_MESSAGE_MAP()
BOOL CApp::InitInstance()
{
m_pMainWnd = new CMainWin;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return (TRUE);
}
CApp App;
続き
//App.h
class CMainWin :public CFrameWnd {
public:
CMainWin();
afx_msg void OnPaint();
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
};
class CApp :public CWinApp {
public:
BOOL InitInstance();
};
//EOF
OnPaintメッセージハンドラにCPaintDC dc(this)を記述すると問題なく動作
します。理由がどうしてもわかりません。
書き忘れました、環境はVC++6.0です。
実は全然別のところが問題とか。
>>69 メンバ関数版じゃなければ表示されるんでない?<MessageBox()
AfxMessageBox()だっけ?
.NET 2003はユニコードに対応しているよ。
ファイルの保存でユニコードで保存してやると
ちゃんと保存される。
>>69 ほんとだね
これはなかなか興味深い
ちょっと調べてみるか
まず、OnPaintメッセージがきたときに、ディフォルトの動作を行わないせいで
何時までたってもウインドウが無効領域のままになる
なのでOnPaintの無限ループのような状態が起きている
これのせいで、MessageBoxがメッセージを受け取れないみたいだね
WM_PAINTのディフォルト処理を入れなきゃウインドウズプログラムはだめだってことで
飯行くので急いで書いたのでむちゃくちゃな文章になってるな・・・
ちゃんと書くと
WM_PAINTメッセージってシステムがこの領域は無効な領域(描画が必要な領域)
だと判断したから発生させるメッセージ(よく再描画するのにInvalidateを呼び出すが
これは、アプリ側で無理やり無効な領域にしているってこと)
このメッセージを受け取ったアプリ側は、適切な描画処理をするもしくは
ウインドウズディフォルトの処理に任せる
このとき使用されるAPIがBeginPaint EndPaint、MFCならCPaintDC
このAPIもしくはクラスを使用した場合、無効領域がクリアされるため
再び無効領域が出来るまでになるまでWM_PAINTが発生されることは無い
69の作ったプログラムでは、WM_PAINTメッセージのハンドラで何も処理をしない為
何時までたってもその領域が無効であるとシステム判断するのでWM_PAINTを繰り返す
WM_PAINTは優先度の高いメッセージなので、この処理が完了しないと他のメッセージは
受け取れない、メッセージボックスはWM_INITDIALOGなど一連のメッセージを受け取って
処理をしない限り動けないので何時までたってもそのメッセージを受け取れない
つまりプログラムが停止しているわけではなく、OnPaintメッセージでループしている
説明下手ですまんが、大体のニュアンスは分かっていただけたかな?
>>68 多言語リソースは.rc2の方に書いておけば、リソースエディタは影響受けない。
もちろん、逆にそこの部分はリソースエディタの支援をまったく受けられなく
なるんだけど、C(++)ソース中にユニバーサルキャラクタで書き込むよりは
可読性があっていいんじゃないかと。
ちなみにユニコードで保存したrc2ファイルは、テキストファイルとして
VisualStudioで編集できる。
75さんとても丁寧な説明ありがとうございます。
WM_PAINTメッセージが送られ続けているということですね。
Windowsプログラムはまだやり始めたばかりでわからないことが多いですが
とても楽しいです。
これからもがんばっていこうと思います。
本当にありがとうございました。
ダイアログボックスにCAD図形みたいなものを描画するときって、
何かいいコントロールとかってありますか?
ピクチャーコントロールって、こういうときに使うのでしょうか?
>>80 ダイアログボックスに貼り付けると、IDがIDC_STATICとなって、
普通のスタティックテキストと扱いが同じなんだよね。
で、どうやって使わせようとしているのかの意図が読み取れなくて???
藻前が何を言おうとしているのか読み取れねーよ!!!
自分でIDを変えるんだよ
85 :
デフォルトの名無しさん:04/07/02 21:55
教えてください。いまあるアプリケーションで縦のスクロールバーを他のアプリケーションから
スライドさせてそのアプリケーションの表示をスクロールさせたいのですが、
スクロールバーそのものの位置は更新できるんですけど表示はスクロールしません。
どうやればよいのでしょうか?ちなみに今は
void CXXX::foo()
{
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
::GetScrollInfo(m_hScroll, SB_CTL, &si);//m_hScrollはスクロールバーのHWND
SCROLLINFO tmpsi = si;
tmpsi.fMask = SIF_POS;
int pos = si.nPos;
while(pos < si.nMax)
{
tmpsi.nPos = pos;
::SetScrollInfo(m_hScroll, SB_CTL, &tmpsi, TRUE);
//キャプチャ処理
pos += si.nPage;
}
}
という感じです。
>>85 InvalidateRect()してみるとか?
アクティブなアプリが他のアプリだから画面更新されんってことか?
プロセス間通信はイベントオブジェクト以外苦手じゃ
SetScrollPosは「スクロールバーの情報を書き換えるだけ」なので、
それじゃアプリにスクロール要求は出ない。
他アプリをスクロールさせるってのはやったことないけど、
単純にWM_xSCROLLを送ればいいんじゃなかろうか。
AfxBeginThreadで作ったスレッドの中からAfxMessageBoxを呼ぶと
MessageBoxがダイアログの中央ではなく、画面の中央に表示されて
しますのですが、ダイアログの中央に出す方法はありませんか?
環境はVC++.NET 2003です。
/* スレッド作成 */
m_Thread = AfxBeginThread(func, (LPVOID)this, THREAD_PRIORITY_NORMAL);
/* スレッド関数 */
static UINT func( LPVOID pParam )
{
CHogeDlg *pHogeDlg;
pHogeDlg = (CHogeDlg*)pParam;
pHogeDlg->Hogehoge();
return 0;
}
/* 実行部分 */
int CHogeDlg::Hogehoge( void )
{
AfxMessageBox("Hoge",(MB_OK | MB_SETFOREGROUND | MB_ICONEXCLAMATION | MB_TASKMODAL),0);
}
みなさんありがとうございます。
>>88さんのおっしゃるとおり、
親にWM_VSCROLLを送ることで実現できました。
>>89 普通はどっちなんだっけ?
ともかく、ダイアログ関係を中央に出そうとするのはCenterWindowの仕業だから、
そこにブレークポイントをかけて、しかるのちに対策を考えればいいかと。
>>89 そのスレッドでダイアログの情報を持ってないのが原因だろうから、
何らかの方法でCWnd*を渡してメンバ関数版を使えばいいんでないかな。
>>89 試していないけど、CHogeDlgがCDialogを継承
しているならのメンバ関数のメッセージボックスを
呼び出せばいいんじゃないの?
94 :
デフォルトの名無しさん:04/07/03 16:44
>>89 >ダイアログの中央に出す方法はありませんか?
方法はある。 WM_INITDIALOG
もっと簡単な方法が知りたいってことか?
どんくらいまでわかるのかを書かないと
それこそ基本中の基本から説明せにゃならん。
もちろん、それは万単位が相場で只ではできない。
MDIでフォームビューを選んだとき、フォームのダイアログのサイズを
MoveWindow()とかSetWindowPos()でサイズを変えようとすると
必ず落ちますが(DEBUGビルド時)、これって許されないのでしょうか。
CChildFrameのサイズに合わせて大きさを変えたいのですけど。
>>95 簡単にいいますと、フォーム内のダイアログテンプレートのサイズを
変更するにはどうしたら良いのか、ということです。
単純にGetDlgItem()ではダメですよね。NULLが返ってきてしまいます。
>>91,92,93,94
回答ありがとうございます。
とりあえずスレッド作成元のCWnd*をグローバル変数に設定して、
スレッド内からMessageBoxを呼び出す方法と、直接メンバ関数の
MessageBoxを呼び出す方法を試しましたが、結果は同様でした。
なお作成元のスレッドでAfxMessageBoxを呼び出した場合には、ダイアログの
中央に表示されます。
>>94 当方組み込み向けのCが本職で、Windowsプログラムはほとんど経験がありません。
スレッド内でメッセージボックスを表示させることはWindowsプログラムではほとんどしな
いことなんでしょうか?
>>97 俺もあまり詳しくはないが、そこまでMessageBoxにこだわる必要はないのでは?
メッセージ出力用のダイアログクラスを作成して、そのクラスに親の位置を渡せば良いのでは
ないのかな
ダイアログクラスなら、OnInitDialog()で表示位置やサイズを変更すると簡単なんだけど。
意図していたことと違うかもしれないが、暫定的にしておいて、他のもっと重要なところに
パワーをかけた方が良いと思うよ
99 :
デフォルトの名無しさん:04/07/03 23:47
>>97 スレッドにはメッセージループを持つスレッドと、持たないスレッドがある。
WM_INITDIALOGはメッセージなわけだが・・・
>>97 Windowsでは、ウインドウはどれかのスレッドに属している、
つまりスレッドがウインドウを保持しているといっていい。
そして1つのウインドウは複数のスレッドに共有されることは無い。
ウインドウには親子関係があるがこれは同一スレッド内においてのみ有効
スレッドがウインドウを作った場合親ウインドウに別のスレッドのウインドウを
指定しても無効になる
メッセージボックスの場合、内部的にCenterWindowが呼ばれるわけだが、
親ウインドウがいないもしくは無効な為、ど真ん中に表示されてしまう
どうしてもと言うなら、試したこと無いので出来るかどうかわからないが
見えない親ウインドウをスレッド元のウインドウサイズにあわせて作って
おいてメッセージボックスを呼び出すとか
>>96 つまり、スクロールバーを表示させたくないってこと?
103 :
デフォルトの名無しさん:04/07/04 17:52
CStringArrayのサンプルプログラムが欲しいです。
参考ページでもいいのでお願いします。
105 :
デフォルトの名無しさん:04/07/04 18:09
>>104 コンパイルすらできない俺って・・・_| ̄|○
VC7ですが、助けてくださらんか?
>>105 長くなって申し訳ないが、969さんのコード全部転載させてもらいますた。
あくまで例として載せてくれたみたいなので、宣言が抜けてたりしたのを
追加しただけです。
#include <afxwin.h>
#include <io.h>
#include <iostream>
using namespace std;
CStringArray arDstFileList;
CStringArray arSrcFileList;
void Read(CString& csFile)
{
CStdioFile readFile;;
CString csRead;
readFile.Open(csFile,CFile::modeRead);
CString csDstFile;
CString csSrcFile;
while (readFile.ReadString(csRead)){
csDstFile = csRead.Mid(0,csRead.Find(":"));
csSrcFile = csRead.Mid(csRead.Find(":") + 1,csRead.GetLength());
arDstFileList.Add(csDstFile);
arSrcFileList.Add(csSrcFile);
}
readFile.Close();
}
void Move()
{
// ファイル有無(書き込み権チェック)
for (int i = 0;i < arSrcFileList.GetSize();i++){
if (0 != _access(arSrcFileList.GetAt(i),6)){
throw new CFileException();
}
}
// ファイルの移動
for (i = 0;i < arSrcFileList.GetSize();i++){
if (0 == ::MoveFile(arSrcFileList.GetAt(i),_T("C:\\temp\\") + arDstFileList.GetAt(i))){
throw new CFileException();
}
}
}
main()
{
try{
Read(CString("C:\\list.dat"));
Move();
}
catch(CException* pE){
pE->Delete();
cerr << _T("ERROR") << endl;
}
}
>>106 VCを初めて3日目なんで、こういうコードを載せてもらった場合、
どうやってスケルトン?(でしたっけ)を作るかわかりません。
MFCアプリケーションで作ればいいのでしょうか?
>>106 サンプルコードありがとうございました。
お礼が遅れて、すみません。
>>105 上のコードだとMFCとは言ってもMFCの中の
CStringArrayを使うだけで、中身はコンソールプログラム
だから(簡単に書くとコンソールプログラムはmainから
始まり、ウィンドウズプログラムはWinMainから始まる)
とりあえず、Win32コンソールプロジェクトで作成する。
で、CStringArrayを利用するにはMFCをリンクする必要が
あるのでプロジェクトのプロパティで「MFCの使用」を
「共有DLLでMFCを使用する」または「スタティックライブラリ
でMFCを使用する」に設定する。
始めて3日だと、リンクとかDLLとかスタティックとか言われても
わけわからないだろうけど、MSDNにも情報があるのでこつこつ
やってちょ。
>>110 がんばってコンパイルはとおりましたが、エラーが出て実行できませんでした。
もっと勉強します。
スプラッシュウインドウとしてメッセージを表示させるだけの
ダイアログにスタティックウインドウを貼り付けただけのウインドウを作りました
CWinApp::InitInstance中で作成、表示させようとするとウインドウ自体は
表示されるのですがスタティックコントロールのメッセージが表示されません。
メッセージはInitInstanceの関数を抜けたあとなら表示されるので
ただ単純に再描画の為のメッセージを受け取れていないだけだと思うのですが
InitInstance中にメッセージポンプ入れるなど色々試してみましたが思うように
表示されません。
今は、別スレッド化してメッセージの表示は出来ていますが
出来たら単一スレッドで動かしたいです。何かよい方法をご存知の方いらっしゃったら
教えてください
質問なのでage
114 :
デフォルトの名無しさん:04/07/04 21:37
>>105 そっかぁ。もっと簡単な例だせばよかたーYO。
ごめん。
MFCの配列クラスはCStringArrayとかCUIntArrayとか
いっぱいあるけど、テンプレートというのを覚えると、
CArray<CString>、CArray<UINT> とCArrayクラステンプレート
だけ覚えると何でも作れるようになるYO。
その場合でもよく使うのは、Add、GetAt、GetSizeとかで
その他のも使ってるうちに覚えてくる。
#include <afxwin.h>
#include <stdio.h>
int main(void)
{
CStringArray ar;
ar.Add("あ");
ar.Add("い");
ar.Add("う");
printf("配列の要素数は %d コです。\n", ar.GetSize());
for (int i = 0; i < ar.GetSize(); ++i) {
printf("配列の %d 番目の 要素は %s です。\n", i, ar.GetAt(i));
}
return 0;
}
つーか始めて三日でなんでCStringArrayなのか分からない。
まずCString、そのうちCArrayって感じだと思うが。それぞれの
概念が理解できていれば、Arrayの仲間についても自然と分かる
はずだし。
>>115 ありがとうございます。
なんとなく、わかりました。
何でも作れるようになる・・・素晴らしい言葉ですね。
頑張ってマスターします。
今後とも宜しくお願いします!
素直にvector使おうよ…
>>118 MFCで作っている限りにおいてはvectorを使用するよりも
CStringArrayのほうが利点が多い
漏れもMFC使ってる分にはSTL使わないなぁ
>>118 vectorを使うとCStringArrayよりいいのでしょうか?
>>121 CString使うなら、CStringArrayで問題ない。
>>122 逆にstringだとvectorですか?
MFCでコンテナとして使うだけならデバッグ性能やシリアライズが出来る
CStringArrayが良い
アルゴリズム使う場合はstlだけどね
該当するものがなければvectorなり使うしかない。
ちなみに、VCでstl使うならstlportの方が良いよ
128 :
デフォルトの名無しさん:04/07/04 23:42
スレッドを使うプログラムを作ったのですが、
スレッドからダイアログにメッセージをセットしようとするとアサートします。
スレッドが怪しいのですが、
UINT thread(LPVOID pParam)で作って
CTestdlg;
として、dlg.GetDlgItem(IDC_EDIT1)->SetWindowText(msg);
では駄目なのでしょうか?
どうすればセットできますか?
>>129 俺も使ってるけどねboost
ただ敷居がちと高い
もう少し詳しく書いてくれたら教えるよ
>>110 便乗で申し訳ありませんが、
1.「共有DLLでMFCを使用する」
2.「スタティックライブラリでMFCを使用する」
1.2はどうちがうのでしょうか?
>>129 boostはstl実装じゃないじゃん。
libをリンクするか、dllを使うかの違い。
>>132 ダイアログベースでスレッドをコールするようにしているのですが、
そのクラスへ Cクラス dlg
として、dlg.GetDlgItem(IDC_EDIT1)->SetWindowText(msg)とすると
アサートします。
コンパイルは通るのですが。
>>136 う〜ん、わからんw
まずスレッドを生成している場所はどこ?
生成方法は?
ついでにそのダイアログクラスは、元のダイアログなの
関係が上手くつかめない
>>139 生成場所はダイアログで実行される関数内です。
CWinThread *p_thread = ::AfxBeginThread(Thread, this);
こんな感じでThread関数を呼び出します。
UNIT Thread(LPVOID pParam)
ワーカスレッドを真似てみたのですが。。怪しいです
>>140 ダイアログは一つです。クラスも一つです。(スレッドはクラスの宣言をしてません)
>>141 聞いたことはありますが、使ったことはありませんでした。
ちょっと調べてみます。
あーなるほど
スレッドに元のダイアログのポインタを引数として渡して
そこからダイアログの子ウインドウに何かやっているってことか
アサートしているのはどこ、GetDlgItemのウインドウハンドルがNULLとかかな?
>>144 そんな感じでしようとしてましたができませんでした。
生成場所のダイアログで実行される関数って何?
使用で
「マルチスレッドに対応すること」
と書かれていた場合、どんな風に実装すればいいのでしょうか?
またすごい質問がきたな。w
>>145 多分そうです。ウィンドウハンドラがNULLです。
>>148 同時に同じリソースにアクセスされても整合性が取れる実装ってことだね
ライブラリなんかを作る場合、その部分をしっかり作っておかないと不味い
ユーザインタフェーススレッドはこのコール方法で合っていますか?
CSubThread *pThread = (CSubThread*)AfxBeginThread(RUNTIME_CLASS(CSubThread),THREAD_PRIORITY_NORMAL, 0, 0);
pThread->m_bAutoDelete=FALSE;
pThread->ResumeThread();
これでCWinThreadの派生クラスを作成しましたが、これでよいのでしょうか?
複数のスレッドにするにはその数分クラスを作成しないといけないのですか?
OnOkか・・・ちなみに、そのコントロールは存在しているよね
>>154 はい。デフォルトのまま置いてあります。
>>153 言っておくけどユーザインターフェーススレッドはそのスレッドでウインドウを
マネージしたい場合(メッセージキューを作って云々ってことね)に
作るスレッドなので138の今回の目的のためには使えないんじゃないかと思う
なぜならユーザスレッドとワーカスレッドなんてのはMFCの上だけで存在するものだし
多分もっと根本的な問題だと思うけど
まさかとは思うけど
OnOKの実装ってそのままにしていない?
CDialog::OnOKのディフォルトって内部でEndDialogを呼び出すけど。。。
>>155 たぶんソース張ってもらったほうが早いんで、ソース張ってくれます?
スレッドの部分だけでいいんで。
ちなみに今ダイアログでこんなの作ってみたが問題なく動いたよ
UINT ThreadFunc( LPVOID lpVal )
{
CThreadTEstDlg *pDlg = (CThreadTEstDlg *)lpVal;
pDlg->GetDlgItem( IDC_EDIT1 )->SetWindowText( "テスト" );
return 0;
}
void CThreadTEstDlg::OnOK()
{
// TODO: この位置にその他の検証用のコードを追加してください
CWinThread *pThread = AfxBeginThread( ThreadFunc, this );
//CDialog::OnOK();
}
>>159 漏れも試したら普通に動いたんで、なにか根本的に間違えてると思う。
こんな感じです。
void CTestDlg::OnOK()
{
threadflag = 1;
CWinThread *p_thread = ::AfxBeginThread(Thread, this);
//CDialog::OnOK();
}
UNIT thread(LPVOID pParam)
{
CTest dlg;
CString msg;
while(threadflag){
// 処理
//msgにメッセージを格納
}
dlg.GetDlgItem(IDC_EDIT1)->SetWindowText(msg);
}
threadflagがグローバル変数のフラグで
こいつは本当はMutexLockとかしてもう少し複雑に処理してますが、
流れはこんな感じです。
あぁ、やっぱり。。。。
>CTest dlg;
ここ
いやな予感はしていたが・・・
じゃ、後はよろしく
俺は寝ます・・・
167 :
デフォルトの名無しさん:04/07/05 01:19
>>106 これをstl使って書いたコードが見たいのですが、誰か書いてくれませんか?
>>167 >115のでもいいなら...
#include <vector>
#include <string>
#include <stdio.h>
using namespace std;
int main(void)
{
vector<string> vec;
vec.push_back("あ");
vec.push_back("い");
vec.push_back("う");
printf("配列の要素数は %d コです。\n", vec.size());
for (int i = 0; i < vec.size(); ++i) {
printf("配列の %d 番目の 要素は %s です。\n", i, vec[i].c_str());
}
return 0;
}
string、vectorがSTLで定義されているクラスです。
for文のところは
int i;
vector<string>::const_iterator iter;
for (i = 0, iter = vec.begin(); iter != vec.end(); ++iter, ++i) {
printf("配列の %d 番目の 要素は %s です。\n", i, iter->c_str());
}
でもOK。これはSTLのイテレータという機能を使った方法。(イテレータは自分で勉強してちょ)
>>106 これさー、datのSTARTとENDそのまま読み込むからエラーになるんだよ。
そりゃ、コンパイル通っても実行はできんさw
172 :
デフォルトの名無しさん:04/07/05 22:28
質問です
CDialogBar上に、スピンボタンを配置しました
CDialogBarは、派生クラスを作らないとMSDNにあったのでコントロールのハンドリングは
すべてCMainFrame上に持ってきています。
このようにすると、スピンコントロールがどうしてもEnableになりません
これはどういうことでしょうか
環境はVC6sp6です
メッセージボックスっぽいものを自作することで
解決しました。
回答をくれた皆さんありがとうございました。
>>172 CDialogBar::OnUpdateCmdUIをオーバーロードしないとあかんらしいです。
うちはVS.NETだけど、たぶん同じだと思います。
175 :
デフォルトの名無しさん:04/07/06 00:51
MFCでコマンドライン引数を渡したいです。
m_lpCmdLineを使うのはわかったのですが、サンプル欲しいです。
渡したいコマンドライン引数は
「xxx.exe -a:c:\hoge.txt -b:c:\poko.txt」
MFCのダイアログベースで制作しているアプリです。
引数を他のcppファイルで受け取って、変数に入れて使用したいです。
宜しくお願い致します。
>>174 回答ありがとうございます
つまり、CDialogBarを派生させないといけないと言うことですね
問題のおきているソースは、かなりでかいプロジェクトでCDialogBarのほとんどの
コマンドハンドラーはCMainFrameに記述されています。
そのためCDialogBarの派生クラスに持っていくのは結構手間がかかってしまいます。
ためしに新規にダイアログバーを持つSDIアプリを作ってみたところスピンコントロールは
問題なくEnableになっていました。
MFCのソースを解析してみたところ、通常ボタンコントロール以外はGet(DLGC_BUTTON以外)
Enableになるように見受けられるのでもう一度どういう原因でDisableになるか調べてみようと思っています
途中で送信してしましました
・・・・
問題なくEnableになっていました。
MFCのソースを解析してみたところ、ジェネリックボタンコントロール以外は
(WM_GETDLGCODEの戻り値がDLGC_BUTTON以外)
Enableになるように見受けられるのでもう一度どういう原因でDisableになるか
調べてみようと思っています
ついでだから回答w
>>175 MFCの場合引数はCCommandLineInfoを継承したクラスを生成して
ParseParam関数をオーバーライドして引数を解析するというのが一般的です。
(といいつつあまり一般に利用されていないけど)
今回の引数は形式がウインドウズの標準と違うため、独自に文字列の
切り離しなどを入れるしかありません-をオプションの識別子としているのであれば
-を取ってコロンを境に前後に文字列を分ける等の処理を入れれば良いでしょう
さてそれを他のcpp(多分他のクラスということでしょうか)に渡すのであれば
ab切り出したそれぞれの文字列変数(CStringなど)を別のクラスに渡せばいいと思います
すいません。
ちょっと質問です。
今、巷の普通の本屋さんで売っているWindowsプログラムの本は大体Visual C++の
本です。
それでそういう本には、「ウイザードで勝手に作られるんで、カスタマイズしたいときは
ここをいじってください」としか書いてなくて、なぜそこをいじればいいのか、プログラムが
どういう流れになっているのか全く分かりません。
結局、SDKの方が分かりやすいと思い、まずはそっちをやることにしました。
みなさんはどうやってMFCを勉強されたのでしょうか?
もっと良い入門書があるのでしょうか?
>>180 どの関数がどのクラスのメンバか意識するようにしたら理解できた。
関数名しか書いてなくても、クラス名::関数名 っていうようにして憶える。
>>180 > それでそういう本には、「ウイザードで勝手に作られるんで、カスタマイズしたいときは
> ここをいじってください」としか書いてなくて、
まずはそこから始めて、具体的な成果物を作らないことにはモチベーションが
持続しないと思うが。体系なんてものは大きすぎてなかなか理解できるもので
ないし、とにかく何か動くものを作れるようになることが先。手段は後で良いんだ
よ。まず「何を作りたいか」、「どういう動きをさせたいか」が大切。それに沿って
どうすれば良いかを調べていく。経験を重ねれば、下層にあるものがだんだん
見えてくるし、それからシステムの学習に入ればいい。
もちろん、CやC++の基礎がないようなレベルだったら話は別。そういった
言語レベルの基礎知識は身に付いてないとVCプログラミングは難しい。
>>180 そんなあなたに
翔泳社の標準講座MFC ハーバートシルト著
>>180 MFC→ウィザードが生成したものをいじる
SDK→猫からソースパクっていじる
結局同じ
>>180 食わず嫌いせずとりあえず一番高いものに食いついて、消化できなくて吐き出して、
高い金払って食って吐いて、高い金払って食って吐いて、
食って吐いて、食って吐いて、食って吐いて……と繰り返しあがき続けていたら、
いつの間にかMFCでもSDKでも問題なく使えるようになり、物も食えるようになっていた。
しかし、そこに行き着くまでに消費した書籍代は…… _| ̄|○
本来、クラスライブラリはその中の構造に関する知識を必要としな
いものだ。したがって
>なぜそこをいじればいいのか
>プログラムがどういう流れになっているのか
なんて気にするな。
と考える俺は少数派だと自覚しております。
187 :
デフォルトの名無しさん:04/07/07 20:47
>>185 途中で降りたらベット丸損だぞ
本と同じ重さの札束を狙う大博打ってとこを忘れんな
188 :
デフォルトの名無しさん:04/07/07 23:13
void hoge(void)
{
CPen myPen;
myPen.DeleteObject(); ←これいるんですか?
Delete myPen; ←これもいるんですか?
}
CPenってスコープ外れる時に、この辺やってくれないの?
> Delete myPen; ←これもいるんですか?
こんなのいれたらコンパイルとおらねぇよ。
>>189 myPen.DeleteObject();
これ、必須ですか?
msdnより、
1.スタック フレーム上にグラフィック オブジェクトを定義します。CreatePen など、それぞれの型固有の作成関数を使って、オブジェクトを初期化します。コンストラクタでオブジェクトを初期化することもできます。
1 段階で作成する方法と、2 段階で作成する方法については以下に説明します。
2.オブジェクトを現在のデバイス コンテキストに選択し、前に選択した古いグラフィック オブジェクトを保存します。
3.現在のグラフィック オブジェクトを使い終わったら、古いグラフィック オブジェクトをデバイス コンテキストに選択し直して、状態を復元します。
4.フレームに割り当てられたグラフィック オブジェクトは、スコープからはずれたときに自動的に削除されます。
これ見て意味わからんかったら再度質問しろ。
>>188 その変数がスコープ内で使い切りになっていて、デストラクタによる削除で
間に合う場合は、DeleteObject()が不要。ただしDeleteObject()を書いても
悪くはない。
デストラクタに任せるか、明示するかの違い。あるいはそれぞれその必要が
あるかどうか場合によって選択する。
>Delete myPen;
は?
>>191 >>192 ありがとう、謎が解けました。
これで熱帯夜も眠れそうです。
Delete myPenは立ち読みした時に載っていて、
「え?そんなんまで書くんだ・・・」
と記憶していたもんで・・・
>>188 MFCってよりC++の根本的な理解が足りないだけじゃないんですか?
>>195 CDCとCClientDCのデストラクタの違いについて
C++の根本的な理解で説明してくれ
CDC::~CDC()
{
if (m_hDC != NULL)
::DeleteDC(Detach());
}
CClientDC::~CClientDC()
{
ASSERT(m_hDC != NULL);
::ReleaseDC(m_hWnd, Detach());
}
CPenから話が飛んでますよ
っていうか、C++理解していれば、
わざわざここに質問するようなことではないのだが。
単なる仕様だろ。
そのMFCの仕様が分からないから、ここに質問したのだと思われ・・・
仕様ならヘルプに書いてあるよ。
>構築時に Windows の GetDC 関数を呼び出し、
>破棄時に ReleaseDC 関数を呼び出します。
>>202 ヘルプも見ないで質問する人、どう思います?
206 :
デフォルトの名無しさん:04/07/08 22:54
207 :
デフォルトの名無しさん:04/07/08 22:58
これから先は、
ヘルプに書いてある事質問禁止
でお送りします
ム板ってヘルプみたいなもんだろ。違うか?
210 :
デフォルトの名無しさん:04/07/08 23:27
もうさ、BCBにしとけって
マジおすすめ
213 :
デフォルトの名無しさん:04/07/08 23:59
BCBの何がいいのかマジわからんぞ
つか、WindowsアプリではVC最強!
そんな恥ずかしい事、ageて言わないでくれ・・・
216 :
デフォルトの名無しさん:04/07/09 00:35
MASMは?
217 :
デフォルトの名無しさん:04/07/09 00:46
名刀のような名前ですね。
218 :
デフォルトの名無しさん:04/07/09 01:00
>>213 はげ同
BCBは使えるが、VC++は使えないなんて香具師は
まず、仕事回してもらえないだろうね
仕事は回ってこないが、意固地な友達が増えるという利点がある。
スレ違いな話はそろそろやめれくれや
ヘルプが見れない環境って、
その時点で仕事放棄してるのと同じだ...orz
>>221 少なくても、本人の仕事環境に対する意識はゼロといえるだろう。
ヘルプが見れない環境のくせに、ここで得意になって質問されてもね。
車でガス欠しちゃうくらい恥と思わなきゃ。
え?VC++ってヘルプ無いの?!!!
最弱〜 orz
>>222 まともに答えられないくせに上級者気取りか。
おめでてーな。
2chできる環境ならオンライン版の
MSDNライブラリが見られるはず。
レスればレスるほどに恥ずかしさが増してくるよ。
VC++ぐらい1人でインストールしなさいって。
そうすりゃヘルプぐらい見れるから。
釣られまくりだな
228 :
デフォルトの名無しさん:04/07/09 07:59
趣味でやっていますが…
全部自演ですよ?
ところで226みたいな奴はこのスレに何を期待してるんだ?
レスる
ヘルプは読み方が分からないってのもあるからねぇ。
日本語かどうかじゃなくて、書いてある言葉そのものが読みきれないっていうか。
その辺をうまく要約してくれる神を求めて、ここに書いてることもあるでしょ。
233 :
デフォルトの名無しさん:04/07/10 01:47
MFCを使ったOOPのやり方について解説している本あるいはサイトがあったら教えてくれませんか?
234 :
デフォルトの名無しさん:04/07/10 01:54
すいません、まとはずれな質問しましたか??各クラスの役割がいまいち
よく分からないんですが・・・。
>>235 まとははずして無いと思います、
まともな回答者を待ちましょう
>>237 一応読みました。OOPの勉強はしたのですが、いざMFCで実現しようとすると、どのように
したらよいか、ってのが分かりません。例えば、CWinAppっていうのはコントローラなのか、
とか、ドキュメントクラスはなんなのかってことです。ほかには、画面を次々と切り替えて
行くとき、それぞれの画面のクラスを作成するのか?とかよく分かりません。作成すると
したら、それを切り替えるたり、生成したりするのはどのクラスでするべきなのか、とかです。
つまり、まだC++使う時期じゃないと思うのですよ。
自分で試行錯誤、いろいろやりながら覚えていく手間を惜しむのなら、
はじめからやめたほうがいいと思います。
でたな。上級者気取りのオッサン
>>240 さぞ悔しかったんだろう
ほっといてやれ
お前ら、まだやってんの?寝たら?
>>239 いや、ある程度実践的なプログラムの作成はこなしたんですが。いまだにどうすべきか、
ってのが分からずだましだましプログラミングしてる状況です。
あと240ではないです。
>>233 実践的なプログラムの作成をこなせてるのなら
今のままでも問題ないのでは?
なんだ。趣味のプログラムか。
247 :
デフォルトの名無しさん:04/07/10 03:36
まさか仕事中に、「ドキュメントクラスってどうやって使うのですか?」
なんて聞いてまわったりしてないよね... orz
>>246 また上級者気取りのレス。いい加減にしろ。
>これから先は、
>ヘルプに書いてある事質問禁止
>でお送りします
BCBはMFCが付いていてもヘルプがない、冷たいこと、言わんといて。
250 :
デフォルトの名無しさん:04/07/10 07:55
225 :デフォルトの名無しさん :04/07/09 04:06
2chできる環境ならオンライン版の
MSDNライブラリが見られるはず。
ドキュメントクラスなんて、あれよ。ただのクラス。
ちょっと規模がでかくなりそうなんで、
描画用(ビュークラス)とデータ処理用(ドキュメントクラス)
に分けてみっか!てな感じ
252 :
デフォルトの名無しさん:04/07/10 09:24
>>251 そういうことじゃないんですが・・・、なんていったらいいんでしょうか?それ、
曖昧なんですよね・・・。その説明じゃ役に立たなかったというか・・・。
>>252 どうわからないのか説明できないのなら教えようが無いな。
254 :
デフォルトの名無しさん:04/07/10 11:18
>>253 例えば、商品注文システムを考えると、商品注文クラス(商品の1回での注文を表すクラス)というのが
ありますよね?それをドキュメントクラスの子クラスとするのか、それとも、そのクラスのオブジェクトを
保持するのがドキュメントクラスなのか、とかです。
256 :
デフォルトの名無しさん:04/07/10 11:29
>>255 ということは、そのクラスのオブジェクトを保持するのがドキュメントクラスってことですか??
>>238 OOPなんて言葉に縛られず、ひとつひとつのクラスの使い方を確実にマスターしてくことでしょうな。
100個も覚えられれば、そのうちピーンと何かがひらめいてくるだろう。
一度ひらめいてしまえば、クラスなんて覚えなくてもヘルプ片手にプログラムできるようになる。
その辺の話は、知るより感じなければならない部分なので、他人に聞いても解決しないよ。
仮想リストコントロール内でのアイテム選択変更に
SetItemState(nIndex, LVIS_SELECTED, LVIS_SELECTED | LVIS_FOCUSED);
とやっても選択が変わってくれないんですけど、これは使えませんか?
仮想LCだと選択についてもやり方が別になってますか?
260 :
デフォルトの名無しさん:04/07/10 12:23
>>250 ケータイから2chにアクセスしていますが、何か?
ドキュメントクラスってのはMVCでいうModel部分。
データ管理部分のクラス。
で、データをドキュメントクラスに持たせるか、派生クラスに持たせるかなんてのは
自分の好きにすればいい。
263 :
デフォルトの名無しさん:04/07/10 12:31
>>262 ケータイから2chにアクセスしています。
ケータイで使えるヘルプのURLを教えて下さい。
ここで釣られまくってる香具師はプロとして失格だね。
265 :
デフォルトの名無しさん:04/07/10 12:36
どいつもこいつもC++の根本的な理解が足りないだけだな
よく釣れるな・・・この釣堀は
267 :
デフォルトの名無しさん:04/07/10 12:45
>>264 プロって、2chのプロか?
それなら失格で大いに結構!!
>>267 おまえはプログラマとして失格だな
ただのグラマ
プロのグラマーって、ゲームセンターあらしであったネタだな。
釣られてる香具師ってコンプレックスのかたまりなんだと思う。
もっと冷静になって、自分をもっと知るべきなんだろうね。
まあ、オチケツ、と言っておこう。
厨房の行動
・負けそうになると「釣れた!」という
--某所より転載
273 :
デフォルトの名無しさん:04/07/10 15:08
>>272 FOMAで見てみましたが、どうやらケータイには対応していないようです。
見れない人はMSDNサブスクリプションの年間契約をしてください。
FOMAをモデム代わりにして、PCのブラウザでアクセスすればいんじゃないの?
>>275 ケーブル持ってないです。
それにパケット代で死んでしまいます。
つまり見る資格無しってことですよ。
そんな心がけでプログラマーは笑ってしまいます。
いや、私じゃなくて世間一般的に言ってです。
>>277 自称上級者たちに笑われても
痛くも痒くもありません。
>>276 プログラマってそういう仕事だよ。そのくらい金出してやれ。
将来得るに違いない能力が、つまらん制限のおかげで身に付くのが遅れるのは哀しいだろ?
今頃わかった!・・・
わざとやってんだろ?おまえら!
そうやって、暇だったら、プログラムの一つでも
作れってこった
もちろんわざとです。
ヘルプをどうしても見れない事にしたい奴を
からかってるだけです。
CStdioFileの派生クラスで、ファイルをオープンしたあとGetLength()実行すると
そこでAssertionがかかるんだけど何ででしょうか。GetPosition()でもかかってしまします
その質問で答えられたら超能力者
ASSERT出たときに、ファイル名と行数が出てこない?
そこを読めば?
>>285-287 原因が判明しますた
オープンしたのは基底クラス型の面罵変数だったのに、派生クラスのGetLength()を
直接呼んだのが間違いでした。オーバーライドしておくべきでした_| ̄|○
ヘルプを読んでもわからないはずだ...orz
>どいつもこいつもC++の根本的な理解が足りないだけだな
C++は仕様が複雑すぎるので、だれも根本的には理解できそうに無い。
291 :
名無しさん@そうだ選挙に行こう:04/07/11 11:24
>>265 どいつもこいつもに、あんたも含まれるのか?
含まれない人なら当然、「根本的な理解」とは何かが言えるよな。
まあ、100%理解してて記憶にもあってありとあらゆる記述ができるという人間は、
世界でも片手ぐらいしかいないんじゃないか?
実際使うときは、そんな必要はまったく無いのだが。
100%知ってると……あれだよ、TVチャンピオンC++選手権に出られる。
とりあえず何の疑問も持たずに
>>188 見たいなソース貼っちゃうようではまずい。
>>294 CPenがデストラクタ処理あるはずなのに
この記述には意味があるのか?
と疑問を持ったから貼った・・・とは解釈できんのか?
質問したい者だけが質問し
答えたい者だけが答える
これで好かろう
あとはガタガタ言うな
>>295 まずいのはそこではなく
new してないのに delete してるところだろ
しかも Delete になってるし。
C++の基本が全然理解できてない。
300 :
名無しさん@そうだ選挙に行こう:04/07/11 17:24
301 :
名無しさん@そうだ選挙に行こう:04/07/11 17:26
僅かでもMFCを外れると興奮する人がいるスレはここですか?
いえ根本的な理解が足りないと言われて
粘着になってしまった人がいるスレです。
303 :
名無しさん@そうだ選挙に行こう:04/07/11 17:46
>>298 そうそう、MFCとかCPenとかの理解じゃなくて、
先ず、自動変数に関して理解していないってところから
議論を始めなきゃならんということでしょ。
つまり、C++わかっちゃいねーなと...orz
306 :
名無しさん@そうだ選挙に行こう:04/07/11 18:41
まさか、スタックとかヒープとか知らないでプログラムとか組んでるとか?
末恐ろしいな…ガクブル
>>304 こんなのスルーできないようでは
アンタもガキですから!残念!
308 :
名無しさん@そうだ選挙に行こう:04/07/11 18:55
ここ見てる暇あったら選挙行って来い。
まだ1時間はあるぞ。
309 :
名無しさん@そうだ選挙に行こう:04/07/11 19:06
投票したらその場で.NET2003とか当たるようにすれば
もっと投票率上がるんじゃないか。
一度に10回ぐらい投票してやってもいいぜ。
ここ最近ageてるやつ妙にバカっぽいな。
というか、自己顕示欲が強いんだろ。
みんな、俺に注目してくれぇぇぇぇぇ!!!!!!
>>298 >>193の書き込みによると「Delete myPen;」は本に書いてあったらしいね。
本当に書いてあったのならその本も晒し者だな。
314 :
デフォルトの名無しさん:04/07/11 23:23
>>305 まったくだよ、C++を全然理解してない奴が
MFCに手を出すもんじゃないよな...orz
>>314 そのうちnewってコンストラクタで勝手にやってくれないの?
とか言い出すよ。きっと
MFCを使える程度にC++を理解してることがそんなに上級者なのか?
本当にそう思ってるなら本気でC++の入門書読んでからここに参加した方がいいよ。
318 :
デフォルトの名無しさん:04/07/12 00:27
と言うわけで、次のご相談どうぞ
↓
320 :
デフォルトの名無しさん:04/07/12 00:41
自称上級者がウザイのですが、どうすればいいですか?
次の方どうぞ
↓
だからMFC使える程度の理解なら上級者じゃなくていいっつの。
入門書でいいっつってんだろ。とにかく読んでから来いや。
自称上級者と、自称初心者は仲良く入門書を読んでくること
喧嘩しちゃだめですよ
相手を上級者と言うことが至高の煽りだと思っている人がいるようです。
悪い流れの中に落としちゃったみたいなので引っ越すよ・・・
326 :
デフォルトの名無しさん:04/07/12 11:33
>>324 だよな・・・煽りまでも幼稚だよな・・・アホとしか言い様ないよな..orz
あと、「自称上級者」って何だよw
上級者自称してる奴なんていつでてきたよ?w
>>326 あんたみたいなのがいると、燃料の落とし甲斐があるよ
今日はC++の本、何ページまで読んだの?
ここに来るのは本を全部読んで、
MFCのヘルプも見れる環境にしてからにしたほうが良いと思うよ。
でないと、話にならないですから。
取り敢えず、new delete の章はじっくり見た方が良さそうだ
自分の恥ずかしさに気が付くと思うよ
っていうか、質問するときの最低限のマナーとして、
最低条件とか決めてテンプレにでも載せたらいいんじゃないでしょうか。
たとえば、
・C++の基礎は勉強済み。
・MFCのヘルプを見れる環境を持っている。
は必要ではないでしょうか。
何でもかんでも教えて君は、本人の怠慢だと思いますので。
>>329 コンストラクタ、デストラクタ、クラスの関数への参照渡しと
そうでないときの引数の違いとか、最初に勉強したとき理解できなくて
そのままってこともありますものね。
ある程度経ってまた勉強しなおすと、目からうろこってことも多いです。
いまだにMFCは使ってるけどCStringを使わず、
char*ばかり多用している人もいるんですよね。
LPCSTRの存在の本質を本当にわかっている人は
いったいどれだけいるのだろうかと思います。
STL使ってない人って結構多いよね。
初めて使ったときは、こんな便利なもの!!って感動したけど。
CObList使う以前に<list>で間に合っちゃうなんてことも
結構あるんですけどね。
334 :
デフォルトの名無しさん:04/07/12 18:35
>>330 >・C++の基礎は勉強済み。
初歩ではなく基礎ならば
これを守れる香具師は皆無と思われ
基礎: ISO/IEC14882:2003
応用: MFC
>・MFCのヘルプを見れる環境を持っている。
ここにアクセスできる以上、
全員がクリアしていることが自明
(MSDNオンライン)
>>334 携帯でアクセスしてるなんてつわものもいるみたいですよw
ヘルプ見れないぞゴルァって切れてたしw
まあ、CやC++の質問はそれぞれの専用スレがある訳だし
最低限MSDNを調べ、それでも解決できない様であれば、
このスレに質問しに来なさい。
その時は、快く面倒見ようじゃないか。
338 :
デフォルトの名無しさん:04/07/12 18:50
339 :
デフォルトの名無しさん:04/07/12 18:56
>>333 そりゃ、STL も RTTI も MFC より後でできたやつだからね
>>338 あなたでしたかw
こんなに簡単に釣(ry
まぁ俺が学習した順番は
MFC → API → C++ → C
な訳だが。
自らの不勉強さを恥にも思わず、ただ切れるだけの人って、
ものすごく人生で損しているように感じます。
考え方をちょっと方向転換すれば、
とても幸せになれるのになって思います。
ぶちギレたら誰も教えてくれなくなりますものね。
世渡り上手も自分を向上させるコツのひとつです。
多分
>>338はまだまだ人生経験、社会勉強が足りないんだと思われる。
サラリーマンなら参考書ぐらい言えば買ってくれるものです。
会社があなたを認めているのならですけど...orz
>>342 おまえの中では不勉強の奴=切れてる奴
という図式が成り立ってるのか?
それはちょっと短絡すぎるぞ。
面白半分で煽り入れている奴の方が多いんじゃないかな?
おまえ以外の人はとっくに気がついている訳だが・・・
345 :
デフォルトの名無しさん:04/07/12 19:39
>>342 一日の長ってやつを定量的に認識できない香具師はまだまだ青いね
346 :
デフォルトの名無しさん:04/07/12 20:05
>>342 俺には両方切れている様に見えたんだが、
何故勉強不足の者だけが切れているかの様な
結論に至ったのかお聞かせ願いたい
>>348 上級者なら他人に聞くな。自分で調べろ。
不勉強=問答無用でアホ(C++不適合)
他称上級者=煽りに乗せられて荒らしに油を注ぎ、アホ(2ch不適合)
荒らし=なんと言うか、うんこ
静観者=正解
俺=まあ、アホ
と言うわけで、MFCの相談の方どうぞ
↓
351 :
デフォルトの名無しさん:04/07/12 21:26
静観者=アホ
見ない人 or 見るのをやめた人 = 正解
352 :
デフォルトの名無しさん:04/07/12 21:28
353 :
デフォルトの名無しさん:04/07/12 21:29
自らの努力をまったくせず、ただの教えて君質問は
わかる人にはわかるよ。それってスルー。
不幸にも釣られちゃう人が多いのも事実みたいだけど。
>>342 俺には両方切れている様に見えたんだが、
何故勉強不足の者だけが切れているかの様な
結論に至ったのかお聞かせ願いたい
スルーできない香具師、大杉...orz
>>356 いい質問だが、それはあなたの国語力に依存するので
なんと言っていいのやら。
MFC・C++云々じゃなくて、スルーを覚えてから2chに来よう
そこでBCBですよ奥さん
うんこ
>>363 BCBでMFC使おうとしてヘルプ見れないとか
言い出す奴いるからうんこ。
void hoge(void)
{
CPen myPen;
myPen.DeleteObject(); ←これいるんですか?
Delete myPen; ←これもいるんですか?
}
CPenってスコープ外れる時に、この辺やってくれないの?
おまえら早く寝なさいっ!
オレモナー
だからもう、何もかも自分でググれよ、脳無し
ここは本当によく釣れるインターネットですね
暇人ばっかり
374 :
デフォルトの名無しさん:04/07/13 07:42
見苦しいぞオッサン
こんな事してばっかりいるから
いつまでたってもBCBに追いつけないんだよ…
とマジレスしてみる
なんで急に釣りが増えたんだ
だって入れ食いなんだもん
厨房丸出しだね。どっちも。
暑さで逝っちゃいそうだからね...orz
っていうか、クーラー無しでがんばってる香具師いる?
自分の部屋にはクーラーありませんが。
ちょっと意味が違うorz
CString::LoadString()は重宝しています。
自作関数の引数にchar*となっているところをLPCSTRに書き換えてみろ。
CStringも渡せるぞ。すごいだろ。
char*とLPCSTRは違うけどな。
違うから意味がある。
LPCTSTR
389 :
デフォルトの名無しさん:04/07/14 09:13
ピクチャーボックスにファイルから選らんだビットマップを貼り付けたいのですが
どのようにすればいいのでしょうか?
えららんだ
(LPCSTR)(LPCTSTR)cstring; ってできるんだよね
>>392 出来るけど、UNICODEビルドではどうなっても知らないよ。
キャストは万能とか思ってる人多いなぁ
395 :
デフォルトの名無しさん:04/07/14 22:12
ヘ_ヘ
ミ・・ ミ ということにしたいのですね?
( ° )〜
396 :
デフォルトの名無しさん:04/07/14 23:37
質問です。
MFCを使わない標準DLLがあります。で、その中で機能追加のためスタティックライブラリを使おうとしてるんだが、
そのスタティックライブラリがMFCを使っています。
とりあえずヘッダはやりくりしてどうにかコンパイルはできましたが、リンク時に「DllMainは既に・・・」というエラーがでます。
MFC自体が持ってるDllMain?と標準DLLが持っているDllMainが衝突したりといった問題などあるように見えますが、
そもそもこういうことって出来ないんでしょうか?
1行目あたりから意味がわからん
>>395 ここんとこ急にフェミ猫のコピペが各スレで増殖し出したな。
俺に触発されたのか? :-P
>>396 そのスタティックライブラリをDLL化してそれを呼び出す
という逃げ方もあります。
>>396 スタティックライブラリの出来が悪くて、なぜかその中にDllMain()という関数があるんじゃないの (w
403 :
デフォルトの名無しさん:04/07/15 02:12
Document/View スタイルじゃないやり方(CFrameWnd + CWinApp)で、CWinAppにOnKeyDown等を加えてもメッセージが来ないんですが何故でしょうか?
Document/View スタイルだと動くんですが・・・。
コマンドルーティング
>>401 まぁそれが妥当かとは思うんですが、とりあえずファイル増やしたくないなぁと。
>>402 ん、、てことは普通はできるってことですかね?
まぁDllMain以外にもスレッドとかソケットあたりが変に混ざりそうでいやなんだけど、もうちょいもがいてみます。
>>404 サンクス。コマンドールーティング参考になりました。
しかし、間抜けでした。てっきりフレームワークで生成されるCChildViewクラスってAbout dialogのことだと思い込んでいて無視していたんですが、実はこれが入力メッセージを受け取る肝心なクラスだったんですね。
あーやだなこんな調子で今更MFCを覚えるの鬱。.NETって、あくまでも中間言語インタープリタだから、x86ネイティブコードという観点からいくとMFCの代替になりませんよね?
407 :
デフォルトの名無しさん:04/07/15 10:41
呼び出したメニューのIDを引数で渡してくれるメニュー用COMMAND関数を
作るにはどうしたらいいんでしょうか?
ON_COMMAND_RANGE
410 :
デフォルトの名無しさん:04/07/15 19:26
最近やっとMDIの勉強始めたばっかで初心者的質問なのだが、、
今MDIの画像ビューア作ってるけど画像を選択して子ウィンドウが表示されたときに
クライアントの大きさを画像サイズといっしょにしたい。
で自分なりに調べたが
CMyDocument::OnNewDocument
↓
CMyView::OnInitialUpdate
↓
CChildFrame::ActivateFrame
画像データはOnNewDocumentで取得。
最後のフレームのところでSetWindowPlacementか使ってフレームの大きさを
決めたいわけだ。
で、、どうやったらフレームからドキュメントみえるんだ? ビューにも画像データのポインタ
渡してるからビューでもいいけど、、。
誰か助けて_| ̄|○
間違えた、、、
×CMyDocument::OnNewDocument
↓
○CMyDocument::OnOpenDocument
連書きすまん、、自己解決
CFrameWnd::GetActiveDocumentなるまんまの関数があった、、、。
もっとヘルプみます_| ̄|○
ヘルプを見ないで質問しちゃう奴は
C++を理解してないも同然
また出たよ。自称上級者が・・・ (;´Д`)
解答できない質問されるのがよほど悔しいのかね
じしょう 【自称】
(名)
(1)実体はどうあれ、自らこうだと称すこと。
で、誰か自称したのか?
>>418 明言しなくても、言外に表れている。
それくらい解れよ。
荒らそうと必死だな
.aviをフォームの背景として再生するために
CAnimateCtrl m_animate;
//...
m_animate.SetWindowPos(HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
m_ctrl.BringWindowToTop();
という風にCAnimateCtrlのオブジェクトを一番下に、その他のコントロールを上の方に
持っていこうとしてるんだけど、直ぐにアニメーションが最前面になってしまいます。
何かうまい解決策はないもんでしょうか?
>>419 だからそれ、自分が上級者だと勘違いしているだけなんだから自称って言わないってば。
(Win32スレに誤爆したのでこちらに書き込みます。)
MFCフレームワークで、CWinApp, CMainFrm, CChildView という派生クラスを使う事を強要されますけど、どこにどういう機能を置けばいいのかいまいちピントきません。
リアルタイムでレンダリングするスクリーン、キー入力、パラメータ入力用のダイアログがあるので,
CWinApp -> OnIdle() レンダラーアップデート, CChildViewへの描画。
CChildView -> OnKeyUp(), OnMouseMove()等
CDialog -> CMainFrm::hoge->SendMessage(...) で入力パラメータを送る。
CMainFrm -> SendMessage(...)でクラス間のデータ受け渡し。
っていう感じでやっているんですが、クラスが保持している別クラスインスタンスへのポインタがprotectedになっていたりするので、SendMessage()のバケツリレーみたいになったりして、2度手間3度手間が多くて疲れます。
「プロはこうやる」っていうのがあったら教えてください。
>>424 CDocumentが出てきてないようだが、使ってないの?
>>424 プロはめんどくさいのでウィザードの吐いたコードいじって使います
プロはめんどくさいのでそもそもMFCを使いません
プロはSDKだけでプログラミングするなんて
非効率なことはしません。特別な事情がない限り。
ネタにマジレスすんな
>「プロはこうやる」っていうのがあったら教えてください。
図書館で、
「MFCによるWindows95プログラミング」か「MFCによるWindowsプログラミング」
を借りて読んでください。
431 :
デフォルトの名無しさん:04/07/17 17:52
ネタなので放置な。
こういうことをMSがやったものがMFC
435 :
デフォルトの名無しさん:04/07/17 18:36
MFCでお勧めの本ってある?
効率って削減したらダメじゃないか?
using namespace std; ・・・(1)
なんてことをすると、MFCのテンプレートのCArrayなどを使うときに問題がでますが、
using namespace std; する前の状態に戻すときは std の部分になんと書けばいいですか?
439 :
デフォルトの名無しさん:04/07/17 20:30
CTabCtrlについて教えてください。
VisualStudioにあるような平らなタブを作成したくて、CTabCtrlを継承してクラスを作成
SubClass化してDrawItemをオーバライドしたのですが、
DrawItem内では、TabCtrlの枠の描画はOS?依存らしく自前で描画が出来きないようです。
このようなタブをMFCを利用して作りたいときはどの様にすれば、よろしいのでしょうか?
ご教授いただきたく思います。
>>439 codeguruやcodeprojectに行けばあったと思う。
探してみて。
441 :
デフォルトの名無しさん:04/07/18 00:08
>>440 codeprojectにありました。
会員登録? して試してみたいとおもいます。
どうもありがとうございました。
>>436 この本初めてみたけどいいの?
USサイトではいいみたいだけど。。。
MFCはもうだめぽ
444 :
デフォルトの名無しさん:04/07/22 16:29
質問です
MFCを使用して、MSCommで通信を行っているのですがどうにも
解決できない問題に遭遇しました
当初Windows2000を使用していたのですが、WindowsXPに
もってきて動かすと受信がうまく出来ません。
受信部にイベントOnCommを使用しているのですが、2000だと問題なく受け
とれる受信イベントがXPでは受け取れません
RThreshなどはソフトで設定していて、値も正常に入っています
ポートオープンで失敗していることもありません
どなたか、同様の現象がでて、対応された方いらっしゃいますか?
開発環境は VC6+SP6です
日本人の書籍とアメリカ人の書籍を読み比べた結果、導き出された結論。
Windowsプログラミングを知り尽くしているのがアメリカ人。
Windowsプログラミングを知ったかしているのが日本人。
マイクロソフトの仕様変更を先読みしたプログラムを書くのがアメリカ人。
マイクロソフトが仕様変更したときに「仕様変えんな ゲイツ氏ね!」と泣くのが日本人。
MFCの不具合に文句を言い、不具合を修正して使うのがアメリカ人。
MFCの不具合に文句を言うだけで何も出来ないのが日本人。
MFCを一から教える書籍を売るのがアメリカ人。
Appウィザードで作成したテンプレートにコントロールを追加するだけの子供騙し書籍を売るのが日本人。
オリジナリティに溢れたMFCの書籍を売るのがアメリカ人。
他人からパクったネタを適当に並べただけの書籍を売るのが日本人。
やっぱ 日本人の書籍だけでは不十分。
どれもこれも同じようなものばっかりなんだもん(藁
↑みたいなこと必死に書くから日本人は馬鹿にされるんだな
447 :
デフォルトの名無しさん:04/07/22 18:17
>>445 > MFCを一から教える書籍を売るのがアメリカ人。
> Appウィザードで作成したテンプレートにコントロールを追加するだけの子供騙し書籍を売るのが日本人。
入門用としてはやったことがすぐカタチになる後者の方がおすすめ
449 :
デフォルトの名無しさん:04/07/22 18:51
>>448 神頼み的な思想を植えつけない細心の注意が必要
450 :
デフォルトの名無しさん:04/07/22 18:54
CFrameWnd すら使うかどうか
習得パス設計との緊密なマッチングで決めること
TABオーダーでバグられた位でグラつく知識はダメ
MFCはダメなライブラリの見本
452 :
デフォルトの名無しさん:04/07/22 19:26
>MFCの不具合に文句を言い、不具合を修正して使うのがアメリカ人。
文句言うより他あたるのがアメ公
アメリカ人はコレ使うと決めたら他の選択肢捨てるよね
俺アメリカ人だけど、MFC自体捨てたよ
今はBCBで、バリバリ快調っす
456 :
デフォルトの名無しさん:04/07/22 21:41
面接で渋られたときのゴネ方が内容的にまるで違う
日本人:イオナズン
アメリカ人:ダディクール
>>445 アメリカ人向けの糞本は翻訳されないだけだろ
そんなのに著作料と翻訳料払うぐらいなら日本人に直接書かせる罠
原書読めば笑えるのも呆れかえるのも、いっぱいある。
461 :
デフォルトの名無しさん:04/07/25 21:38
VC.NET2003(MFC)の質問です。
ダイアログを作る時にエディットボックスなどと関連付けするメンバ変数を作ろうとしているのですが、
うちの環境ではなぜかメンバ変数追加ウィザードが動作しません。
手動でメンバ変数を書いた場合にエディットボックスどうやって関連付けすればいいのでしょうか?
>>461 アイテムをダブルクリックして駄目なら駄目なんだろ。
>>461 ダブルクリックするとエディタが開いてチェンジイベントの記述になります。
VCがおかしい→再インスコ
ウィザードがおかしい→テスト用プロジェクト作ってみる
手動がいい→サンプルをまねる
CList の入れ子ってできないでしょうか.
CList< CList< int, int >, CList< int, int > > みたいな.
VS.NET2003で新しいプロジェクト作成でMFCアプリケーションを作成したら、
ダイアログバーも生成されたので、リソースエディタでエディットコントロールを2つ
追加してコンパイルすると、ダイアログバー上にエディットコントロールが2つあって、
文字の入力等は問題なく出来るのですが、TABキーでフォーカスの移動をしようと
しても、1つ目のエディットコントロールにしか移動しません。
リソースのタブストップには両方ともチェックが入っているのですが、どうすれば
フォーカス移動が出来るようになるのでしょう?
>>467 設定してもだめ。
というか、設定してなくても、普通のダイアログならリソースエディタで貼り付けた
順に初期設定されてるから、意図したとおりにならずとも何がしかの順で移動して
くれると思うのですが、TABキーでは頑なに1つめのエディットコントロールから
離れようとしません。
クリックしてやるとちゃんと2つ目のエディットコントロールにフォーカス移動するん
ですが。
なんか、追加のコードがいるんでしょうか?
>なんか、追加のコードがいるんでしょうか?
普通はいらない。
というか、普通にウィザードでMFCアプリ作ってもダイアログバーなんか付いてこないと思うんだが。
>>469 プロジェクト作成時にReBarを使う設定にすると付いてくるようです。
んで、解決しました。ダイアログバーに割り当てられてるダイアログリソースの
ControlプロパティがデフォルトではFalseになっていたのでした。
プロジェクト生成時にこれくらいはTrueにしておいてほしかった・・・orz
あー、そういうのがあるのか。2003はインストールしただけでほとんど使っていないので気付かなかった。
それにしても、2003のリソースエディタのプロパティは使いにくいなあ。
無理矢理ダイアログバー作ろうといじってて、なかなかダイアログスタイル設定できずに苦労した。
何だよ「子」って
472 :
デフォルトの名無しさん:04/07/29 00:00
スレが汚れるので.NETの話題はお控えください。
473 :
デフォルトの名無しさん:04/07/29 01:29
>>472 スレのレベルが下がるので、VisualStudio.NETと.NET Frameworkを
混同している人はカキコを控えて下さい。
VC++.NETはMFC的には機能ダウンしてるしな
475 :
デフォルトの名無しさん:04/07/29 08:33
>>474 ウッソー?
機能アップしてるだろ。
例えばCStringはstd::basic_stringのようにテンプレートクラス化されて
使いやすくなってると思う。
>>475 書き方が悪かった。ライブラリじゃなくてIDEまわりね。
MFCライブラリはもろもろ良くなってるね
CStringはウニとS-JIS混在できるしね
IDEは.NETと共通化したから非共通部分が落とされたね
478 :
デフォルトの名無しさん:04/07/30 17:48
先輩にMFCをするより、SDKでガイガリやったほうがいいのができるっていわれたんだが、本当?
いいのができるかどうかは関係ない。
APIだけで作っても駄目な物は駄目
その先輩はMFC使えない、C++わからないだけってパターンが多い。
481 :
デフォルトの名無しさん:04/07/30 19:39
MFCって何から勉強すればいいんだ?
自分が必要とするところから。
習うより慣れろ。
484 :
デフォルトの名無しさん:04/07/31 18:25
CListView でレボートビューにした場合、ラベルを改行して
複数行で表示したいのですが、可能でしょうか。
Owner Drawでやるしかないんじゃない?
マルチします。すみません。
C++BuilderXでGUIアプリを作成する場合には
MFCは使えるのでしょうか?
また、フォームエディタは使用できるのでしょうか?
487 :
デフォルトの名無しさん:04/07/31 22:30
CListView で Owner Draw を使うのにはどうすればいいのでしょうか。
教えて君で申し訳ないです。
調べても調べがつかなかったもので。。
>>487 CodeGuruに行くとそういうサンプルが少なくとも二つは見つかるよ。
#つーか、見つけた。
OwnerDrawじゃなくてCustomDrawの手法ならGoogleで国内サイトを探すだけでいろいろ出てくると思う。
今から始めるならMFCはやめて.NETにしたほうがいい?
490 :
デフォルトの名無しさん:04/07/31 23:35
>>488 ありがとうございます。
とりあえず、CodeGuruから調べてみたいと思います。
俺はCodeProjectの方が好きだな・・・
CodeGuruはリニューアルしてから見づらいな・・・
>>489 「今から始める」という意味が「学習を始める」だったらMFCで良い。
「長大なプロジェクトを起こす」という意味なら.netを考慮する価値はあるかも。
つまりちょこちょこ作って今すぐ広い環境で動かすならMFCだな。
>>493 あー。まだ厨房なんで将来的なことも考えていただければ幸いです。
>>494 んじゃまず、ハードの基礎やってから、アセンブラ逝け。1年たったらまた恋。
漏れは、SDK だけでアプリ作れない香具師の MFC アプリは信用しないなあ。
……「アセンブリが解らない香具師のアプリは信用しない」と同じレベルかゴメンorz
何でもそうだが、知ってるやつ見えてるやつから見ると、知らないやつ見えてないやつは、危なっかしく感じる。
知らないやつ見ててないやつ自身は、なんの恐れも不安もない。
えーと、分裂症の方でしょうか?
499 :
デフォルトの名無しさん:04/08/01 04:01
SDKやってMFCすれば〜
MFCだかVBだか知らないんだけど、例えば某USB機器に付属してるソフト。
起動してすかさず他アプリケーションを前面に持って来て、
そのソフトが完全に起動し終わったのを確認してウィンドウをアクティブにすると
フッと、ウィンドウ上のボタンのフォーカスが切り替わる。
細かい事だけど、何やってんだよ (;´Д`) 怖いよ
レベルが低くて本当にこれから始めるっていうならなおさら、あんまり先のことは
考えずに、今できることをやって経験を積んでおくことを薦める。先々どうするかは
自分で経験して判断できるようになってから決めればよい。何もできないうちに
後のことを言っても始まらないからね。
現在一般に出回ってるシステム環境や、ツール、学習面での文書のこと考えたら
いきなり.netはやりづらいと思う。どうせ最初は小さいものしか作れないんだし、
何かしら使える機能のあるものを気軽に作って、プログラムすることの手順に慣れ
るのが先だろう。
一応Delphiとかはいろんなページ見ながらやってたんだけど
他の言語に移行したくなったんで、.NETかMFCがいいかなーと思ったたけです。
別にJavaやSDKでもいいんですが、アセンブラは必要なんでしょうか?
そんな「なんとなく」が理由なら自分で好きなのやれ。
504 :
デフォルトの名無しさん:04/08/01 18:29
>>502 必要って何のために?
仕事で必要かどうかは内容次第で、
具体的な就職先と配属先が決まらないと何とも言いようがない
けど、そんな理由に引きずられるだけな若手は「うちへ欲しい」タイプじゃない
泥縄方式のおんぶに抱っこで何ができるか甚だ疑問だからだ
言語であろうとデバイスあろうと、
特定のブツに対するマニュアル的な知識は泥縄でも徹底的ならそれでいい
もっと根本的なことで、こういう分野を切り開いていくことに対して
自発的な意思で行動しているか否かが肝心要の核心だ
で、アセンブラの話に戻ろう
アセンブラやってみたいか? 意味ねえと思うか?
おまえが答えるしかないことだ
>>504 アセンブラはやってみたくないけど、意味はあるとおもう。
既存の高級言語を使う場面とアセンブラを使う場面はどう違うのか説明してくれ。
506 :
デフォルトの名無しさん:04/08/01 20:46
>>505 特定のCPUの、特有の機能を使うとき
例: 特権命令
コードサイズまたは実行速度に定量的な条件があるとき
例: PIC
507 :
デフォルトの名無しさん:04/08/01 20:48
>>505 続き
既にアセンブラベースで進行中のプロジェクト
例: (軍機のため言えません)
最初にDelphiやると他のものが使えなくなってしまう。
そういう意味では最初に学ぶのはDelphi以外が良いと言うことになるのかも知れない。
>>502 > 一応Delphiとかは
「とか」ってなんだよ・・・
なんかこういう書きぶり続くとどうでも好きにすればとしか言いようないな
普通にCかC++から初め野菜って事で
511 :
デフォルトの名無しさん:04/08/01 22:05
ここMFCのスレなのにDelphiの話題ばっかりで大丈夫?
他のスレで同じことするとスレ違いとかうるさく言われるのにね。
513 :
デフォルトの名無しさん:04/08/01 22:17
今更言語談義が始まって呆れてる最中。
515 :
デフォルトの名無しさん:04/08/01 22:24
>>505 >アセンブラはやってみたくないけど
賛成も反対もする筋合いにないからどっちとも言わないが、
はっきりした意思があるなら邪念は捨てろ
516 :
デフォルトの名無しさん:04/08/01 22:26
卒業年次生にもなって何屋に【なる】のか決まってないなら
それはそれですることがあるはずだ
MFCなひとは、なんでDelphierや初心者言語話に、普通に答えてんの?
そこはスレが荒れるとこでしょ。やっぱMFCに愛着無いからかね。
単に楽をするためのライブラリィ程度しか考えていないよ、俺は
それと、暇つぶしにレスしているだけ
暇つぶしでスレ違いレスすんなタコ
Cスレで聞こうと思ったのでつが荒れてたので
こちらでおながいします。
MFCを使っているとoperator newをオーバーロード
して、デバッグのときにはメモリリークを検出してくれるので
助かっているのですが、MFCを使用しない場合は
みなさんどうしてますか?
自力でnewをオーバーロードしてるのでつか??
つーか、スレ違いな話題はスールしろよ!
>>508 父親にCから始めろと言われ、本を買ってくれたのでCから始めました。
他スレとか見てるとMFCの雲行き怪しげなので.NETにしときます。
スレ違いな質問してすみませんでした。
523 :
デフォルトの名無しさん:04/08/02 00:08
>>520 そんなギミックに頼るハメになる前に単体テストしとく
VC6とVC7の違いについて解説しているページはありませんか?
例えば、VC6のメモリウィンドウは、 VC7ではココにある…etc
最近学習を始めたのですが、VC6のMFC関連のHPを見ていると
どうもVC7と操作性?が違っていて、勉強が進みません。
大変お手数ですが、ご教授をお願いします。
527 :
デフォルトの名無しさん:04/08/02 02:27
BoundChecker
Purify
530 :
デフォルトの名無しさん:04/08/02 07:32
MFCのクラス(というかメソッド?)がスレッドセーフか否かはどこで調べれば良いでしょうか。
MSDNには特に記述が無いようですが…
>>530 LIBもDLLもシングルとマルチがある
(つまりマルチならクラス全てマルチ)
532 :
デフォルトの名無しさん:04/08/02 11:16
MFCで作ったプログラムってMFCランタイムがないと
動かないんですか?
(つりではないです。お願いします)
>スタティックリンクすれ
この一言でわかっちゃうってことは、釣りだろw
536 :
デフォルトの名無しさん:04/08/02 17:53
VC++のコンパイルエラーなど出す「出力ウィンドウ」のように単純に
1行づつメッセージを出力するためにはどのような手法を使うのが一般的なのでしょうか?
>>536 リストコントロールとか
書き込み禁止のエディットコントロールとか
スクロールビューとか
遅れますたm(__)m
>>523 単体テストでリークバグを検出したいのでつよw
>>524-528 やっぱ市販製品でつか...(マニーが...orz
>>529 うーんちょっと違いまつ。メモリ確保失敗というより
リークの検出をしたいでつ。。。
みなさんどうもありがとうございますた。
とりあえず慎重にPGして、ひと山あててBoundsChecker
買うですw
539 :
デフォルトの名無しさん:04/08/03 01:09
COleDataSource::DoDragDrop() を呼ぶ前に CacheGlobalData() を
2種類のデータ形式で呼び出すと、最初はうまく動作するんですが
一定時間後に E_OUTOFMEMORY で COleDataObject::GetGlobalData() に
失敗するようになります。GetGlobalData() を2度呼び出すのは
間違ってるでしょうか?
>>520 んなもん買わないでも_CrtSetDbgFlag使えばいいんじゃねーの?
ちょっとよろしいですか?
あるディレクトリ以下のファイル名一覧を取得したいんですが、サンプルをコピーしてみて、できたのですが。
日本語のファイル名だけ取得できませんでした・・・。
CFileFindって日本語は駄目なんでしょうか?
>>543 どうやらそのようでした。ありがとうございました!
545 :
デフォルトの名無しさん:04/08/03 21:26
すみません。
>>530-531あたりを見て思ったのですが、
マルチスレッドのDLLを使えばMFCだろうとCのstrtok関数だろうと全てスレッドセーフになり、
シングルのDLLを使う場合は、スレッドセーフであることが保証されていないので自分で同期取らないといけない、
という理解で良いのでしょうか?
私はてっきりマルチスレッドにするときは何が何でもマルチスレッドDLLを使って、
その上で、スレッドアンセーフなものは自分で同期をとるプログラミングをしなさい、
ということかと思っていました…
スレッドセーフなライブラリは、ちゃんと使えば、スレッドセーフになる。
どんな使い方でもスレッドセーフになるって、魔法のライブラリかよ。
「バグのないライブラリを使うと、バグのないプログラムになる」が否なのに同じ。
当然、スレッドセーフでないライブラリは、マルチスレッドで使うと危険。
ちゃんと同期をとって使っているつもりでも、内部処理や内部エリアで同期がとれていない。
>>545 MFCは同期クラス(CMutexとか)以外はスレッドセーフじゃなかった気がする。
心配ならソース見てみれば?
>>548 はスレッドセーフの言葉の意味自体すら知らない
For size and performance reasons, MFC objects are not thread-safe at the object level, only at the class level.
まとめ
シングルスレッド用ライブラリ スレッドセーフではない(マルチスレッドでは使用不可)
マルチスレッド用ライブラリ クラスレベルでスレッドセーフ(マルチスレッドで使用可)
同一オブジェクトに対する別スレッドからのアクセスの同期は
同期オブジェクトを使ってプログラマがとる
553 :
デフォルトの名無しさん:04/08/04 12:21
CAsyncSocketを使用して書いていますが
どーやって接続先、自分のIPアドレスとポート番号を取得できますか?
>>552 同期クラスは例外で、オブジェクトレベルでスレッドセーフ。
>>552 MFCにシングルスレッド用ライブラリなど存在しない。
シングルスレッド用とマルチスレッド用(スレッドセーフ)があるのはCランタイムライブラリ。
>>553 IPだけでなくネームアドレスも使えるだろ?
ポートは使用するサービスによって決まるもんなんだからあらかじめ決めて動作
させるのがネットワーク・アプリ書くときの前提になると思うが。
何がしたいのか、キミのネットワークの仕組みについての理解度がどれくらいか
よく分からないね。
557 :
デフォルトの名無しさん:04/08/04 19:39
>どーやって接続先、自分のIPアドレスとポート番号を取得できますか?
自分の方は GetSockName(), 先方は GetPeerName で取れます。
IPv6 対応はそれぞれ GetSockNameEx, GetPrrtNameEx。
指がずれたな(w
MFC version 6.0 (still mfc42.dll) Visual C++ version 6.0 シングルスレッド用DLLあり
MFC version 7.0 (mfc70.dll) Visual C++ .NET なし
> 同期クラスは例外で、オブジェクトレベルでスレッドセーフ。
そりゃそうだろ(藁)
>>561 CEvent::SetEventの呼び出しを
Win32の生のクリティカルセクションで同期するバカが実在したりするから
世の中は面白い。
てか、同期クラスはただのラッパーだし
564 :
デフォルトの名無しさん:04/08/06 15:12
質問です
CDialogBar上にボタンを配置して、それを条件に合わせて、
有効無効の変更を行いたいのですが、何処で行えば良いでしょうか?
MFCのソースを追っている限りでは、コマンドハンドラが存在すると常に有効に
なってしまうように見受けられますが・・・
>>564 コマンドマップに EnableCommandUI だかなんだかを追加するんじゃなかったかな。
>>564 CDialogBar m_wndDlgBar;
....
CButton *pBtn=(CButton *)SubclassDlgItem(IDC_BUTTON1, &m_wndDlgBar);
pBtn->EnableWindow(FALSE/TRUE);
では、だめかな?
>>565 >>566 返答有難う御座います
CMainFrameのコマンドマップに
ON_UPDATE_COMMAND_UP( IDC_BTN_XXX, OnUpdateBtnXXX )
を手動で入れてそこで処理させることで実現できました
568 :
デフォルトの名無しさん:04/08/06 22:54
>>562 すみません、解説お願いします。
(理解できてません…)
>>568 1.「MFCで提供されているクラス、同一のインスタンスへのアクセスはスレッドセーフではない」という話をどこかから聞きつける。
2.そうかそうか、と言って、以下のようなコードを書く
とあるスレッド
EnterCriticalSection( &csEvent1 );
event1.SetEvent(); // スレッドセーフじゃないのでクリティカルセクションで保護
LeaveCriticalSection( &csEvent1 );
別のスレッド
EnterCriticalSection( &csEvent1 );
HANDLE hEvent = (HANDLE)event1; // スレッドセーフじゃないのでクリティカルセクションで保護
LeaveCriticalSection( &csEvent1 );
WaitForSingleObject(, INFINITE);
実際にはもちろんこんな必要はない。
570 :
デフォルトの名無しさん:04/08/07 01:09
MFCで全角スペースをトリミングしたいのですが
自分でロジック組む以外ないですかね?
ロジックとか言うほどのもんかよ
定義とか言うほどのもんかよ
>>573 説明出来ないのか ( ´,_ゝ`)プッ・・
説明とか言うほどのもんかよ
説明とか言うほどのもんかよとか言えるほどもんかよ
ほどもんかよ
ぼぉくほどもん。ターケコープタァー!
579 :
デフォルトの名無しさん:04/08/07 03:59
CWebBrowserクラスのNavigateで、自前のウィンドウに埋め込みウェブを表示させているのですが
そこのユーザーエージェントを制御したいのですがどうすればよいでしょうか?
教えてください
Navigateに与える引数を工夫すれば実現できそうなのですが・・・
どなたかヒントください
581 :
デフォルトの名無しさん:04/08/07 07:02
夏ですね
夏厨が沢山、湧いてますなぁ〜。
無理っぽいので自分で作ります。
>>583 応援されたので作って見ました。一応、動いてるけど、これでええのかな?
CString s = "うあ ああああ ";
int c;
int last_pos = -1;
int pos;
int i = 0;
while (i < s.GetLength()) {
pos = i;
if (IsDBCSLeadByte(s[i])) {
if (i == s.GetLength() - 1) {
c = ' '; // DBCSの先頭バイトだけが最後に残っている場合
i++;
} else {
c = ((BYTE)s[i] << 8) + (BYTE)s[i+1];
i+=2;
}
} else {
c = s[i];
i++;
}
if (_istspace(c) || c == 0x8140) { // ホワイトスペースか全角ブランク?
if (last_pos == -1)
last_pos = pos;
} else {
last_pos = -1;
}
}
if (last_pos != -1)
s = s.Left(last_pos);
VBやC#もTrimは全角スペースをちゃんと処理してるのね。MFCだめぽ。 orz
日本語が変だ。orz
587 :
デフォルトの名無しさん:04/08/08 00:16
ちょっとこのスレ元気ないし、とりあえず誰か579の問いに答えてやったらどうよ?
オレはわからないんから答えられないけどさ
579さんこんばんは。
出来ません
CWebBrowserではIEのコンポーネントを使っているので、
どうしても変更したければSDKベースで作り直して下さい。
>>590 NavigateのPostDataで送るデータを工夫すれば
なんとかなりそうなのですが・・・
どこかに参考資料ないですかね?(できる限りは調べたのですが)
よろしくおねがいします
それくらい自分でなんとかしろ
> VBやC#もTrimは全角スペースをちゃんと処理してるのね。MFCだめぽ。 orz
VBやC#がどんな文字を扱っているか調べた後、CString::TrimXXXX 使いなさい。
>>594 いろいろ系統の似たサンプルはあるんですが、
User-Agentを制御するサンプルはありませんね
>>596 UrlMkSetSessionOption()
URLMON_OPTION_USERAGENT
今までありがとう、MFC
これからもよろしく、MFC
ATLのことも忘れないでください。
海栗って何?
海栗=うに=unix
603 :
デフォルトの名無しさん:04/08/11 16:30
MFCのサンプルなどでCodeGuru等が有名ですが、
CodeGuruのソースのライセンスはどのようになっていますでしょうか?
サイトの方をみたのですが、それらしき文章がないように思い受けます。
スレ違いかもしれませんが、ご教授いただければとおもっております。
雲丹
607 :
デフォルトの名無しさん:04/08/12 23:59
タスクバーに常駐するタイプのプログラム作ってます。
で質問なんですけど、xpのタスクバーは非アクティブのとき非表示に出来ますが
どうやって制御すればいいんでしょう?教えてください
少なくともMFCにはそんな機能は無いな
>>607 タスクバーに常駐させるだけで良いのでは?
タスクバーが非アクティブのとき非表示になっても何も困らないのでは?
610 :
デフォルトの名無しさん:04/08/13 07:09
「アクティブでないインジケータを隠す」機能に対応できず、常に表示されてしまっている状態で困っています
>>610 つまり「アクティブのまま」なんじゃないの?
MFC最高。MFCあったらC++なんかイラネ
KFC最高。KFCあったらMacなんかイラネ
sage乙!
MFC乙!
lps乙CmdLine
X1-turbo乙
or乙
初心者なんですが、今MFCからC言語始めてるんですが、
APIを直接使わずにMFCだけでAPIでできることのすべてを代用することができますか?
>>621 寡聞にして「すべて」を代用できるかどうかは知らんが、
少なくともAPIの知識が必要になるメンバ関数は少なくない。
MFCを使いつつ、その先にはAPIがあることを念頭に入れておくのがいいと思う。
>>621 > 初心者なんですが、今MFCからC言語始めてるんですが、
「初心者」って言っても色々あるだろうが、そんなことできるんだろうか?
と素朴な疑問。
Cの基礎的な書式とC++のクラス概念くらい学んでからWindowsプログラミング
に移行した方が良いっていうか、そうじゃないと普通無理だろっていうか・・・。
とりあえず普通に質問に答えるなら、出来るか出来ないか。だろ?
なんで君たちはそこには言及しないんだい?
という訳でAPIでMFCの代わりは出来ますが、MFCでAPIの代わりは出来ません。
>>622 全部自分でやるAPIのほうがわかりやすくて魅力的に見えてきました・・・。
この関数できたらAPIやってみようと思います。
>>623 プログラムの勉強を始めて今2週間くらいです。
C言語の文法はなんとなくわかったのですが、コードでCaptionを変える方法で躓きました。
MFCはAPIをラップしたものだから同じ機能があると思ってMFCメインにしようと思ったのですがVCが自動的にやってくれすぎて一向に構造がクリアにみえてきません・・・。
MessageBox関数と同じ機能をもつ関数を自分で作るにはどうすればいいんでしょうか。
と思っていたらなにやらできたようです。
MSDNわかりにくっ(;´Д`)
>>624 なるほど。
APIのほうが優れもののようなのでキリがついたらそっち勉強しようと思います。
つうか、「C言語」じゃねえよ。
APIの方が優れてるってのはどうかと思う。MFCはどっちかというとプログラマの手間を
省くための便利ライブラリなんだし、技術がないならむしろMFCを積極的に利用した方
が楽ができるし良い物を作れる。大抵のことはMFCでできてしまうんだし。
C -> API -> C++ > MFC でいいよ。
そしてMFCに嫌気が差して、APIに戻るか他のライブラリを探すようになる。
>>629 たしかにかなりの人がMFCに挫折するね
631 :
デフォルトの名無しさん:04/08/18 23:18
なんで、MFCで挫折するんだろうね?
へんなマクロが嫌だ。
なんで、そんな動きするのか、わけがわからん。
ソースおっても、膨大すぎて意味分からん。
ウィザードでつくったものを、どう変更すりゃいいのか、意味不明。
C++とAPI知ってんのに、意味分からんマクロとか大杉。
すでにJavaに移行しました。Java分かりやすくてサイコー!!
MFCがいやで、C++ Builderに逝った人は多そうだな。
漏れは、WTLにいったよ。
2005ではMFCはどうなるんだろう〜?
それなりに枯れてて出来たソフトの質はいいんだけどね
覚えるのにWin32API以上に労力が必要なのは痛いね
俺MFCに依存しまくり・・・・・・・orz
全然 Foundation じゃないよね。
MFCに挫折して、Delphiに逝った趣味グラマです。Delphiだと、VCLのソースを見る事は少ないです。MFCのフレームワークは、いくつものクラスを連動して使う事を強いられます。VCLだと、あるコンポーネントだけ使うということが容易なのがいいです。
MFC の限界っていうより、C++ の限界にかなり制約を受けてると思う。
C++がもっとまともな仕様なら
MFCも使いやすいライブラリになっていただろうに。
最近Java厨がいろんなスレを荒らしてるね
MFCが肌に合わないならWTLでも試しては伺か?
ってか、厨房の言語の宣伝とかいらねぇ。
Del厨もJava厨も巣に帰れと(ry
そもそもMFCが肌に合わないとかいう話がスレ違いなんだが。
愚痴はマ板へ。
言語厨は厨用スレへ。
ここはどんな理由にせよMFCを使う人のためのスレ。
644 :
デフォルトの名無しさん:04/08/19 06:02
亀ですがクラスレベルでスレッドセーフとは何を意味してますか?
オブジェクトレベルでスレッドセーフでないということは分ります。
同一インスタンスのものを複数のスレッドから触るときは排他がいるということですね。
クラスレベルでもスレッドセーフでないと言ったらどうなるのでしょう?
たとえばそれはあるクラスがstaticなメンバなどを使ってそのクラスの共有の
情報をもっていてそれが複数のスレッドから触られるとおかしくなるような設計である。
といったことですか?
dejavu?
648 :
デフォルトの名無しさん:04/08/21 12:57
.NETにはあるようですが、MFCにてurlencodeをする方法がみつかりません。
良き方法があればご教授いただきたい。
やはり、コーディングするしかないのでしょうか?
649 :
デフォルトの名無しさん:04/08/21 14:35
>>640 時間軸として逆じゃね?
ARM以前のC++の貧弱な表現力で作ったらあーなったのがMFCで、
ある意味、今のC++に至る過程でMFCは反面教師として機能していた。
今MFC作ったらCStringもstd::stringの派生だったかもしれないね。
CObArrayなんかもなかっただろうし。
>>650 無知登場
文句は受け付けません
ググレ
>>651 文句は言わんが、あんたの言いたいことが判らん。
#だからこそ無知と言われているのだろうが。
ほんとに無知なのに勘違い自信家だと調べもしないで偉そうにするのな(しかも自作自演)
655 :
デフォルトの名無しさん:04/08/22 00:50
質問です。
MFCでアクセスのDBから検索するプログラムつくりました。
一緒にアクセス(のフォーマット)のDBを配布したいんですけど
ライセンスは大丈夫ですかね?
ダイアログバーの追加がうまくいきません
テンプレートを作って
CMainFrameでCDialogBarのオブジェクトを用意
コンストラクタでCreateを呼ぶ
でコンパイルは通りますが実行しようとすると
"0x77f5284"の命令が"0x00000000"のメモリを参照しました。
メモリが"written"になることはできませんでした。
と出て実効できません。
とりあえずダイアログバーを表示するだけの場合でも他に何かやらなければならないことがありますか?
>>656 CMainFrameのコンストラクタで、CMainFrameを親としてCDialogBarをCreateしてる
というオチだろうか?
658 :
デフォルトの名無しさん:04/08/22 11:51
>>656 コンストラクタ内の auto 変数として CDialogBar オブジェクトを定義している
というオチだろうか?
なんか勘違いしていました
コンストラクタではなくMainFrameのOnCreateでCreateを呼んでいます
CDialogBar オブジェクトはちゃんとCMainFrameクラスのメンバとして宣言していますし
>>659のサイトの通りにやっても同じエラーが出て実効できません
>>650 UNICODEビルドの場合、std::stringの派生じゃ困ると思う。
>>662 std::basic_string<TCHAR>
665 :
デフォルトの名無しさん:04/08/22 16:29
>>664 ちゃんと話がかみ合ってると俺は見ているが・・・
この後の展開次第かもな
いまのCStringってテンプレートだよね
VC++6.0はちがったとおもったけど
>>666 そそ、C6とC7で互換性がなくて怪しげなソースが引っ掛かり捲くり。
C6は兎も角、C4の頃はまともにテンプレートが使えない状態だったし。
VC++.NETつかえねー
670 :
デフォルトの名無しさん:04/08/22 18:44
C6とかC7って首都高みたいだな。
タイトルバーの文字列ってどう変更するんでしょうか?
実行途中で変えるとか起動時に変える
というのではなく、デフォルトを変えたいと言うか…
>>672 リソースストリングテーブルのIDR_MAINFRAMEに
・SDIなら先頭から\nまでの文字列
・MDIなら文字列そのもの
がタイトルバーに表示されるような気がした。
>>673 変更できました
ソースを必死で検索してました…
ありがとうございました
>>675 リンク先のページで、動的に変える場合は SetWindowText とか使えとなっているけど、
CFrameWnd::SetTitle で変えるか、GetTitle をオーバーライドして変えておかないと
不意に元に戻されて「MFCは陰で何やってるかわかんない・・・APIだけの方がラクぽ」
ってことになるので注意。
677 :
デフォルトの名無しさん:04/08/25 03:02
TCHARと_TCHARのちがいってなんですか?
>>677 _TCHAR
tchar.hが_UNICODE/_MBCSが定義されているかで切り替える。
TCHAR
windows.h(の中のwinnt.h)がUNICODEが定義されているかで切り替える。LPCTSTRなどの仲間がいる。
質問させてください。
MFCでSDIのプログラムを作っています。
ビューの基本クラスをCTreeViewにしています。
フレームのメンバ関数から、ビューのメンバ関数を使えずにいます。
ビューの基本クラスがCViewの場合、ポインタをGetActiveViewで取得でき、
そこからメンバ関数を使えると思うのですが、
自分のプログラムの場合、CTreeViewなので、GetActiveViewの戻り値を
CTreeViewにキャストして関数を使ったところ、コンパイルは通るのですが、
アドレスがおかしいなどのエラーがでました。
どなたか知恵をかしてください。
>>679 まずはデバッガで GetAvtiveView が返してきたものを見てみたら?
>>679 そりゃCTreeViewにキャストしたらCTreeViewまでのメンバしか使えないでしょ。
>>680 ぬるっす。
わかりました。OnCreateでやってたからだめなんですね。
Activeじゃないですものね。
ありがとうございました。
質問です。
エクスプローラの超簡易版みたいなものを作っています。
ツリービューでの表示と展開はできるようになったのですが、
たとえば展開しているフォルダに別アプリなどで新しいフォルダ
を作成した時、すぐにエクスプローラの表示に反映させるには
どうすれば良いでしょうか?
MFC6.0です、よろしくお願いします。
>>683 FindFirstChangeNotification
>>678 回答ありがとうございます。MFCだと_TCHARがよさそうなので_TCHAR使います。
687 :
デフォルトの名無しさん:04/08/26 12:12
MFCアプリのGUIスレッドでメッセージだけでなくCEvent等の
監視も行いたいと考えています。とりあえず考え付くのは
CWinThread::PumpMessage内のGetMessageの前、又は
OnIdleにてMsgWaitForMultipleObjectsを呼ぶ方法です。
CWinThread::RunのoverrideにしてもOnIdleのブロックに
しても余り一般的とは思えず躊躇してます。
似たような事をやったことある人がいれば意見をお願いします。
>>687 AfxBeginThread()でスレッドを作り、その中でシグナルイベント待ち。
ユーザーインターフェーススレッドに対して通知をしたい場合は、
WM_USER以上のユーザー定義メッセージを送信する。
受け取る側でもメッセージをユーザー定義メッセージ受信できるようにしておく。
689 :
デフォルトの名無しさん:04/08/26 13:52
MFCベースアプリで実装されている機能についてプラグインにすることになったのですが
プラグインとはどうやって作ればいいのでしょうか?
>>689 susieプラグインで練習してみれば?
>>688 WM_USERじゃ拙いって。WM_APPを越える値がお勧め。
>>687 私のアプリでは、タイマーでイベント監視をした。
イベントの場合は落とし穴がいろいろあるから気をつけてや〜
>>688 別スレッドだとスレッドスイッチが多くなるのが少し
気になります。
>>691 タイマーだと処理周期が頭打ちとなってしまいそうです。
基本的には688の方法でもパフォーマンス的にはOK
だと思いますが、MsgWaitForMultipleObjectsを使えば
監視するだけのスレッドを立ち上げずにすむかなぁと思い
質問しました。
693 :
デフォルトの名無しさん:04/08/27 04:16
ActiveXをDllに組み込み、プラグインにしたいです。
メニューのプロジェクトへ追加、コンポーネントとコントロール・・を使って追加すると
ラッパクラスが出来ると思うのですがこれを使うことは出来るのでしょうか?
このクラスのインスタンスをDll側のグローバルに用意してもいざメソッドを呼ぶと
void AFX_CDECL CWnd::SetProperty(DISPID dwDispID, VARTYPE vtProp, ...)
{
ASSERT(m_pCtrlSite != NULL); // not an OLE control (not yet, at least)
で引っかかってしまいます。
このクラスは使わずに自分でCreateInstanceするのですか?
>>692 処理速度が問題になるなら、イベントでの同期は検討しなおした方がよくない?
イベントはそれ自体早くないと思うし、発行側は処理側が処理したことを知りえないから
何らかの方法で返信しないといけなくなるしね。
>>687,692
質問者の分際で、評論家・審査員を気取ってんじゃねーよ、クソが
MFC使っときながらスレッド生成のコストを気にする人には困ったものだ。
単にスキル不足なだけちゃうんかと。
CStringのoperator=の戻り値にconsが付いてるのはなぜですか?
何故こんなこと思ったかというと
CString& func(CString& str)
{
CString tmp;
// 処理
return str = tmp;
}
returnのところで
error C2440: 'return' : 'const class CString' から 'class CString &' に変換することはできません。(新しい動作 ; ヘルプを参照)
変換で修飾子が失われます。
と出たからです。
std::string::operator=の戻り値にはconst付いてないのに、CStringに付いてる意図はなんでしょうか?
>>698 CStringが作られた頃のC++は代入演算子の結果がCと同じく右辺値だったからじゃない?
それでCStringもそれに合わせてoperator =()の戻り値を値渡しに……するとオーバーヘッドがかかるんでconst参照にした、って具合。
>>698 WTLって知ってる?マイクロソフトのサイトからダウソできるよ。
WTLのCStringだと、constじゃないよ。
WTL::CStringで解決。終了。
>>700 >意図はなんでしょうか?
って聞いてるんだから、その答えじゃ解決になってませんよっと。
ちなみに、手元にあるVer7.1(build 3340)ではconstで
最新のWTL7.5.4196.0 では付いてませんね。
>>701 マジですか?よく調べずに書いてしまった。
当方、WTL7.5です。
>>698さん、そんなわけでスマソ。忘れて下さい。
早く夏休みが終わりますように…(ナムナム
VC2005か.NET Framework SDKにMFCある?
706 :
デフォルトの名無しさん:04/08/29 19:01
CSplitterWndを用いて分割しCListView、CHtmlView等を貼り付けてブラウザを作っております。
http://www.codeproject.com/miscctrl/simplebrowserformfc.aspを参考にして メモリ上のHTMLを書き込むと言うプログラムを作成いたしました。
このプログラムはCListView上のキーダウンのタイミングでCHtmlViewを書き換えるものです。
これは上手くいったのですが、問題が出てきてしまいました。
CHtmlViewをクリックしたあとに、CListView上にクリック等で戻りキーダウンすると
FocusがCHtmlViewに移動してしまうのです。
このときにメモリ上のHTMLファイルを書き込んでおりまます。
どうやら、HtmlViewをクリアする所あたりで問題が起きているようなのですが。
また、CHtmlViewをクリックを一度もしない場合においては問題なく動いております。
SetFocusでCListViewにセットし直しても、上手く動かないようです。
何か良い案、参考情報へのリンクなどお知りでございましたらご教授ください。
>>706 SetActiveViewとかどうよ?(試してないが)
ついでに
>お尻でございましたら
「ご存知でしたら」じゃね?
>>707 お恥ずかしい(涙
SetActiveViewを試してみたのですが、上手くいきませんでした。
起動と同時にタブコントロールを生成しようと、
C○○ViewのOnInitialUpdateで
CTabCtrl.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 200, 80), this, 100);
を呼び出すと、SDIだと上手くいったんですがMDIでは何故かタブが生成されません。
エラーが出る訳でもなく、thisをGetWindow(GW_CHILD)に変更するとMDI子ウィンドウに生成されるので、
指定するウィンドウか生成するタイミングが間違っていると思うのですが色々試しても分かりません。
原因の分かる方、教えて下さい。
すでに(VIEWの)ウィンドウがあるかどうかくらいは確認したんだろうな?
711 :
デフォルトの名無しさん:04/09/07 17:51
コンボボックスについて質問です。
コンボボックスのエディットコントロールでテキストを変更した場合、OnCbnEditchangeXXXXが呼ばれますが、
このエディットコントロールのテキストの内容を取得する方法を教えてください。
>>711 「テキストの内容」ってなんだ?
GetLBText()じゃないの?
つーかリファレンスでメンバ関数のチェックぐらいしたんだろうな?
>>712 失礼しました。
誤)テキストの内容
正)エディットボックスの内容
その関数だとリストボックス内のテキストです。
エディットボックス内のテキストを取得する方法が見つかりません。
GetWindowText
716 :
デフォルトの名無しさん:04/09/08 01:10
VC6.0で開発しています。
IEコンポーネントを使ってネット上からhtmlファイルを取得し、
解析して保存したいのですが、
ブラウザ画面を表示させたくはありません。
IEコンポーネントのうちURLからコンテンツを取得する機能と
htmlコンテンツを解析する機能を使いたいのですが
どのようにすればよいのでしょうか?
>>716 「解析」というのが何を指しているのか分からないね。
IEコンポーネントを使うって書いてあるけど、ブラウザ・エンジンを使うってのは
普通レンダリングさせるためであって、ファイル内容をHTMLコードとして見る
だけなら必要ないことのはずだが?
>>717 レスありがとうございます。
> 「解析」というのが何を指しているのか分からないね。
テーブルで表示されてる表などを整形してリスト表示したり
したいです。
> IEコンポーネントを使うって書いてあるけど、ブラウザ・エンジンを使うってのは
> 普通レンダリングさせるためであって、ファイル内容をHTMLコードとして見る
> だけなら必要ないことのはずだが?
ごもっともです。
・URLからhtmlコードを簡単に取得できそう。
・IE対応のページを確実に解析できそう
というのが理由です。
htmlの解析という視点に立つと他の手段はあるのでしょうか?
DOMオブジェクトとかのドキュメント構造を取得したいってことじゃないの?
720 :
デフォルトの名無しさん:04/09/08 01:37
>>719 そうです。
でもXMLパーサーでは解析できませんよね?
一応試して見ましたができなかったので
IEコンポーネント使えば確実だろうと思いました。
CHtmlViewってのはあくまでViewであって表示させるためのものだと思うが?
中身をデータとして扱いたいならCHttpXXX系やCAsyncSocketなんかを使って
ファイル・データをもってきて自分で使いたいように加工するもんだと思う。
軽いHTMLパーサならCodeProjectとかSourceForgeとかにありそうだけどな。
>>722 自分でparseしたくないって話だっただろ。
GetHtmlDocumentでドキュメントインターフェイスの取得できるし。
みなさまありがとう
>> 721,725を見ましたが
この二つの組み合わせでうまくいきそうです。
感謝しています。
今、メニューの項目からダイアログを開いて値を入れて
OKを押したら、その値を元にCPenの絵が動くっていう
ソフトを作ってます。
ダイアログを表示するのはクラスCxxxAppに、
CPenで書かれた絵はOnDrawじゃなくCxxxViewクラスの中にpublic:として
HogeDraw()(OnDrawじゃないっす)を作ってあります。
ダイアログの関数に
if( Hoge.DoModal() == IDOK ){
クラスCxxxViewのメンバ関数HogeDraw(ダイアログの値を引数にする)
}
としたいのですが、どう記述すれば良いのですか?
参考になりそうなサンプルとかあったら教えてください。
対処できずにはや3日ほど経ちました…
簡単に言うとCxxxAppの中で
CxxxViewのHogeDraw(引数あり)を使いたいんですが、
どう変数を宣言すればいいのか、どうポインタを渡せば良いのか
分からないってことです。
すいません、お願いします。
名前が化けました。727=728です。
とりあえず、地道に勉強してくれ。
3日もあればかなり勉強できる(・∀・)!
732 :
デフォルトの名無しさん:04/09/09 23:50
ネットワークスレから移動してきました。
再質問します。
677 名前:デフォルトの名無しさん :04/09/09 22:52
ライブラリに依存する質問になってしまいますが、MFCのCAsyncSocketのOnXXX()は、
どういう仕組みで呼び出されるのでしょうか?
もし、メッセージポンプを経て呼び出されるのなら、OnXXX()の中では長時間の処理が
出来なくなりますが、皆さんどう対処しているのでしょう?
678 名前:677 :04/09/09 23:38
ソース見てみました。
カレントスレッドのメッセージポンプを利用するみたいですが、あってますか?
もしかしてスレ違いでしょうか?
CWinThreadはメッセージポンプが付いているそうですが、
これを利用すればいいのでしょうか?
734 :
デフォルトの名無しさん:04/09/10 00:41
よく分らないけどメッセージハンドラ内でどうしても処理が長くなるのなら
処理をスレッドに配置してスレッド起動をして、そのままメッセージハンドラを抜けてしまえばいいんじゃない?
ってか何をするのかによる。本当に長い計算をするのならスレッドにすればいいと思う。
何かを待つのなら・・・何を待つのか聞きたい。
Microsoftのサンプルでは、大抵子プロセスを待つ部分にワーカスレッドを使っているみたいですが、
ソケット側のちょっとした挙動の変化でGUIを止めたくないのです。
こういう要求って変ですか?
737 :
デフォルトの名無しさん:04/09/10 01:15
その場合、そのイベントハンドラからやっぱりスレッドを起動し、
そのスレッド内部でWaitFor系APIで子プロセスの終了イベントを待つ。
(たぶんその子プロセスのハンドルかなんかがそのままイベントとしてWaitできると思った。)
そんで、WaitForSingleObjectを抜けたらメインスレッドにメッセージをポストしてスレッドはそのまま終了。
というのはどう?
738 :
デフォルトの名無しさん:04/09/10 01:22
>>737 おそらくそれが正当な方法なんでしょうね。
Microsoftのサンプルもそういう形が多いです。
ところで、複数のサーバが合わさった形のプログラムはどうインプリメントするべきなんでしょうか?
たとえば、HTTP、FTPなどが組み合わさっているようなものです。
もし、あるサーバで異常が起こった場合、タイムアウトなどによって回復されるまでの期間
GUIが重くなる事態は避けたいと思います。
各サーバごとにUIスレッドを分けるといいのかな?などと妄想しましたが、
普通はどうするものなのでしょうか?
HTTP、FTPというのはあくまでもたとえです。
別プロセスにして、サーバー同士はプロセス間通信しとけよ。
740 :
ディフォルトの名無しさん:04/09/10 01:26
VCでMFCを使用してアプリを作成したのですが、OSや環境によって正常に
動作しないなんてあるのでしょうか?
日本語版や英語版のWINDOWS環境では問題なく動作していたんですが
ドイツ版のWINDOWSでは動くPCと動かないPCが出てきました
動かないPCは、コンストラクション後にInitdialogに入らずにそのまま、
そのダイアログが終了してしまうという現象でした。
このようなことってあるんでしょうか?
741 :
デフォルトの名無しさん:04/09/10 01:27
>>739 プロセス間通信にもソケットを使おうとしています。
俺は異常でしょうか?
742 :
デフォルトの名無しさん:04/09/10 01:29
自分はCAsyncSocketを使ったことが無いのでなんともいえないですが
ワーカスレッドでバークレーソケットを使うなら
UIのスレッドとは別にサーバAとサーバBを別々のワーカスレッドにして
おのおのでソケットを作ってlistenしたりすると思う。
そしておのおののサーバスレッドはイベントをUIに通知するためにPostMessageして
メインスレッドと交信する。もしどっちかが死んだり固まったりした場合でリスタートしたいなら
仕切りなおしの同期の処理を設計する必要があるでしょう。
743 :
デフォルトの名無しさん:04/09/10 01:36
>>742 実は、そういう形で作っていたのですが、非同期に切り替えることにしました。
以前は、各ソケットにスレッドを割り当ててブロッキングしていたのですが、
非同期にするに当たってATLあたりからメッセージポンプをいただいて
自前のソケットクラスを拡張するか、MFCを使うか考えました。
そして簡単そうなMFCを使うことにしたわけです。
一つのプロセスでUIスレッドを複数使うのはあまり一般的ではないのでしょうか?
744 :
デフォルトの名無しさん:04/09/10 01:38
>>740 CWinApp派生::InitInstanceでDoModal呼ぶ前に抜けるコードパスも存在する場合がある。
ソケットを使うための初期化処理(Wizが自動インプリメント)に失敗したとか。
746 :
デフォルトの名無しさん:04/09/10 01:39
実は、先ほどMFCソース(CAsyncSocket)を読んでみて余りのシンプルさと、
素直とは言えない作りに驚きました。
これだったら、自分で作り直したほうがいいのではないかとさえ思うのです。
皆さんはどう思いますか?
>>743 自分はUIスレッド複数はやったことが無いので、一般的かどうかについては
他の回答者の方の回答をお待ちくださいです。
既存のものを作り変える必要性が本当にあるかというのも気になる
既存のものの問題がもしブロッキングとかだったら正しくselectを使うなど
すれば回避できると思う。しかしそのブロッキングの解決策としてCAsyncSocketを使うのは
結局同じ問題に到達するかもしれない上に変なアーキテクチャのために振り回されるかも。
一般論として、技術があるなら自分でできるところまでやれば良いけど、自分で
やった分には責任を持たなくちゃいけないことになる。それを踏まえてどこまで
自分で「できる」のか判断して決めるしかないのでは?
>>732 OnXXX で(自らなにか)時間のかかる処理をするなら、
非同期でソケットを使う利点はまるでないと思うけど。
>ソケット側のちょっとした挙動の変化でGUIを止めたくないのです。
ちょっと状況が想定できないけど、どんなときにそういう問題がおきますか?
DDXなんか関係ないじゃん
>>728 CxxxViewクラスのポインタをグローバル変数かどっかに保存しておけばよろしいかと。
754 :
デフォルトの名無しさん:04/09/10 15:24:28
>>727 ビュークラス内からダイアログを起動すればいいだけの話でしょ?
755 :
デフォルトの名無しさん:04/09/10 16:46:36
>>727 ビュークラスにメッセージ飛ばして、その先でHogeDraw()を実行する。
WM_APPなどでググってみれ。
ダイアログの値を渡す方法はいくらでもある。
グローバル変数でもCxxxAppのメンバ変数でも良し。
そのときはHogeDraw()はpublicじゃなくてもオッケ。
>>727-729です。
皆さんありがとうございます。
結局、
>>754さんのやり方でやりました。
CxxxViewクラスの中でメニューの項目からダイアログを出すっていう
関数を作ったのがなんか「?」って感じになってますが…。
>>755さんの
>ビュークラスにメッセージ飛ばして
をもうちょっと勉強してからやってみます。
勉強し直してきます…。
757 :
デフォルトの名無しさん:04/09/10 18:46:21
>>750 IEでもFFFTPでも挙動がおかしいときがありますよね?
操作を受け付けない時間が有りますよね?
自分の作るプログラムがそういう挙動を示さないとは思えないのです。
>>757 >操作を受け付けない時間が有りますよね?
…ないと思われ。OSがWin9xとか。
>>758 NT系でも同様だよ。
「操作」の定義があまりにもシェル寄りだね、その見方だと。
>>756 >
>>755さんの
>>ビュークラスにメッセージ飛ばして
>をもうちょっと勉強してからやってみます。
せっかくMFC使ってるのに、そんな面倒なことしなくてもよし!
単に View にそのメニューのコマンドハンドラを追加すればいいだけだよ〜。
>>757 それは非同期ソケットの問題じゃないと思うけど。
漏れの経験ではそれなりに非同期っぽく作ったネットワークアプリが無反応になるのは、
gethostbyname を不用意に呼んでブロックしているケース、socket が connect / shutdown中で、
他スレッドから close しても停止できないケースが大半なんじゃないかな。
762 :
デフォルトの名無しさん:04/09/10 22:29:46
>>761 closeで停止できなかった場合に無反応になるのだとしたら、
何故無反応になるのですか?
非同期ソケットが便利なのは他のイベントと一緒に待てる点?
KFC最高。KFCあったらMacなんかイラネ
766 :
デフォルトの名無しさん:04/09/12 08:20:46
ウィザードでCWinThreadを継承してクラスを作るとコンストラクタとデストラクタが
protectedになるのは何故ですか?
特にデストラクタがそうなる理由がわかりません。
Microsoftのサンプルは全てpublicになっていました。
よろしくお願いします。
767 :
デフォルトの名無しさん:04/09/12 08:47:00
>>764 スレッドを少なく出来る部分に魅力を感じます。
Windowsでもpoll出来ますか?
出来るならそっちを使いたいです。
よろしくお願いします。
768 :
デフォルトの名無しさん:04/09/12 09:49:02
>>766 「何故」について考えることに意味があるかどうかだ。
しょせん同じ人間が用意したウィザードだぞ。
答えをいうなら、ウィザード作成者が徹夜明けだったからとしか答えようがない。
770 :
デフォルトの名無しさん:04/09/12 10:31:24
>>769 バグですかね?
たぶん意味があると思うのですが。
は!
わかったかもしれない!
もしかして、CWinThreadを継承したクラスは自分をマネージしないといけないんですか?
だとすると納得いく。
ちょっと実験してみます。
マネージってなんだよ。
専門用語?それともカッコイイっぽいから使ってるだけ?
772 :
デフォルトの名無しさん:04/09/12 10:41:57
>>770 動的生成されることを前提にしてるからprotectedにしたほうが安全だと想ったんじゃない。
IMPLEMENT_DYNCREATEとかCRuntimeClassあたりで。
774 :
デフォルトの名無しさん:04/09/12 13:20:13
ビットマップリソースをスタティックテキストに表示する方法を教えてください
>774
vrubyでググろう
カッコイイだけでカタカナ語使うのは馬鹿だと思われるよ。
「コイツ、話を誤魔化してる。もしくは何も判ってない。」と思われるだけ。
777 :
デフォルトの名無しさん:04/09/12 14:31:42
>>776 はい。誤魔化していました。
素直にわかりませんって書けばよかったです。
>>773 そうみたいです。
でも、デストラクタはどうしてなんですかね?
破棄するときどうなるのだろう?
おい、CWinThreadの質問してるヤシ、ドキュメントちゃんと読んでるのか?
new/deleteで生成すると書いてあったか?
779 :
デフォルトの名無しさん:04/09/12 15:00:05
ピクチャコントロールでビットマップを透過したいのですがどうすればいいですか?
動的生成=newじゃねーよ、そもそもデストラクタがprivateならユーザーが明示的にインスタンスを作成できない。
もちろん内部じゃnewとかしてるけど、そういうどうでもいいところに突っ込むなよ。
783 :
デフォルトの名無しさん:04/09/12 17:14:29
>>778 スレッドを自殺させたあとにメモリーをチェックするとリークしていると報告されるのですが、
これは何故なんでしょう?
自殺のさせ方が悪かったのだろう。
TerminateThreadを使ったのか?
785 :
デフォルトの名無しさん:04/09/12 17:37:57
>>784 PostQuitMessageしてみました。
ナンーカ
根本的に間違っているような母艦
788 :
デフォルトの名無しさん:04/09/12 20:40:02
ボタン1とボタン2で同じハンドラ関数を呼び出してるんですが、どちらが呼び出したか判定する方法ありませんか?
GetCurrentMessage
>788
MFCよくわかんないけど (じゃあなぜこのスレにいるんだつーツッコミは禁止だ)
Win32APIレベルで考えると、ボタンを押されたら親ウィンドウに
WM_COMMAND をポストされるよな。BN_CLICKED と コントロールID と
ご丁寧にボタンのウィンドウハンドルまでつけて。
コントロールID やウィンドウハンドルで選別すればヨロシけれ。
もれ普段MFC使わずにナマで書いてるけど、いちいちコントロールID設定するの面倒なんで
ウィンドウハンドルで選別してるw
究極のDQNグラマとはもれのことよw
791 :
デフォルトの名無しさん:04/09/12 22:30:12
じゃあなぜこのスレにいるんだ
SDKでプログラムしていてもWindowsアプリっぽくするためには
MFCのトリックをパクったりするのが有効だからだろ。
まぁDQNは放置しておいて、ON_COMMAND_RANGE使え。
794 :
デフォルトの名無しさん:04/09/13 00:48:10
>>788 っていうか、マウス操作している人が一番良く知っているはずだが。
795 :
デフォルトの名無しさん:04/09/13 01:18:31
ダイアログベースでメニューを追加しました
あるメニューの項目で、UPDATE_COMMAND_UIメッセージの
イベントハンドラを(CxxxDlgクラスへ)追加し、その関数内で、
pCmdUI->SetCheck(1);
と記述したのですが、チェックが付いてくれません
同じ事をシングルドキュメントでやると、上手くいくのですが・・・
ダイアログベースでメニューのチェックを制御するには
なにかコツがあるのでしょうか?
FAQキタ━━━(゚∀゚)━━━ !!
797 :
デフォルトの名無しさん:04/09/13 06:07:24
798 :
740:04/09/13 13:36:30
原因の方は判明しました
FLEXGRIDを使用していたのですが、OCXファイルはあったのですがClassIDの方に登録
されて居なかったので、その段階でダイアログが開かずに落ちていました。
このClassIDってどのようにして登録すればよいのでしょうか
>>742 ありがとうございます
regsvr32
800 :
デフォルトの名無しさん:04/09/14 13:11:05
エディットコントロールで'\n'が適用されないのですがどうすればいいですか?
環境はVC.NET 2003です
FAQマタキタ━━━(゚∀゚)━━━ !!
804 :
デフォルトの名無しさん:04/09/14 23:40:13
>>803 fuck you 股来た 目がビーチクでターンエーがオメコで括弧が足
ターンエーと呼ぶ馬鹿ハケン
807 :
デフォルトの名無しさん:04/09/15 18:19:26
ユーザ定義のメッセージを処理するのはCWnd::WindowProcとCWnd::DefWindowProcと
どちらでやったらより良いですか?またなぜ、そのほうがより良いといえるのですか?
どっちでもない
ON_REGISTERED_MESSAGE
もしくは
ON_MESSAGE
ハンドラで
>>800 ソフトラインブレーク で調べてみんさい
810 :
デフォルトの名無しさん:04/09/15 22:03:16
MFC三日目の初心者です、
いくらでもたたいてくれて結構です
画像を加工して保存がしたいのですが
HDCで保持するのとDIBデータを扱う2つがあるのですが
この2つについての、違いをご教授願いたいのです。
よろしくお願いします
811 :
デフォルトの名無しさん:04/09/15 22:11:19
812 :
デフォルトの名無しさん:04/09/16 19:03:05
モードレスダイアログ上にテキストボックスを配置して、
テキストに変更がある度に処理を行いたいのです。
ClassWizard(VisualC++ 6.0)を使用して、
CEdit型の変数、m_EditXをエディットボックスに対応させ、
EN_CHANGEメッセージのハンドラを作成しました。
void CSelectDlg::OnChangeEditbox()
{
char buffer[5];
m_EditX.GetLine(0, buffer, 4);
・
・
}
実行してみると、ダイアログがオープンした途端、
CEdit::GetLine内部でAssertionが発生して止まってしまいます。
どうやらエディットボックスが有効になる前(?)に
EN_CHANGEメッセージが送られてくるようです。
http://www.flounder.com/getdlgitem.htm#Uninitialized%20Controls これを避けるために、OnInitDialogが実行済みかどうかを
格納しておくBOOL変数を持たせる方法というのがあるそうです。
ただ、こういった処理をしたい場合、これが定番な書き方なのでしょうか?
もうちょっとスマートなやり方がありそうな気がするのですが。。
あ、テキストボックスにメッセージが送られるのは、
スピンボックスから自動関連付けしているのが原因っぽいです。
関連付けを外したらダイアログは普通に表示されました。
>>812 スマートかどうかは知らないけど、とりあえずピンポイントその状況だけ避けるなら
if (::IsWindow(m_EditX..m_hWnd)) とかで判定する手もあると思う。
>>814 正直、それを考えてましたw
Assertionがその条件で発生してるんですが、
IsWindowの意味自体があやふやで自信がありませんでした。
メンバ変数を増やすよりはマシってことで、それでやらせていただきます。
どなたか795お願いします
>>795>>816 wndfrm.cpp にあるように、メニューの UPDATE_COMMAND_UI を処理するのは CFrameWnd クラス。
( CFrameWnd::OnInitMenuPopup を参照 )
よってダイアログベースの場合自分で似たような処理を書くか、単純に自力でメニューアイテムをSetCheck すること。
あるいは単に SDI で FormView 使うって手もある。たぶんこっちのほうが簡単。
OnInitMenuPopupでチェックするのがFAQ。
>>814 MFC的には if (m_EditX.GetSafeHwnd()) だな。
>>819 GetSafeHwndはポインタ経由で this が 0 のときにもアクセス違反にならないというだけの関数。
(要は return this ? this->m_hWnd : 0 ってな実装)。
ポインタでもないメンバ変数に使うのは無意味。
m_hWnd って直中身見るのは行儀悪くてイヤーンっていう非MFC人なら常時使ってもいいかもね。
operator HWND
ってあまり使ってませんかそうですか
>>816 えっと、どなたか存じませんが、ありがとう。
>>817 FormView使った方が、早そうですね。
参考になりました。
ありがとうございます。
823 :
デフォルトの名無しさん:04/09/17 01:52:26
MFCが無くなっちゃうって本当ですか?
>>823 なくなりません。
MFCがテンプレートになる可能性があるだけでしょう。
その場合、ClassWizardなどのIDE機能の変更があると思います。
いや、すぐにとは言わんがMFCもATLもなくなるだろ。
そりゃタイムスパンのレベルと何をもって「なくなる」とするかによるだろうけど
少なくとも現行OS(winXP以下)が現役で動いているうちは確実に使えるだろ
Longhornでも確実に使えると思うね。
MSがOSを出し続ける限り使えると思う。
それ以前に、MSにとってMFC/ATLをなくすメリットは何かあるの?
新しいライブラリを売る。
829 :
デフォルトの名無しさん:04/09/17 23:18:10
>>828 こんどこそ驚きのプゲラ仕様がないライブラリを求む
プゲラですめばいいけどね。大抵真っ青。
831 :
デフォルトの名無しさん:04/09/18 01:01:11
リストビューの表示を高速化する方法について教えてください。
大量(最大1万件)のデータをリストビューに表示させるのですが、一番下のアイテムを選択表示させデータの流れる様子を、画面に表示させたいのです。
SetRedrawを用いてInsertItemを行っています。1万件を超えるとDeleteItemを用いて先頭のアイテムを削除しています。現在表示速度が遅いのかデータが溜まっています。さらに画面がちらついてしまいます。
画面のちらつきはOnEraseBkgndを用いて、描画を省いているのですが上手く画面のちらつきがおさまりません。
良い方があれば教えてください。
>>831 リストビューで表示が間に合わないような頻度で書き換わるデータを本当にリストビューで
1万件もためて表示する意味があるのかという疑問が・・・。
>>831 大量データを扱う場合は仮想リストコントロールを使うというのが定石だけど、
「流れる様子」とか言ってあんまり頻繁に更新する場合は頻度によって多少
のちらつきが出るかも。
仮想リストビューなんて要るの?
コモンのリストコントロールなら必要ないと思うけど。
描画に必要なインデックス情報しか処理要求してこないようにできたはず。
MFCの場合は知らないけど。
>>835で書いたヤツだと、自分で能動的にリストを更新したい場合は、
WM_PAINTを送るだけでいいから楽だよ。
LVN_GETDISPINFOとか、LPSTR_TEXTCALLBACKでググって見れば?
MFCでも逝けるはず。試してないけど。
修正します。
WM_PAINT送信での更新だと、InvalidateRect()もあらかじめ必要かも。
普通に(仮想でなく)ListCtrlで1万行出してましたが。
尤も、ログ機能なんで更新は最高でも1秒に一回程度。
有り得ない上限として1万行の仕様になり、ランテストした次第。
リストコントロールは、表示よりもむしろアイテムの挿入・削除に時間がかかるので、
あらかじめ上限数のアイテムを作っておいて、無効アイテムに空文字を返せば、
動的にアイテム数が増減しても高速処理できる。
ただし、見た目は件数が数件でもスクロールバーが出てしまうけど。
つーかなぜそこまで泥臭いことをして仮想リストコントロールを避けるのか分からない・・・
>>835 > 仮想リストビューなんて要るの?
> コモンのリストコントロールなら必要ないと思うけど。
コモンのリストコントロールを使わずに仮想リストビューを使うって、どういうこと?
843 :
デフォルトの名無しさん:04/09/18 17:58:02
MFCのダイアログベースのプログラムを作ってみました。
プログラム自体は動くのですが、Enterを押すと勝手に終了してしまいます。
なぜがご存知の方、教えてください<m(__)m>
>>843 ダイアログクラスのOnOk()をオーバーライドし
CDialog::OnOK();
をコメントアウトして下さい
>>843 聞かれる前に追加。
Escキーでも終了してしまうので、
OnCancel()も>844同様に呼び出されないようにすべし。
それは対処法の先回りであり、843の疑問に対する答えにはなっていないな。
しかも終了手段がなくなる罠。
CHtmlViewを利用しているプログラムを作成しております。
Proxyの動的な変更方法が判りません。
Sleipnirの様にプログラム中から変更を行いたいと思っております。
参考になる文献などでも良いのでご存じの方ご教授お願い致します。
850 :
デフォルトの名無しさん:04/09/18 20:57:01
>>847 なんで? いつでも EndDialog できるやん。
854 :
デフォルトの名無しさん:04/09/18 21:24:15
>>851 そんなん言い出すなら、タスクリストがあるやん
>>854 で、「タスクリストからしか終了できません。どうすればいいですか。」って質問が来そうだなって話だ
857 :
デフォルトの名無しさん:04/09/18 21:29:16
>>856 そんなら来てからでええやん
来ないかも知れないし
858 :
デフォルトの名無しさん:04/09/18 21:31:18
タスクリストってなんんですか?
いや、そんなくだらない質問来て欲しくないから
予防線として
>>845は同時にEndDialogも書いた方がいいという主張をしたかったんだろう。
>>847は。
直後に答え出てますやん
なぜがご存知の方、教えてください
なぜがご存知の方、教えてください
なぜがご存知の方、教えてください
Q. ダイアログがEnterキーで終了してしまうんです。なぜですか?
A. OnOK()をコメントアウトで終了しなくなります。
すごい回答だ。つーか、こんな回答でWindowsのダイアログの作法を無視しまくる
変なアプリが増えないことを祈る。
867 :
デフォルトの名無しさん:04/09/18 22:16:48
エスケープキーでキャンセルできないダイアログボックスは 【 う ざ い 】
OKで閉じないダイアログもうざいけどね。
OKじゃないや、enterだ。
いろいろやり方あるけど、MFCならこの辺じゃないか?
void CxxxDlg::OnOK()
void CxxxDlg::OnCancel()
void CxxxDlg::OnClose()
頼むから話の流れを読んでから書き込んでくれ。
しかも終了手段がなくなる罠。
キャンセルを押してもこの話題が終わらないのですが、どうすればいいでしょうか。
>>873 なんで? いつでも EndDialog できるやん。
thisThread->EndDialog('終了');
876 :
デフォルトの名無しさん:04/09/19 00:05:26
error(875) : no matching EndDialog(const char*) in CthisThread
そんなエラーが出るわけねえだろうがクソ野郎
878 :
デフォルトの名無しさん:04/09/19 00:20:00
843です。ご回答いただきありがとうございます<m(__)m>
私の理解では、
ESCやENTERでプログラムが終了するのはダイアログベースの仕様であり、
終了させるためには、OnCancel()、OnOK()をオーバーライドすればよい。
実際にやってみたところ、ESCやEnterでは終了せず、右上のバツでは終了できました。
ありがとうございました!!
しかしながらEnterでプログラムが終了する仕様は問題ありですね、、、
>>しかしながらEnterでプログラムが終了する仕様は問題ありですね、、、
んなこたあない。
ダイアログがどうゆうものか、もちっと勉強してくれ。
ところが世の中にはenterでダイアログが終わるとバグ扱いになる所も。。
うちは「仕様です」で押し切るな。
ダイアログクラスをベースにして、ダイアログではないプログラムを作る。
ダイアログクラスを使わないで、ダイアログを作る。
ダイアログクラスをベースにして、ダイアログではないプログラムを作る。
→Enterでプログラムが終了するのは好ましくない。
ダイアログクラスを使わないで、ダイアログを作る。
→Enterでプログラムが終了しないのは好ましくない。
OKボタンに相当するものがあってボタンがそれだけならEnterでOnOKを受けて
終了するのは自然な動作だが、ダイアログ・ベースでもそんな簡単なものばかり
じゃないからね。ものに合わせて変えるのは当然だろ。
ダイアログが閉じた後、さらに別のGUI操作が続く場合は、Enterクローズは便利だけど、
ダイアログが閉じて、アプリ終了した場合やGUI操作がない場合は、Enterクローズは不安感に襲われる。
>>863 ダイアログの作法?
ダイアログを作ってるんじゃなく、
ダイアログを"ベース"にアプリを作っています。
887 :
デフォルトの名無しさん:04/09/19 12:18:04
質問させてください。
CSocketで通信するプログラムを作ってるのですが、Connectで止まってしまいます。
動作試験中なのでサーバ、クライアントともに同じマシンであり、
"127.0.0.1"にコネクトするようにしています。
サーバ:Create(1500) → Listen() → Accept(socket) ここで止まる
クライアント:Create() → Connect("127.0.0.1", 1500) ここで止まる
各CreateとListenが成功しているのは戻り値で確認しています。
不可思議なのは、別のマシンではちゃんと動くことです。
自分のマシン:Win XP Pro(SP2当ててない),
ファイアウォール・アンチウィルス停止中
別のマシン:Win 2000 Pro
どんな原因が考えられるでしょうか。(ポート番号が良くないとか?)
>>887 127.0.0.1がちゃんと解決されているか確認。
netstat /an でポート番号が重複してないか確認。
ダイアログアプリケーションでAfxMessageBox()などのモーダルダイアログが表示されているときに
別のアプリケーションからPostMessage()されると、そのメッセージは破棄されてしまうのですか?
どうも拾えないメッセージがあってそれが原因かなと考えているのですが・・・
XP自信もファイヤーウォール持ってるけど関係あるかね?
>>887 どうでも良いけどテストで使うにしろ1500ってポートはあんまり使わないところ
とりあえず5000オーバーの空いてるところとか使っとけよ
892 :
デフォルトの名無しさん:04/09/19 14:55:09
みなさんありがとうございます。
>>888 127.0.0.1が解決できているかどうかの確認ですが、
とりあえずpingは返ってくるようです(他に確認方法ってありますか?)。
またnetstat /anで確認したのですが、特にかぶっているポートはありませんでした。
>>890 OSのファイヤーウォールの項目もチェックしてみましたが、
どの接続にもファイヤーウォールのチェックは入っていませんでした。
>>891 そうします。Winがどのあたりのポートを使っているか
よく知らなかったもので。
telnet 127.0.0.1 1500
894 :
デフォルトの名無しさん:04/09/19 15:09:29
>>893 接続中: 127.0.0.1...ホストへ接続できませんでした。 ポート番号 1500: 接続に失敗し
ました
となりました。これは解決ができていないのでしょうか?
ためしにnetstat /anで出てきたLISTENING中のポートに
telnetしてみても同じ結果になりました。
>>894 そのリスニング・ポートはちゃんと0.0.0.0か127.0.0.1にバインドされてるの?
システム・サービスの場合、リストに出てても接続を受けないものもあるから
ちゃんと動く何かの簡易サーバ-クライアント・ソフトを持ってきて実験して
みたら?
それでもダメなら接続をブロックするファイアウォールか何かが動いてる
そのシステム固有の問題ってはっきりするから。
何故、1500?
もし他のポートで試せるのなら試すべき。
XPならファイアーウォールの設定をしないとダメなのでは?
>>892を見るとテストするポートの設定をしてないように思える。
>>889 破棄されない。
MessageBox APIの中でメッセージループが回ってるから。
>>895-897 ご回答ありがとうございます。
>>895さんのおっしゃる通り、アンインストールしたと思っていた
ファイヤーウォール(Zone Alarm)が残っていたようです。
アンインストールしたら正常に接続できました。
言い訳をさせていただくと、以前はフィルタ状況のモニターがポップアップで
表示されており、現在は出現しないのでアンインストールしたと思い込んでいました。
(思い込みは良くない・・・)
休日にみなさんの貴重な時間を割いていただいてありがとうございます。
問題の特定の仕方や、問題になりそうな部分の勉強になりました。
今後も精進します。
ドッキングツールバーという仕組みは、ReBarのようなものを自前で実装しているという理解でいいですか?
良く分からん表現だな
特に問題の無かったアプリのダイアログにボタンを追加したんですが、
そのボタンにクラスウィザードを使おうとしたところ、
ソースファイル(C:\〜\TestDlg.h, C:\〜\TestDlg.cpp)の
クラス"CTestDlg"は重複する挿入ブロックが存在します。
というメッセージが出てクラスウィザードが使えなくなってしまったのですが
どうやったら直りますか?環境はXP(SP1)、VC6SP6です。
いったんVCを終了してncb, opt, clw ファイルを削除した後にもう一度
試してみたんですがやはり同じ症状です。
すんません。解決しますた。
ダイアログベースでデストラクタが無いので手動で追加したんですが
それを消してから上記の3ファイルを削除・再構築したところ直りました。
904 :
デフォルトの名無しさん:04/09/22 21:51:01
宿題に困っています。
お分かりの方、いらっしゃいましたら、よろしくお願いします。
1.iniファイルで指定されたフォルダにあるファイル名(例:abbccc)を取得
2.ファイル名を分解(例:a bb ccc)
3.msdnの行にadoを使ってインサートする(例:a bb cccとフィールドを分けて)
まあ、もしかしたらスレ違いじゃ無いのかもしれないけど、
msdnにadoでインサートするのはMFCじゃ無くても無理だろうなあと。
ClassViewで右クリックを使ってクラスにメンバ関数を追加するとき、
デフォルトの引数を設定して、一番最後の引数の型をLPCTSTRにして
デフォルト値=NULL にすると宣言と定義が違うという旨のダイアログが
出て実際に定義の部分の引数部分が削られてしまうのですが、これって
どういうことなんでしょうか?
手動で直すとClassViewの該当関数をダブルクリックしても、ソースの
該当関数部分にジャンプしなくなって「インプリメンテーションが見つからない」
なんて警告されます。
class CTest{
CTest();
~CTest();
BOOL SetData(DWORD dwData=0, LPCTSTR pStrName=NULL); ←コレ
protected:
DWORD m_dwData;
CString m_strName;
};
BOOL CTest::SetData(DWORD dwData) ←宣言と異なる
{
m_dwData=dwData;
if(pStrName==NULL)
m_strName="";
else
m_strName=pStrName;
return TRUE;
}
>>908 すみません。VCのですよね。
VisualC++Ver6、サービスパックもVer6です。
ちなみにconst char * に置き換えると直るには直るのですが
これ(宣言と定義で違うようにすること)は一体どういう意図なのかがわからないです
バグかなぁ?
VC.NETじゃちゃんと同じになるんだけど・・・
>>907 ウィザードで作った後、手作業でデフォルト引数書くとかするしかないんじゃないかなぁ。
デフォルト引数のある関数にジャンプしないのは俺もよくある。
近くの関数にジャンプしてからスクロール…っていつもしてる。
こういう仕様なんだとあきらめてるよ。
>>909 同じ環境でやってみたけど、CLASS VIEWがおかしいみたい。
コンパイルは通る。
クラスビューは、あくまで作業の参考・手助け。
見た目が破損しててもコンパイル・ビルド作業への影響は一切ない。
>>910-913 意味は分かりませんがやっぱり仕様ですかねえ。
とりあえずUNICODEは使わないのでconst char *
でやっときます
915 :
デフォルトの名無しさん:04/09/25 04:07:08
CStringの中のTabSpaceの見分け方を教えて下さい。
削除したくて、Trimで色々やってみたのですが、うまいこといきません、
教えてエロイ人。
CString::Remove( '\t' );
で、解決しました・・・。
Trimに拘った、私が悪かったみたいです。
ご迷惑おかけしました〜。
VC6だったら、CString::Remove はバグあるから気をつけてね
どういうバグ?
>>918 2バイト文字が考慮されないっていうやつだろ、多分。
流れを壊すようですいません。
MFCはじめたばかりの初心者です。
質問ですが、ウインドウの背景を画像ファイルとして保存するにはどうすればいいのでしょうか。
いろいろ調べたのですが結局分かりませんでした。
環境はこのとおりです
OS:WindowsXP SP1
VC++.NET 2003
お願いします。どなたか教えてください。
>>920 CImageにアタッチすれば、CImage::Save()で保存出来るよ。
今ホットなGDI+を使うことになるけど。
924 :
デフォルトの名無しさん:04/09/26 20:02:17
MFC ActiveX Controll WizardでActiveXコントロールを作っています.
作成したコントロールはVBでFormなどに貼り付けて使う予定です.
コントロールは実行時に他のDLLやファイルなどを読み込む必要があり,
ターゲットとなるexeのカレントパスを取得してファイルなどを読み込む処理を
コントロールのクラスのOnCreateメソッド(?)に書きました.
しかし,OnCreateではVBなどでコントロールをFormに貼り付けた時点で
実行されてしまうため,実行時のexeのパスを取得する部分を利用して
ファイルなどを読み込む処理でエラーが起きてしまいます.
プログラムが実行されるときに
一度だけ処理されるメソッドやイベントはあるば教えて頂きたいのですが.
環境 VC6.0 VB6.0 WinXP
>>924 DllMain()でやればいいんじゃないの。
>>925 なんか,あまり一般的では無さそうですね>DLLMain
「DLLmain OCX」でぐぐってみましたが,50件も出てきませんでした.
mfc-mlで同じ質問・・・
デバッグ版とリリース版ってメモリ領域の確保(解放)の仕方が違うんですかね?
new演算子で確保したメモリ領域を解放する処理は明示的に行っているんですが、
デバッグ版⇒CWinApp::Exitinstanceが実行される前に(明示的記述したタイミングで)、
メモリ解放処理が完了する。
リリース版⇒CWinApp::Exitinstanceが実行された後に、メモリ解放処理が完了する。
上記のような動きをしているみたいなんです。
メモリ解放処理後に、終了コードを各プロセスを管理しているプロセスに通知しているため
リリース版では管理プロセスが終了コードを受信した時にも、
対象のプロセスが動き続けていることになってしまいます。
こんな現象に関してご存知の方いらっしゃいましたらぜひご教授をお願いします。
パス
>>929 デバッグ版 DEBUG_NEW を定義せず
リリース版 最適化全てオフ
でテストしてみそ
PostMessage()でメッセージを順番に送るとき、受け取る側で順番が入れ替わったり
する事はありますか?
キューなんだからそんなことないはず。
>>933 あるらしい
>>934 メッセージにも優先順位があるらしく、マウスイベントが
他のイベントより優先される場合もあるらしいよ
>>935 マウスイベントはメッセージキューを通らないで直接ウィンドウプロシージャへ行くメッセージじゃないか?
>>936 そうかも
「PostMessageでは試したことないけど」って言うの忘れた
どもです。
同じ系統のメッセージの順番のみが問題ですんで、他のメッセージの割り込みは問題にならないです。
とりあえず大丈夫なものとしてやってみます
940 :
デフォルトの名無しさん:04/09/29 19:53:29
BITMAPINFOに256カラーのビットマップ、256色のグレースケールのパレットを用意しました。
このBITMAPINFOとビットマップの高さが増すにつれパレット番号を増加させるデータをもちいて
CreateDIBitmapにセットしてグラデーションのビットマップを作りました。(作ったつもり。)
これをメモリデバイスコンテキストでSelectObjectしてからディスプレイ(24bit)のDCにBitBltしたのですが、
この場合256カラー(パレットあり)を変換して24bitカラーのビットマップになってくれるとおもったのですが
どうもパレットデータはシステム内部のものをつかって描画してるっぽいんですがなぜですか?
そういうものですか?
「つもり」の部分が間違っていると思われ。
ビットマップの中のDLLを呼び出したいんですが、
HINSTANCE hInst;
hInst = LoadLibrary("Graphics.dll");
HBITMAP hBitmap;
hBitmap = LoadBitmap(hInst, "IDB_BITMAP1");
とやっても、hBitmap == NULLになってしまってビットマップを読み込めません。
僕のどこが間違ってるんでしょうか。
dllはMFC用のやつですハイ
>>942 全体的に間違ってると思います。1行目とか。
その DLL には本当に "IDB_BITMAP1" というビットマップが入ってますか?
MAKEINTRESOURCE(IDB_BITMAP)の間違いではないのですか?
>>944 1行目書きなおしたら変になってしまいました
自分で作ったDLLなんで IDB_BITMAP1 が入ってるのは間違いないはずなんですが、どうもそれだと読みこめなかったみたいで、
MAKEINTRESOURCE(1000);
と直接リソースIDで指定してもう一度やってみたら読み込めました。
なんでこれだとできるのか分かりませんが、とりあえず解決したみたいです。ありがとうございました。
>なんでこれだとできるのか分かりませんが
それがわかるまで先に進むな
一歩たりとも
>>9 MFCなんか嫌いだぁ
>>933 キューの中では順序通りでも PeekMessage で優先して取り出せるでしょ
DispatchMessageが中で何してるかは知るか。
>>940 パレットは別に CreatePaletteとSelectObjectでセットするんだったような
GDI+への対応はいつになるんだ?
>>945 まず無理だろうが、Graphics.dllのソースの中にある resource.h をインクルードしてみるといい。
これがMFCというやつだ。
>>945 断言していい。
入ってない。
そういうあいまいな認識でコード書くと周りに甚大な被害を及ぼすからやめてくれ。
>>947 引っ込め。
951 :
デフォルトの名無しさん:04/09/30 20:41:04
ピクチャーボックスに表示されている画像を取り込んで保存しているのですが
どうも一回目は保存されなく2回目から保存されます。
いろいろと設定しているですがうまくいきません
どなたか教えてくださいませ
ソフト visualstadio 6.0
OS win xp
ビットマップインフォを作成する
DDBを作成してウィンドウからビットマップをコピー
メモリ割り当ててビットマップからデータを取得
ビットマップファイルヘッダーを作成
データをファイルへセーブ の手順でやっています
hfile = CreateFile(fn,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
WriteFile(hfile ,&bmfh,sizeof(bmfh),&tmp,NULL);
WriteFile(hfile,&pbmi->bmiHeader,sizeof(pbmi->bmiHeader),&tmp,NULL);
if(pbmi->bmiHeader.biBitCount <= 8)
{
WriteFile(hfile,pbmi->bmiColors,sizeof(COLORREF)*(1<<pbmi->bmiHeader.biBitCount),&tmp,NULL);
}
SetFilePointer(hfile,bmfh.bfOffBits,NULL,FILE_BEGIN);
WriteFile(hfile,pbits,pbmi->bmiHeader.biSizeImage,&tmp,NULL);
CloseHandle(hfile);
952 :
デフォルトの名無しさん:04/09/30 20:43:55
MFCをこれから勉強しようと思っていますが
オススメの書籍等あれば教えていただけませんでしょうか?
>>951 ・1回目に保存処理が走っているのか確認
・各APIの戻り値を確認
>SetFilePointer(hfile,bmfh.bfOffBits,NULL,FILE_BEGIN);
これ?
>>952 VCそのものを全く知らん状態で始めるならとりあえず入門書として
林晴比古の本なんかを薦めてみるが、取っ掛かりだけ掴めれば
後は余程専門的な事をやらない限りはネットで調べた方が早いし
詳しい情報が載ってる。
MFCアプリウィザードで作ったダイアログについて。
CDialgを継承したクラスに
WaitForSingleObject()を使って
常に特定のイベントがシグナルか監視する
独立した関数を作りたいのですが
良い方法はありませんか?
良かったら教えてください。
957 :
デフォルトの名無しさん:04/09/30 22:59:47
スレッド。
>>951 関係ないけどFILE_SHARE_WRITEはやめといた方が・・・
>>952 >>955に同意。
ただし、MFC入門書は良書が多いので問題ないけど、
その後をどう進むかだね。
C++の専門書(入門書でなくSTLに触れていて、テンプレート関連が充実)
を読むのが良いかも。
質問
環境:WinNT、VC6.0
でMFC使ってる者です
BOCのFlexGrid使ってるんですが
これのツリービューを作っているんですが
状態の保持が上手く出来ません
ツリーのオブジェクトを削除したり置換したりすると
縮めたオブジェクトが展開されてしまいます
>>960 BOC(現GrapeCity)ならサポートが丁寧だから向こうに聞いたら?
Gridでなんでツリーなのかよく判らんが。
MFC用のDLLはVisual Basicからも呼び出せます
か?
965 :
デフォルトの名無しさん:04/10/02 17:16:29
どうも951です
現在2chブラウザ使えないの状況下なのでこうなってます
>>958さん
FILE_SHARE_WRITEはやめといたほうがいいといいますがそれはどういうこと
ですか?
>>954さん
一応命令は削除してみましたが変化は見られませんでした
>>953さん
APIはすべて確認したところすべて正常でした
自分の考えでは再描画系に問題があったのではないかと判断しております
みなさま、ご意見ありがとうございました。
966 :
デフォルトの名無しさん:04/10/02 17:19:53
タイヘン恐縮なのですがみなさまご教授ねがいと思います
ピクチャーボックスの枠を消去したいのですがネットで方法を
探しているのですが見つかりません
どなたかおしえてくださいませ
968 :
sage:04/10/02 17:37:10
ビットマップスタイル?
ビットマップTypeか
>>965 >FILE_SHARE_WRITEはやめといたほうがいいといいますがそれはどういうこと
denyじゃなくてshareだぞ。
複数の書き込みオープンを許すんだぞ。
WS_EX_CLIENTEDGE
>>966ピクチャーボックスじゃなくて CPictureHolder
CSplitterWndを動的分割ウィンドウで使う場合は
ネストって出来ないんでしょうか?
ネストした子側のウインドウサイズが0x0になっていて
うまく動作しませんでした。
親側のビューをDeleteView()やGetPane()->DestroyWindow()などで
削除してみたりしたんですが変わりませんでした。
よろしくお願いします。
974 :
デフォルトの名無しさん:04/10/02 21:31:19
こちらの方が適当と誘導されたので、再度質問させてください。
707 名前:デフォルトの名無しさん[sage] 投稿日:04/10/02 19:32:00
質問です。
メインのダイアログ(MainDlg)にタブコントロールを貼り付けて
PropertySheet(CPage3)を作成し、その上にRadioButton(IDC_RADIO1)を貼り付けました。
で、CPage3.hのメンバ変数に
public:
CButton *m_pButton1;
と書いて
CPage3.cppに
CPage3::CPage3()
: CPropertyPage(CPage3::IDD)
{
m_pButton1=(CButton*)GetDlgItem(IDC_RADIO1);
}
と書きました。
で、MainDlg.cppのOnInitDialog()
に、m_pPage3->m_pButton1->SetCheck(1);
と書きました。
ちなみにこの動作を入れなければ、タブコントロールもきちんと動いてますし、他のコントロールへの操作も出来てます。
しかしこれを入れると、実行時に不正な処理を行いました。 と言われます。
何故でしょうか?
VC++.NET2003でMFCを使ってます。
宜しくお願いします。
>>973 やったことあるので出来ると思います。
CSplitterWnd のソースだかどっかにうんこのようなASSERTが入ってた気がするので
オーバーライドとかで回避しないとデバッグ時に死ぬ。
すごい、簡単なことかもしれませんがあえてお聞きします
CString型 に改行文字を入れることは可能なのか
CString型 に改行文字を入れた状態でファイル書き込みWriteFileを
行った場合改行されるものなのですか?
自分はやってみたのですが無理でした
CString a="aiueo"+'\n';
すいませんが教えてください。
CString a="aiueo"+'\n';
↑なんじゃこりゃ
・・・ポインタと整数の足し算だからエラーも警告も出ないのか・・・。
>>976 可能。
Windowsでは改行を "\r\n" の2文字であらわしているので、
CString a="aiueo\r\n";
>>975 情報ありがとうございました。
さっそくやってみます。
>>978 バッファにいれとく限りにおいては、「\n」だけで良いんじゃないか?
テキストモードにしとけば、ファイルへの出力の時に内部処理で\r\nになる。
WriteFileにテキストモードなんかあったっけ?
>>978さんどもです
そのとおり実行できましたー
ありがとうございます
またまた質問で申し訳ないのですが
CFileDialogを使って任意でファイルを保存するようにしているのですが
すでにあるファイルを、上書きしようとしたら警告がでません。
拡張子をつけた状態では警告文はでるのですがわざとファイル名から拡張子を
消してみると今度は警告がでません。おそらくファイル名の文字列が
違うので警告文がでないのは承知なのですが拡張子は同じはずなので
警告がでてほしいのですが、対処方法がわかりません、すいませんがご教授
お願いいたします
CFileDialog myDLG(FALSE,NULL,NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"ビットマップ(*.bmp)|*.bmp||");
if(myDLG.DoModal() != IDOK) return;
コモンダイアログ使っておきながら myDLG ですか?
>>974 コンストラクタではタイミング的に早すぎて、
GetDlgItem(IDC_RADIO1)が成功しないんだと思う。
OnInitDialog()内で行ってみては?