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

■MFC相談室 mfc11.dll■

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

前スレ
■ VisualC++(MFC限定)相談室 MFC10.dll■
http://pc5.2ch.net/test/read.cgi/tech/1074104008/

関連リンクは >>2-10 の辺り。
0002デフォルトの名無しさんNGNG
過去スレ
■ VisualC++(MFC限定)相談室 MFC9.dll■
http://pc2.2ch.net/test/read.cgi/tech/1062098350/
■ VisualC++(MFC限定)相談室 MFC8.dll■ (スレタイ壊れているけど前スレ)
http://pc2.2ch.net/test/read.cgi/tech/1056584836/
■ VisualC++(MFC限定)相談室 MFC7.dll■
http://pc2.2ch.net/test/read.cgi/tech/1047949606/l50
■ VisualC++(MFC限定)相談室 MFC6.dll■
http://pc2.2ch.net/test/read.cgi/tech/1039607377/
■ VisualC++(MFC限定)相談室 5■
http://pc3.2ch.net/tech/kako/1028/10285/1028553308.html
■ VisualC++(MFC限定)相談室 4■
http://pc3.2ch.net/tech/kako/1021/10216/1021620974.html
■ VisualC++(MFC限定)相談室 3■
http://pc.2ch.net/tech/kako/1014/10140/1014057520.html
■ VisualC++(MFC限定)相談室 2■
http://pc.2ch.net/tech/kako/1008/10080/1008031675.html
■ VisualC++(MFC限定)相談室 ■
http://pc.2ch.net/tech/kako/989/989902845.html
0003デフォルトの名無しさんNGNG
>>1
Z!
0004デフォルトの名無しさんNGNG
まえすれ
>>972
Thanks!
これでOKザウンス!
0005デフォルトの名無しさんNGNG
捕手しときます
0006デフォルトの名無しさんNGNG
MFCってもうすぐなくなるそうですが、本当ですか?
0007デフォルトの名無しさんNGNG
>>6
本当です。
0008デフォルトの名無しさんNGNG
MFC42.DLL
   シニ

で命運尽きたと見るべきだろう
0009デフォルトの名無しさんNGNG
MFCは永久に不滅です
0010デフォルトの名無しさんNGNG
最初からMSの提唱プログラミング技術は信用していない。
0011デフォルトの名無しさんNGNG
「の」の位置が変になった。

最初からMS提唱のプログラミング技術は信用していない。
0012デフォルトの名無しさんNGNG
CP/Mのパクリ
UNIXのパクり
CORBAのパクリ
SmallTalkのパクリ
Javaのパクリ

オリジナルは??
0013デフォルトの名無しさんNGNG
無い。
0014デフォルトの名無しさんNGNG
COMは何のパクリ?
0015デフォルトの名無しさんNGNG
MS-DOS
0016デフォルトの名無しさんNGNG
話の流れ断ち切るようですみませんが質問させてください

.NETの開発環境やブラウザのSleipnirとかで使ってる
アイコンの背景の変わるツールバーってどうやって実装するんでしょう?
スタイル設定とかで駄目なん?

0017デフォルトの名無しさんNGNG
>>16
MFCを継承していじりたおす。
0018デフォルトの名無しさんNGNG
ダイアログを使ってて、気になることがひとつあるのですが、
×ボタンでアプリケーションを終了させると、
「コード 20 (0x14) で終了しました。」
で、終了して、タスクバーから終了させると、
「コード 61536 (0xF060) で終了しました。」
と、表示されます。

0で終了していないので、どこかにエラーが潜んでいるのかと思うのですが、
どうやって調べたらよいでしょうか?

検索してもそれらしい情報がなくて、
ヘルプでも、0でなければエラーがあるって事しか書いてないので、
どうやったらいいのかと。。。

どなたか知ってる方お願いします。
0019デフォルトの名無しさんNGNG
>>18
Escキーで終了すると0x1bで、Enterキーで終了すると0x0dになるはずですが。
これはちっともエラーではございません。
0020本田NGNG
>COMは何のパクリ?

CORBA
0021デフォルトの名無しさんNGNG
クライアントがインプロセスサーバーの関数を直接呼べるのはCOMだけなのでは?
0022デフォルトの名無しさんNGNG
こんにちは
初歩的な質問ですが、

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が出てきますが、
このコモンダイアログを表示するという記述がされている部分がありません。

これらのコード(ソース)は、どこに記述されてるのでしょうか?
0023デフォルトの名無しさんNGNG
>>22
VCをインストールしたディレクトリ下のMFCってとこにソースがある。
その中をgrepしてみれば?
0024デフォルトの名無しさんNGNG
Attachってどういうものなんでしょう?
0025デフォルトの名無しさんNGNG
>>22
CWinAppの初期化コードの中

cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;

とするとでてこない。この辺が関係してる。
0026デフォルトの名無しさんNGNG
質問:

プロジェクトの新規作成で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)

0027デフォルトの名無しさんNGNG
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
リソースは
リンクするメイン側に置くのですか?
0028デフォルトの名無しさんNGNG
>>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かと・・・・

0029デフォルトの名無しさんNGNG
int argc, char *argv[]
のように、外部ファイルドロップで起動した時、
ドロップしたファイル名を取得するにはどうすれば良いですか?
0030デフォルトの名無しさんNGNG
>>29
Wizardが吐いたソースならCHogeApp::InitInsatance()の中に
 CCommandLineInfo cmdInfo;
 ParseCommandLine(cmdInfo);
ってコードあるでしょ。そのあたりで調べてみれば?
あと、__argcと__argvとか。
0031デフォルトの名無しさんNGNG
>>30
助かります!調べてみます!
0032デフォルトの名無しさんNGNG
>>29
文字列で受けるなら
CString cmdstr = GetCommandLine();

__argc変数を使うなら
for(int i = 1; i < __argc; i++){
 CString cmdstr = __argv[i];
}

どちらかというと後者の方が扱いやすいね
0033デフォルトの名無しさんNGNG
ツールバーを作ろうとしているのですが、

//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」と出てるのでエラーはないと思われますが。
0034デフォルトの名無しさんNGNG
Createの戻り値が見れると言うことは、
そこではエラーが出ていないのでは?
003533NGNG
>>34
すいません。
今、どうにか解決できました。
大変申し訳ございませんでした。
0036デフォルトの名無しさんNGNG
CEditでJaneDoeのDoe部分みたいに
文字に色つけたりフォント変えたりリンク踏めるようにするのはどうすればいいんですか?
今はリッチエディットでやってるけど98とXPだとdllのバージョンが違うし
微妙に重かったり、選択の文字色反転がイヤだったりで、改造したいんですよ。
0037デフォルトの名無しさんNGNG
無理
0038デフォルトの名無しさんNGNG
>>36
codeguruとかにヒントになるソースがあったはず
0039デフォルトの名無しさんNGNG
CComboBoxでCBS_SORTを動的につけたり外したりって無理でしょうか?
SetWindowLongでできなかったんですが…
0040デフォルトの名無しさんNGNG
MFCで作ったアプリは、MFCのDLLを添付しないと
実行することはできないのでしょうか?
自分が作ったExeのみで配布することはできないでしょうか?
0041デフォルトの名無しさんNGNG
>>39
1. ResetContent
2. スタイル付け替え
3. AddString
でもダメ?
すでにあるアイテムのソート/非ソートをスタイル変更で
切り替えてくれるような器用な造りにはなっていないと思う。
けど、これはAPIスレ用の話題だな。
>>40
MFCをスタティックリンクすれば。
0042デフォルトの名無しさんNGNG
>>40
VC6以前のVCでビルドしたものならDLLの心配はしなくていい
ほとんどのwin32環境でDLL持ってるのが当たり前になってるから

VC7以降なら注釈を付けてDLLのインストールが必要なことを書いておくか
同梱するかした方がいい
0043デフォルトの名無しさんNGNG
>>40
MFCのスタティックライブラリを使用にする
004439NGNG
>>41
駄目でしたorz
APIスレに移動してみようと思います。ありがとうございました。
0045デフォルトの名無しさんNGNG
>>40
スタティック ライブラリで MFC を使用する
0046デフォルトの名無しさんNGNG
ダイアログベースでボタンをつくってそのボタンをクリックすると
メニューの開くと同じ動作させるにはどうすればいいでしょうか?
0047デフォルトの名無しさんNGNG
>>46
CMenu
0048デフォルトの名無しさんNGNG
>>46
「開く」のメニュー項目と同じIDのボタンを
0049デフォルトの名無しさんNGNG
>>47 48
できました

ダイアログに開くからえたビットマップをダイアログのピクチャーボックス
に表示するにはどうすればいいのでしょう?
0050デフォルトの名無しさんNGNG
・ダイアログから得たのでないビットマップをピクチャーボックスに表示する方法を調べる
・それをダイアログから得たビットマップファイルの場合に応用する
0051デフォルトの名無しさんNGNG
>>41
>>42
>>43
>>45
ありがとうございます。
スタティックは知っていたのですが、
結局Exe以外にも添付しなきゃならないとか何とか・・・・
ってどこかのHPで書いてあって、
結局駄目なのか?と思ってたので。。

一応、どのWindowsでも動かないとまずいって言うので、
(95は除外してもよさそうなのですが)
困ってたんです。
環境はVC6なので、大丈夫かと思うのですが。
0052デフォルトの名無しさんNGNG
ちなみにVC.NETスタティックリンクで
作ったexeを検証したところ
Win98 WinME Win2000 WinXP (by VirtualPC)
で動いてます
0053デフォルトの名無しさんNGNG
>>52
ついでにランタイムライブラリもスタティックリンクにしとけよ
0054デフォルトの名無しさんNGNG
Formベースで作ったプログラムを作って、出来たクラスがCXXXView、CXXXDoc、(その他)とした時
CXXXView.h 内で CXXXDoc.h を
CXXXDoc.h 内で CXXXView.h を
それぞれインクルードするとコンパイル出来ないのですが、そう言うものなのでしょうか?
インクルードする順番も一応変えてみたりしたのですが、無理でした。
この方法が無理ならば、DocとViewで相互に呼び出したいときはどうしたらいいのでしょうか?
0055デフォルトの名無しさんNGNG
>>54
CView::GetDocument()
CDocument::GetFirstViewPosition()
CDocument::GetNextView()

DocからViewは普通はポインタを使って直接呼び出すのではなく
CDocument::UpdateAllViews()でドキュメントの変更を通知する。
あとはCView::OnUpdate()で。
0056デフォルトの名無しさんNGNG
ていうか、相互に呼び出したいだけなら.hでインクルードする必要ない
0057デフォルトの名無しさんNGNG
ダイアログにラジオボタンを付けて
それにコントロール変数を追加したいんですが
VC6の時は、グループ先頭を「グループ」にチェック入れて
int変数を追加できたんだけど
VC7.1だと先頭のGroupをtrueに設定して
コントロール変数を追加しようとすると
BOOLしか追加できないみたいなんです
intで追加できないんでしょうか?
0058デフォルトの名無しさんNGNG
>>54
ちょい工夫すれば容易にできる話だが・・・
だが、そーゆーPGはやめておけ。
0059デフォルトの名無しさんNGNG
予め決められたハングル文字を表示したいのですが、
ソースにハードコーディングしたら駄目らしく、
かといってストリングテーブルにいれたら???となってしまいます・・・
文字セットはUnicode文字セットを使用しているので、
エディットボックス間のコピー等は上手く行くのですが・・・

どなたかお知恵を貸して下さい
0060デフォルトの名無しさんNGNG
つかおまいの環境、ハングル入ってるのか?
0061デフォルトの名無しさんNGNG
>>60
WinXPなんで、言語のあたりをいじると、ハングルIMEが使えます。
けど、OCNの翻訳サイトで単語訳してコピペする予定です
0062デフォルトの名無しさんNGNG
最新のでも開発環境そのものはUNICODE対応していないんだっけ?
006359NGNG
>>62
やっぱVC++じゃ駄目ですかね・・・・orz
何故かVBとVC#はすんなり出来てくれたんですが、
どーしてもネイティブじゃないと嫌なもんで・・・
0064デフォルトの名無しさんNGNG
>>59
今AppWizard見てみたのだが、リソースに使用する
言語ってコンボがあるが、それには日本語、英語しか
ないからOSもVCもハングル版買わないといかんのでは?
0065デフォルトの名無しさんNGNG
wchar_t a[] = L"\uac00\uac01\uac02\uac03";
MessageBox(NULL, a, L"韓国語", MB_OK);

少なくともこういうのは通るし動くんで、
・ソースはUTF-8とかでハングルで直接書く
・プリプロセッサとして、UTF-8なソースをShift_JISなソースに書き換える
(リテラルのユニバーサルキャラクタへの置き換え)物を作る
でなんとかなるんじゃ。リソースはどうにもなんないかもだけど。
006659NGNG
>>64
そこには「韓国語」っていうのもあるんですが、
コード生成時に何やらエラーが出て止まります。
やはり環境が揃ってないと無理なんでしょうかね・・・
レスくれた方、どうもありがとです。
もうちっとVC++で粘ってみます。

と、リロードしてみたら!
>>65
これは、素晴しい!
なんとかなりそうです。感激!

0067デフォルトの名無しさんNGNG
>>59
MSDNの「Unires サンプル : Unicode リソース ファイルの使用」
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcsample/html/vcconuniressampledemonstratesuseofunicoderesourcefiles.asp
は?
006859NGNG
>>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;

の様に使う事で、多言語対応する事ができました。
0069デフォルトの名無しさんNGNG
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;
0070デフォルトの名無しさんNGNG
続き
//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)を記述すると問題なく動作
します。理由がどうしてもわかりません。
007169NGNG
書き忘れました、環境はVC++6.0です。
0072デフォルトの名無しさんNGNG
実は全然別のところが問題とか。
0073デフォルトの名無しさんNGNG
>>69
メンバ関数版じゃなければ表示されるんでない?<MessageBox()
AfxMessageBox()だっけ?
0074デフォルトの名無しさんNGNG
.NET 2003はユニコードに対応しているよ。
ファイルの保存でユニコードで保存してやると
ちゃんと保存される。
0075デフォルトの名無しさんNGNG
>>69
ほんとだね
これはなかなか興味深い
ちょっと調べてみるか
007675NGNG
まず、OnPaintメッセージがきたときに、ディフォルトの動作を行わないせいで
何時までたってもウインドウが無効領域のままになる
なのでOnPaintの無限ループのような状態が起きている
これのせいで、MessageBoxがメッセージを受け取れないみたいだね
WM_PAINTのディフォルト処理を入れなきゃウインドウズプログラムはだめだってことで
007775NGNG
飯行くので急いで書いたのでむちゃくちゃな文章になってるな・・・
ちゃんと書くと
WM_PAINTメッセージってシステムがこの領域は無効な領域(描画が必要な領域)
だと判断したから発生させるメッセージ(よく再描画するのにInvalidateを呼び出すが
これは、アプリ側で無理やり無効な領域にしているってこと)
このメッセージを受け取ったアプリ側は、適切な描画処理をするもしくは
ウインドウズディフォルトの処理に任せる
このとき使用されるAPIがBeginPaint EndPaint、MFCならCPaintDC
このAPIもしくはクラスを使用した場合、無効領域がクリアされるため
再び無効領域が出来るまでになるまでWM_PAINTが発生されることは無い

69の作ったプログラムでは、WM_PAINTメッセージのハンドラで何も処理をしない為
何時までたってもその領域が無効であるとシステム判断するのでWM_PAINTを繰り返す
WM_PAINTは優先度の高いメッセージなので、この処理が完了しないと他のメッセージは
受け取れない、メッセージボックスはWM_INITDIALOGなど一連のメッセージを受け取って
処理をしない限り動けないので何時までたってもそのメッセージを受け取れない
つまりプログラムが停止しているわけではなく、OnPaintメッセージでループしている

説明下手ですまんが、大体のニュアンスは分かっていただけたかな?
0078デフォルトの名無しさんNGNG
>>68
多言語リソースは.rc2の方に書いておけば、リソースエディタは影響受けない。
もちろん、逆にそこの部分はリソースエディタの支援をまったく受けられなく
なるんだけど、C(++)ソース中にユニバーサルキャラクタで書き込むよりは
可読性があっていいんじゃないかと。
ちなみにユニコードで保存したrc2ファイルは、テキストファイルとして
VisualStudioで編集できる。
007969NGNG
75さんとても丁寧な説明ありがとうございます。
WM_PAINTメッセージが送られ続けているということですね。

Windowsプログラムはまだやり始めたばかりでわからないことが多いですが
とても楽しいです。
これからもがんばっていこうと思います。
本当にありがとうございました。
0080デフォルトの名無しさんNGNG
ダイアログボックスにCAD図形みたいなものを描画するときって、
何かいいコントロールとかってありますか?
ピクチャーコントロールって、こういうときに使うのでしょうか?
0081デフォルトの名無しさんNGNG
>>80
俺はこういう時に使ってる
0082デフォルトの名無しさんNGNG
>>80
ダイアログボックスに貼り付けると、IDがIDC_STATICとなって、
普通のスタティックテキストと扱いが同じなんだよね。
で、どうやって使わせようとしているのかの意図が読み取れなくて???
0083デフォルトの名無しさんNGNG
藻前が何を言おうとしているのか読み取れねーよ!!!
0084デフォルトの名無しさんNGNG
自分でIDを変えるんだよ
0085デフォルトの名無しさんNGNG
教えてください。いまあるアプリケーションで縦のスクロールバーを他のアプリケーションから
スライドさせてそのアプリケーションの表示をスクロールさせたいのですが、
スクロールバーそのものの位置は更新できるんですけど表示はスクロールしません。
どうやればよいのでしょうか?ちなみに今は
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;
    }
}
という感じです。
0086デフォルトの名無しさんNGNG
>>85
InvalidateRect()してみるとか?
0087デフォルトの名無しさんNGNG
アクティブなアプリが他のアプリだから画面更新されんってことか?
プロセス間通信はイベントオブジェクト以外苦手じゃ
0088デフォルトの名無しさんNGNG
SetScrollPosは「スクロールバーの情報を書き換えるだけ」なので、
それじゃアプリにスクロール要求は出ない。
他アプリをスクロールさせるってのはやったことないけど、
単純にWM_xSCROLLを送ればいいんじゃなかろうか。
0089デフォルトの名無しさんNGNG
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);
}
009085です。NGNG
みなさんありがとうございます。>>88さんのおっしゃるとおり、
親にWM_VSCROLLを送ることで実現できました。
0091デフォルトの名無しさんNGNG
>>89
普通はどっちなんだっけ?
ともかく、ダイアログ関係を中央に出そうとするのはCenterWindowの仕業だから、
そこにブレークポイントをかけて、しかるのちに対策を考えればいいかと。
0092デフォルトの名無しさんNGNG
>>89
そのスレッドでダイアログの情報を持ってないのが原因だろうから、
何らかの方法でCWnd*を渡してメンバ関数版を使えばいいんでないかな。
0093デフォルトの名無しさんNGNG
>>89
試していないけど、CHogeDlgがCDialogを継承
しているならのメンバ関数のメッセージボックスを
呼び出せばいいんじゃないの?
0094デフォルトの名無しさんNGNG
>>89
>ダイアログの中央に出す方法はありませんか?
方法はある。 WM_INITDIALOG
もっと簡単な方法が知りたいってことか?
どんくらいまでわかるのかを書かないと
それこそ基本中の基本から説明せにゃならん。
もちろん、それは万単位が相場で只ではできない。
0095デフォルトの名無しさんNGNG
MDIでフォームビューを選んだとき、フォームのダイアログのサイズを
MoveWindow()とかSetWindowPos()でサイズを変えようとすると
必ず落ちますが(DEBUGビルド時)、これって許されないのでしょうか。
CChildFrameのサイズに合わせて大きさを変えたいのですけど。
009695NGNG
>>95
簡単にいいますと、フォーム内のダイアログテンプレートのサイズを
変更するにはどうしたら良いのか、ということです。
単純にGetDlgItem()ではダメですよね。NULLが返ってきてしまいます。
009789NGNG
>>91,92,93,94
回答ありがとうございます。
とりあえずスレッド作成元のCWnd*をグローバル変数に設定して、
スレッド内からMessageBoxを呼び出す方法と、直接メンバ関数の
MessageBoxを呼び出す方法を試しましたが、結果は同様でした。
なお作成元のスレッドでAfxMessageBoxを呼び出した場合には、ダイアログの
中央に表示されます。
>>94
当方組み込み向けのCが本職で、Windowsプログラムはほとんど経験がありません。
スレッド内でメッセージボックスを表示させることはWindowsプログラムではほとんどしな
いことなんでしょうか?
0098デフォルトの名無しさんNGNG
>>97
俺もあまり詳しくはないが、そこまでMessageBoxにこだわる必要はないのでは?
メッセージ出力用のダイアログクラスを作成して、そのクラスに親の位置を渡せば良いのでは
ないのかな
ダイアログクラスなら、OnInitDialog()で表示位置やサイズを変更すると簡単なんだけど。
意図していたことと違うかもしれないが、暫定的にしておいて、他のもっと重要なところに
パワーをかけた方が良いと思うよ
0099デフォルトの名無しさんNGNG
>>97
スレッドにはメッセージループを持つスレッドと、持たないスレッドがある。
WM_INITDIALOGはメッセージなわけだが・・・
0100デフォルトの名無しさんNGNG
>>97
Windowsでは、ウインドウはどれかのスレッドに属している、
つまりスレッドがウインドウを保持しているといっていい。
そして1つのウインドウは複数のスレッドに共有されることは無い。
ウインドウには親子関係があるがこれは同一スレッド内においてのみ有効
スレッドがウインドウを作った場合親ウインドウに別のスレッドのウインドウを
指定しても無効になる
メッセージボックスの場合、内部的にCenterWindowが呼ばれるわけだが、
親ウインドウがいないもしくは無効な為、ど真ん中に表示されてしまう
どうしてもと言うなら、試したこと無いので出来るかどうかわからないが
見えない親ウインドウをスレッド元のウインドウサイズにあわせて作って
おいてメッセージボックスを呼び出すとか
0101デフォルトの名無しさんNGNG
>>96
つまり、スクロールバーを表示させたくないってこと?
■ このスレッドは過去ログ倉庫に格納されています